Browse Source

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneProServiceImpl.java
by su 3 years ago
parent
commit
71da6a6c3b
87 changed files with 4219 additions and 120 deletions
  1. 4 29
      4dkankan-center-api/4dkankan-center-platform-api/src/main/java/com/fdkankan/platform/api/feign/PlatformClient.java
  2. 9 0
      4dkankan-center-api/4dkankan-center-platform-api/src/main/java/com/fdkankan/platform/api/feign/PlatformOrderClient.java
  3. 39 0
      4dkankan-center-api/4dkankan-center-platform-api/src/main/java/com/fdkankan/platform/api/feign/PlatformUserClient.java
  4. 10 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/common/LogFactory.java
  5. 2 24
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/feign/SceneFeign.java
  6. 19 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/feign/OrderFeign.java
  7. 21 2
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/feign/ModelingFeign.java
  8. 21 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/common/UploadPath.java
  9. 121 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/controller/app/DeviceCameraAppController.java
  10. 103 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/controller/manager/CameraVersionController.java
  11. 1 1
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/mapper/ICameraVersionMapper.java
  12. 2 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/service/ICameraDetailService.java
  13. 8 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/service/ICameraSpaceService.java
  14. 14 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/service/ICameraVersionService.java
  15. 26 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/service/IDeviceService.java
  16. 13 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/service/impl/CameraDetailServiceImpl.java
  17. 43 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/service/impl/CameraSpaceServiceImpl.java
  18. 150 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/service/impl/CameraVersionServiceImpl.java
  19. 251 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/service/impl/DeviceServiceImpl.java
  20. 83 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/vo/ResponseCameraApp.java
  21. 119 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/controller/pay/OrderAlipayController.java
  22. 264 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/controller/pay/OrderPaypalController.java
  23. 304 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/controller/pay/OrderWechatPayController.java
  24. 6 2
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/request/RequestPlaceOrder.java
  25. 4 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/ICommerceOrderService.java
  26. 4 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/IDownloadOrderService.java
  27. 4 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/IExpansionOrderService.java
  28. 4 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/IIncrementOrderService.java
  29. 1 1
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/IInvoiceService.java
  30. 4 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/IOrderService.java
  31. 1 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/ITradeLogService.java
  32. 4 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/IVirtualOrderService.java
  33. 264 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/PayOrderService.java
  34. 26 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/impl/CommerceOrderServiceImpl.java
  35. 24 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/impl/DownloadOrderServiceImpl.java
  36. 28 2
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/impl/ExpansionOrderServiceImpl.java
  37. 26 2
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/impl/IncrementOrderServiceImpl.java
  38. 1 1
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/impl/InvoiceServiceImpl.java
  39. 31 14
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/impl/OrderServiceImpl.java
  40. 13 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/impl/TradeLogServiceImpl.java
  41. 28 5
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/impl/VirtualOrderServiceImpl.java
  42. 1 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/controller/api/UserOrderController.java
  43. 5 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/Commerce.java
  44. 5 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/Entity.java
  45. 5 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/Expansion.java
  46. 12 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/Pay.java
  47. 14 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/PayEntity.java
  48. 39 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/PayFactory.java
  49. 5 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/Recharge.java
  50. 26 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/Alipay.java
  51. 58 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/AlipayCommerce.java
  52. 71 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/AlipayDownload.java
  53. 74 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/AlipayEntity.java
  54. 82 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/AlipayExpansion.java
  55. 71 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/AlipayIncrement.java
  56. 59 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/AlipayRecharge.java
  57. 26 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/Paypal.java
  58. 57 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/PaypalCommerce.java
  59. 58 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/PaypalDownload.java
  60. 67 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/PaypalEntity.java
  61. 65 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/PaypalExpansion.java
  62. 58 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/PaypalIncrement.java
  63. 60 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/PaypalRecharge.java
  64. 26 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/Wechat.java
  65. 55 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/WechatCommerce.java
  66. 65 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/WechatDownload.java
  67. 71 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/WechatEntity.java
  68. 81 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/WechatExpansion.java
  69. 65 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/WechatIncrement.java
  70. 55 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/WechatRecharge.java
  71. 11 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/OrderItemStrategy.java
  72. 9 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/OrderStrategy.java
  73. 79 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/OrderStrategyFactory.java
  74. 59 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/impl/Camera2EyesOrderImpl.java
  75. 59 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/impl/Camera8EyesOrderImpl.java
  76. 57 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/impl/CommerceMonthOrderImpl.java
  77. 88 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/impl/CommerceOrderImpl.java
  78. 59 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/impl/CommerceYearOrderImpl.java
  79. 46 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/impl/DownloadOrderImpl.java
  80. 51 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/impl/EntityOrderImpl.java
  81. 78 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/impl/ExpansionOrderImpl.java
  82. 102 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/impl/IncrementOrderImpl.java
  83. 47 0
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/impl/RechargeOrderImpl.java
  84. 0 3
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/controller/TestController.java
  85. 5 5
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/listener/BuildSceneResultMQListener.java
  86. 27 26
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneFileBuildServiceImpl.java
  87. 6 3
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneProServiceImpl.java

+ 4 - 29
4dkankan-center-api/4dkankan-center-platform-api/src/main/java/com/fdkankan/platform/api/feign/PlatformClient.java

@@ -1,16 +1,16 @@
 package com.fdkankan.platform.api.feign;
 
-import com.fdkankan.common.user.SSOUser;
-import com.fdkankan.platform.api.vo.*;
 import com.fdkankan.common.response.ResultData;
+import com.fdkankan.platform.api.vo.Camera;
+import com.fdkankan.platform.api.vo.CameraDetail;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
 @FeignClient(value = "4dkankan-center-platform")
-@RequestMapping("/platform/feign")
-public interface PlatformClient {
+@RequestMapping("/platform/feign/goods")
+public interface PlatformGoodsClient {
 
     /**
      *
@@ -39,29 +39,4 @@ public interface PlatformClient {
      */
     @PostMapping("/getCameraBySnCode")
     ResultData<Camera> getCameraBySnCode(@RequestParam(value = "snCode", required = false) String snCode);
-    /**
-     *
-     * @return SSOUser
-     */
-    @PostMapping("/getSSOUserByUserId")
-    ResultData<SSOUser> getSSOUserByUserId(@RequestParam(value = "userId", required = false) Long userId) ;
-
-    /**
-     *
-     * @return company
-     */
-    @PostMapping("/getCompanyById")
-    ResultData<Company> getCompanyById(@RequestParam(value = "companyId", required = false) Long companyId) ;
-    /**
-     *
-     * @return user
-     */
-    @PostMapping("/getUserByName")
-    ResultData<User> getUserByName(@RequestParam(value = "userName", required = false) String userName) ;
-    /**
-     *
-     * @return UserIncrement
-     */
-    @PostMapping("/getUserIncrementByCameraId")
-    ResultData<UserIncrement> getUserIncrementByCameraId(@RequestParam(value = "cameraId", required = false) Long cameraId);
 }

+ 9 - 0
4dkankan-center-api/4dkankan-center-platform-api/src/main/java/com/fdkankan/platform/api/feign/PlatformOrderClient.java

@@ -0,0 +1,9 @@
+package com.fdkankan.platform.api.feign;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@FeignClient(value = "4dkankan-center-platform")
+@RequestMapping("/platform/feign/order")
+public interface PlatformOrderClient {
+}

+ 39 - 0
4dkankan-center-api/4dkankan-center-platform-api/src/main/java/com/fdkankan/platform/api/feign/PlatformUserClient.java

@@ -0,0 +1,39 @@
+package com.fdkankan.platform.api.feign;
+
+import com.fdkankan.common.response.ResultData;
+import com.fdkankan.common.user.SSOUser;
+import com.fdkankan.platform.api.vo.*;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@FeignClient(value = "4dkankan-center-platform")
+@RequestMapping("/platform/feign/user")
+public interface PlatformUserClient {
+    /**
+     *
+     * @return SSOUser
+     */
+    @PostMapping("/getSSOUserByUserId")
+    ResultData<SSOUser> getSSOUserByUserId(@RequestParam(value = "userId", required = false) Long userId) ;
+
+    /**
+     *
+     * @return company
+     */
+    @PostMapping("/getCompanyById")
+    ResultData<Company> getCompanyById(@RequestParam(value = "companyId", required = false) Long companyId) ;
+    /**
+     *
+     * @return user
+     */
+    @PostMapping("/getUserByName")
+    ResultData<User> getUserByName(@RequestParam(value = "userName", required = false) String userName) ;
+    /**
+     *
+     * @return UserIncrement
+     */
+    @PostMapping("/getUserIncrementByCameraId")
+    ResultData<UserIncrement> getUserIncrementByCameraId(@RequestParam(value = "cameraId", required = false) Long cameraId);
+}

+ 10 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/common/LogFactory.java

@@ -0,0 +1,10 @@
+package com.fdkankan.platform.common;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class LogFactory {
+    public static final Logger V_LOG = LoggerFactory.getLogger("visitLog");
+    public static final Logger P_LOG = LoggerFactory.getLogger("programLog");
+
+}

+ 2 - 24
4dkankan-center-platform/src/main/java/com/fdkankan/platform/feign/SceneFeign.java

@@ -1,13 +1,9 @@
 package com.fdkankan.platform.feign;
 
-import com.fdkankan.common.user.SSOUser;
 import com.fdkankan.platform.goods.entity.Camera;
 import com.fdkankan.platform.goods.entity.CameraDetail;
-import com.fdkankan.platform.goods.entity.Company;
 import com.fdkankan.platform.goods.service.ICameraDetailService;
 import com.fdkankan.platform.goods.service.ICameraService;
-import com.fdkankan.platform.goods.service.ICompanyService;
-import com.fdkankan.platform.user.service.IUserService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -20,8 +16,8 @@ import org.springframework.web.bind.annotation.RestController;
  * 提供场景调用
  */
 @RestController
-@RequestMapping("/feign")
-public class SceneFeign {
+@RequestMapping("/feign/goods")
+public class GoodsFeign {
 
     private static Logger log = LoggerFactory.getLogger("feignVisitLog");
 
@@ -29,10 +25,6 @@ public class SceneFeign {
     private ICameraService cameraService;
     @Autowired
     private ICameraDetailService cameraDetailService;
-    @Autowired
-    private IUserService userService;
-    @Autowired
-    private ICompanyService companyService;
 
     @PostMapping("/getCameraByChildName")
     public Camera getCameraByChildName(@RequestParam(value = "childName", required = false) String childName) {
@@ -66,20 +58,6 @@ public class SceneFeign {
         log.info("scene服务调用:getCameraBySnCode,返回:{}",detail);
         return detail;
     }
-    @PostMapping("/getSSOUserByUserId")
-    public SSOUser getSSOUserByUserId(@RequestParam(value = "userId", required = false) Long userId) {
-        log.info("scene服务调用:getSSOUserByUserId,参数:userId:{},",userId);
-        SSOUser ssoUser =  userService.getSSOUserByUserId(userId);
-        log.info("scene服务调用:getSSOUserByUserId,返回:{}",ssoUser);
-        return ssoUser;
-    }
-    @PostMapping("/getCompanyById")
-    public Company getCompanyById(@RequestParam(value = "companyId", required = false) Long companyId) {
-        log.info("scene服务调用: getCompanyById,参数:companyId:{},",companyId);
-        Company entity = companyService.getById(companyId);
-        log.info("scene服务调用: getCompanyById,返回:{}",entity);
-        return entity;
-    }
 
 }
 

+ 19 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/feign/OrderFeign.java

@@ -0,0 +1,19 @@
+package com.fdkankan.platform.feign;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 提供计算调用
+ */
+@RestController
+@RequestMapping("/feign/order")
+public class OrderFeign {
+
+    private static Logger log = LoggerFactory.getLogger("feignVisitLog");
+
+
+}
+

+ 21 - 2
4dkankan-center-platform/src/main/java/com/fdkankan/platform/feign/ModelingFeign.java

@@ -1,5 +1,8 @@
 package com.fdkankan.platform.feign;
 
+import com.fdkankan.common.user.SSOUser;
+import com.fdkankan.platform.goods.entity.Company;
+import com.fdkankan.platform.goods.service.ICompanyService;
 import com.fdkankan.platform.user.entity.User;
 import com.fdkankan.platform.user.entity.UserIncrement;
 import com.fdkankan.platform.user.service.IUserIncrementService;
@@ -16,8 +19,8 @@ import org.springframework.web.bind.annotation.RestController;
  * 提供计算调用
  */
 @RestController
-@RequestMapping("/feign")
-public class ModelingFeign {
+@RequestMapping("/feign/user")
+public class UserFeign {
 
     private static Logger log = LoggerFactory.getLogger("feignVisitLog");
 
@@ -25,6 +28,8 @@ public class ModelingFeign {
     private IUserService userService;
     @Autowired
     private IUserIncrementService userIncrementService;
+    @Autowired
+    private ICompanyService companyService;
 
     @PostMapping("/getUserByName")
     public User getUserByName(@RequestParam(value = "userName", required = false) String userName) {
@@ -40,6 +45,20 @@ public class ModelingFeign {
         log.info("modeling服务调用:getUserIncrementByCameraId,返回:{}",entity);
         return entity;
     }
+    @PostMapping("/getSSOUserByUserId")
+    public SSOUser getSSOUserByUserId(@RequestParam(value = "userId", required = false) Long userId) {
+        log.info("scene服务调用:getSSOUserByUserId,参数:userId:{},",userId);
+        SSOUser ssoUser =  userService.getSSOUserByUserId(userId);
+        log.info("scene服务调用:getSSOUserByUserId,返回:{}",ssoUser);
+        return ssoUser;
+    }
+    @PostMapping("/getCompanyById")
+    public Company getCompanyById(@RequestParam(value = "companyId", required = false) Long companyId) {
+        log.info("scene服务调用: getCompanyById,参数:companyId:{},",companyId);
+        Company entity = companyService.getById(companyId);
+        log.info("scene服务调用: getCompanyById,返回:{}",entity);
+        return entity;
+    }
 
 }
 

+ 21 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/common/UploadPath.java

@@ -0,0 +1,21 @@
+package com.fdkankan.platform.goods.common;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class UploadPath {
+
+    public static String ALIYUN_SSO_PATH = "camera_version/";
+
+    public static String YAMAXUN_S3_PATH = "https://eurs3.4dkankan.com/camera_version/";
+
+    public static String DIR_NAME = "camera_version/";
+
+    // 获取时间戳
+    public static String dateStr() {
+        SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
+        String format = df.format(new Date());
+        long timeMillis = System.currentTimeMillis();
+        return format + "_" + timeMillis + "_";
+    }
+}

+ 121 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/controller/app/DeviceCameraAppController.java

@@ -0,0 +1,121 @@
+//package com.fdkankan.platform.goods.controller.app;
+//
+//import com.fdkankan.common.controller.BaseController;
+//import com.fdkankan.platform.user.request.RequestCamera;
+//import lombok.extern.log4j.Log4j2;
+//import org.apache.commons.lang.StringUtils;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.web.bind.annotation.RequestBody;
+//import org.springframework.web.bind.annotation.RequestMapping;
+//import org.springframework.web.bind.annotation.RequestMethod;
+//import org.springframework.web.bind.annotation.RestController;
+//
+//import java.util.ArrayList;
+//import java.util.List;
+//
+///**
+// * 设备中心接口-app设备模块
+// */
+//@Log4j2
+//@RestController
+//@RequestMapping("/api/app/camera")
+//public class DeviceCameraAppController extends BaseController {
+//
+//
+//    /**
+//     * 获取设备详情
+//     * childPassword        相机密码
+//     * childName            相机的物理地址
+//     */
+//    @RequestMapping(value = "/getCameraInfo", method = RequestMethod.POST)
+//    public String getCameraInfo(@RequestBody RequestCamera param) throws Exception {
+//
+//    }
+//
+//
+//    /**
+//     * 绑定设备
+//     */
+//    @ApiOperation("绑定设备")
+//    @RequestMapping(value = "/bindCamera", method = RequestMethod.POST)
+//    @ApiImplicitParams({
+//            @ApiImplicitParam(name = "userName", value = "用户名", dataType = "number"),
+//            @ApiImplicitParam(name = "childName", value = "相机的物理地址", dataType = "String"),
+//            @ApiImplicitParam(name = "cameraType", value = "相机类型,1双目,4八目", dataType = "String"),
+//            @ApiImplicitParam(name = "snCode", value = "sn码", dataType = "String")
+//    })
+//    public Result bindCamera(@RequestBody RequestCamera camera) throws Exception {
+//        if((StringUtils.isEmpty(camera.getChildName()) && StringUtils.isEmpty(camera.getSnCode())) || StringUtils.isEmpty(camera.getUserName())){
+//            throw new BaseRuntimeException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+//        }
+//        return deviceService.bindProCamera(camera);
+//    }
+//
+//    /**
+//     * 获取用户所有设备
+//     */
+//    @ApiOperation("获取用户所有设备")
+//    @RequestMapping(value = "/getCamerasForUser", method = RequestMethod.POST)
+//    @ApiImplicitParams({
+//            @ApiImplicitParam(name = "userName", value = "用户名", dataType = "number"),
+//            @ApiImplicitParam(name = "cameraType", value = "相机类型,1双目,4八目", dataType = "String")
+//    })
+//    public Result<List<ResponseCameraApp>> getCamerasForUser(@RequestBody RequestCamera camera) throws Exception {
+//        if(StringUtils.isEmpty(camera.getUserName())){
+//            throw new BaseRuntimeException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+//        }
+//        Result userResult = userService.findByUserName(camera.getUserName());
+//        if (userResult.getCode() == Result.CODE_FAILURE){
+//            return userResult;
+//        }
+//        SSOUser ssoUser = mapper.convertValue(userResult.getData(), SSOUser.class);
+//        if (ssoUser == null){
+//            throw new BaseRuntimeException(LoginConstant.FAILURE_CODE_3015, LoginConstant.FAILURE_MSG_3015);
+//        }
+//
+//        if(camera.getCameraType() == null){
+//            camera.setCameraType(4);
+//        }
+//        List<CameraDetailEntity> list = cameraDetailService.findEntityByUserId(ssoUser.getId(), camera.getCameraType().longValue());
+//        if(list == null){
+//            Result.success();
+//        }
+//
+//        List<ResponseCameraApp> resultList = new ArrayList<>();
+//        for(CameraDetailEntity entity : list){
+//            CameraEntity cameraEntity = goodsService.findCameraById(entity.getCameraId());
+//
+//            if(cameraEntity == null){
+//                continue;
+//            }
+//            Result result = goodsService.getCameraInfo(cameraEntity.getChildName(), cameraEntity.getChildPassword());
+//            if (result.getCode() == Result.CODE_FAILURE){
+//                return result;
+//            }
+//            ResponseCameraApp cameraApp = mapper.convertValue(result.getData(), ResponseCameraApp.class);
+//
+//            UserIncrementEntity userIncrementEntity = userIncrementService.findByCameraId(cameraEntity.getId());
+//            if(userIncrementEntity != null){
+//                cameraApp.setUserIncrementId(userIncrementEntity.getId());
+//                cameraApp.setIsExpire(userIncrementEntity.getIsExpired());
+//            }
+//
+//            resultList.add(cameraApp);
+//        }
+//
+//        return Result.success(resultList);
+//    }
+//
+//    /**
+//     * 设备解除绑定
+//     */
+//    @ApiOperation("设备解除绑定")
+//    @RequestMapping(value = "/unbind", method = RequestMethod.POST)
+//    @ApiImplicitParams({
+//            @ApiImplicitParam(name = "userName", value = "用户名", dataType = "number"),
+//            @ApiImplicitParam(name = "cameraType", value = "相机类型,1双目,4八目", dataType = "String"),
+//            @ApiImplicitParam(name = "childName", value = "相机的物理地址", dataType = "String")})
+//    public Result unbind(@RequestBody RequestCamera camera) throws Exception {
+//        return deviceService.unbindPro(camera);
+//    }
+//}

+ 103 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/controller/manager/CameraVersionController.java

@@ -0,0 +1,103 @@
+package com.fdkankan.platform.goods.controller.manager;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.platform.agent.request.RequestSearch;
+import com.fdkankan.platform.goods.entity.CameraVersion;
+import com.fdkankan.platform.goods.service.ICameraVersionService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 相机版本管理模块
+ */
+@RestController
+@RequestMapping("/api")
+public class CameraVersionController {
+
+    @Autowired
+    private ICameraVersionService cameraVersionService;
+
+    /**
+     * 仅有有一台相机是活动状态
+     * type     相机类型,1八目,2双目,不传默认八目
+     * @return
+     */
+    @GetMapping(value = "/manager/goods/version/list")
+    public Page<CameraVersion> getList(@RequestParam(value="pageNum", defaultValue="0", required = false) Integer pageNum,
+                                       @RequestParam(value="pageSize", defaultValue="10", required = false) Integer pageSize,
+                                       @RequestParam(value="type", required = false) String type) throws Exception{
+        return cameraVersionService.getPageByType(pageNum,pageSize,type);
+    }
+    /**
+     * 仅有有一台相机是活动状态 更新状态
+     * type     相机类型,1八目,2双目,不传默认八目 9:转台相机 10:激光 5:第三方相机
+     * id       id
+     * state    状态
+     * @return
+     */
+    @GetMapping(value = "/manager/goods/version/update/{id}/{status}/{type}")
+    public String updateStatus(@PathVariable("id") Long id,
+                               @PathVariable("status") String status,
+                               @PathVariable("type") String type) throws Exception{
+        return cameraVersionService.updateStatus(id, StringUtils.upperCase(status),type);
+    }
+
+    /**
+     * 搜索查询
+     * type     相机类型,1八目,2双目,不传默认八目
+     * pageNum         页码
+     * pageSize         页大小
+     * startDate    开始时间
+     * endDate      结束时间
+     * itemName     项目名称
+     * @return
+     */
+    @PostMapping("/manager/goods/version/search")
+    public Page<CameraVersion> searchLike(@RequestBody RequestSearch param) throws Exception{
+        return cameraVersionService.searchLike(param);
+    }
+
+    /**
+     * 上传文件
+     * type     相机类型,1八目,2双目,不传默认八目
+     * file       文件流
+     * version    版本
+     * description  描述
+     * @return
+     */
+    @PostMapping(value = "/manager/goods/version/upload", consumes = { "multipart/form-data" })
+    public String upload(@RequestParam("file") MultipartFile file,
+                         @RequestParam("version") String version,
+                         @RequestParam("description") String description,
+                         @RequestParam("minVersion") String minVersion,
+                         @RequestParam("type") String type) {
+        try {
+           return cameraVersionService.upload(file,version,description,minVersion,type);
+        }catch (Exception e){
+            return ErrorCode.ERROR_MSG.message();
+        }
+    }
+    /**
+     * 给硬件部接口,不需要拦截 获取激活的相机
+     * type     相机类型,相机类型,1八目,2双目, 9转台双目, 10激光转台
+     * @return
+     */
+    @GetMapping("/goods/version/enabled")
+    public CameraVersion getEnabledCameraVersion(
+                                         @RequestParam("type") String type) throws Exception{
+        return cameraVersionService.getByType(type);
+    }
+    /**
+     * 更新imageVersion 不需要拦截
+     * @return
+     */
+    @RequestMapping(value = {"/updateimageVersion"}, method = RequestMethod.GET)
+    public int updateImageVersion(
+            @RequestParam("num") String num) throws Exception{
+        return cameraVersionService.updateImageVersion(num);
+    }
+
+}

+ 1 - 1
4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/mapper/ICameraVersionMapper.java

@@ -1,7 +1,7 @@
 package com.fdkankan.platform.goods.mapper;
 
-import com.fdkankan.platform.goods.entity.CameraVersion;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.platform.goods.entity.CameraVersion;
 import org.apache.ibatis.annotations.Mapper;
 
 /**

+ 2 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/service/ICameraDetailService.java

@@ -50,4 +50,6 @@ public interface ICameraDetailService extends IService<CameraDetail> {
     CameraDetail updateCameraDetailByCameraIdAndSpace(Long cameraId, Long space);
 
     Long getSumBalanceByUserId(Long userId);
+
+    boolean updateCameraBalance(Long cameraId, int body, Integer points);
 }

+ 8 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/service/ICameraSpaceService.java

@@ -2,6 +2,7 @@ package com.fdkankan.platform.goods.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fdkankan.platform.goods.entity.CameraSpace;
+import com.fdkankan.platform.order.entity.ExpansionOrder;
 import com.fdkankan.platform.user.vo.ResponseCameraSpace;
 
 import java.util.List;
@@ -17,5 +18,12 @@ import java.util.List;
 public interface ICameraSpaceService extends IService<CameraSpace> {
 
     List<CameraSpace> getListByCameraId(Long cameraId);
+
     List<ResponseCameraSpace> getVoListByCameraId(Long cameraId);
+
+    CameraSpace getByUserIdAndCameraId(Long userId, Long cameraId);
+
+    void removeByCameraId(Long cameraId);
+
+    CameraSpace saveByExpansionOrder(ExpansionOrder expansionOrder);
 }

+ 14 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/service/ICameraVersionService.java

@@ -1,7 +1,10 @@
 package com.fdkankan.platform.goods.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.platform.agent.request.RequestSearch;
 import com.fdkankan.platform.goods.entity.CameraVersion;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * <p>
@@ -13,4 +16,15 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface ICameraVersionService extends IService<CameraVersion> {
 
+    Page<CameraVersion> getPageByType(Integer pageNum, Integer pageSize, String type);
+
+    String updateStatus(Long id, String upperCase, String type);
+
+    Page<CameraVersion> searchLike(RequestSearch param);
+
+    String upload(MultipartFile file, String version, String description, String minVersion, String type) throws Exception;
+
+    CameraVersion getByType(String type);
+
+    int updateImageVersion(String num);
 }

+ 26 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/service/IDeviceService.java

@@ -0,0 +1,26 @@
+package com.fdkankan.platform.goods.service;
+
+
+import com.fdkankan.platform.goods.entity.Camera;
+import com.fdkankan.platform.goods.vo.ResponseCameraApp;
+import com.fdkankan.platform.user.request.RequestCamera;
+import com.fdkankan.platform.user.vo.ResponseCamera;
+
+public interface IDeviceService {
+
+    ResponseCamera getCameraDetail(Long cameraId) throws Exception;
+
+    String bindCamera(RequestCamera camera) throws Exception;
+
+    ResponseCameraApp bindProCamera(RequestCamera camera) throws Exception;
+
+    String getScenes(RequestCamera param) throws Exception;
+
+    String deleteScene(String sceneNum) throws Exception;
+
+    Camera findByChildNameAndChildPassword(String appUserName, String appPassword) throws Exception;
+
+    String unbind(RequestCamera camera) throws Exception;
+
+    String unbindPro(RequestCamera camera) throws Exception;
+}

+ 13 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/service/impl/CameraDetailServiceImpl.java

@@ -396,4 +396,17 @@ public class CameraDetailServiceImpl extends ServiceImpl<ICameraDetailMapper, Ca
     public Long getSumBalanceByUserId(Long userId) {
         return cameraDetailMapper.getSumBalanceByUserId(userId);
     }
+
+    @Override
+    public boolean updateCameraBalance(Long cameraId, int body, Integer points) {
+        CameraDetail detailEntity = this.getByCameraId(cameraId);
+        int sub = Integer.parseInt(detailEntity.getBalance());
+        if (0 == body){
+            sub += points;
+        }else if (-2 == body){
+            sub -= points;
+        }
+        detailEntity.setBalance(String.valueOf(sub));
+        return this.updateById(detailEntity);
+    }
 }

+ 43 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/service/impl/CameraSpaceServiceImpl.java

@@ -5,10 +5,13 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fdkankan.platform.goods.entity.CameraSpace;
 import com.fdkankan.platform.goods.mapper.ICameraSpaceMapper;
 import com.fdkankan.platform.goods.service.ICameraSpaceService;
+import com.fdkankan.platform.order.entity.ExpansionOrder;
 import com.fdkankan.platform.user.vo.ResponseCameraSpace;
+import org.joda.time.DateTime;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -36,4 +39,44 @@ public class CameraSpaceServiceImpl extends ServiceImpl<ICameraSpaceMapper, Came
     public List<ResponseCameraSpace> getVoListByCameraId(Long cameraId) {
         return cameraSpaceMapper.getVoListByCameraId(cameraId);
     }
+
+    @Override
+    public CameraSpace getByUserIdAndCameraId(Long userId, Long cameraId) {
+        QueryWrapper<CameraSpace> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(CameraSpace::getUserId,userId)
+                .eq(CameraSpace::getCameraId,cameraId)
+                .eq(CameraSpace::getSpaceType,1);
+        List<CameraSpace> list = this.list(queryWrapper);
+        if(list == null || list.size() <= 0){
+            return null;
+        }
+        return list.get(0);
+    }
+
+    @Override
+    public void removeByCameraId(Long cameraId) {
+        QueryWrapper<CameraSpace> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(CameraSpace::getCameraId,cameraId);
+        this.remove(queryWrapper);
+    }
+
+    @Override
+    public CameraSpace saveByExpansionOrder(ExpansionOrder expansionOrder) {
+        CameraSpace cameraSpaceEntity = new CameraSpace();
+        DateTime date = null;
+        if(expansionOrder.getMonth() == 12){
+            date = new DateTime().plusYears(1).plusDays(expansionOrder.getDelay());
+        }else {
+            date = new DateTime().plusDays(expansionOrder.getMonth() * 31).plusDays(expansionOrder.getDelay());
+        }
+        cameraSpaceEntity.setUserId(expansionOrder.getUserId());
+        cameraSpaceEntity.setOrderSn(expansionOrder.getOrderSn());
+        cameraSpaceEntity.setCameraId(expansionOrder.getCameraId());
+        cameraSpaceEntity.setSpace(0L);
+        cameraSpaceEntity.setSpaceType(2);
+        cameraSpaceEntity.setSpaceStartTime(new Date());
+        cameraSpaceEntity.setSpaceEndTime(date.toDate());
+        this.save(cameraSpaceEntity);
+        return cameraSpaceEntity;
+    }
 }

+ 150 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/service/impl/CameraVersionServiceImpl.java

@@ -1,12 +1,32 @@
 package com.fdkankan.platform.goods.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.constant.ServerCode;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.common.util.FileMd5Util;
+import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.common.validation.ValidationUtils;
+import com.fdkankan.fyun.oss.UploadToOssUtil;
+import com.fdkankan.platform.agent.request.RequestSearch;
+import com.fdkankan.platform.goods.common.UploadPath;
 import com.fdkankan.platform.goods.entity.CameraVersion;
 import com.fdkankan.platform.goods.mapper.ICameraVersionMapper;
 import com.fdkankan.platform.goods.service.ICameraVersionService;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.util.Base64;
+import java.util.List;
 
 /**
  * <p>
@@ -21,5 +41,135 @@ public class CameraVersionServiceImpl extends ServiceImpl<ICameraVersionMapper,
 
     private static Logger log = LoggerFactory.getLogger("programLog");
 
+    @Value("${oss.type}")
+    private String ossType;
+    @Value("${prefix.ali}")
+    private String prefixAli;
+    @Resource
+    private UploadToOssUtil uploadToOssUtil;
+
+    private LambdaQueryWrapper<CameraVersion> getQueryByType(String type){
+        LambdaQueryWrapper<CameraVersion> queryWrapper = new LambdaQueryWrapper<>();
+        String cameraType = StringUtils.isNotBlank(type) ? type : "1";
+        queryWrapper.eq(CameraVersion::getCameraType,cameraType)
+                .orderByDesc(CameraVersion::getCreateTime);
+        return queryWrapper;
+    }
+
+    @Override
+    public Page<CameraVersion> getPageByType(Integer pageNum, Integer pageSize, String type) {
+        return this.page(new Page<>(pageNum, pageSize), getQueryByType(type));
+    }
+
+    @Override
+    public String updateStatus(Long id, String status, String type) {
+        CameraVersion cameraVersion = this.getById(id);
+        if(cameraVersion == null){
+            throw new BusinessException(ErrorCode.NOT_RECORD);
+        }
+        if (!ValidationUtils.validateRecStatus(status)) {
+            throw new BusinessException(ErrorCode.ERROR_MSG);
+        }
+        // 仅有有一台相机是活动状态
+        // 查找所以活动状态相机
+        String cameraType = StringUtils.isNotBlank(type) ? type : "1";
+        LambdaUpdateWrapper<CameraVersion> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(CameraVersion::getAcStatus,"I")
+                .eq(CameraVersion::getAcStatus,"A")
+                .eq(CameraVersion::getCameraType,cameraType);
+        this.update(updateWrapper);
+
+        cameraVersion.setAcStatus(status);
+        if(!this.updateById(cameraVersion)){
+            throw new BusinessException(ErrorCode.ERROR_MSG);
+        }
+        return ServerCode.SUCCESS.message();
+    }
+
+    @Override
+    public Page<CameraVersion> searchLike(RequestSearch param) {
+        String cameraType = StringUtils.isNotBlank(param.getType()) ? param.getType() : "1";
+        LambdaQueryWrapper<CameraVersion> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(CameraVersion::getCameraType,cameraType);
+        if(param.getStartDate()!=null){
+            queryWrapper.ge(CameraVersion::getCreateTime,param.getStartDate());
+        }
+        if(param.getStartDate()!=null){
+            queryWrapper.le(CameraVersion::getCreateTime,param.getEndDate());
+        }
+        if (StringUtils.isNotBlank(param.getItemName())) {
+            queryWrapper.and(wrapper -> wrapper
+                    .like(CameraVersion::getFileName,param.getItemName())
+                    .or()
+                    .like(CameraVersion::getVersion,param.getItemName()));
+        }
+        queryWrapper.orderByDesc(CameraVersion::getCreateTime);
+
+        return this.page(new Page<>(param.getPageNum(), param.getPageSize()), queryWrapper);
+    }
+
+    @Override
+    public String upload(MultipartFile file, String version, String description, String minVersion, String type)throws Exception {
+        String cameraType = StringUtils.isNotBlank(type) ? type : "1";
+        log.info("run upload");
+        if (!file.isEmpty()&& file.getSize() <= 0) {
+            throw new BusinessException(ErrorCode.FILE_NOT_EXIST);
+        }
+        // 文件名全名
+        String fullFileName = file.getOriginalFilename();
+        // 将文件转字节-> 字符串
+        String fileContent = Base64.getEncoder().encodeToString(file.getBytes());
+        // 获取类路径
+        String resourcePath = FileUtils.getResource();
+        log.info("resourcePath: {}", resourcePath);
+        // 创建目录
+        String dirPath = resourcePath + UploadPath.DIR_NAME;
+        FileUtils.createDir(dirPath);
+        // 拼接唯一文件名
+        String fileName = UploadPath.dateStr() + fullFileName;
+        // 文件保存路径
+        String filePath = dirPath + UploadPath.dateStr() + fullFileName;
+        // 写文件到本地
+        FileUtils.base64ToFileWriter(fileContent, filePath);
+        log.info("filePath: {}", filePath);
+        // 上传到阿里云sso
+        uploadToOssUtil.upload(filePath, UploadPath.DIR_NAME + fileName);
+        log.info("upload success");
+        String url = prefixAli + UploadPath.ALIYUN_SSO_PATH + fileName;
+        if("s3".equals(ossType)){
+            url = UploadPath.YAMAXUN_S3_PATH + fileName;
+        }
+        log.info("upload url: {}" + url);
+        // 添加对象信息
+        CameraVersion versionEntity = new CameraVersion();
+        versionEntity.setFileName(fileName);
+        versionEntity.setFileUrl(url);
+        versionEntity.setVersion(version);
+        versionEntity.setDescription(description);
+        versionEntity.setCameraType(Integer.parseInt(cameraType));
+        versionEntity.setMinVersion(minVersion);
+        versionEntity.setAcStatus("I");
+        versionEntity.setFileMd5(FileMd5Util.getFileMD5(new File(filePath)));
+        this.save(versionEntity);
+        // 删除本地文件
+        FileUtils.deleteFile(filePath);
+        return ServerCode.SUCCESS.message();
+    }
+
+    @Override
+    public CameraVersion getByType(String type) {
+        List<CameraVersion> list = this.list(getQueryByType(type).eq(CameraVersion::getRecStatus, "A"));
+        if(list == null || list.size() <= 0){
+            return null;
+        }
+        return list.get(0);
+    }
 
+    @Override
+    public int updateImageVersion(String num) {
+        //    @Update("UPDATE t_scene_pro_edit SET images_version = images_version + 1
+        //    WHERE pro_id = (SELECT id FROM t_scene_pro WHERE num=#{num} and rec_status = 'A' ) ")
+        // TODO: 2022/1/12
+        return 1;
+    }
 }

+ 251 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/service/impl/DeviceServiceImpl.java

@@ -0,0 +1,251 @@
+package com.fdkankan.platform.goods.service.impl;
+
+import com.fdkankan.common.constant.AppConstant;
+import com.fdkankan.common.constant.CameraConstant;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.constant.ServerCode;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.common.util.FileSizeUtil;
+import com.fdkankan.platform.goods.entity.Camera;
+import com.fdkankan.platform.goods.entity.CameraDetail;
+import com.fdkankan.platform.goods.service.ICameraDetailService;
+import com.fdkankan.platform.goods.service.ICameraService;
+import com.fdkankan.platform.goods.service.IDeviceService;
+import com.fdkankan.platform.goods.vo.ResponseCameraApp;
+import com.fdkankan.platform.user.entity.User;
+import com.fdkankan.platform.user.entity.UserIncrement;
+import com.fdkankan.platform.user.request.RequestCamera;
+import com.fdkankan.platform.user.service.IUserIncrementService;
+import com.fdkankan.platform.user.service.IUserService;
+import com.fdkankan.platform.user.vo.ResponseCamera;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service("deviceService")
+@Transactional
+public class DeviceServiceImpl implements IDeviceService {
+
+    @Autowired
+    private IUserService userService;
+    @Autowired
+    private ICameraDetailService cameraDetailService;
+    @Autowired
+    private ICameraService cameraService;
+
+    @Autowired
+    private IUserIncrementService userIncrementService;
+
+    @Override
+    public ResponseCamera getCameraDetail(Long cameraId) throws Exception {
+        ResponseCamera vo = null;
+        Camera cameraEntity = cameraService.getById(cameraId);
+        if (cameraEntity != null){
+            CameraDetail cameraDetailEntity = cameraDetailService.getByCameraId(cameraId);
+            User user = userService.getById(cameraDetailEntity.getUserId());
+            vo = new ResponseCamera();
+            vo.setId(cameraEntity.getId());
+            vo.setActivatedTime(cameraEntity.getActivatedTime());
+            vo.setBalance(cameraDetailEntity.getBalance());
+            vo.setChildName(cameraEntity.getChildName());
+            vo.setUserName(user == null ? null : user.getUserName());
+        }
+        return vo;
+    }
+
+    /**
+     *
+     * @param camera
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public String bindCamera(RequestCamera camera)  throws Exception{
+        User userEntity = userService.getUserByUserName(camera.getUserName());
+        if (userEntity == null){
+            throw new BusinessException(AppConstant.FAILURE_CODE_4007, AppConstant.FAILURE_MSG_4007);
+        }
+        Camera cameraEntity = cameraService.getByChildName(camera.getChildName());
+        if (cameraEntity == null){
+            throw new BusinessException(AppConstant.FAILURE_CODE_4010, AppConstant.FAILURE_MSG_4010);
+        }
+        CameraDetail cameraDetailEntity = cameraDetailService.getByCameraId(cameraEntity.getId());
+        if (/*cameraDetailEntity.getGoodsId() == 4 && */cameraDetailEntity.getUserId() != null){
+            // 八目相机只能绑定一人,不能重复绑定
+            throw new BusinessException(CameraConstant.FAILURE_6006);
+        }
+        cameraDetailService.bind(cameraEntity.getId(), userEntity.getId());
+
+        if (cameraDetailEntity.getCameraType() == 0){
+            //result = sceneService.updateUserIdByCameraId(null, cameraEntity.getId());
+            //todo updateUserIdByCameraId
+        }else {
+            //result = sceneService.updateUserIdByCameraIdPro(null, cameraEntity.getId());
+        }
+        return ServerCode.SUCCESS.message();
+    }
+
+    @Override
+    public ResponseCameraApp bindProCamera(RequestCamera camera) throws Exception {
+        User userEntity = userService.getUserByUserName(camera.getUserName());
+        if (userEntity == null){
+            throw new BusinessException(AppConstant.FAILURE_CODE_4007, AppConstant.FAILURE_MSG_4007);
+        }
+        Camera cameraEntity = null;
+        if(camera.getChildName() != null){
+            cameraEntity = cameraService.getByChildName(camera.getChildName());
+        }
+        if(camera.getSnCode() != null){
+            cameraEntity = cameraService.getBySnCode(camera.getSnCode());
+        }
+        if (cameraEntity == null){
+            throw new BusinessException(AppConstant.FAILURE_CODE_4010, AppConstant.FAILURE_MSG_4010);
+        }
+        CameraDetail cameraDetailEntity = cameraDetailService.getByCameraId(cameraEntity.getId());
+        if (cameraDetailEntity.getUserId() != null){
+            throw new BusinessException(CameraConstant.FAILURE_6006);
+        }
+
+        if(camera.getCameraType() == null){
+            camera.setCameraType(4);
+        }
+        if(camera.getCameraType().longValue() != cameraDetailEntity.getGoodsId()){
+            throw new BusinessException(CameraConstant.FAILURE_6005);
+        }
+
+        cameraDetailService.bind(cameraEntity.getId(), userEntity.getId());
+//        Result result = sceneService.updateUserIdByCameraIdPro(userEntity.getId(), cameraEntity.getId());
+//        if (result.getCode() == Result.CODE_FAILURE){
+//            throw new Exception(LoginConstant.ERROR_MSG);
+//        }
+        //todo updateUserIdByCameraIdPro
+
+        ResponseCameraApp responseCamera = new ResponseCameraApp();
+        responseCamera.setChildName(cameraEntity.getChildName());
+
+        responseCamera.setUsedSpace(cameraDetailEntity.getUsedSpace());
+        responseCamera.setTotalSpace(cameraDetailEntity.getTotalSpace());
+        responseCamera.setUsedSpaceStr(FileSizeUtil.formatFileSize(cameraDetailEntity.getUsedSpace()));
+        responseCamera.setTotalSpaceStr(FileSizeUtil.formatFileSize(cameraDetailEntity.getTotalSpace()));
+        return responseCamera;
+    }
+
+    @Override
+    public String getScenes(RequestCamera param) throws Exception {
+       // return sceneService.findScenesPagerByCondition(param, "create_time desc");
+        //todo findScenesPagerByCondition
+        return ServerCode.SUCCESS.message();
+    }
+
+    @Override
+    public String deleteScene(String sceneNum) throws Exception {
+//        Result result = sceneService.deleteScene(sceneNum);
+//        if (result.getCode() == Result.CODE_FAILURE){
+//            throw new Exception(LoginConstant.ERROR_MSG);
+//        }
+        //todo deleteScene
+        return ServerCode.SUCCESS.message();
+    }
+
+    @Override
+    public Camera findByChildNameAndChildPassword(String appUserName, String appPassword) throws Exception{
+        Camera dbCameraEntity = cameraService.getByChildName(appUserName);
+        if (dbCameraEntity == null){
+            throw new BusinessException(CameraConstant.FAILURE_6003);
+        }
+        if(!appPassword.equals(dbCameraEntity.getChildPassword())){
+            throw new BusinessException(ErrorCode.PASSWORD_ERROR);
+        }
+        return dbCameraEntity;
+    }
+    @Override
+    public String unbind(RequestCamera camera) throws Exception {
+        Camera cameraEntity = cameraService.getByChildName(camera.getChildName());
+        if (cameraEntity == null){
+            throw new BusinessException(AppConstant.FAILURE_CODE_4010, AppConstant.FAILURE_MSG_4010);
+        }
+        CameraDetail detailEntity = cameraDetailService.getByCameraId(cameraEntity.getId());
+        if(detailEntity == null){
+            throw new BusinessException(AppConstant.FAILURE_CODE_4010, AppConstant.FAILURE_MSG_4010);
+        }
+        User  userEntity = userService.getUserByUserName(camera.getUserName());
+        if(userEntity == null){
+            throw new BusinessException(ErrorCode.USER_NOT_EXIST);
+        }
+        if(userEntity.getId().longValue() != detailEntity.getUserId().longValue()){
+            throw new BusinessException(CameraConstant.FAILURE_6003);
+        }
+        cameraDetailService.unbind(cameraEntity.getId());
+
+        //相机解除绑定,一并解除权益绑定
+        UserIncrement userIncrementEntity = userIncrementService.getByCameraId(cameraEntity.getId());
+        if(userIncrementEntity != null){
+            userIncrementService.unbindCamera(detailEntity.getUserId(), userIncrementEntity.getId(), true,detailEntity,userIncrementEntity);
+        }
+//        Result result = null;
+//        if (detailEntity.getType() == 0){
+//            result = sceneService.updateUserIdByCameraId(null, cameraEntity.getId());
+//        }else {
+//            result = sceneService.updateUserIdByCameraIdPro(null, cameraEntity.getId());
+//        }
+//        if (result.getCode() == Result.CODE_FAILURE){
+//            throw new Exception(LoginConstant.ERROR_MSG);
+//        }
+//  todo updateUserIdByCameraId
+        //删除所有相机协作信息
+//        if(detailEntity.getCooperationUser() != null){
+            camera.setCameraId(cameraEntity.getId());
+            userService.deleteCooperationUser(camera,detailEntity);
+//        }
+        return ServerCode.SUCCESS.message();
+    }
+
+    @Override
+    public String unbindPro(RequestCamera camera) throws Exception {
+        Camera cameraEntity = cameraService.getByChildName(camera.getChildName());
+        if (cameraEntity == null){
+            throw new BusinessException(AppConstant.FAILURE_CODE_4010, AppConstant.FAILURE_MSG_4010);
+        }
+        CameraDetail detailEntity = cameraDetailService.getByCameraId(cameraEntity.getId());
+        if(detailEntity == null){
+            throw new BusinessException(AppConstant.FAILURE_CODE_4010, AppConstant.FAILURE_MSG_4010);
+        }
+        User userEntity = userService.getUserByUserName(camera.getUserName());
+        if(userEntity == null){
+            throw new BusinessException(ErrorCode.USER_NOT_EXIST);
+        }
+        if(userEntity.getId().longValue() != detailEntity.getUserId().longValue()){
+            throw new BusinessException(CameraConstant.FAILURE_6005);
+        }
+
+        if(camera.getCameraType() == null){
+            camera.setCameraType(4);
+        }
+        if(camera.getCameraType().longValue() != detailEntity.getGoodsId()){
+            throw new BusinessException(CameraConstant.FAILURE_6005);
+        }
+
+        cameraDetailService.unbind(cameraEntity.getId());
+
+        //相机解除绑定,一并解除权益绑定
+        UserIncrement userIncrementEntity = userIncrementService.getByCameraId(cameraEntity.getId());
+        if(userIncrementEntity != null){
+            userIncrementService.unbindCamera(detailEntity.getUserId(), userIncrementEntity.getId(), true,detailEntity,userIncrementEntity);
+        }
+
+//        Result result = sceneService.updateUserIdByCameraIdPro(null, cameraEntity.getId());
+//        if (result.getCode() == Result.CODE_FAILURE){
+//            throw new Exception(LoginConstant.ERROR_MSG);
+//        }
+        //todo updateUserIdByCameraIdPro
+
+        //删除所有相机协作信息
+//        if(detailEntity.getCooperationUser() != null){
+            camera.setCameraId(cameraEntity.getId());
+            userService.deleteCooperationUser(camera,detailEntity);
+//        }
+        return ServerCode.SUCCESS.message();
+    }
+
+
+}

+ 83 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/goods/vo/ResponseCameraApp.java

@@ -0,0 +1,83 @@
+package com.fdkankan.platform.goods.vo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class ResponseCameraApp extends ResponseGoods {
+
+    //(value = "用户ID", name = "userId")
+    private Long userId;
+
+    //(value = "用户名", name = "userName")
+    private String userName;
+
+    //(value = "激活时间", name = "activatedTime")
+    private Date activatedTime;
+
+    //(value = "相机的Mac地址", name = "childName")
+    private String childName;
+
+    //(value = "订单号", name = "orderSn")
+    private String orderSn;
+
+    //(value = "余额", name = "balance")
+    private String balance;
+
+    //(value = "相机类型的id", name = "goodsId")
+    private Long goodsId;
+
+    //(value = "相机拥有者类型", name = "own")
+    private Integer own;
+
+    //(value = "wifi名称", name = "wifiName")
+    private String wifiName;
+
+    //(value = "wifi密码", name = "wifiPassword")
+    private String wifiPassword;
+
+    /**
+     * 商品名称
+     */
+    //(value = "商品名称", name = "name")
+    private String name;
+
+    /**
+     * 商品图片
+     */
+    //(value = "商品图片", name = "imageUrl")
+    private String imageUrl;
+    /**
+     * 商品图片2
+     */
+    //(value = "商品图片2", name = "pic")
+    private String pic;
+
+    /**
+     * 相机类型,0表示双目,1表示专业八目,2表示商业八目,3表示企业八目
+     */
+    //(value = "相机类型,0表示双目,1表示专业八目,2表示商业八目,3表示企业八目", name = "type")
+    private int type;
+
+    //(value = "总场景数", name = "sceneCount")
+    private int sceneCount;
+
+    //(value = "总容量", name = "totalSpace")
+    private Long totalSpace;
+
+    //(value = "已使用容量", name = "usedSpace")
+    private Long usedSpace;
+
+    private String snCode;
+
+    private String usedSpaceStr;
+
+    private String totalSpaceStr;
+
+    private Long cooperationUser;
+
+    private Long userIncrementId;
+
+    private Integer isExpire;
+}

+ 119 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/controller/pay/OrderAlipayController.java

@@ -0,0 +1,119 @@
+package com.fdkankan.platform.order.controller.pay;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alipay.api.internal.util.AlipaySignature;
+import com.fdkankan.common.controller.BaseController;
+import com.fdkankan.pay.alipay.AlipayDefaultConfig;
+import com.fdkankan.platform.order.request.RequestPlaceOrder;
+import com.fdkankan.platform.user.factory.PayFactory;
+import com.fdkankan.platform.user.strategy.OrderStrategyFactory;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+
+/**
+ * 支付中心-支付宝支付模块
+ */
+@Log4j2
+@RestController
+@RequestMapping("/api/order/pay")
+public class OrderAlipayController extends BaseController {
+    @Autowired
+    private AlipayDefaultConfig alipayDefaultConfig;
+    @Autowired
+    private OrderStrategyFactory orderStrategyFactory;
+    @Autowired
+    private PayFactory payFactory;
+
+    /**
+     * 支付宝付款
+     * orderId      订单id
+     * orderType    订单类型,0购买相机,1点数重置,2扩容,3商业版,4增值服务,5场景下载
+     * spaceId      0表示国内订单,1表示国外订单
+     */
+    @RequestMapping(value = "/alipay", method = RequestMethod.POST)
+    public JSONObject alipay(@RequestBody RequestPlaceOrder order) throws Exception {
+        return payFactory.scanPay("alipay", order);
+    }
+
+    /**
+     * 支付宝H5付款
+     * orderId          订单id
+     * orderType        订单类型,0购买相机,1点数重置,2扩容,3商业版,4增值服务,5场景下载
+     * spaceId          0表示国内订单,1表示国外订单
+     * @return
+     */
+    @RequestMapping(value = "/aliMobilePay", method = RequestMethod.POST)
+    public JSONObject aliMobilePay(@RequestBody RequestPlaceOrder order) throws Exception {
+        return payFactory.h5Pay("alipay", order, null);
+    }
+
+    /**
+     * 支付宝异步回调
+     */
+    @RequestMapping(value = "/alipay/async_notify", method = RequestMethod.POST)
+    public String async_notify() {
+        //获取支付宝POST过来反馈信息
+        Map<String, String> params = new HashMap<String, String>();
+        Map<String, String[]> requestParams = request.getParameterMap();
+        for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
+            String name = (String) iter.next();
+            String[] values = (String[]) requestParams.get(name);
+            String valueStr = "";
+            for (int i = 0; i < values.length; i++) {
+                valueStr = (i == values.length - 1) ? valueStr + values[i]
+                        : valueStr + values[i] + ",";
+            }
+            //乱码解决,这段代码在出现乱码时使用
+            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
+            params.put(name, valueStr);
+        }
+        //调用SDK验证签名
+        try {
+            boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayDefaultConfig.getAlipayPublicKey(), alipayDefaultConfig.getCharset(), alipayDefaultConfig.getSignType());
+            if (signVerified) {
+                log.info("支付宝回调签名认证成功");
+                //商户订单号
+                String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
+                //支付宝交易号
+                String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
+                //交易状态
+                String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
+                //交易body
+                String body = new String(request.getParameter("body").getBytes("ISO-8859-1"), "UTF-8");
+                log.info("支付宝回调返回body:" + body);
+                //付款金额
+//                String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8");
+                String openid = new String(request.getParameter("seller_id").getBytes("ISO-8859-1"),"UTF-8");
+                String orderSn = out_trade_no.split("_")[0];
+                if(body.split("_").length == 2){
+                    orderSn += "_" + body.split("_")[1];
+                }
+                if ("TRADE_FINISHED".equals(trade_status)){
+                    log.warn("支付宝——交易结束了!" + out_trade_no);
+                }else if ("TRADE_SUCCESS".equals(trade_status)){
+                    orderStrategyFactory.doHandler(orderSn, trade_no, openid, out_trade_no.split("_")[1], 1);
+                }else {
+                    log.error("订单号:" + orderSn + "支付宝回调交易状态异常:" + trade_status);
+                }
+                return "success";
+            }else{
+                log.warn("支付宝回调签名认证失败,signVerified=false, paramsJson:{}", JSON.toJSONString(params));
+                return "failure";
+            }
+        } catch (Exception e) {
+            log.error("支付宝回调签名认证失败,paramsJson:{},errorMsg:{}", JSON.toJSONString(params), e.getMessage());
+            return "failure";
+        }
+    }
+
+}

+ 264 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/controller/pay/OrderPaypalController.java

@@ -0,0 +1,264 @@
+package com.fdkankan.platform.order.controller.pay;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.controller.BaseController;
+import com.fdkankan.pay.paypal.PayPalDefaultConfig;
+import com.fdkankan.pay.paypal.sdk.PaypalService;
+import com.fdkankan.platform.order.request.RequestPlaceOrder;
+import com.fdkankan.platform.user.factory.PayFactory;
+import com.fdkankan.platform.user.strategy.OrderStrategyFactory;
+import com.paypal.api.payments.Payment;
+import com.paypal.base.rest.PayPalRESTException;
+import lombok.extern.log4j.Log4j2;
+import okhttp3.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Enumeration;
+
+/**
+ * 支付中心-paypal支付模块
+ */
+@Log4j2
+@Controller
+@RequestMapping("/api/order/pay")
+public class OrderPaypalController extends BaseController {
+
+    @Autowired
+    private OrderStrategyFactory orderStrategyFactory;
+    @Autowired
+    private PayFactory payFactory;
+    @Autowired
+    private PaypalService paypalService;
+    @Autowired
+    private PayPalDefaultConfig config;
+
+    @Value("${main.url}")
+    private String mainUrl;
+
+    /**
+     * Paypal付款
+     * orderId      订单id
+     * orderType    订单类型,0购买相机,1点数重置,2扩容,3商业版,4增值服务,5场景下载
+     * spaceId      0表示国内订单,1表示国外订单
+     */
+    @RequestMapping(value = "/paypal", method = RequestMethod.POST)
+    public String paypal(@RequestBody RequestPlaceOrder order) throws Exception {
+
+        JSONObject jsonObject = payFactory.scanPay("paypal", order);
+        if (jsonObject != null && jsonObject.get("redirect") != null){
+            return "redirect:" + jsonObject.getString("redirect");
+        }
+        return  "redirect:" + mainUrl + config.getFailUrl();
+    }
+
+    /**
+     * Paypal付款
+     * orderId      订单id
+     * orderType    订单类型,0购买相机,1点数重置,2扩容,3商业版,4增值服务,5场景下载
+     * spaceId      0表示国内订单,1表示国外订单
+     */
+    @RequestMapping(value = "/paypalH5", method = RequestMethod.POST)
+    public String paypalH5(RequestPlaceOrder order) throws Exception {
+        JSONObject jsonObject = payFactory.h5Pay("paypal", order, null);
+        if (jsonObject != null && jsonObject.get("redirect") != null){
+            return "redirect:" + jsonObject.getString("redirect");
+        }
+        return  "redirect:" + mainUrl + config.getH5FailUrl();
+    }
+
+    /**
+     * 支付成功 Paypal支付通知
+     * @param paymentId
+     * @param payerId
+     * @return
+     */
+    @RequestMapping(value = "/paypal/callback", method = RequestMethod.GET)
+    public String successPay(@RequestParam("paymentId") String paymentId,
+                             @RequestParam("PayerID") String payerId) {
+        try {
+            log.warn("=====paypal支付回调=====\npaymentId:"+paymentId+"\npayerId:"+payerId);
+            Payment payment = paypalService.executePayment(paymentId, payerId);
+            if (payment.getState().equals("approved")) {
+                log.info("paypal支付成功回调");
+                String custom = payment.getTransactions().get(0).getCustom();
+                String txnId = payment.getTransactions().get(0).getRelatedResources().get(0).getSale().getId();
+                String payerEmail  = payment.getTransactions().get(0).getPayee().getEmail();
+                log.warn("=====custom:"+custom+"\ntxnId:"+txnId+"\npayerEmail:"+payerEmail);
+
+                String orderSn = custom.split("_")[0];
+                if(custom.split("_").length > 2 && custom.split("_")[2].matches("^-?[0-9]+")){
+                    orderSn += "_" + custom.split("_")[2];
+                }
+                orderStrategyFactory.doHandler(orderSn, txnId, payerEmail, custom.split("_")[1], 2);
+                return "redirect:" + mainUrl + config.getSuccessUrl();
+            }
+        } catch (PayPalRESTException e) {
+            log.error(e.getMessage());
+        } catch (Exception e) {
+            log.error("paypal支付回调异常,errorMsg:{}", e.getMessage());
+        }
+        return "redirect:" + mainUrl + config.getFailUrl();
+    }
+
+    /**
+     * 支付成功 PaypalH5支付通知
+     * @param paymentId
+     * @param payerId
+     * @return
+     */
+    @RequestMapping(value = "/paypal/callbackH5", method = RequestMethod.GET)
+    public String successPayH5(@RequestParam("paymentId") String paymentId,
+                             @RequestParam("PayerID") String payerId) {
+        try {
+            log.warn("=====paypal支付回调=====\npaymentId:"+paymentId+"\npayerId:"+payerId);
+            Payment payment = paypalService.executePayment(paymentId, payerId);
+            if (payment.getState().equals("approved")) {
+                log.info("paypal支付成功回调");
+                String custom = payment.getTransactions().get(0).getCustom();
+                String txnId = payment.getTransactions().get(0).getRelatedResources().get(0).getSale().getId();
+                String payerEmail  = payment.getTransactions().get(0).getPayee().getEmail();
+                log.warn("=====custom:"+custom+"\ntxnId:"+txnId+"\npayerEmail:"+payerEmail);
+                String orderSn = custom.split("_")[0];
+                if(custom.split("_").length > 2 && custom.split("_")[2].matches("^-?[0-9]+")){
+                    orderSn += "_" + custom.split("_")[2];
+                }
+                orderStrategyFactory.doHandler(orderSn, txnId, payerEmail, custom.split("_")[1], 2);
+                return "redirect:" + mainUrl + config.getH5SuccessUrl();
+            }
+        } catch (PayPalRESTException e) {
+            log.error(e.getMessage());
+        } catch (Exception e) {
+            log.error("paypal支付回调异常,errorMsg:{}", e.getMessage());
+        }
+        return "redirect:" + mainUrl + config.getH5FailUrl();
+    }
+
+    /**
+     * Paypal取消支付
+     * @return
+     */
+    @RequestMapping(value = "/paypal/cancel", method = RequestMethod.GET)
+    public String cancelPay(){
+        return "redirect:" + mainUrl + config.getFailUrl();
+    }
+
+    /**
+     * PaypalH5取消支付
+     * @return
+     */
+    @RequestMapping(value = "/paypal/cancelH5", method = RequestMethod.GET)
+    public String cancelPayH5(){
+        return "redirect:" + mainUrl + config.getH5FailUrl();
+    }
+
+    /**
+     *  Paypal支付回调
+     *  Paypal的INP异步通知服务器, 需要修改Paypal官网即时付款通知IPN通告URL
+     */
+    @RequestMapping(value = "/paypal/notify", method = RequestMethod.POST)
+    public void callback() {
+        Enumeration en = request.getParameterNames();
+        String str = "cmd=_notify-validate";
+        while (en.hasMoreElements()) {
+            String paramName = (String) en.nextElement();
+            String paramValue = request.getParameter(paramName);
+            try {
+                str = str + "&" + paramName + "=" + URLEncoder.encode(paramValue, "utf-8");
+            } catch (UnsupportedEncodingException e) {
+                StringWriter trace=new StringWriter();
+                e.printStackTrace(new PrintWriter(trace));
+                log.error(trace.toString());
+            }
+            //此处的编码一定要和自己的网站编码一致,不然会出现乱码,paypal回复的通知为‘INVALID’
+        }
+        final String itemName = request.getParameter("item_name");//商品名
+        final String itemNumber = request.getParameter("item_number");//购买数量
+        final String paymentDate = request.getParameter("payment_date");//交易时间
+        final String receiverEmail = request.getParameter("receiver_email");//收款人email
+        final String payerEmail = request.getParameter("payer_email");//付款人email
+        final String paymentAmount = request.getParameter("mc_gross");//交易钱数
+        final String paymentCurrency = request.getParameter("mc_currency");//货币种类
+        final String paymentStatus = request.getParameter("payment_status");//交易状态
+        final String txnId = request.getParameter("txn_id");//交易id
+        String custom = request.getParameter("custom");//发送payment请求时候自定义的业务服务器订单号
+
+        log.info("itemName:"+itemName);
+        log.info("itemNumber:"+itemNumber);
+        log.info("paymentDate:"+paymentDate);
+        log.info("receiverEmail:"+receiverEmail);
+        log.info("payerEmail:"+payerEmail);
+        log.info("paymentAmount:"+paymentAmount);
+        log.info("paymentCurrency:"+paymentCurrency);
+        log.info("paymentStatus:"+paymentStatus);
+        log.info("txnId:"+txnId);
+        log.info("custom:"+custom);
+        String orderSn = custom.split("_")[0];
+        try {
+            //构建post请求给paypal,将信息 POST 回给 PayPal 进行验证
+            //String url = "https://www.sandbox.paypal.com/cgi-bin/webscr";//沙箱环境
+            //String url = new URL("https://www.paypal.com/cgi-bin/webscr");//正式环境
+            String url = "https://www.paypal.com/cgi-bin/webscr";//正式环境
+            //http框架用的是okhttp,okhttp也依赖okio的jar包
+            OkHttpClient client = new OkHttpClient();
+            okhttp3.RequestBody body = okhttp3.RequestBody.create(MediaType.parse("text/plain; charset=utf-8"), str);
+            Request req = new Request.Builder().post(body).url(url).build();
+            client.newCall(req).enqueue(new Callback() {
+                @Override
+                public void onFailure(Call arg0, IOException arg1) {
+                    log.error("构建post请求给paypal时候发生了错误:" + custom);
+                }
+                @Override
+                public void onResponse(Call arg0, Response arg1) throws IOException {
+                    String str = arg1.body().string();
+                    //验证通过
+                    if ("VERIFIED".equals(str)) {
+//	                    StringBuilder sb = new StringBuilder();
+//	                    sb.append("付款成功参数:itemName=").append(itemName).append(",itemNumber=").append(itemNumber).
+//	                    append("付款成功参数:paymentStatus=").append(paymentStatus).append(",paymentDate=").append(paymentDate).
+//	                    append("付款成功参数:paymentAmount=").append(paymentAmount).append(",paymentCurrency=").append(paymentCurrency).
+//	                    append("付款成功参数:txnId=").append(txnId).append(",receiverEmail=").append(receiverEmail).
+//	                    append("付款成功参数:payerEmail=").append(payerEmail);
+//	                    log.info(sb.toString());
+
+                        //1.确认“payment_status”为“Completed”,因为系统也会为其他结果(如“Pending”或“Failed”)发送 IPN。
+                        //2.检查“txn_id”是否未重复,以防止欺诈者重复使用旧的已完成的交易
+                        //3.验证“receiver_email”是已在您的PayPal账户中注册的电子邮件地址,以防止将付款发送到欺诈者的账户
+                        if ("Completed".equals(paymentStatus)) {
+                            //根据自己业务进行处理(修改订单状态,支付时间等等操作)
+                            try {
+                                log.info("paypal支付成功回调");
+                                //表示续费,有消费记录id
+                                if(custom.split("_").length > 2 && custom.split("_")[2].matches("^-?[0-9]+")){
+                                    orderStrategyFactory.doHandler(custom.split("_")[0] + "_" + custom.split("_")[2], txnId, payerEmail, custom.split("_")[1], 2);
+                                }else {
+                                    orderStrategyFactory.doHandler(orderSn, txnId, payerEmail, custom.split("_")[1], 2);
+                                }
+                            } catch (Exception e) {
+                                log.error("paypal支付回调异常,errorMsg:{}", e.getMessage());
+                            }
+                        }
+                    } else if ("VERIFIED".equals(str)) {
+                        log.error("付款失败回调VERIFIED,订单号=" + orderSn);
+                    } else {
+                        log.error("付款无效回调VERIFIED,订单号=" + orderSn);
+                    }
+                }
+            });
+        } catch (Exception e) {
+            log.error("paypal支付回调异常,errorMsg:{}", e.getMessage());
+        }
+    }
+
+
+}

+ 304 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/controller/pay/OrderWechatPayController.java

@@ -0,0 +1,304 @@
+package com.fdkankan.platform.order.controller.pay;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.config.RedisDefaultConfig;
+import com.fdkankan.common.constant.Constant;
+import com.fdkankan.common.constant.ConstantUrl;
+import com.fdkankan.common.constant.OrderConstant;
+import com.fdkankan.common.controller.BaseController;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.pay.paypal.sdk.UrlUtils;
+import com.fdkankan.pay.wx.WXPayDefaultConfig;
+import com.fdkankan.pay.wx.sdk.WXPayConstants;
+import com.fdkankan.pay.wx.sdk.WXPayUtil;
+import com.fdkankan.platform.order.entity.CommerceOrder;
+import com.fdkankan.platform.order.entity.ExpansionOrder;
+import com.fdkankan.platform.order.entity.IncrementOrder;
+import com.fdkankan.platform.order.entity.VirtualOrder;
+import com.fdkankan.platform.order.request.RequestPlaceOrder;
+import com.fdkankan.platform.order.service.*;
+import com.fdkankan.platform.user.factory.PayFactory;
+import com.fdkankan.platform.user.strategy.OrderStrategyFactory;
+import com.fdkankan.platform.user.vo.ResponseOrder;
+import com.fdkankan.platform.user.vo.ResponseOrderItem;
+import com.fdkankan.redis.util.RedisUtil;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.io.BufferedOutputStream;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 支付中心-微信支付模块
+ */
+@Log4j2
+@Controller
+@RequestMapping("/api/order/pay")
+public class OrderWechatPayController extends BaseController {
+    @Autowired
+    private OrderStrategyFactory orderStrategyFactory;
+    @Autowired
+    private PayFactory payFactory;
+    @Autowired
+    private IOrderService orderService;
+    @Autowired
+    private IVirtualOrderService virtualOrderService;
+    @Autowired
+    private IExpansionOrderService expansionOrderService;
+    @Autowired
+    private ICommerceOrderService commerceOrderService;
+    @Autowired
+    private IIncrementOrderService incrementOrderService;
+    @Autowired
+    private PayOrderService payOrderService;
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Value("${main.url}")
+    private String mainUrl;
+
+    /**
+     * 微信扫码付款
+     * orderId          订单id
+     * orderType        订单类型,0购买相机,1点数重置,2扩容,3商业版,4增值服务,5场景下载
+     * spaceId          0表示国内订单,1表示国外订单
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/wechatPay", method = RequestMethod.POST)
+    public JSONObject wechatPay(@RequestBody RequestPlaceOrder order) throws Exception {
+        return payFactory.scanPay("wechat", order);
+    }
+
+    /**
+     * 微信H5付款
+     * orderId          订单id
+     * orderType        订单类型,0购买相机,1点数重置,2扩容,3商业版,4增值服务,5场景下载
+     * spaceId          0表示国内订单,1表示国外订单
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/wechatMobilePay", method = RequestMethod.POST)
+    public JSONObject wechatMobilePay(@RequestBody RequestPlaceOrder order) throws Exception {
+        return payFactory.h5Pay("wechat", order, UrlUtils.getIpAddr(request));
+    }
+
+    /**
+     * 微信内H5付款
+     * code
+     * orderId          订单id
+     * orderType        订单类型,0购买相机,1点数重置,2扩容,3商业版,4增值服务,5场景下载
+     * spaceId          0表示国内订单,1表示国外订单
+     */
+    @RequestMapping(value = "/wechatPreJsPay")
+    public String wechatPreJsPay(Long orderId, int orderType, String code, Long spaceId) throws Exception {
+        InputStream is = null;
+        WXPayDefaultConfig config = new WXPayDefaultConfig();
+        // 这个url链接地址和参数皆不能变
+        String url = ConstantUrl.WEIXIN_TOKEN_URL1 + config.getAppID() + "&secret=" + config.getSecret() + "&grant_type=authorization_code" + "&code=" + code;
+        try {
+            URL urlGet = new URL(url);
+            HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();
+            http.setRequestMethod("GET"); // 必须是get方式请求
+            http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
+            http.setDoOutput(true);
+            http.setDoInput(true);
+            System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒
+            System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒
+            http.connect();
+            is = http.getInputStream();
+            int size = is.available();
+            byte[] jsonBytes = new byte[size];
+            is.read(jsonBytes);
+            String message = new String(jsonBytes, "UTF-8");
+            log.debug("获取access_token返回的message:"+message);
+            JSONObject oppidObj = JSONObject.parseObject(message);
+            String access_token = (String) oppidObj.get("access_token");
+            String openid = (String) oppidObj.get("openid");
+
+            String orderSn = null;
+            StringBuilder sb = new StringBuilder();
+            BigDecimal totalFee = null;
+            switch (orderType){
+                case 0:
+                    ResponseOrder responseOrder = orderService.getOrderDetail(orderId);
+                    if (responseOrder.getId() == null) return "redirect:" + mainUrl + "mobile.html#/payresult/fail";
+
+                    List<ResponseOrderItem> items = responseOrder.getOrderItems();
+                    for (int i = 0; i < items.size(); i++){
+                        sb.append(items.get(i).getGoodsCount()).append("*").append(items.get(i).getGoodsName());
+                        if (i != items.size() - 1){
+                            sb.append(",");
+                        }
+                    }
+                    totalFee = responseOrder.getTotalAmount().multiply(new BigDecimal(100));
+                    orderSn = responseOrder.getOrderSn();
+                    orderSn += "_entity";
+                    break;
+                case 1:
+                    VirtualOrder virtualOrderEntity = virtualOrderService.getById(orderId);
+                    if (virtualOrderEntity == null){
+                        return "redirect:" + mainUrl + "mobile.html#/payresult/fail";
+                    }
+                    sb.append(Constant.PAY_SUBJECT + ":" + virtualOrderEntity.getPoints());
+                    totalFee = new BigDecimal(virtualOrderEntity.getPoints()).multiply(new BigDecimal(100));
+                    orderSn = virtualOrderEntity.getOrderSn();
+                    orderSn += "_recharge";
+                    break;
+                case 2:
+                    ExpansionOrder expansion = expansionOrderService.getById(orderId);
+                    if (expansion == null){
+                        return "redirect:" + mainUrl + "mobile.html#/payresult/fail";
+                    }
+                    //订单金额为国外金额就报错
+                    if(expansion.getAbroad() == 1){
+                        throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004);
+                    }
+                    String date = "1年";
+                    if(expansion.getMonth() < 12){
+                        date = expansion.getMonth() + "个月";
+                    }
+                    String subject = Constant.EXPANSION_SUBJECT + ":" + expansion.getUnitSize() + expansion.getUnit() + "/" + date;
+                    sb.append(subject);
+                    totalFee = expansion.getAmount().multiply(new BigDecimal(100));
+                    orderSn = expansion.getOrderSn();
+                    orderSn += "_expansion";
+                    break;
+                case 3:
+                    CommerceOrder commerce = commerceOrderService.getById(orderId);
+                    if (commerce == null){
+                        return "redirect:" + mainUrl + "mobile.html#/payresult/fail";
+                    }
+                    sb.append(Constant.COMMERCE_SUBJECT);
+                    totalFee = commerce.getAmount().multiply(new BigDecimal(100));
+                    orderSn = commerce.getOrderSn();
+                    orderSn += "_commerce";
+                    break;
+                case 4:
+                    IncrementOrder incrementOrderEntity = incrementOrderService.getById(orderId);
+                    if (incrementOrderEntity == null){
+                        return "redirect:" + mainUrl + "mobile.html#/payresult/fail";
+                    }
+                    //订单金额为国外金额就报错
+                    if(incrementOrderEntity.getAbroad() == 1){
+                        throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004);
+                    }
+                    sb.append(Constant.INCREMENT_SUBJECT + ":" + incrementOrderEntity.getCount() + "个/年");
+                    totalFee = incrementOrderEntity.getAmount().multiply(new BigDecimal(100));
+                    orderSn = incrementOrderEntity.getOrderSn();
+                    orderSn += "_increment";
+                    break;
+                case 5:
+//                    IncrementOrderEntity incrementOrderEntity = incrementOrderService.findById(orderId);
+//                    if (incrementOrderEntity == null){
+//                        return "redirect:" + mainUrl + "mobile.html#/payresult/fail";
+//                    }
+//                    //订单金额为国外金额就报错
+//                    if(incrementOrderEntity.getAbroad() == 1){
+//                        throw new BaseRuntimeException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004);
+//                    }
+//                    sb.append(Constant.INCREMENT_SUBJECT + ":" + incrementOrderEntity.getCount() + "个/年");
+//                    totalFee = incrementOrderEntity.getAmount().multiply(new BigDecimal(100));
+//                    orderSn = incrementOrderEntity.getOrderSn();
+//                    orderSn += "_increment";
+                    break;
+            }
+            String body = sb.toString();
+            if(spaceId != null){
+                orderSn = orderSn.replace("expansion", String.valueOf(spaceId));
+            }
+            Map<String, String> resp = payOrderService.wechatPay(orderSn, sb.toString(), body, totalFee, UrlUtils.getIpAddr(request), openid);
+            String timeStamp = String.valueOf(System.currentTimeMillis() / 1000);
+            return "redirect:" + mainUrl + ConstantUrl.WEIXIN_MOBILE_PAY_URL + timeStamp + "&signType=MD5&appId=" + resp.get("appid")
+                    + "&nonceStr=" + resp.get("nonce_str") + "&prepay_id=" + resp.get("prepay_id") + "&paySign=" + resp.get("paySign");
+        }catch (Exception e){
+            log.debug("获取access_token发生异常",e);
+        }finally {
+            if (is != null){
+                is.close();
+            }
+        }
+        return "redirect:" + mainUrl + "mobile.html#/payresult/fail";
+    }
+
+    /**
+     * 微信支付回调
+     */
+    @RequestMapping(value = {"/wechatPay/notify"}, method = RequestMethod.POST)
+    public void callback() {
+        log.warn("微信回调接口方法 start");
+        String inputLine = "";
+        String notifyXml = "";
+        try {
+            while((inputLine = request.getReader().readLine()) != null){
+                notifyXml += inputLine;
+            }
+            //关闭流
+            request.getReader().close();
+            log.warn("微信回调内容信息:"+notifyXml);
+            //解析成Map
+            Map<String,String> map = WXPayUtil.xmlToMap(notifyXml);
+
+            WXPayDefaultConfig config = new WXPayDefaultConfig();
+            if (WXPayUtil.isSignatureValid(map, config.getKey(), WXPayConstants.SignType.MD5) || WXPayUtil.isSignatureValid(map, config.getKey(), WXPayConstants.SignType.HMACSHA256)) {
+                //判断 支付是否成功
+                if("SUCCESS".equals(map.get("result_code"))){
+                    log.warn("微信回调返回是否支付成功:是");
+                    //获得 返回的商户订单号
+                    String out_trade_no = map.get("out_trade_no");
+                    String trade_no = map.get("transaction_id");
+                    String openid = map.get("openid");
+                    log.warn("微信回调返回商户订单号:" + out_trade_no);
+                    //修改订单状态
+                    String orderSnE = out_trade_no.substring(0, out_trade_no.lastIndexOf("_"));
+
+                    String orderSn = out_trade_no.split("_")[0];
+                    if(!out_trade_no.contains("recharge") && !out_trade_no.contains("commerce") &&
+                            !out_trade_no.contains("entity") && !out_trade_no.contains("expansion") &&
+                            !out_trade_no.contains("increment") && !out_trade_no.contains("download")){
+//                        orderSn += "_" + out_trade_no.split("_")[1];
+
+                        log.warn("orderSnE:" + orderSn + "_expansion");
+                        redisUtil.set(orderSn + "_expansion", out_trade_no, RedisDefaultConfig.DEFAULT_EXPIRE_TIME);
+                    }else {
+                        log.warn("orderSnE:" + orderSnE);
+                        redisUtil.set(orderSnE, out_trade_no ,RedisDefaultConfig.DEFAULT_EXPIRE_TIME);
+                    }
+                    orderStrategyFactory.doHandler(orderSn, trade_no, openid, out_trade_no.split("_")[1], 0);
+                    log.warn("微信支付成功,订单号:"  + orderSn);
+                    //通知微信服务器已经支付成功
+                    notifyXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code>"
+                            + "<return_msg><![CDATA[OK]]></return_msg></xml> ";
+                }else{
+                    notifyXml = "<xml><return_code><![CDATA[FAIL]]></return_code>"
+                            + "<return_msg><![CDATA[报文为空]]></return_msg></xml> ";
+                }
+            } else{
+                log.error("签名验证错误");
+                notifyXml = "<xml><return_code><![CDATA[FAIL]]></return_code>"
+                        + "<return_msg><![CDATA[签名验证错误]]></return_msg></xml>";
+            }
+            BufferedOutputStream out = new BufferedOutputStream(
+                    response.getOutputStream());
+            out.write(notifyXml.getBytes());
+            out.flush();
+            out.close();
+
+        } catch (Exception e) {
+            log.error("微信支付回调数据异常, errorMsg:{}", e.getMessage());
+        }
+    }
+
+
+}

+ 6 - 2
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/request/RequestPlaceOrder.java

@@ -1,8 +1,12 @@
-package com.fdkankan.platform.user.request;
+package com.fdkankan.platform.order.request;
 
+import com.fdkankan.platform.user.request.RequestCart;
+import com.fdkankan.platform.user.request.RequestInvoice;
+import com.fdkankan.platform.user.request.RequestUser;
 import lombok.Data;
 
 import java.io.Serializable;
+
 // 下单
 @Data
 public class RequestPlaceOrder implements Serializable {
@@ -24,4 +28,4 @@ public class RequestPlaceOrder implements Serializable {
     private Integer abroad;
     // 续费时扩容信息id
     private Long spaceId;
-}
+}

+ 4 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/ICommerceOrderService.java

@@ -18,4 +18,8 @@ import java.math.BigDecimal;
 public interface ICommerceOrderService extends IService<CommerceOrder> {
 
     ResponseCommerceOrder saveByOrderParam(Long userId, RequestCommerceOrder param, BigDecimal bigDecimal);
+
+    CommerceOrder getByOrderSn(String orderSn);
+
+    boolean paySuccessCommerceOrder(String orderSn, String tradeNo, int paymentTypeName);
 }

+ 4 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/IDownloadOrderService.java

@@ -22,4 +22,8 @@ public interface IDownloadOrderService extends IService<DownloadOrder> {
     ResponseDownloadOrder saveByOrderParam(Long userId, RequestIncrementOrder order, BigDecimal price);
 
     Page<ResponseDownloadOrder> getPageByParam(Long userId, RequestDownloadOrder param);
+
+    DownloadOrder getByOrderSn(String orderSn);
+
+    boolean paySuccessDownloadOrder(String orderSn, String tradeNo, int paymentTypeName);
 }

+ 4 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/IExpansionOrderService.java

@@ -22,4 +22,8 @@ public interface IExpansionOrderService extends IService<ExpansionOrder> {
     ResponseExpansionOrder saveByOrderParam(Long userId, RequestExpansionOrder order, BigDecimal bigDecimal, String unit, int unitSize, int month, int delay);
 
     Page<ResponseExpansionOrder> getExpansionListByParam(RequestCamera param);
+
+    ExpansionOrder getByOrderSn(String orderSn);
+
+    boolean paySuccessExpansionOrder(String orderSn, String tradeNo, int paymentTypeName, int status);
 }

+ 4 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/IIncrementOrderService.java

@@ -21,4 +21,8 @@ public interface IIncrementOrderService extends IService<IncrementOrder> {
     ResponseIncrementOrder saveByOrderParam(Long userId, RequestIncrementOrder order, BigDecimal price);
 
     Page<ResponseIncrementOrder> getPageByParam(Long id, RequestIncrementOrder param);
+
+    IncrementOrder getByOrderSn(String orderSn);
+
+    boolean paySuccessIncrementOrder(String orderSn, String tradeNo, int paymentTypeName);
 }

+ 1 - 1
4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/IInvoiceService.java

@@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fdkankan.platform.order.entity.Invoice;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fdkankan.platform.user.request.RequestInvoice;
-import com.fdkankan.platform.user.request.RequestPlaceOrder;
+import com.fdkankan.platform.order.RequestPlaceOrder;
 import com.fdkankan.platform.user.vo.ResponseInvoice;
 
 /**

+ 4 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/IOrderService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fdkankan.platform.goods.vo.ResponseGoods;
 import com.fdkankan.platform.goods.vo.ResponseGoodsSku;
+import com.fdkankan.platform.order.RequestPlaceOrder;
 import com.fdkankan.platform.order.entity.Order;
 import com.fdkankan.platform.order.vo.ResponseCommerceOrder;
 import com.fdkankan.platform.order.vo.ResponseExpansionOrder;
@@ -48,4 +49,7 @@ public interface IOrderService extends IService<Order> {
 
     ResponseGoodsSku getIncrementOrDownloadPrice(RequestCamera param, String token);
 
+    Order getByOrderSn(String orderSn);
+
+    boolean paySuccessEntityOrder(String orderSn, String tradeNo, int paymentTypeName);
 }

+ 1 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/ITradeLogService.java

@@ -13,4 +13,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface ITradeLogService extends IService<TradeLog> {
 
+    TradeLog getByOrderSn(String orderSn);
 }

+ 4 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/IVirtualOrderService.java

@@ -39,4 +39,8 @@ public interface IVirtualOrderService extends IService<VirtualOrder> {
     Page<ResponseIncrementOrder> incrementOrderList(RequestIncrementOrder param, String token);
 
     Page<ResponseDownloadOrder> downloadOrderList(RequestDownloadOrder param, String token);
+
+    VirtualOrder getByOrderSn(String orderSn);
+
+    boolean paySuccessVirtualOrder(String orderSn, String tradeNo, int paymentTypeName);
 }

+ 264 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/PayOrderService.java

@@ -0,0 +1,264 @@
+package com.fdkankan.platform.order.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.DefaultAlipayClient;
+import com.alipay.api.domain.AlipayTradeWapPayModel;
+import com.alipay.api.request.AlipayTradeWapPayRequest;
+import com.fdkankan.common.constant.ConstantFilePath;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.constant.OrderConstant;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.common.util.MD5;
+import com.fdkankan.pay.alipay.AlipayDefaultConfig;
+import com.fdkankan.pay.alipay.sdk.AlipayGoodsDetail;
+import com.fdkankan.pay.alipay.sdk.AlipayService;
+import com.fdkankan.pay.alipay.sdk.AlipayUtil;
+import com.fdkankan.pay.alipay.sdk.AlipaymentEx;
+import com.fdkankan.pay.paypal.sdk.PayPalmentEx;
+import com.fdkankan.pay.paypal.sdk.PaypalService;
+import com.fdkankan.pay.wx.WXPayDefaultConfig;
+import com.fdkankan.pay.wx.sdk.WXPay;
+import com.fdkankan.pay.wx.sdk.WXPayUtil;
+import com.fdkankan.platform.common.LogFactory;
+import com.paypal.api.payments.Links;
+import com.paypal.api.payments.Payment;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+@Service
+public class PayOrderService {
+
+    @Autowired
+    private AlipayService alipayService;
+    @Autowired
+    private AlipayDefaultConfig alipayDefaultConfig;
+    @Autowired
+    private PaypalService paypalService;
+
+    @Value("${main.url}")
+    private String mainUrl;
+
+    public JSONObject aliPayScanPay(String orderSn, String subject, String body, BigDecimal totalFee, List<AlipayGoodsDetail> goodsDetailList) throws Exception{
+        AlipaymentEx alipaymentEx = new AlipaymentEx();
+        alipaymentEx.setOutTradeNo(orderSn);
+        alipaymentEx.setSubject(subject);
+        alipaymentEx.setBody(body);
+        alipaymentEx.setTotalAmount(totalFee);
+        alipaymentEx.setStoreId("test_store_id");
+        alipaymentEx.setOperatorId("test_operator_id");
+        alipaymentEx.setTimeoutExpress("120m");
+        alipaymentEx.setGoodsDetailList(goodsDetailList);
+        String pngPath = ConstantFilePath.ALI_QRCODE_FOLDER + orderSn + ".png";
+        try {
+            Map<String, String> alipayMap = alipayService.tradePrecreate(alipaymentEx, mainUrl + alipayDefaultConfig.getNotifyUrl());
+            if ("0".equals(alipayMap.get("code"))){
+                BufferedImage image = AlipayUtil.getQRCodeImge(alipayMap.get("qr_code"));
+                File file = new File(pngPath);
+                if (file.exists()){
+                    file.delete();
+                }
+                ImageIO.write(image, "png", file);
+            }else{
+                throw new BusinessException(ErrorCode.ERROR_MSG);
+            }
+        } catch (AlipayApiException e) {
+            LogFactory.P_LOG.error(e.getMessage());
+            throw new BusinessException(ErrorCode.ERROR_MSG);
+        }
+
+        JSONObject j = new JSONObject();
+        j.put("src", pngPath.replace(ConstantFilePath.BASE_PATH, ""));
+        j.put("price", totalFee);
+        return j;
+    }
+
+    public JSONObject aliPayH5Pay(String orderSn, String subject, String body, BigDecimal totalFee) {
+        // 超时时间 可空
+        String timeoutExpress = "2m";
+        // 销售产品码 必填
+        String productCode = "QUICK_WAP_WAY";
+        /**********************/
+        // SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签
+        //调用RSA签名方式,这个不用你管,只要你配置文件是正确的
+        AlipayClient client = new DefaultAlipayClient(alipayDefaultConfig.getGatewayUrl(),
+                alipayDefaultConfig.getAppid(), alipayDefaultConfig.getAppPrivateKey(), alipayDefaultConfig.getFormate(),
+                alipayDefaultConfig.getCharset(), alipayDefaultConfig.getAlipayPublicKey(), alipayDefaultConfig.getSignType());
+        AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
+        // 封装请求支付信息
+        AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
+        //带!的都是你需要传递的参数 其他的是支付宝必须的
+        //!本地生成的订单编号
+        model.setOutTradeNo(orderSn);
+        //!商品名称
+        model.setSubject(subject);
+        //!商品价格
+        model.setTotalAmount(String.valueOf(totalFee));
+        //!商品介绍
+        model.setBody(body);
+        //超时时间
+        model.setTimeoutExpress(timeoutExpress);
+        //产品销售码
+        model.setProductCode(productCode);
+        //将参数传入到 BizModel中
+        alipayRequest.setBizModel(model);
+        //异步回调地址
+        alipayRequest.setNotifyUrl(mainUrl + alipayDefaultConfig.getNotifyUrl());
+        //同步回调地址
+        alipayRequest.setReturnUrl(mainUrl + alipayDefaultConfig.getReturnUrl());
+
+        String result = "";
+        try {
+            // 调用SDK生成表单
+            //get方式生成表单 主要解决在微信中对支付宝屏蔽问题,如果不是在微信中可post提交,将form的注释解开,result注释掉即可
+            result = client.pageExecute(alipayRequest, "get").getBody();
+            LogFactory.P_LOG.warn("支付宝调用SDK生成表单:" + result);
+            //form = client.pageExecute(alipay_request).getBody();
+//                System.out.println(form);
+        } catch (AlipayApiException e) {
+            e.printStackTrace();
+            LogFactory.P_LOG.error("生成表单失败!");
+        }
+        JSONObject j = new JSONObject();
+        j.put("form", result);
+        return j;
+    }
+
+    public JSONObject payPalPay(String orderSn, String subject, String body, BigDecimal totalFee, BigDecimal goodsFee, String successUrl, String cancelUrl) throws Exception {
+        PayPalmentEx payPalmentEx = new PayPalmentEx();
+        payPalmentEx.setOrderSn(orderSn);
+        payPalmentEx.setOrderTotal(totalFee);
+        payPalmentEx.setSubTotal(goodsFee);
+        payPalmentEx.setDescription(body);
+
+        Payment payment = paypalService.createPayment(payPalmentEx, successUrl, cancelUrl);
+        for(Links links : payment.getLinks()){
+            if(links.getRel().equals("approval_url")){
+                // 客户付款登陆地址
+                JSONObject j = new JSONObject();
+                j.put("redirect", links.getHref());
+                j.put("price", totalFee);
+                return j;
+            }
+        }
+        throw new BusinessException(OrderConstant.FAILURE_CODE_8002, OrderConstant.FAILURE_MSG_8002);
+    }
+
+    public JSONObject wechatScanPay(String orderSn, String subject, String body, BigDecimal totalFee) throws Exception {
+        WXPayDefaultConfig config = new WXPayDefaultConfig();
+        WXPay wxPay = new WXPay(config);
+
+        Map<String, String> data = new HashMap<String, String>();
+        data.put("body", body);
+        data.put("detail", subject);
+        data.put("out_trade_no", orderSn + "_" + new Random().nextInt(100));
+        data.put("device_info", "WEB");
+        data.put("fee_type", "CNY");
+        data.put("total_fee", totalFee.stripTrailingZeros().toPlainString());
+        data.put("spbill_create_ip", config.getCreateIP());
+        data.put("notify_url", mainUrl + config.getNotifyURL());
+        data.put("trade_type", "NATIVE");  // 此处指定为扫码支付
+        data.put("product_id", orderSn); //多个商品,使用订单号
+
+        String pngPath = ConstantFilePath.WEIXIN_QRCODE_FOLDER + orderSn + ".png";
+        try {
+            //发起支付
+            Map<String, String> resp = wxPay.unifiedOrder(data);
+            BufferedImage image = AlipayUtil.getQRCodeImge(resp.get("code_url"));
+            File file = new File(pngPath);
+            if (file.exists()){
+                file.delete();
+            }
+            ImageIO.write(image, "png", file);
+        } catch (Exception e) {
+            LogFactory.P_LOG.error(e.getMessage());
+            throw new BusinessException(ErrorCode.ERROR_MSG);
+        }
+        JSONObject j = new JSONObject();
+        j.put("src", pngPath.replace(ConstantFilePath.BASE_PATH, ""));
+        j.put("price", totalFee.divide(new BigDecimal("100"), 2));
+        return j;
+    }
+
+    public JSONObject wechatH5Pay(String orderSn, String subject, String body, BigDecimal totalFee, String ipAddress) throws Exception {
+        LogFactory.P_LOG.warn("ipAddress:"+ipAddress);
+        WXPayDefaultConfig config = new WXPayDefaultConfig();
+        WXPay wxPay = new WXPay(config);
+
+        Map<String, String> data = new HashMap<String, String>();
+        data.put("body", subject);
+        data.put("detail", body);
+        data.put("out_trade_no", orderSn + "_" + new Random().nextInt(100));
+        data.put("device_info", "H5");
+        data.put("fee_type", "CNY");
+        data.put("total_fee", totalFee.stripTrailingZeros().toPlainString());
+        data.put("spbill_create_ip", ipAddress);
+        data.put("notify_url", mainUrl + config.getNotifyURL());
+        data.put("trade_type", "MWEB");  // 此处指定为扫码支付
+        data.put("product_id", orderSn); //多个商品,使用订单号
+        data.put("nonce_str", MD5.getMessageDigest(String.valueOf(new Random().nextInt(10000)).getBytes()));
+
+        String mweb_url = "";
+        Map<String, String> resp = wxPay.unifiedOrder(data);
+        LogFactory.P_LOG.warn("wechatH5Pay" + resp);
+        String return_code = resp.get("return_code");
+        String return_msg = resp.get("return_msg");
+        if ("SUCCESS".equals(return_code) && "OK".equals(return_msg)) {
+            mweb_url = resp.get("mweb_url");//调微信支付接口地址
+            mweb_url += "&redirect_url=" + URLEncoder.encode(mainUrl + config.getH5RedirectURL(), "UTF-8");
+            LogFactory.P_LOG.warn("mweb_url=" + mweb_url);
+        } else {
+            LogFactory.P_LOG.error("微信统一支付接口获取预支付订单出错");
+        }
+        JSONObject j = new JSONObject();
+        j.put("mweb_url", mweb_url);
+        return j;
+    }
+
+    public Map<String, String> wechatPay(String orderSn, String subject, String body, BigDecimal totalFee, String ipAddress, String openid) throws Exception {
+        WXPayDefaultConfig config = new WXPayDefaultConfig();
+        WXPay wxPay = new WXPay(config);
+
+        Map<String, String> data = new HashMap<String, String>();
+        data.put("body", subject);
+        data.put("detail", body);
+        data.put("out_trade_no", orderSn + "_" + new Random().nextInt(100));
+        data.put("device_info", "wechat");
+        data.put("fee_type", "CNY");
+        data.put("total_fee", totalFee.stripTrailingZeros().toPlainString());
+        data.put("spbill_create_ip", ipAddress);
+        data.put("notify_url", mainUrl + config.getNotifyURL());
+        data.put("trade_type", "JSAPI");
+        data.put("product_id", orderSn);
+        data.put("openid", openid);
+
+        Map<String, String> resp = wxPay.unifiedOrder(data);
+        LogFactory.P_LOG.warn("wechatPay" + resp);
+
+        Map<String, String> sign = new HashMap<>();
+        sign.put("package", "prepay_id="+resp.get("prepay_id"));
+        sign.put("appId", config.getAppID());
+        sign.put("timeStamp",String.valueOf(System.currentTimeMillis() / 1000));
+        sign.put("nonceStr", resp.get("nonce_str"));
+        sign.put("signType", "MD5");
+        String paySign = WXPayUtil.generateSignature(sign, config.getKey());
+
+        resp.put("signType", "MD5");
+        resp.put("paySign", paySign);
+        LogFactory.P_LOG.warn("wechatPay" + resp);
+        return resp;
+    }
+
+}

+ 26 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/impl/CommerceOrderServiceImpl.java

@@ -1,5 +1,7 @@
 package com.fdkankan.platform.order.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fdkankan.common.util.NumberUtils;
 import com.fdkankan.platform.order.entity.CommerceOrder;
@@ -11,6 +13,8 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
 
 /**
  * <p>
@@ -41,4 +45,26 @@ public class CommerceOrderServiceImpl extends ServiceImpl<ICommerceOrderMapper,
         BeanUtils.copyProperties(commerceOrderEntity, commerceOrder);
         return commerceOrder;
     }
+
+    @Override
+    public CommerceOrder getByOrderSn(String orderSn) {
+        LambdaQueryWrapper<CommerceOrder> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(CommerceOrder::getOrderSn,orderSn);
+        List<CommerceOrder> list = this.list(queryWrapper);
+        if(list == null || list.size() <= 0){
+            return null;
+        }
+        return list.get(0);
+    }
+
+    @Override
+    public boolean paySuccessCommerceOrder(String orderSn, String tradeNo, int paymentTypeName) {
+        LambdaUpdateWrapper<CommerceOrder> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(CommerceOrder::getPayType,paymentTypeName)
+                .set(CommerceOrder::getNumber,tradeNo)
+                .set(CommerceOrder::getPayStatus,1)
+                .set(CommerceOrder::getTradeTime,new Date())
+                .eq(CommerceOrder::getOrderSn,orderSn);
+        return this.update(updateWrapper);
+    }
 }

+ 24 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/impl/DownloadOrderServiceImpl.java

@@ -1,6 +1,7 @@
 package com.fdkankan.platform.order.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fdkankan.common.util.NumberUtils;
@@ -24,6 +25,7 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -110,4 +112,26 @@ public class DownloadOrderServiceImpl extends ServiceImpl<IDownloadOrderMapper,
         }
         return result;
     }
+
+    @Override
+    public DownloadOrder getByOrderSn(String orderSn) {
+        QueryWrapper<DownloadOrder> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(DownloadOrder::getOrderSn,orderSn);
+        List<DownloadOrder> list = this.list(queryWrapper);
+        if(list == null || list.size() <=0){
+            return null;
+        }
+        return list.get(0);
+    }
+
+    @Override
+    public boolean paySuccessDownloadOrder(String orderSn, String tradeNo, int paymentTypeName) {
+        LambdaUpdateWrapper<DownloadOrder> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(DownloadOrder::getPayType,paymentTypeName)
+                .set(DownloadOrder::getNumber,tradeNo)
+                .set(DownloadOrder::getPayStatus,1)
+                .set(DownloadOrder::getTradeTime,new Date())
+                .eq(DownloadOrder::getOrderSn,orderSn);
+        return this.update(updateWrapper);
+    }
 }

+ 28 - 2
4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/impl/ExpansionOrderServiceImpl.java

@@ -1,7 +1,11 @@
 package com.fdkankan.platform.order.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.util.NumberUtils;
 import com.fdkankan.platform.order.entity.ExpansionOrder;
 import com.fdkankan.platform.order.mapper.IExpansionOrderMapper;
@@ -9,13 +13,12 @@ import com.fdkankan.platform.order.service.IExpansionOrderService;
 import com.fdkankan.platform.order.vo.ResponseExpansionOrder;
 import com.fdkankan.platform.user.request.RequestCamera;
 import com.fdkankan.platform.user.request.RequestExpansionOrder;
-import com.fdkankan.common.constant.ErrorCode;
-import com.fdkankan.common.exception.BusinessException;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -71,4 +74,27 @@ public class ExpansionOrderServiceImpl extends ServiceImpl<IExpansionOrderMapper
         pageVo.setRecords(list);
         return pageVo;
     }
+
+    @Override
+    public ExpansionOrder getByOrderSn(String orderSn) {
+        QueryWrapper<ExpansionOrder> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(ExpansionOrder::getOrderSn,orderSn);
+        List<ExpansionOrder> list = this.list(queryWrapper);
+        if(list == null || list.size()<=0){
+            return null;
+        }
+        return list.get(0);
+    }
+
+    @Override
+    public boolean paySuccessExpansionOrder(String orderSn, String tradeNo, int paymentTypeName, int status) {
+        LambdaUpdateWrapper<ExpansionOrder> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(ExpansionOrder::getPayType,paymentTypeName)
+                .set(ExpansionOrder::getNumber,tradeNo)
+                .set(ExpansionOrder::getStatus, status)
+                .set(ExpansionOrder::getPayStatus, 1)
+                .set(ExpansionOrder::getTradeTime, new Date())
+                .eq(ExpansionOrder::getOrderSn,orderSn);
+        return this.update(updateWrapper);
+    }
 }

+ 26 - 2
4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/impl/IncrementOrderServiceImpl.java

@@ -1,8 +1,11 @@
 package com.fdkankan.platform.order.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.util.NumberUtils;
 import com.fdkankan.platform.goods.common.SkuCache;
 import com.fdkankan.platform.goods.service.IGoodsSkuService;
@@ -15,14 +18,13 @@ import com.fdkankan.platform.order.service.IInvoiceService;
 import com.fdkankan.platform.user.request.RequestIncrementOrder;
 import com.fdkankan.platform.user.vo.ResponseIncrementOrder;
 import com.fdkankan.platform.user.vo.ResponseInvoice;
-import com.fdkankan.common.constant.ErrorCode;
-import com.fdkankan.common.exception.BusinessException;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -109,4 +111,26 @@ public class IncrementOrderServiceImpl extends ServiceImpl<IIncrementOrderMapper
         }
         return result;
     }
+
+    @Override
+    public IncrementOrder getByOrderSn(String orderSn) {
+        QueryWrapper<IncrementOrder> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(IncrementOrder::getOrderSn,orderSn);
+        List<IncrementOrder> list = this.list(queryWrapper);
+        if(list == null || list.size()<=0){
+            return null;
+        }
+        return list.get(0);
+    }
+
+    @Override
+    public boolean paySuccessIncrementOrder(String orderSn, String tradeNo, int paymentTypeName) {
+        LambdaUpdateWrapper<IncrementOrder> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(IncrementOrder::getPayType,paymentTypeName)
+                .set(IncrementOrder::getNumber,tradeNo)
+                .set(IncrementOrder::getPayStatus, 1)
+                .set(IncrementOrder::getTradeTime, new Date())
+                .eq(IncrementOrder::getOrderSn,orderSn);
+        return this.update(updateWrapper);
+    }
 }

+ 1 - 1
4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/impl/InvoiceServiceImpl.java

@@ -10,7 +10,7 @@ import com.fdkankan.platform.order.entity.*;
 import com.fdkankan.platform.order.mapper.IInvoiceMapper;
 import com.fdkankan.platform.order.service.*;
 import com.fdkankan.platform.user.request.RequestInvoice;
-import com.fdkankan.platform.user.request.RequestPlaceOrder;
+import com.fdkankan.platform.order.RequestPlaceOrder;
 import com.fdkankan.platform.user.service.IUserService;
 import com.fdkankan.platform.user.vo.ResponseInvoice;
 import com.fdkankan.platform.user.vo.ResponseOrder;

+ 31 - 14
4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/impl/OrderServiceImpl.java

@@ -2,14 +2,17 @@ package com.fdkankan.platform.order.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fdkankan.common.constant.*;
+import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.user.SSOUser;
 import com.fdkankan.common.util.DateUtil;
 import com.fdkankan.common.util.FileSizeUtil;
 import com.fdkankan.common.util.FileUtils;
 import com.fdkankan.common.util.NumberUtils;
+import com.fdkankan.pay.alipay.AlipayDefaultConfig;
 import com.fdkankan.pay.alipay.sdk.AlipayService;
 import com.fdkankan.pay.wx.WXPayDefaultConfig;
 import com.fdkankan.pay.wx.sdk.WXPay;
@@ -19,6 +22,7 @@ import com.fdkankan.platform.goods.entity.*;
 import com.fdkankan.platform.goods.service.*;
 import com.fdkankan.platform.goods.vo.ResponseGoods;
 import com.fdkankan.platform.goods.vo.ResponseGoodsSku;
+import com.fdkankan.platform.order.RequestPlaceOrder;
 import com.fdkankan.platform.order.constant.OrderEnum;
 import com.fdkankan.platform.order.entity.Invoice;
 import com.fdkankan.platform.order.entity.Order;
@@ -33,14 +37,11 @@ import com.fdkankan.platform.user.service.IUserIncrementService;
 import com.fdkankan.platform.user.service.IUserService;
 import com.fdkankan.platform.user.vo.*;
 import com.fdkankan.redis.util.RedisUtil;
-import com.fdkankan.common.constant.CameraConstant;
-import com.fdkankan.common.constant.ErrorCode;
-import com.fdkankan.common.constant.ServerCode;
-import com.fdkankan.common.exception.BusinessException;
 import org.apache.commons.lang3.StringUtils;
 import org.joda.time.DateTime;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -93,6 +94,11 @@ public class OrderServiceImpl extends ServiceImpl<IOrderMapper, Order> implement
     private AlipayService alipayService;
     @Autowired
     private IUserIncrementService userIncrementService;
+    @Autowired
+    private AlipayDefaultConfig alipayDefaultConfig;
+
+    @Value("${main.url}")
+    private String mainUrl;
 
     @Override
     public ResponseOrder getOrderDetail(Long orderId) {
@@ -397,16 +403,6 @@ public class OrderServiceImpl extends ServiceImpl<IOrderMapper, Order> implement
         return success;
     }
 
-    private Order getByOrderSn(String orderSn) {
-        QueryWrapper<Order> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(Order::getOrderSn,orderSn);
-        List<Order> list = this.list(queryWrapper);
-        if(list == null || list.size()<=0){
-            return null;
-        }
-        return list.get(0);
-    }
-
     @Override
     public ResponseGoods getExpansionPrice(RequestCamera camera, String token) {
         String skuStr = SkuCache.skusMap.get(String.valueOf(camera.getDateType()));
@@ -472,4 +468,25 @@ public class OrderServiceImpl extends ServiceImpl<IOrderMapper, Order> implement
         responseGoodsSku.setDeadLine(dateTime.toDate().getTime());
         return responseGoodsSku;
     }
+
+    @Override
+    public Order getByOrderSn(String orderSn) {
+        QueryWrapper<Order> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(Order::getOrderSn,orderSn);
+        List<Order> list = this.list(queryWrapper);
+        if(list == null || list.size()<=0){
+            return null;
+        }
+        return list.get(0);
+    }
+
+    @Override
+    public boolean paySuccessEntityOrder(String orderSn, String tradeNo, int paymentTypeName) {
+        LambdaUpdateWrapper<Order> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(Order::getPaymentTypeName,paymentTypeName)
+                .set(Order::getTradeNum,tradeNo)
+                .set(Order::getPaymentStatus,OrderEnum.PaymentStatus.paid.name())
+                .eq(Order::getOrderSn,orderSn);
+        return this.update(updateWrapper);
+    }
 }

+ 13 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/impl/TradeLogServiceImpl.java

@@ -1,11 +1,14 @@
 package com.fdkankan.platform.order.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.fdkankan.platform.order.entity.TradeLog;
 import com.fdkankan.platform.order.mapper.ITradeLogMapper;
 import com.fdkankan.platform.order.service.ITradeLogService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * <p>
  * 交易成功记录表 服务实现类
@@ -17,4 +20,14 @@ import org.springframework.stereotype.Service;
 @Service
 public class TradeLogServiceImpl extends ServiceImpl<ITradeLogMapper, TradeLog> implements ITradeLogService {
 
+    @Override
+    public TradeLog getByOrderSn(String orderSn) {
+        LambdaQueryWrapper<TradeLog> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(TradeLog::getOrderSn,orderSn);
+        List<TradeLog> list = this.list(queryWrapper);
+        if(list == null || list.size() <= 0){
+            return null;
+        }
+        return list.get(0);
+    }
 }

+ 28 - 5
4dkankan-center-platform/src/main/java/com/fdkankan/platform/order/service/impl/VirtualOrderServiceImpl.java

@@ -1,14 +1,17 @@
 package com.fdkankan.platform.order.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.fdkankan.platform.agent.constant.AgentConstant;
-import com.fdkankan.platform.agent.vo.AgentVo;
-import com.fdkankan.platform.agent.vo.ResponseAgentCamera;
 import com.fdkankan.common.constant.Constant;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.user.SSOUser;
 import com.fdkankan.common.util.NumberUtils;
+import com.fdkankan.platform.agent.constant.AgentConstant;
+import com.fdkankan.platform.agent.vo.AgentVo;
+import com.fdkankan.platform.agent.vo.ResponseAgentCamera;
 import com.fdkankan.platform.order.entity.VirtualOrder;
 import com.fdkankan.platform.order.mapper.IVirtualOrderMapper;
 import com.fdkankan.platform.order.service.IDownloadOrderService;
@@ -24,8 +27,6 @@ import com.fdkankan.platform.user.service.IUserService;
 import com.fdkankan.platform.user.vo.ResponseDownloadOrder;
 import com.fdkankan.platform.user.vo.ResponseIncrementOrder;
 import com.fdkankan.platform.user.vo.ResponseVirtualOrder;
-import com.fdkankan.common.constant.ErrorCode;
-import com.fdkankan.common.exception.BusinessException;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -277,4 +278,26 @@ public class VirtualOrderServiceImpl extends ServiceImpl<IVirtualOrderMapper, Vi
         //查询该用户已支付的增值权益
         return  downloadOrderService.getPageByParam(ssouser.getId(),param);
     }
+
+    @Override
+    public VirtualOrder getByOrderSn(String orderSn) {
+        QueryWrapper<VirtualOrder> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(VirtualOrder::getOrderSn,orderSn);
+        List<VirtualOrder> list = this.list(queryWrapper);
+        if(list == null || list.size()<=0){
+            return null;
+        }
+        return list.get(0);
+    }
+
+    @Override
+    public boolean paySuccessVirtualOrder(String orderSn, String tradeNo, int paymentTypeName) {
+        LambdaUpdateWrapper<VirtualOrder> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(VirtualOrder::getPayType,paymentTypeName)
+                .set(VirtualOrder::getNumber,tradeNo)
+                .set(VirtualOrder::getPayStatus, 1)
+                .set(VirtualOrder::getTradeTime, new Date())
+                .eq(VirtualOrder::getOrderSn,orderSn);
+        return this.update(updateWrapper);
+    }
 }

+ 1 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/controller/api/UserOrderController.java

@@ -3,6 +3,7 @@ package com.fdkankan.platform.user.controller.api;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fdkankan.platform.goods.vo.ResponseGoods;
 import com.fdkankan.platform.goods.vo.ResponseGoodsSku;
+import com.fdkankan.platform.order.RequestPlaceOrder;
 import com.fdkankan.platform.order.service.IOrderService;
 import com.fdkankan.platform.order.vo.ResponseCommerceOrder;
 import com.fdkankan.platform.order.vo.ResponseExpansionOrder;

+ 5 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/Commerce.java

@@ -0,0 +1,5 @@
+package com.fdkankan.platform.user.factory;
+
+public interface Commerce extends PayEntity{
+
+}

+ 5 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/Entity.java

@@ -0,0 +1,5 @@
+package com.fdkankan.platform.user.factory;
+
+public interface Entity extends PayEntity{
+
+}

+ 5 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/Expansion.java

@@ -0,0 +1,5 @@
+package com.fdkankan.platform.user.factory;
+
+public interface Expansion extends PayEntity{
+
+}

+ 12 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/Pay.java

@@ -0,0 +1,12 @@
+package com.fdkankan.platform.user.factory;
+
+public interface Pay {
+
+    public Commerce commercePay();
+
+    public Entity entityPay();
+
+    public Expansion expansionPay();
+
+    public Recharge rechargePay();
+}

+ 14 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/PayEntity.java

@@ -0,0 +1,14 @@
+package com.fdkankan.platform.user.factory;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.platform.order.request.RequestPlaceOrder;
+
+public interface PayEntity {
+
+    JSONObject scanPay(RequestPlaceOrder order) throws Exception;
+
+    JSONObject h5Pay(RequestPlaceOrder order, String ip) throws Exception;
+
+    String getType();
+
+}

+ 39 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/PayFactory.java

@@ -0,0 +1,39 @@
+package com.fdkankan.platform.user.factory;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.util.SpringUtil;
+import com.fdkankan.platform.order.request.RequestPlaceOrder;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Component
+@Slf4j
+public class PayFactory implements InitializingBean {
+
+    @Autowired
+    private SpringUtil applicationContextHelper;
+
+    private Map<String, PayEntity> payMap = new ConcurrentHashMap<>();
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        Map<String, PayEntity> payHandles = applicationContextHelper.getBeansOfType(PayEntity.class);
+        for (Map.Entry<String, PayEntity> payHandle : payHandles.entrySet()) {
+            payMap.put(payHandle.getValue().getType(), payHandle.getValue());
+        }
+    }
+
+    public JSONObject scanPay(String type, RequestPlaceOrder order) throws Exception {
+        log.warn("scanPay:" + type + "_" + order.getOrderType() + "----------payMap:" + payMap.get(type + "_" + order.getOrderType()));
+        return payMap.get(type + "_" + order.getOrderType()).scanPay(order);
+    }
+
+    public JSONObject h5Pay(String type, RequestPlaceOrder order, String ipAddr) throws Exception {
+        return payMap.get(type + "_" + order.getOrderType()).h5Pay(order, ipAddr);
+    }
+}

+ 5 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/Recharge.java

@@ -0,0 +1,5 @@
+package com.fdkankan.platform.user.factory;
+
+public interface Recharge extends PayEntity{
+
+}

+ 26 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/Alipay.java

@@ -0,0 +1,26 @@
+package com.fdkankan.platform.user.factory.impl;
+
+import com.fdkankan.platform.user.factory.*;
+
+public class Alipay implements Pay{
+
+    @Override
+    public Commerce commercePay() {
+        return new AlipayCommerce();
+    }
+
+    @Override
+    public Entity entityPay() {
+        return new AlipayEntity();
+    }
+
+    @Override
+    public Expansion expansionPay() {
+        return new AlipayExpansion();
+    }
+
+    @Override
+    public Recharge rechargePay() {
+        return new AlipayRecharge();
+    }
+}

+ 58 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/AlipayCommerce.java

@@ -0,0 +1,58 @@
+package com.fdkankan.platform.user.factory.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.Constant;
+import com.fdkankan.common.constant.OrderConstant;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.pay.alipay.sdk.AlipayGoodsDetail;
+import com.fdkankan.platform.order.entity.CommerceOrder;
+import com.fdkankan.platform.order.request.RequestPlaceOrder;
+import com.fdkankan.platform.order.service.ICommerceOrderService;
+import com.fdkankan.platform.order.service.PayOrderService;
+import com.fdkankan.platform.user.factory.Commerce;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Component
+public class AlipayCommerce implements Commerce {
+
+    @Autowired
+    private ICommerceOrderService commerceOrderService;
+    @Autowired
+    private PayOrderService payOrderService;
+
+    @Override
+    public JSONObject scanPay(RequestPlaceOrder order) throws Exception {
+        CommerceOrder commerce = commerceOrderService.getById(order.getOrderId());
+        if (commerce == null){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        String subject = Constant.COMMERCE_SUBJECT;
+        List<AlipayGoodsDetail> goodsDetailList = new ArrayList<>();
+        AlipayGoodsDetail goodsDetail = AlipayGoodsDetail.newInstance(commerce.getOrderSn(), subject, commerce.getAmount().intValue(), 1);
+        goodsDetailList.add(goodsDetail);
+        String orderSn = commerce.getOrderSn();
+        orderSn += "_commerce";
+        return payOrderService.aliPayScanPay(orderSn, subject, subject, commerce.getAmount(), goodsDetailList);
+    }
+
+    @Override
+    public JSONObject h5Pay(RequestPlaceOrder order, String ip) throws Exception {
+        CommerceOrder commerce = commerceOrderService.getById(order.getOrderId());
+        if (commerce == null){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        String subject = Constant.COMMERCE_SUBJECT;
+        String orderSn = commerce.getOrderSn();
+        orderSn += "_commerce";
+        return payOrderService.aliPayH5Pay(orderSn, subject, subject, commerce.getAmount());
+    }
+
+    @Override
+    public String getType() {
+        return "alipay_3";
+    }
+}

+ 71 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/AlipayDownload.java

@@ -0,0 +1,71 @@
+package com.fdkankan.platform.user.factory.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.Constant;
+import com.fdkankan.common.constant.OrderConstant;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.pay.alipay.sdk.AlipayGoodsDetail;
+import com.fdkankan.platform.order.entity.DownloadOrder;
+import com.fdkankan.platform.order.request.RequestPlaceOrder;
+import com.fdkankan.platform.order.service.IDownloadOrderService;
+import com.fdkankan.platform.order.service.PayOrderService;
+import com.fdkankan.platform.user.factory.Expansion;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 增值权益
+ */
+@Component
+public class AlipayDownload implements Expansion {
+
+    @Autowired
+    private IDownloadOrderService downloadOrderService;
+    @Autowired
+    private PayOrderService payOrderService;
+
+    @Override
+    public JSONObject scanPay(RequestPlaceOrder order) throws Exception {
+        DownloadOrder downloadOrderEntity = downloadOrderService.getById(order.getOrderId());
+        if (downloadOrderEntity == null){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        //订单金额为国外金额就报错
+        if(downloadOrderEntity.getAbroad() == 1){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004);
+        }
+        String subject = Constant.DOWNLOAD_SUBJECT + ":" + downloadOrderEntity.getCount() + "次";
+        List<AlipayGoodsDetail> goodsDetailList = new ArrayList<>();
+        AlipayGoodsDetail goodsDetail = AlipayGoodsDetail.newInstance(downloadOrderEntity.getOrderSn(), subject, downloadOrderEntity.getAmount().intValue(), 1);
+        goodsDetailList.add(goodsDetail);
+        String orderSn = downloadOrderEntity.getOrderSn();
+        orderSn += "_download";
+        String body = subject;
+        return payOrderService.aliPayScanPay(orderSn, subject, body, downloadOrderEntity.getAmount(), goodsDetailList);
+    }
+
+    @Override
+    public JSONObject h5Pay(RequestPlaceOrder order, String ip) throws Exception {
+        DownloadOrder downloadOrderEntity = downloadOrderService.getById(order.getOrderId());
+        if (downloadOrderEntity == null){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        //订单金额为国外金额就报错
+        if(downloadOrderEntity.getAbroad() == 1){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004);
+        }
+        String subject = Constant.DOWNLOAD_SUBJECT + ":" + downloadOrderEntity.getCount() + "次";
+        String orderSn = downloadOrderEntity.getOrderSn();
+        orderSn += "_increment";
+        String body = subject;
+        return payOrderService.aliPayH5Pay(orderSn, subject, body, downloadOrderEntity.getAmount());
+    }
+
+    @Override
+    public String getType() {
+        return "alipay_5";
+    }
+}

+ 74 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/AlipayEntity.java

@@ -0,0 +1,74 @@
+package com.fdkankan.platform.user.factory.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.OrderConstant;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.pay.alipay.sdk.AlipayGoodsDetail;
+import com.fdkankan.platform.order.request.RequestPlaceOrder;
+import com.fdkankan.platform.order.service.IOrderService;
+import com.fdkankan.platform.order.service.PayOrderService;
+import com.fdkankan.platform.user.factory.Entity;
+import com.fdkankan.platform.user.vo.ResponseOrder;
+import com.fdkankan.platform.user.vo.ResponseOrderItem;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Component
+public class AlipayEntity implements Entity {
+
+    @Autowired
+    private PayOrderService payOrderService;
+    @Autowired
+    private IOrderService orderService;
+
+    @Override
+    public JSONObject scanPay(RequestPlaceOrder order) throws Exception {
+        ResponseOrder responseOrder = orderService.getOrderDetail(order.getOrderId());
+        if (responseOrder.getId() == null){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        List<AlipayGoodsDetail> goodsDetailList = new ArrayList<>();
+        List<ResponseOrderItem> items = responseOrder.getOrderItems();
+        StringBuilder sb = new StringBuilder();
+        AlipayGoodsDetail goodsDetail = null;
+        for (int i = 0; i < items.size(); i++){
+            sb.append(items.get(i).getGoodsCount()).append("*").append(items.get(i).getGoodsName());
+            if (i != items.size() - 1){
+                sb.append(",");
+            }
+
+            goodsDetail = AlipayGoodsDetail.newInstance(items.get(i).getGoodsSn(), items.get(i).getGoodsName(), items.get(i).getGoodsPrice().intValue(), items.get(i).getGoodsCount());
+            goodsDetailList.add(goodsDetail);
+        }
+        String orderSn = responseOrder.getOrderSn();
+        orderSn += "_entity";
+        return payOrderService.aliPayScanPay(orderSn, "四维看看官网-商品", sb.toString(), responseOrder.getTotalAmount(), goodsDetailList);
+    }
+
+    @Override
+    public JSONObject h5Pay(RequestPlaceOrder order, String ip) throws Exception {
+        ResponseOrder responseOrder = orderService.getOrderDetail(order.getOrderId());
+        if (responseOrder.getId() == null){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        List<ResponseOrderItem> items = responseOrder.getOrderItems();
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < items.size(); i++) {
+            sb.append(items.get(i).getGoodsCount()).append("*").append(items.get(i).getGoodsName());
+            if (i != items.size() - 1) {
+                sb.append(",");
+            }
+        }
+        String orderSn = responseOrder.getOrderSn();
+        orderSn += "_entity";
+        return payOrderService.aliPayH5Pay(orderSn, "四维看看官网-商品", sb.toString(),  responseOrder.getTotalAmount());
+    }
+
+    @Override
+    public String getType() {
+        return "alipay_0";
+    }
+}

+ 82 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/AlipayExpansion.java

@@ -0,0 +1,82 @@
+package com.fdkankan.platform.user.factory.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.Constant;
+import com.fdkankan.common.constant.OrderConstant;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.pay.alipay.sdk.AlipayGoodsDetail;
+import com.fdkankan.platform.order.entity.ExpansionOrder;
+import com.fdkankan.platform.order.request.RequestPlaceOrder;
+import com.fdkankan.platform.order.service.IExpansionOrderService;
+import com.fdkankan.platform.order.service.PayOrderService;
+import com.fdkankan.platform.user.factory.Expansion;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Component
+public class AlipayExpansion implements Expansion {
+
+    @Autowired
+    private IExpansionOrderService expansionOrderService;
+    @Autowired
+    private PayOrderService payOrderService;
+
+    @Override
+    public JSONObject scanPay(RequestPlaceOrder order) throws Exception {
+        ExpansionOrder expansion = expansionOrderService.getById(order.getOrderId());
+        if (expansion == null){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        //订单金额为国外金额就报错
+        if(expansion.getAbroad() == 1){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004);
+        }
+        String date = "1年";
+        if(expansion.getMonth() < 12){
+            date = expansion.getMonth() + "个月";
+        }
+        String subject = Constant.EXPANSION_SUBJECT + ":" + expansion.getUnitSize() + expansion.getUnit() + "/" + date;
+        List<AlipayGoodsDetail> goodsDetailList = new ArrayList<>();
+        AlipayGoodsDetail goodsDetail = AlipayGoodsDetail.newInstance(expansion.getOrderSn(), subject, expansion.getAmount().intValue(), 1);
+        goodsDetailList.add(goodsDetail);
+        String orderSn = expansion.getOrderSn();
+        orderSn += "_expansion";
+        String body = subject;
+        if(order.getSpaceId() != null){
+            body += "_" + order.getSpaceId();
+        }
+        return payOrderService.aliPayScanPay(orderSn, subject, body, expansion.getAmount(), goodsDetailList);
+    }
+
+    @Override
+    public JSONObject h5Pay(RequestPlaceOrder order, String ip) throws Exception {
+        ExpansionOrder expansion = expansionOrderService.getById(order.getOrderId());
+        if (expansion == null){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        //订单金额为国外金额就报错
+        if(expansion.getAbroad() == 1){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004);
+        }
+        String date = "1年";
+        if(expansion.getMonth() < 12){
+            date = expansion.getMonth() + "个月";
+        }
+        String subject = Constant.EXPANSION_SUBJECT + ":" + expansion.getUnitSize() + expansion.getUnit() + "/" + date;
+        String orderSn = expansion.getOrderSn();
+        orderSn += "_expansion";
+        String body = subject;
+        if(order.getSpaceId() != null){
+            body += "_" + order.getSpaceId();
+        }
+        return payOrderService.aliPayH5Pay(orderSn, subject, body, expansion.getAmount());
+    }
+
+    @Override
+    public String getType() {
+        return "alipay_2";
+    }
+}

+ 71 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/AlipayIncrement.java

@@ -0,0 +1,71 @@
+package com.fdkankan.platform.user.factory.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.Constant;
+import com.fdkankan.common.constant.OrderConstant;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.pay.alipay.sdk.AlipayGoodsDetail;
+import com.fdkankan.platform.order.entity.IncrementOrder;
+import com.fdkankan.platform.order.request.RequestPlaceOrder;
+import com.fdkankan.platform.order.service.IIncrementOrderService;
+import com.fdkankan.platform.order.service.PayOrderService;
+import com.fdkankan.platform.user.factory.Expansion;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 增值权益
+ */
+@Component
+public class AlipayIncrement implements Expansion {
+
+    @Autowired
+    private IIncrementOrderService iIncrementOrderService;
+    @Autowired
+    private PayOrderService payOrderService;
+
+    @Override
+    public JSONObject scanPay(RequestPlaceOrder order) throws Exception {
+        IncrementOrder incrementOrderEntity = iIncrementOrderService.getById(order.getOrderId());
+        if (incrementOrderEntity == null){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        //订单金额为国外金额就报错
+        if(incrementOrderEntity.getAbroad() == 1){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004);
+        }
+        String subject = Constant.INCREMENT_SUBJECT + ":" + incrementOrderEntity.getCount() + "个/年";
+        List<AlipayGoodsDetail> goodsDetailList = new ArrayList<>();
+        AlipayGoodsDetail goodsDetail = AlipayGoodsDetail.newInstance(incrementOrderEntity.getOrderSn(), subject, incrementOrderEntity.getAmount().intValue(), 1);
+        goodsDetailList.add(goodsDetail);
+        String orderSn = incrementOrderEntity.getOrderSn();
+        orderSn += "_increment";
+        String body = subject;
+        return payOrderService.aliPayScanPay(orderSn, subject, body, incrementOrderEntity.getAmount(), goodsDetailList);
+    }
+
+    @Override
+    public JSONObject h5Pay(RequestPlaceOrder order, String ip) throws Exception {
+        IncrementOrder incrementOrderEntity = iIncrementOrderService.getById(order.getOrderId());
+        if (incrementOrderEntity == null){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        //订单金额为国外金额就报错
+        if(incrementOrderEntity.getAbroad() == 1){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004);
+        }
+        String subject = Constant.INCREMENT_SUBJECT + ":" + incrementOrderEntity.getCount() + "个/年";
+        String orderSn = incrementOrderEntity.getOrderSn();
+        orderSn += "_increment";
+        String body = subject;
+        return payOrderService.aliPayH5Pay(orderSn, subject, body, incrementOrderEntity.getAmount());
+    }
+
+    @Override
+    public String getType() {
+        return "alipay_4";
+    }
+}

+ 59 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/AlipayRecharge.java

@@ -0,0 +1,59 @@
+package com.fdkankan.platform.user.factory.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.Constant;
+import com.fdkankan.common.constant.OrderConstant;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.pay.alipay.sdk.AlipayGoodsDetail;
+import com.fdkankan.platform.order.entity.VirtualOrder;
+import com.fdkankan.platform.order.request.RequestPlaceOrder;
+import com.fdkankan.platform.order.service.IVirtualOrderService;
+import com.fdkankan.platform.order.service.PayOrderService;
+import com.fdkankan.platform.user.factory.Recharge;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+@Component
+public class AlipayRecharge implements Recharge {
+
+    @Autowired
+    private IVirtualOrderService virtualOrderService;
+    @Autowired
+    private PayOrderService payOrderService;
+
+    @Override
+    public JSONObject scanPay(RequestPlaceOrder order) throws Exception {
+        VirtualOrder virtualOrderEntity = virtualOrderService.getById(order.getOrderId());
+        if (virtualOrderEntity == null){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        String subject = Constant.PAY_SUBJECT + ":" + virtualOrderEntity.getPoints();
+        List<AlipayGoodsDetail> goodsDetailList = new ArrayList<>();
+        AlipayGoodsDetail goodsDetail = AlipayGoodsDetail.newInstance(virtualOrderEntity.getOrderSn(), subject, new BigDecimal(virtualOrderEntity.getPoints()).intValue(), 1);
+        goodsDetailList.add(goodsDetail);
+        String orderSn = virtualOrderEntity.getOrderSn();
+        orderSn += "_recharge";
+        return payOrderService.aliPayScanPay(orderSn, subject, subject, new BigDecimal(virtualOrderEntity.getPoints()), goodsDetailList);
+    }
+
+    @Override
+    public JSONObject h5Pay(RequestPlaceOrder order, String ip) throws Exception {
+        VirtualOrder virtualOrderEntity = virtualOrderService.getById(order.getOrderId());
+        if (virtualOrderEntity == null){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        String subject = Constant.PAY_SUBJECT + ":" + virtualOrderEntity.getPoints();
+        String orderSn = virtualOrderEntity.getOrderSn();
+        orderSn += "_recharge";
+        return payOrderService.aliPayH5Pay(orderSn, subject, subject, new BigDecimal(virtualOrderEntity.getPoints()));
+    }
+
+    @Override
+    public String getType() {
+        return "alipay_1";
+    }
+}

+ 26 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/Paypal.java

@@ -0,0 +1,26 @@
+package com.fdkankan.platform.user.factory.impl;
+
+import com.fdkankan.platform.user.factory.*;
+
+public class Paypal implements Pay {
+
+    @Override
+    public Commerce commercePay() {
+        return new PaypalCommerce();
+    }
+
+    @Override
+    public Entity entityPay() {
+        return new PaypalEntity();
+    }
+
+    @Override
+    public Expansion expansionPay() {
+        return new PaypalExpansion();
+    }
+
+    @Override
+    public Recharge rechargePay() {
+        return new PaypalRecharge();
+    }
+}

+ 57 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/PaypalCommerce.java

@@ -0,0 +1,57 @@
+package com.fdkankan.platform.user.factory.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.Constant;
+import com.fdkankan.common.constant.OrderConstant;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.pay.paypal.PayPalDefaultConfig;
+import com.fdkankan.platform.order.entity.CommerceOrder;
+import com.fdkankan.platform.order.request.RequestPlaceOrder;
+import com.fdkankan.platform.order.service.ICommerceOrderService;
+import com.fdkankan.platform.order.service.PayOrderService;
+import com.fdkankan.platform.user.factory.Commerce;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Component
+public class PaypalCommerce implements Commerce {
+
+    @Autowired
+    private PayOrderService payOrderService;
+    @Autowired
+    private ICommerceOrderService commerceOrderService;
+    @Autowired
+    private PayPalDefaultConfig payPalDefaultConfig;
+
+    @Value("${main.url}")
+    private String mainUrl;
+
+    @Override
+    public JSONObject scanPay(RequestPlaceOrder order) throws Exception {
+        return getResult(order, mainUrl + payPalDefaultConfig.getPaySuccessUrl(), mainUrl + payPalDefaultConfig.getCancelUrl());
+    }
+
+    @Override
+    public JSONObject h5Pay(RequestPlaceOrder order, String ip) throws Exception {
+        return getResult(order, mainUrl + payPalDefaultConfig.getH5PaySuccessUrl(), mainUrl + payPalDefaultConfig.getH5CancelUrl());
+    }
+
+    private JSONObject getResult(RequestPlaceOrder order, String successUrl, String cancelUrl) throws Exception {
+        CommerceOrder commerce = commerceOrderService.getById(order.getOrderId());
+        if (commerce == null) {
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        String subject = Constant.COMMERCE_SUBJECT;
+        String orderSn = commerce.getOrderSn();
+        orderSn += "_commerce";
+        return payOrderService.payPalPay(orderSn, subject, subject, commerce.getAmount(), commerce.getAmount(),
+                successUrl,
+                cancelUrl);
+    }
+
+    @Override
+    public String getType() {
+        return "paypal_3";
+    }
+}

+ 58 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/PaypalDownload.java

@@ -0,0 +1,58 @@
+package com.fdkankan.platform.user.factory.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.Constant;
+import com.fdkankan.common.constant.OrderConstant;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.pay.paypal.PayPalDefaultConfig;
+import com.fdkankan.platform.order.entity.DownloadOrder;
+import com.fdkankan.platform.order.request.RequestPlaceOrder;
+import com.fdkankan.platform.order.service.IDownloadOrderService;
+import com.fdkankan.platform.order.service.PayOrderService;
+import com.fdkankan.platform.user.factory.Expansion;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Component
+public class PaypalDownload implements Expansion {
+
+    @Autowired
+    private PayOrderService payOrderService;
+    @Autowired
+    private IDownloadOrderService downloadOrderService;
+    @Autowired
+    private PayPalDefaultConfig payPalDefaultConfig;
+
+    @Value("${main.url}")
+    private String mainUrl;
+
+    @Override
+    public JSONObject scanPay(RequestPlaceOrder order) throws Exception {
+        return getResult(order, mainUrl + payPalDefaultConfig.getPaySuccessUrl(), mainUrl + payPalDefaultConfig.getCancelUrl());
+    }
+
+    @Override
+    public JSONObject h5Pay(RequestPlaceOrder order, String ip) throws Exception {
+        return getResult(order, mainUrl + payPalDefaultConfig.getH5PaySuccessUrl(), mainUrl + payPalDefaultConfig.getH5CancelUrl());
+    }
+
+    private JSONObject getResult(RequestPlaceOrder order, String successUrl, String cancelUrl) throws Exception {
+        DownloadOrder downloadOrderEntity = downloadOrderService.getById(order.getOrderId());
+        if (downloadOrderEntity == null) {
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        String subject = Constant.INCREMENT_SUBJECT + ":" + downloadOrderEntity.getCount() + "次";
+        String orderSn = downloadOrderEntity.getOrderSn();
+        orderSn += "_download";
+        String body = subject;
+        return payOrderService.payPalPay(orderSn, subject, body, downloadOrderEntity.getAmount(), downloadOrderEntity.getAmount(),
+                successUrl,
+                cancelUrl);
+    }
+
+    @Override
+    public String getType() {
+        return "paypal_5";
+    }
+}

+ 67 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/PaypalEntity.java

@@ -0,0 +1,67 @@
+package com.fdkankan.platform.user.factory.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.OrderConstant;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.pay.paypal.PayPalDefaultConfig;
+import com.fdkankan.platform.order.request.RequestPlaceOrder;
+import com.fdkankan.platform.order.service.IOrderService;
+import com.fdkankan.platform.order.service.PayOrderService;
+import com.fdkankan.platform.user.factory.Entity;
+import com.fdkankan.platform.user.vo.ResponseOrder;
+import com.fdkankan.platform.user.vo.ResponseOrderItem;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+public class PaypalEntity implements Entity {
+
+    @Autowired
+    private PayOrderService payOrderService;
+    @Autowired
+    private IOrderService orderService;
+    @Autowired
+    private PayPalDefaultConfig payPalDefaultConfig;
+
+    @Value("${main.url}")
+    private String mainUrl;
+
+    @Override
+    public JSONObject scanPay(RequestPlaceOrder order) throws Exception {
+        return getResult(order, mainUrl + payPalDefaultConfig.getPaySuccessUrl(), mainUrl + payPalDefaultConfig.getCancelUrl());
+    }
+
+    @Override
+    public JSONObject h5Pay(RequestPlaceOrder order, String ip) throws Exception {
+        return getResult(order, mainUrl + payPalDefaultConfig.getH5PaySuccessUrl(), mainUrl + payPalDefaultConfig.getH5CancelUrl());
+    }
+
+    @Override
+    public String getType() {
+        return "paypal_0";
+    }
+
+    private JSONObject getResult(RequestPlaceOrder order, String successUrl, String cancelUrl) throws Exception {
+        ResponseOrder responseOrder = orderService.getOrderDetail(order.getOrderId());
+        if (responseOrder.getId() == null)
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+
+        List<ResponseOrderItem> items = responseOrder.getOrderItems();
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < items.size(); i++) {
+            sb.append(items.get(i).getGoodsCount()).append("*").append(items.get(i).getGoodsName());
+            if (i != items.size() - 1) {
+                sb.append(",");
+            }
+        }
+        String orderSn = responseOrder.getOrderSn();
+        orderSn += "_entity";
+        return payOrderService.payPalPay(orderSn, sb.toString(), sb.toString(),
+                responseOrder.getTotalAmount(), responseOrder.getGoodsAmount(),
+                successUrl,
+                cancelUrl);
+    }
+}

+ 65 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/PaypalExpansion.java

@@ -0,0 +1,65 @@
+package com.fdkankan.platform.user.factory.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.Constant;
+import com.fdkankan.common.constant.OrderConstant;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.pay.paypal.PayPalDefaultConfig;
+import com.fdkankan.platform.order.entity.ExpansionOrder;
+import com.fdkankan.platform.order.request.RequestPlaceOrder;
+import com.fdkankan.platform.order.service.IExpansionOrderService;
+import com.fdkankan.platform.order.service.PayOrderService;
+import com.fdkankan.platform.user.factory.Expansion;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Component
+public class PaypalExpansion implements Expansion {
+
+    @Autowired
+    private PayOrderService payOrderService;
+    @Autowired
+    private IExpansionOrderService expansionOrderService;
+    @Autowired
+    private PayPalDefaultConfig payPalDefaultConfig;
+
+    @Value("${main.url}")
+    private String mainUrl;
+
+    @Override
+    public JSONObject scanPay(RequestPlaceOrder order) throws Exception {
+        return getResult(order, mainUrl + payPalDefaultConfig.getPaySuccessUrl(), mainUrl + payPalDefaultConfig.getCancelUrl());
+    }
+
+    @Override
+    public JSONObject h5Pay(RequestPlaceOrder order, String ip) throws Exception {
+        return getResult(order, mainUrl + payPalDefaultConfig.getH5PaySuccessUrl(), mainUrl + payPalDefaultConfig.getH5CancelUrl());
+    }
+
+    private JSONObject getResult(RequestPlaceOrder order, String successUrl, String cancelUrl) throws Exception {
+        ExpansionOrder expansion = expansionOrderService.getById(order.getOrderId());
+        if (expansion == null) {
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        String date = "1年";
+        if(expansion.getMonth() < 12){
+            date = expansion.getMonth() + "个月";
+        }
+        String subject = Constant.EXPANSION_SUBJECT + ":" + expansion.getUnitSize() + expansion.getUnit() + "/" + date;
+        String orderSn = expansion.getOrderSn();
+        orderSn += "_expansion";
+        String body = subject;
+        if(order.getSpaceId() != null){
+            orderSn += "_" + order.getSpaceId();
+        }
+        return payOrderService.payPalPay(orderSn, subject, body, expansion.getAmount(), expansion.getAmount(),
+                successUrl,
+                cancelUrl);
+    }
+
+    @Override
+    public String getType() {
+        return "paypal_2";
+    }
+}

+ 58 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/PaypalIncrement.java

@@ -0,0 +1,58 @@
+package com.fdkankan.platform.user.factory.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.Constant;
+import com.fdkankan.common.constant.OrderConstant;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.pay.paypal.PayPalDefaultConfig;
+import com.fdkankan.platform.order.entity.IncrementOrder;
+import com.fdkankan.platform.order.request.RequestPlaceOrder;
+import com.fdkankan.platform.order.service.IIncrementOrderService;
+import com.fdkankan.platform.order.service.PayOrderService;
+import com.fdkankan.platform.user.factory.Expansion;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Component
+public class PaypalIncrement implements Expansion {
+
+    @Autowired
+    private PayOrderService payOrderService;
+    @Autowired
+    private IIncrementOrderService incrementOrderService;
+    @Autowired
+    private PayPalDefaultConfig payPalDefaultConfig;
+
+    @Value("${main.url}")
+    private String mainUrl;
+
+    @Override
+    public JSONObject scanPay(RequestPlaceOrder order) throws Exception {
+        return getResult(order, mainUrl + payPalDefaultConfig.getPaySuccessUrl(), mainUrl + payPalDefaultConfig.getCancelUrl());
+    }
+
+    @Override
+    public JSONObject h5Pay(RequestPlaceOrder order, String ip) throws Exception {
+        return getResult(order, mainUrl + payPalDefaultConfig.getH5PaySuccessUrl(), mainUrl + payPalDefaultConfig.getH5CancelUrl());
+    }
+
+    private JSONObject getResult(RequestPlaceOrder order, String successUrl, String cancelUrl) throws Exception {
+        IncrementOrder incrementOrderEntity = incrementOrderService.getById(order.getOrderId());
+        if (incrementOrderEntity == null) {
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        String subject = Constant.INCREMENT_SUBJECT + ":" + incrementOrderEntity.getCount() + "个/年";
+        String orderSn = incrementOrderEntity.getOrderSn();
+        orderSn += "_increment";
+        String body = subject;
+        return payOrderService.payPalPay(orderSn, subject, body, incrementOrderEntity.getAmount(), incrementOrderEntity.getAmount(),
+                successUrl,
+                cancelUrl);
+    }
+
+    @Override
+    public String getType() {
+        return "paypal_4";
+    }
+}

+ 60 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/PaypalRecharge.java

@@ -0,0 +1,60 @@
+package com.fdkankan.platform.user.factory.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.Constant;
+import com.fdkankan.common.constant.OrderConstant;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.pay.paypal.PayPalDefaultConfig;
+import com.fdkankan.platform.order.entity.VirtualOrder;
+import com.fdkankan.platform.order.request.RequestPlaceOrder;
+import com.fdkankan.platform.order.service.IVirtualOrderService;
+import com.fdkankan.platform.order.service.PayOrderService;
+import com.fdkankan.platform.user.factory.Recharge;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+
+@Component
+public class PaypalRecharge implements Recharge {
+
+    @Autowired
+    private PayOrderService payOrderService;
+    @Autowired
+    private IVirtualOrderService virtualOrderService;
+    @Autowired
+    private PayPalDefaultConfig payPalDefaultConfig;
+
+    @Value("${main.url}")
+    private String mainUrl;
+
+    @Override
+    public JSONObject scanPay(RequestPlaceOrder order) throws Exception {
+        return getResult(order, mainUrl + payPalDefaultConfig.getPaySuccessUrl(), mainUrl + payPalDefaultConfig.getCancelUrl());
+    }
+
+    @Override
+    public JSONObject h5Pay(RequestPlaceOrder order, String ip) throws Exception {
+        return getResult(order, mainUrl + payPalDefaultConfig.getH5PaySuccessUrl(), mainUrl + payPalDefaultConfig.getH5CancelUrl());
+    }
+
+    private JSONObject getResult(RequestPlaceOrder order, String successUrl, String cancelUrl) throws Exception {
+        VirtualOrder virtualOrderEntity = virtualOrderService.getById(order.getOrderId());
+        if (virtualOrderEntity == null) {
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        String subject = Constant.PAY_SUBJECT + ":" + virtualOrderEntity.getPoints();
+        String orderSn = virtualOrderEntity.getOrderSn();
+        orderSn += "_recharge";
+        return payOrderService.payPalPay(orderSn, subject, subject,
+                new BigDecimal(virtualOrderEntity.getPoints()), new BigDecimal(virtualOrderEntity.getPoints()),
+                successUrl,
+                cancelUrl);
+    }
+
+    @Override
+    public String getType() {
+        return "paypal_1";
+    }
+}

+ 26 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/Wechat.java

@@ -0,0 +1,26 @@
+package com.fdkankan.platform.user.factory.impl;
+
+import com.fdkankan.platform.user.factory.*;
+
+public class Wechat implements Pay {
+
+    @Override
+    public Commerce commercePay() {
+        return new WechatCommerce();
+    }
+
+    @Override
+    public Entity entityPay() {
+        return new WechatEntity();
+    }
+
+    @Override
+    public Expansion expansionPay() {
+        return new WechatExpansion();
+    }
+
+    @Override
+    public Recharge rechargePay() {
+        return new WechatRecharge();
+    }
+}

+ 55 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/WechatCommerce.java

@@ -0,0 +1,55 @@
+package com.fdkankan.platform.user.factory.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.Constant;
+import com.fdkankan.common.constant.OrderConstant;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.platform.order.entity.CommerceOrder;
+import com.fdkankan.platform.order.request.RequestPlaceOrder;
+import com.fdkankan.platform.order.service.ICommerceOrderService;
+import com.fdkankan.platform.order.service.PayOrderService;
+import com.fdkankan.platform.user.factory.Commerce;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+
+@Component
+public class WechatCommerce implements Commerce {
+
+    @Autowired
+    private PayOrderService payOrderService;
+    @Autowired
+    private ICommerceOrderService commerceOrderService;
+
+    @Override
+    public JSONObject scanPay(RequestPlaceOrder order) throws Exception {
+        CommerceOrder commerce = commerceOrderService.getById(order.getOrderId());
+        if (commerce == null){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        String subject = Constant.COMMERCE_SUBJECT;
+        BigDecimal totalFee = commerce.getAmount().multiply(new BigDecimal(100));
+        String orderSn = commerce.getOrderSn();
+        orderSn += "_commerce";
+        return payOrderService.wechatScanPay(orderSn, subject, subject, totalFee);
+    }
+
+    @Override
+    public JSONObject h5Pay(RequestPlaceOrder order, String ip) throws Exception {
+        CommerceOrder commerce = commerceOrderService.getById(order.getOrderId());
+        if (commerce == null){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        String subject = Constant.COMMERCE_SUBJECT;
+        BigDecimal totalFee = commerce.getAmount().multiply(new BigDecimal(100));
+        String orderSn = commerce.getOrderSn();
+        orderSn += "_commerce";
+        return payOrderService.wechatH5Pay(orderSn, subject, subject, totalFee, ip);
+    }
+
+    @Override
+    public String getType() {
+        return "wechat_3";
+    }
+}

+ 65 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/WechatDownload.java

@@ -0,0 +1,65 @@
+package com.fdkankan.platform.user.factory.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.Constant;
+import com.fdkankan.common.constant.OrderConstant;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.platform.order.entity.DownloadOrder;
+import com.fdkankan.platform.order.request.RequestPlaceOrder;
+import com.fdkankan.platform.order.service.IDownloadOrderService;
+import com.fdkankan.platform.order.service.PayOrderService;
+import com.fdkankan.platform.user.factory.Expansion;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+
+@Component
+public class WechatDownload implements Expansion {
+
+    @Autowired
+    private PayOrderService payOrderService;
+    @Autowired
+    private IDownloadOrderService downloadOrderService;
+
+    @Override
+    public JSONObject scanPay(RequestPlaceOrder order) throws Exception {
+        DownloadOrder downloadOrderEntity = downloadOrderService.getById(order.getOrderId());
+        if (downloadOrderEntity == null){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        //订单金额为国外金额就报错
+        if(downloadOrderEntity.getAbroad() == 1){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004);
+        }
+        String subject = Constant.DOWNLOAD_SUBJECT + ":" + downloadOrderEntity.getCount() + "次";
+        BigDecimal totalFee = downloadOrderEntity.getAmount().multiply(new BigDecimal(100));
+        String orderSn = downloadOrderEntity.getOrderSn();
+        String body = subject;
+        orderSn += "_download";
+        return payOrderService.wechatScanPay(orderSn, subject, body, totalFee);
+    }
+
+    @Override
+    public JSONObject h5Pay(RequestPlaceOrder order, String ip) throws Exception {
+        DownloadOrder downloadOrderEntity = downloadOrderService.getById(order.getOrderId());
+        if (downloadOrderEntity == null){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        //订单金额为国外金额就报错
+        if(downloadOrderEntity.getAbroad() == 1){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004);
+        }
+        String subject = Constant.DOWNLOAD_SUBJECT + ":" + downloadOrderEntity.getCount() + "次";
+        BigDecimal totalFee = downloadOrderEntity.getAmount().multiply(new BigDecimal(100));
+        String orderSn = downloadOrderEntity.getOrderSn();
+        String body = subject;
+        orderSn += "_download";
+        return payOrderService.wechatH5Pay(orderSn, subject, body, totalFee, ip);
+    }
+
+    @Override
+    public String getType() {
+        return "wechat_5";
+    }
+}

+ 71 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/WechatEntity.java

@@ -0,0 +1,71 @@
+package com.fdkankan.platform.user.factory.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.OrderConstant;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.platform.order.request.RequestPlaceOrder;
+import com.fdkankan.platform.order.service.IOrderService;
+import com.fdkankan.platform.order.service.PayOrderService;
+import com.fdkankan.platform.user.factory.Entity;
+import com.fdkankan.platform.user.vo.ResponseOrder;
+import com.fdkankan.platform.user.vo.ResponseOrderItem;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Component
+public class WechatEntity implements Entity {
+
+    @Autowired
+    private IOrderService orderService;
+    @Autowired
+    private PayOrderService payOrderService;
+
+    @Override
+    public JSONObject scanPay(RequestPlaceOrder order) throws Exception {
+        ResponseOrder responseOrder = orderService.getOrderDetail(order.getOrderId());
+        if (responseOrder.getId() == null) {
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        List<ResponseOrderItem> items = responseOrder.getOrderItems();
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < items.size(); i++){
+            sb.append(items.get(i).getGoodsCount()).append("*").append(items.get(i).getGoodsName());
+            if (i != items.size() - 1){
+                sb.append(",");
+            }
+        }
+        BigDecimal totalFee = responseOrder.getTotalAmount().multiply(new BigDecimal(100));
+        String orderSn = responseOrder.getOrderSn();
+        orderSn += "_entity";
+        return payOrderService.wechatScanPay(orderSn, "四维看看官网-商品", sb.toString(), totalFee);
+    }
+
+    @Override
+    public JSONObject h5Pay(RequestPlaceOrder order, String ip) throws Exception {
+        ResponseOrder responseOrder = orderService.getOrderDetail(order.getOrderId());
+        if (responseOrder.getId() == null) {
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+
+        List<ResponseOrderItem> items = responseOrder.getOrderItems();
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < items.size(); i++){
+            sb.append(items.get(i).getGoodsCount()).append("*").append(items.get(i).getGoodsName());
+            if (i != items.size() - 1){
+                sb.append(",");
+            }
+        }
+        BigDecimal totalFee = responseOrder.getTotalAmount().multiply(new BigDecimal(100));
+        String orderSn = responseOrder.getOrderSn();
+        orderSn += "_entity";
+        return payOrderService.wechatH5Pay(orderSn, "四维看看官网-商品", sb.toString(), totalFee, ip);
+    }
+
+    @Override
+    public String getType() {
+        return "wechat_0";
+    }
+}

+ 81 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/WechatExpansion.java

@@ -0,0 +1,81 @@
+package com.fdkankan.platform.user.factory.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.Constant;
+import com.fdkankan.common.constant.OrderConstant;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.platform.order.entity.ExpansionOrder;
+import com.fdkankan.platform.order.request.RequestPlaceOrder;
+import com.fdkankan.platform.order.service.IExpansionOrderService;
+import com.fdkankan.platform.order.service.PayOrderService;
+import com.fdkankan.platform.user.factory.Expansion;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+
+@Component
+public class WechatExpansion implements Expansion {
+
+    @Autowired
+    private PayOrderService payOrderService;
+    @Autowired
+    private IExpansionOrderService expansionOrderService;
+
+    @Override
+    public JSONObject scanPay(RequestPlaceOrder order) throws Exception {
+        ExpansionOrder expansion = expansionOrderService.getById(order.getOrderId());
+        if (expansion == null){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        //订单金额为国外金额就报错
+        if(expansion.getAbroad() == 1){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004);
+        }
+        String date = "1年";
+        if(expansion.getMonth() < 12){
+            date = expansion.getMonth() + "个月";
+        }
+        String subject = Constant.EXPANSION_SUBJECT + ":" + expansion.getUnitSize() + expansion.getUnit() + "/" + date;
+        BigDecimal totalFee = expansion.getAmount().multiply(new BigDecimal(100));
+        String orderSn = expansion.getOrderSn();
+        String body = subject;
+        if(order.getSpaceId() != null){
+            orderSn += "_" + order.getSpaceId();
+        }else {
+            orderSn += "_expansion";
+        }
+        return payOrderService.wechatScanPay(orderSn, subject, body, totalFee);
+    }
+
+    @Override
+    public JSONObject h5Pay(RequestPlaceOrder order, String ip) throws Exception {
+        ExpansionOrder expansion = expansionOrderService.getById(order.getOrderId());
+        if (expansion == null){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        //订单金额为国外金额就报错
+        if(expansion.getAbroad() == 1){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004);
+        }
+        String date = "1年";
+        if(expansion.getMonth() < 12){
+            date = expansion.getMonth() + "个月";
+        }
+        String subject = Constant.EXPANSION_SUBJECT + ":" + expansion.getUnitSize() + expansion.getUnit() + "/" + date;
+        BigDecimal totalFee = expansion.getAmount().multiply(new BigDecimal(100));
+        String orderSn = expansion.getOrderSn();
+        String body = subject;
+        if(order.getSpaceId() != null){
+            orderSn += "_" + order.getSpaceId();
+        }else {
+            orderSn += "_expansion";
+        }
+        return payOrderService.wechatH5Pay(orderSn, subject, body, totalFee, ip);
+    }
+
+    @Override
+    public String getType() {
+        return "wechat_2";
+    }
+}

+ 65 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/WechatIncrement.java

@@ -0,0 +1,65 @@
+package com.fdkankan.platform.user.factory.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.Constant;
+import com.fdkankan.common.constant.OrderConstant;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.platform.order.entity.IncrementOrder;
+import com.fdkankan.platform.order.request.RequestPlaceOrder;
+import com.fdkankan.platform.order.service.IIncrementOrderService;
+import com.fdkankan.platform.order.service.PayOrderService;
+import com.fdkankan.platform.user.factory.Expansion;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+
+@Component
+public class WechatIncrement implements Expansion {
+
+    @Autowired
+    private PayOrderService payOrderService;
+    @Autowired
+    private IIncrementOrderService incrementOrderService;
+
+    @Override
+    public JSONObject scanPay(RequestPlaceOrder order) throws Exception {
+        IncrementOrder incrementOrderEntity = incrementOrderService.getById(order.getOrderId());
+        if (incrementOrderEntity == null){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        //订单金额为国外金额就报错
+        if(incrementOrderEntity.getAbroad() == 1){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004);
+        }
+        String subject = Constant.INCREMENT_SUBJECT + ":" + incrementOrderEntity.getCount() + "个/年";
+        BigDecimal totalFee = incrementOrderEntity.getAmount().multiply(new BigDecimal(100));
+        String orderSn = incrementOrderEntity.getOrderSn();
+        String body = subject;
+        orderSn += "_increment";
+        return payOrderService.wechatScanPay(orderSn, subject, body, totalFee);
+    }
+
+    @Override
+    public JSONObject h5Pay(RequestPlaceOrder order, String ip) throws Exception {
+        IncrementOrder incrementOrderEntity = incrementOrderService.getById(order.getOrderId());
+        if (incrementOrderEntity == null){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        //订单金额为国外金额就报错
+        if(incrementOrderEntity.getAbroad() == 1){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004);
+        }
+        String subject = Constant.INCREMENT_SUBJECT + ":" + incrementOrderEntity.getCount() + "个/年";
+        BigDecimal totalFee = incrementOrderEntity.getAmount().multiply(new BigDecimal(100));
+        String orderSn = incrementOrderEntity.getOrderSn();
+        String body = subject;
+        orderSn += "_increment";
+        return payOrderService.wechatH5Pay(orderSn, subject, body, totalFee, ip);
+    }
+
+    @Override
+    public String getType() {
+        return "wechat_4";
+    }
+}

+ 55 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/factory/impl/WechatRecharge.java

@@ -0,0 +1,55 @@
+package com.fdkankan.platform.user.factory.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.Constant;
+import com.fdkankan.common.constant.OrderConstant;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.platform.order.entity.VirtualOrder;
+import com.fdkankan.platform.order.request.RequestPlaceOrder;
+import com.fdkankan.platform.order.service.IVirtualOrderService;
+import com.fdkankan.platform.order.service.PayOrderService;
+import com.fdkankan.platform.user.factory.Recharge;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+
+@Component
+public class WechatRecharge implements Recharge {
+
+    @Autowired
+    private PayOrderService payOrderService;
+    @Autowired
+    private IVirtualOrderService virtualOrderService;
+
+    @Override
+    public JSONObject scanPay(RequestPlaceOrder order) throws Exception {
+        VirtualOrder virtualOrderEntity = virtualOrderService.getById(order.getOrderId());
+        if (virtualOrderEntity == null){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        String subject = Constant.PAY_SUBJECT + ":" + virtualOrderEntity.getPoints();
+        BigDecimal totalFee = new BigDecimal(virtualOrderEntity.getPoints()).multiply(new BigDecimal(100));
+        String orderSn = virtualOrderEntity.getOrderSn();
+        orderSn += "_recharge";
+        return payOrderService.wechatScanPay(orderSn, subject, subject, totalFee);
+    }
+
+    @Override
+    public JSONObject h5Pay(RequestPlaceOrder order, String ip) throws Exception {
+        VirtualOrder virtualOrderEntity = virtualOrderService.getById(order.getOrderId());
+        if (virtualOrderEntity == null){
+            throw new BusinessException(OrderConstant.FAILURE_CODE_8001, OrderConstant.FAILURE_MSG_8001);
+        }
+        String subject = Constant.PAY_SUBJECT + ":" + virtualOrderEntity.getPoints();
+        BigDecimal totalFee = new BigDecimal(virtualOrderEntity.getPoints()).multiply(new BigDecimal(100));
+        String orderSn = virtualOrderEntity.getOrderSn();
+        orderSn += "_recharge";
+        return payOrderService.wechatH5Pay(orderSn, subject, subject, totalFee, ip);
+    }
+
+    @Override
+    public String getType() {
+        return "wechat_1";
+    }
+}

+ 11 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/OrderItemStrategy.java

@@ -0,0 +1,11 @@
+package com.fdkankan.platform.user.strategy;
+
+
+import com.fdkankan.platform.user.vo.ResponseOrderItem;
+
+public interface OrderItemStrategy {
+
+    public void handleOrderItem(Long userId, ResponseOrderItem orderItem) throws Exception;
+
+    public String getType();
+}

+ 9 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/OrderStrategy.java

@@ -0,0 +1,9 @@
+package com.fdkankan.platform.user.strategy;
+
+public interface OrderStrategy {
+
+    public void handleOrder(String orderSn, String tradeNo, String openId, int paymentTypeName, Long spaceId) throws Exception;
+
+    public String getType();
+
+}

+ 79 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/OrderStrategyFactory.java

@@ -0,0 +1,79 @@
+package com.fdkankan.platform.user.strategy;
+
+import com.fdkankan.common.util.SpringUtil;
+import com.fdkankan.platform.user.vo.ResponseOrderItem;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Log4j2
+@Component
+public class OrderStrategyFactory implements InitializingBean {
+
+    @Autowired
+    private SpringUtil applicationContextHelper;
+
+    private Map<String, OrderStrategy> orderHandleMap = new ConcurrentHashMap<>();
+
+    private Map<String, OrderItemStrategy> orderItemHandleMap = new ConcurrentHashMap<>();
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        Map<String, OrderItemStrategy> orderItemHandles = applicationContextHelper.getBeansOfType(OrderItemStrategy.class);
+        for (Map.Entry<String, OrderItemStrategy> orderHandle : orderItemHandles.entrySet()) {
+
+            String type = orderHandle.getValue().getType();
+            String[] types = type.split(",");
+            if (types.length > 1){
+                for (String str : types){
+                    orderItemHandleMap
+                            .put(str, orderHandle.getValue());
+                }
+            }
+            else{
+                orderItemHandleMap
+                        .put(orderHandle.getValue().getType(), orderHandle.getValue());
+            }
+        }
+
+
+        Map<String, OrderStrategy> orderHandles = applicationContextHelper.getBeansOfType(OrderStrategy.class);
+        for (Map.Entry<String, OrderStrategy> orderHandle : orderHandles.entrySet()) {
+            orderHandleMap.put(orderHandle.getValue().getType(), orderHandle.getValue());
+        }
+    }
+
+    public void doHandler(Long userId, ResponseOrderItem t) throws Exception{
+//        log.warn("userId:"+userId);
+        log.warn("sku:"+t.getSkuSn());
+//        log.warn("orderItemHandleMap:"+orderItemHandleMap);
+//        log.warn(" orderHandleMap.get(type):"+ orderItemHandleMap.get(t.getSkuSn()));
+        orderItemHandleMap.get(t.getSkuSn()).handleOrderItem(userId, t);
+    }
+
+    public void doHandler(String orderSn, String tradeNo, String openId, String type, int paymentTypeName) throws Exception{
+//        log.warn("orderSn:"+orderSn);
+//        log.warn("tradeNo:"+tradeNo);
+//        log.warn("openId:"+openId);
+//        log.warn("type:"+type);
+//        log.warn("paymentTypeName:"+paymentTypeName);
+//        log.warn("orderHandleMap:"+orderHandleMap);
+//        log.warn(" orderHandleMap.get(type):"+ orderHandleMap.get(type));
+        Long spaceId = null;
+        log.info("进入doHandler");
+        if(orderSn.split("_").length == 2){
+            spaceId = Long.valueOf(orderSn.split("_")[1]);
+            orderSn = orderSn.split("_")[0];
+        }
+        if(type.matches("^-?[0-9]+")){
+            type = "expansion";
+        }
+        log.info("type:" + type);
+        log.info("orderSn:" + orderSn);
+        orderHandleMap.get(type).handleOrder(orderSn, tradeNo, openId, paymentTypeName, spaceId);
+    }
+}

+ 59 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/impl/Camera2EyesOrderImpl.java

@@ -0,0 +1,59 @@
+package com.fdkankan.platform.user.strategy.impl;
+
+import com.fdkankan.platform.order.entity.Order;
+import com.fdkankan.platform.order.entity.TradeLog;
+import com.fdkankan.platform.order.service.IOrderService;
+import com.fdkankan.platform.order.service.ITradeLogService;
+import com.fdkankan.platform.user.strategy.OrderItemStrategy;
+import com.fdkankan.platform.user.vo.ResponseOrderItem;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 购买双目相机
+ */
+@Log4j2
+@Component
+public class Camera2EyesOrderImpl implements OrderItemStrategy {
+
+    @Autowired
+    private ITradeLogService tradeLogService;
+    @Autowired
+    private IOrderService orderService;
+
+    @Override
+    public void handleOrderItem(Long userId, ResponseOrderItem orderItem) throws Exception {
+        log.warn("八目相机购买支付成功,生成交易记录");
+        Order orderEntity = orderService.getById(orderItem.getOrderId());
+        TradeLog tradeLogEntity = tradeLogService.getByOrderSn(orderEntity.getOrderSn());
+        if (tradeLogEntity == null){
+            tradeLogEntity = new TradeLog();
+            tradeLogEntity.setOrderSn(orderEntity.getOrderSn());
+            tradeLogEntity.setAmount(orderItem.getGoodsPrice().multiply(new BigDecimal(orderItem.getGoodsCount())));
+            tradeLogEntity.setNumber(orderEntity.getTradeNum());
+//            tradeLogEntity.setTradeTime(new Date());
+            tradeLogEntity.setPayType(1);
+            tradeLogEntity.setPayStatus(1);
+            tradeLogEntity.setOpenid(orderItem.getOpenid());
+            tradeLogEntity.setUserId(orderEntity.getUserId());
+            tradeLogEntity.setAbroad(orderEntity.getAbroad());
+            tradeLogService.save(tradeLogEntity);
+        }else{
+            tradeLogEntity.setAmount(orderItem.getGoodsPrice().multiply(new BigDecimal(orderItem.getGoodsCount())));
+            tradeLogEntity.setNumber(orderEntity.getTradeNum());
+//            tradeLogEntity.setTradeTime(new Date());
+            tradeLogEntity.setOpenid(orderItem.getOpenid());
+            tradeLogEntity.setTradeTime(new Date());
+            tradeLogService.updateById(tradeLogEntity);
+        }
+    }
+
+    @Override
+    public String getType() {
+        return "U15609161635760014";
+    }
+}

+ 59 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/impl/Camera8EyesOrderImpl.java

@@ -0,0 +1,59 @@
+package com.fdkankan.platform.user.strategy.impl;
+
+import com.fdkankan.platform.order.entity.Order;
+import com.fdkankan.platform.order.entity.TradeLog;
+import com.fdkankan.platform.order.service.IOrderService;
+import com.fdkankan.platform.order.service.ITradeLogService;
+import com.fdkankan.platform.user.strategy.OrderItemStrategy;
+import com.fdkankan.platform.user.vo.ResponseOrderItem;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 购买八月相机升级专业会员
+ */
+@Log4j2
+@Component
+public class Camera8EyesOrderImpl implements OrderItemStrategy {
+
+    @Autowired
+    private ITradeLogService tradeLogService;
+    @Autowired
+    private IOrderService orderService;
+
+    @Override
+    public void handleOrderItem(Long userId, ResponseOrderItem orderItem) throws Exception {
+        log.warn("八目相机购买支付成功,生成交易记录");
+        Order orderEntity = orderService.getById(orderItem.getOrderId());
+        TradeLog tradeLogEntity = tradeLogService.getByOrderSn(orderEntity.getOrderSn());
+        if (tradeLogEntity == null){
+            tradeLogEntity = new TradeLog();
+            tradeLogEntity.setOrderSn(orderEntity.getOrderSn());
+            tradeLogEntity.setAmount(orderItem.getGoodsPrice().multiply(new BigDecimal(orderItem.getGoodsCount())));
+            tradeLogEntity.setNumber(orderEntity.getTradeNum());
+//            tradeLogEntity.setTradeTime(new Date());
+            tradeLogEntity.setPayType(1);
+            tradeLogEntity.setPayStatus(1);
+            tradeLogEntity.setOpenid(orderItem.getOpenid());
+            tradeLogEntity.setUserId(orderEntity.getUserId());
+            tradeLogEntity.setAbroad(orderEntity.getAbroad());
+            tradeLogService.save(tradeLogEntity);
+        }else{
+            tradeLogEntity.setAmount(orderItem.getGoodsPrice().multiply(new BigDecimal(orderItem.getGoodsCount())));
+            tradeLogEntity.setNumber(orderEntity.getTradeNum());
+//            tradeLogEntity.setTradeTime(new Date());
+            tradeLogEntity.setOpenid(orderItem.getOpenid());
+            tradeLogEntity.setTradeTime(new Date());
+            tradeLogService.updateById(tradeLogEntity);
+        }
+    }
+
+    @Override
+    public String getType() {
+        return "U15609161635760015";
+    }
+}

+ 57 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/impl/CommerceMonthOrderImpl.java

@@ -0,0 +1,57 @@
+package com.fdkankan.platform.user.strategy.impl;
+
+
+import com.fdkankan.platform.user.strategy.OrderItemStrategy;
+import com.fdkankan.platform.user.vo.ResponseOrderItem;
+
+/**
+ * 购买商业会员/月
+ */
+//@Component
+public class CommerceMonthOrderImpl implements OrderItemStrategy {
+
+//    @Autowired
+//    private ICameraSpaceService cameraSpaceService;
+//    @Autowired
+//    private IUserRoleService userRoleService;
+//    @Autowired
+//    private IUserService userService;
+//    @Autowired
+//    private SceneFeignClient sceneService;
+
+    @Override
+    public void handleOrderItem(Long userId, ResponseOrderItem orderItem) throws Exception {
+//        if (!getType().equals(orderItem.getSkuSn())){
+//            return;
+//        }
+//        UserRole dbUserRole = userRoleService.findByUserId(userId);
+//        if (dbUserRole.getRoleId() < 3){
+//            dbUserRole.setRoleId(3L);
+//            userRoleService.update(dbUserRole);
+//        }
+//        CameraSpaceEntity dbEntity = cameraSpaceService.findDeadlineSpaceByUserId(userId);
+//        if (dbEntity == null){
+//            String expansion = Constant.DEADLINE_SPACE_VALUE_YEAR;
+//            DateTime date = new DateTime().plusMonths(orderItem.getGoodsCount());
+//            CameraSpaceEntity userSpace = new CameraSpaceEntity();
+//            userSpace.setUserId(userId);
+//            userSpace.setSpace(new BigInteger(expansion));
+//            userSpace.setSpaceType(1);
+//            userSpace.setSpaceStartTime(new Date());
+//            userSpace.setSpaceEndTime(date.toDate());
+//            cameraSpaceService.save(userSpace);
+//            userService.updateUserTotalSpace(userId);
+//            sceneService.unlockBeyondSpaceScenes(new BigInteger(Constant.DEADLINE_SPACE_VALUE_YEAR), userId);
+//        }else{
+//            DateTime oldEndTime = new DateTime(dbEntity.getSpaceEndTime().getTime());
+//            DateTime newEndTime = oldEndTime.plusMonths(orderItem.getGoodsCount());
+//            dbEntity.setSpaceEndTime(newEndTime.toDate());
+//            cameraSpaceService.update(dbEntity);
+//        }
+    }
+
+    @Override
+    public String getType() {
+        return "U15604134903250001";
+    }
+}

+ 88 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/impl/CommerceOrderImpl.java

@@ -0,0 +1,88 @@
+package com.fdkankan.platform.user.strategy.impl;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fdkankan.common.constant.Constant;
+import com.fdkankan.platform.goods.entity.CameraDetail;
+import com.fdkankan.platform.goods.entity.CameraSpace;
+import com.fdkankan.platform.goods.service.ICameraDetailService;
+import com.fdkankan.platform.goods.service.ICameraSpaceService;
+import com.fdkankan.platform.order.entity.CommerceOrder;
+import com.fdkankan.platform.order.service.ICommerceOrderService;
+import com.fdkankan.platform.user.strategy.OrderStrategy;
+import lombok.extern.log4j.Log4j2;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+@Log4j2
+@Component
+public class CommerceOrderImpl implements OrderStrategy {
+    @Autowired
+    private ICameraSpaceService cameraSpaceService;
+    @Autowired
+    private ICameraDetailService cameraDetailService;
+    @Autowired
+    private ICommerceOrderService commerceOrderService;
+    @Autowired
+    private ObjectMapper mapper;
+
+    @Override
+    public void handleOrder(String orderSn, String tradeNo, String openId, int paymentTypeName, Long spaceId) throws Exception {
+        CommerceOrder commerceOrder = commerceOrderService.getByOrderSn(orderSn);
+        if (commerceOrder == null) {
+            log.error("找不到订单:" + orderSn);
+            throw new Exception("找不到订单,out_trade_no错误");
+        }
+        // 更新扩容订单
+        boolean result = commerceOrderService.paySuccessCommerceOrder(orderSn, tradeNo, paymentTypeName);
+        if (!result){
+            log.error("更新商业订单失败");
+            throw new Exception("更新商业订单失败");
+        }
+        String expansion = Constant.DEADLINE_SPACE_VALUE_YEAR;
+        CameraDetail detailEntity = cameraDetailService.getByCameraId(commerceOrder.getCameraId());
+        if (detailEntity.getCameraType() < 2){
+            detailEntity.setCameraType(2);
+            detailEntity.setTotalSpace(detailEntity.getTotalSpace() + Long.parseLong(expansion));
+            cameraDetailService.updateById(detailEntity);
+        }
+        CameraSpace dbEntity = cameraSpaceService.getByUserIdAndCameraId(commerceOrder.getUserId(), commerceOrder.getCameraId());
+        if (dbEntity == null){
+            DateTime date = new DateTime();
+            if (commerceOrder.getCommerceType() == 0){
+                date = date.plusYears(commerceOrder.getCount());
+            }else {
+                date = date.plusDays(commerceOrder.getCount() * 31);
+            }
+            CameraSpace cameraSpaceEntity = new CameraSpace();
+            cameraSpaceEntity.setOrderSn(orderSn);
+            cameraSpaceEntity.setUserId(commerceOrder.getUserId());
+            cameraSpaceEntity.setCameraId(commerceOrder.getCameraId());
+            cameraSpaceEntity.setSpace(Long.parseLong(expansion));
+            cameraSpaceEntity.setSpaceType(1);
+            cameraSpaceEntity.setSpaceStartTime(new Date());
+            cameraSpaceEntity.setSpaceEndTime(date.toDate());
+            cameraSpaceService.save(cameraSpaceEntity);
+        }else{
+            DateTime oldEndTime = new DateTime(dbEntity.getSpaceEndTime().getTime());
+            DateTime date;
+            if (commerceOrder.getCommerceType() == 0){
+                date = oldEndTime.plusYears(commerceOrder.getCount());
+            }else {
+                date = oldEndTime.plusDays(commerceOrder.getCount() * 31);
+            }
+            dbEntity.setSpaceEndTime(date.toDate());
+            cameraSpaceService.updateById(dbEntity);
+        }
+        //sceneService.unlockBeyondSpaceScenes(new BigInteger(Constant.DEADLINE_SPACE_VALUE_YEAR), commerceOrder.getUserId(), commerceOrder.getCameraId());
+        //todo unlockBeyondSpaceScenes
+    }
+
+    @Override
+    public String getType() {
+        return "commerce";
+    }
+
+}

+ 59 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/impl/CommerceYearOrderImpl.java

@@ -0,0 +1,59 @@
+package com.fdkankan.platform.user.strategy.impl;
+
+
+import com.fdkankan.platform.user.strategy.OrderItemStrategy;
+import com.fdkankan.platform.user.vo.ResponseOrderItem;
+
+/**
+ * 购买商业会员/年
+ */
+//@Component
+public class CommerceYearOrderImpl implements OrderItemStrategy {
+
+//    @Autowired
+//    private ICameraSpaceService userSpaceService;
+//    @Autowired
+//    private IUserRoleService userRoleService;
+//    @Autowired
+//    private IUserService userService;
+//    @Autowired
+//    private SceneFeignClient sceneService;
+
+    @Override
+    public void handleOrderItem(Long userId, ResponseOrderItem orderItem) throws Exception {
+//        if (!getType().equals(orderItem.getSkuSn())){
+//            return;
+//        }
+//        // 升级商业会员
+//        UserRole dbUserRole = userRoleService.findByUserId(userId);
+//        if (dbUserRole.getRoleId() < 3){
+//            dbUserRole.setRoleId(3L);
+//            userRoleService.update(dbUserRole);
+//        }
+//        CameraSpaceEntity dbEntity = userSpaceService.findDeadlineSpaceByUserId(userId);
+//        if (dbEntity == null){
+//            // 增加期限容量,按年算
+//            String expansion = Constant.DEADLINE_SPACE_VALUE_YEAR;
+//            DateTime date = new DateTime().plusYears(orderItem.getGoodsCount());
+//            CameraSpaceEntity userSpace = new CameraSpaceEntity();
+//            userSpace.setUserId(userId);
+//            userSpace.setSpace(new BigInteger(expansion));
+//            userSpace.setSpaceType(1);
+//            userSpace.setSpaceStartTime(new Date());
+//            userSpace.setSpaceEndTime(date.toDate());
+//            userSpaceService.save(userSpace);
+//            userService.updateUserTotalSpace(userId);
+//            sceneService.unlockBeyondSpaceScenes(new BigInteger(Constant.DEADLINE_SPACE_VALUE_YEAR), userId);
+//        }else{
+//            DateTime oldEndTime = new DateTime(dbEntity.getSpaceEndTime().getTime());
+//            DateTime newEndTime = oldEndTime.plusYears(orderItem.getGoodsCount());
+//            dbEntity.setSpaceEndTime(newEndTime.toDate());
+//            userSpaceService.update(dbEntity);
+//        }
+    }
+
+    @Override
+    public String getType() {
+        return "U15604134906280002";
+    }
+}

+ 46 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/impl/DownloadOrderImpl.java

@@ -0,0 +1,46 @@
+package com.fdkankan.platform.user.strategy.impl;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fdkankan.platform.order.entity.DownloadOrder;
+import com.fdkankan.platform.order.service.IDownloadOrderService;
+import com.fdkankan.platform.user.entity.User;
+import com.fdkankan.platform.user.service.IUserService;
+import com.fdkankan.platform.user.strategy.OrderStrategy;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Log4j2
+@Component
+public class DownloadOrderImpl implements OrderStrategy {
+    @Autowired
+    private IDownloadOrderService downloadOrderService;
+    @Autowired
+    private IUserService userService;
+    @Autowired
+    private ObjectMapper mapper;
+
+    @Override
+    public void handleOrder(String orderSn, String tradeNo, String openId, int paymentTypeName, Long spaceId) throws Exception {
+        DownloadOrder downloadOrder = downloadOrderService.getByOrderSn(orderSn);
+        if (downloadOrder == null) {
+            log.error("找不到订单:" + orderSn);
+            throw new Exception("找不到订单,out_trade_no错误");
+        }
+        // 更新场景下载订单
+        boolean result = downloadOrderService.paySuccessDownloadOrder(orderSn, tradeNo, paymentTypeName);
+        if (!result){
+            log.error("更新增值权益订单失败");
+            throw new Exception("更新增值权益订单失败");
+        }
+        //更新用户下载次数
+        User userEntity = userService.getById(downloadOrder.getUserId());
+        userEntity.setDownloadNumTotal(userEntity.getDownloadNumTotal() + downloadOrder.getCount());
+        userService.updateById(userEntity);
+    }
+
+    @Override
+    public String getType() {
+        return "download";
+    }
+}

+ 51 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/impl/EntityOrderImpl.java

@@ -0,0 +1,51 @@
+package com.fdkankan.platform.user.strategy.impl;
+
+import com.fdkankan.platform.order.entity.Order;
+import com.fdkankan.platform.order.service.IOrderItemService;
+import com.fdkankan.platform.order.service.IOrderService;
+import com.fdkankan.platform.user.strategy.OrderStrategy;
+import com.fdkankan.platform.user.strategy.OrderStrategyFactory;
+import com.fdkankan.platform.user.vo.ResponseOrderItem;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Log4j2
+@Component
+public class EntityOrderImpl implements OrderStrategy {
+    @Autowired
+    private IOrderService orderService;
+    @Autowired
+    private OrderStrategyFactory orderStrategyFactory;
+    @Autowired
+    private IOrderItemService orderItemService;
+
+    @Override
+    public void handleOrder(String orderSn, String tradeNo, String openId, int paymentTypeName, Long spaceId) throws Exception {
+        log.warn("购物支付处理....");
+        Order orderEntity = orderService.getByOrderSn(orderSn);
+        if (orderEntity == null) {
+            log.error("找不到订单:" + orderSn);
+            throw new Exception("找不到订单,out_trade_no错误");
+        }
+        boolean result = orderService.paySuccessEntityOrder(orderSn, tradeNo, paymentTypeName);
+        if (!result){
+            log.error("更新订单失败");
+            throw new Exception("更新订单失败");
+        }
+
+        List<ResponseOrderItem> responseOrderItems = orderItemService.getByOrderId(orderEntity.getId());
+        for (ResponseOrderItem orderItem : responseOrderItems){
+            orderItem.setOpenid(openId);
+            log.warn("orderStrategyFactory:"+orderStrategyFactory);
+            orderStrategyFactory.doHandler(orderEntity.getUserId(), orderItem);
+        }
+    }
+
+    @Override
+    public String getType() {
+        return "entity";
+    }
+}

+ 78 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/impl/ExpansionOrderImpl.java

@@ -0,0 +1,78 @@
+package com.fdkankan.platform.user.strategy.impl;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fdkankan.platform.goods.entity.CameraDetail;
+import com.fdkankan.platform.goods.entity.CameraSpace;
+import com.fdkankan.platform.goods.service.ICameraDetailService;
+import com.fdkankan.platform.goods.service.ICameraSpaceService;
+import com.fdkankan.platform.order.entity.ExpansionOrder;
+import com.fdkankan.platform.order.service.IExpansionOrderService;
+import com.fdkankan.platform.user.strategy.OrderStrategy;
+import lombok.extern.log4j.Log4j2;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Log4j2
+@Component
+public class ExpansionOrderImpl implements OrderStrategy {
+    @Autowired
+    private IExpansionOrderService expansionOrderService;
+    @Autowired
+    private ICameraSpaceService cameraSpaceService;
+    @Autowired
+    private ICameraDetailService cameraDetailService;
+    @Autowired
+    private ObjectMapper mapper;
+
+    @Override
+    public void handleOrder(String orderSn, String tradeNo, String openId, int paymentTypeName, Long spaceId) throws Exception {
+        ExpansionOrder expansionOrder = expansionOrderService.getByOrderSn(orderSn);
+        if (expansionOrder == null) {
+            log.error("找不到订单:" + orderSn);
+            throw new Exception("找不到订单,out_trade_no错误");
+        }
+        //1表示充值,0表示系统赠送,2表示升级套餐
+        int status = 1;
+        if(spaceId == null){
+            status = 2;
+        }
+        // 更新扩容订单
+        boolean result = expansionOrderService.paySuccessExpansionOrder(orderSn, tradeNo, paymentTypeName, status);
+        if (!result){
+            log.error("更新扩容订单失败");
+            throw new Exception("更新扩容订单失败");
+        }
+
+        CameraSpace cameraSpaceEntity = new CameraSpace();
+        if(spaceId == null){
+            //新的容量套餐方案
+            cameraSpaceService.removeByCameraId(expansionOrder.getCameraId());
+            cameraSpaceEntity = cameraSpaceService.saveByExpansionOrder(expansionOrder);
+            CameraDetail detailEntity = cameraDetailService.getByCameraId(expansionOrder.getCameraId());
+            detailEntity.setTotalSpace(cameraSpaceEntity.getSpace());
+            cameraDetailService.updateById(detailEntity);
+            //sceneService.unlockBeyondSpaceScenes(cameraSpaceEntity.getSpace(), cameraSpaceEntity.getUserId(), expansionOrder.getCameraId());
+            //todo unlockBeyondSpaceScenes
+        }else {
+            cameraSpaceEntity = cameraSpaceService.getById(spaceId);
+            DateTime date = null;
+            if(expansionOrder.getMonth() == 12){
+                date = new DateTime(cameraSpaceEntity.getSpaceEndTime()).plusYears(1);
+                if(cameraSpaceEntity.getSpaceEndTime().getYear() % 4 == 0){
+                    date.plusDays(1);
+                }
+            }else {
+                date = new DateTime(cameraSpaceEntity.getSpaceEndTime()).plusDays(expansionOrder.getMonth() * 31);
+            }
+            cameraSpaceEntity.setSpaceEndTime(date.toDate());
+            cameraSpaceEntity.setOrderSn(cameraSpaceEntity.getOrderSn() + "," + orderSn);
+            cameraSpaceService.updateById(cameraSpaceEntity);
+        }
+    }
+
+    @Override
+    public String getType() {
+        return "expansion";
+    }
+}

+ 102 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/impl/IncrementOrderImpl.java

@@ -0,0 +1,102 @@
+package com.fdkankan.platform.user.strategy.impl;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fdkankan.platform.order.entity.IncrementOrder;
+import com.fdkankan.platform.order.service.IIncrementOrderService;
+import com.fdkankan.platform.user.entity.User;
+import com.fdkankan.platform.user.entity.UserIncrement;
+import com.fdkankan.platform.user.service.IUserIncrementService;
+import com.fdkankan.platform.user.service.IUserService;
+import com.fdkankan.platform.user.strategy.OrderStrategy;
+import lombok.extern.log4j.Log4j2;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.UUID;
+
+@Log4j2
+@Component
+public class IncrementOrderImpl implements OrderStrategy {
+    @Autowired
+    private IIncrementOrderService incrementOrderService;
+    @Autowired
+    private IUserIncrementService userIncrementService;
+
+    @Autowired
+    private IUserService userService;
+    @Autowired
+    private ObjectMapper mapper;
+
+    @Override
+    public void handleOrder(String orderSn, String tradeNo, String openId, int paymentTypeName, Long spaceId) throws Exception {
+        IncrementOrder responseIncrementOrder = incrementOrderService.getByOrderSn(orderSn);
+        if (responseIncrementOrder == null) {
+            log.error("找不到订单:" + orderSn);
+            throw new Exception("找不到订单,out_trade_no错误");
+        }
+        // 更新增值权益订单
+        boolean result = incrementOrderService.paySuccessIncrementOrder(orderSn, tradeNo, paymentTypeName);
+        if (!result){
+            log.error("更新增值权益订单失败");
+            throw new Exception("更新增值权益订单失败");
+        }
+        UserIncrement userIncrementEntity = new UserIncrement();
+        if(responseIncrementOrder.getIncrementId() == null){
+
+            //新的增值权益套餐方案
+            DateTime date = new DateTime().plusYears(1);
+
+            if(responseIncrementOrder.getCount() > 0){
+                for(int i = 0, len = responseIncrementOrder.getCount(); i < len; i++){
+                    userIncrementEntity = new UserIncrement();
+                    userIncrementEntity.setKeyWord(UUID.randomUUID().toString().replace("-", ""));
+                    userIncrementEntity.setUserId(responseIncrementOrder.getUserId());
+                    userIncrementEntity.setOrderSn(orderSn);
+                    userIncrementEntity.setIncrementStartTime(new Date());
+                    userIncrementEntity.setIncrementEndTime(date.toDate());
+                    userIncrementEntity.setIsExpired(0);
+                    userIncrementService.save(userIncrementEntity);
+                }
+            }
+        }else {
+            userIncrementEntity = userIncrementService.getById(responseIncrementOrder.getIncrementId());
+            DateTime date = null;
+            Date nowDate = new Date();
+            if(userIncrementEntity.getIncrementEndTime().getTime() > nowDate.getTime()){
+                date = new DateTime(userIncrementEntity.getIncrementEndTime()).plusYears(1);
+                if(userIncrementEntity.getIncrementEndTime().getYear() % 4 == 0){
+                    date.plusDays(1);
+                }
+            }else {
+                date = new DateTime(nowDate).plusYears(1);
+                if(nowDate.getYear() % 4 == 0){
+                    date.plusDays(1);
+                }
+            }
+            userIncrementEntity.setIncrementEndTime(date.toDate());
+            userIncrementEntity.setOrderSn(userIncrementEntity.getOrderSn() + "," + orderSn);
+            userIncrementEntity.setCreateTime(new Date());
+            userIncrementEntity.setIsExpired(0);
+            userIncrementService.updateById(userIncrementEntity);
+
+            //解封所有场景
+            if(userIncrementEntity.getUserId() != null && userIncrementEntity.getCameraId() != null){
+                //sceneFeignClient.unlockBeyondSpaceScenes(null, userIncrementEntity.getUserId(), userIncrementEntity.getCameraId());
+                //todo unlockBeyondSpaceScenes
+            }
+        }
+
+        User userEntity = userService.getById(userIncrementEntity.getUserId());
+        if(userEntity != null){
+            userEntity.setDownloadNumTotal(userEntity.getDownloadNumTotal() + responseIncrementOrder.getCount() * 10);
+            userService.updateById(userEntity);
+        }
+    }
+
+    @Override
+    public String getType() {
+        return "increment";
+    }
+}

+ 47 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/strategy/impl/RechargeOrderImpl.java

@@ -0,0 +1,47 @@
+package com.fdkankan.platform.user.strategy.impl;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fdkankan.platform.goods.service.ICameraDetailService;
+import com.fdkankan.platform.order.entity.VirtualOrder;
+import com.fdkankan.platform.order.service.IVirtualOrderService;
+import com.fdkankan.platform.user.strategy.OrderStrategy;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Log4j2
+@Component
+public class RechargeOrderImpl implements OrderStrategy {
+    @Autowired
+    private IVirtualOrderService virtualOrderService;
+    @Autowired
+    private ICameraDetailService cameraDetailService;
+    @Autowired
+    private ObjectMapper mapper;
+
+    @Override
+    public void handleOrder(String orderSn, String tradeNo, String openId, int paymentTypeName, Long spaceId) throws Exception {
+        VirtualOrder responseVirtualOrder = virtualOrderService.getByOrderSn(orderSn);
+        if (responseVirtualOrder == null) {
+            log.error("找不到订单:" + orderSn);
+            throw new Exception("找不到订单,out_trade_no错误");
+        }
+
+        // 更新充值订单
+        boolean result = cameraDetailService.updateCameraBalance(responseVirtualOrder.getCameraId(), 0, responseVirtualOrder.getPoints());
+        if (!result){
+            log.error("更新相机余额错误");
+            throw new Exception("更新相机余额错误");
+        }
+        boolean result2 = virtualOrderService.paySuccessVirtualOrder(orderSn, tradeNo, paymentTypeName);
+        if (!result2){
+            log.error("更新充值订单失败");
+            throw new Exception("更新充值订单失败");
+        }
+    }
+
+    @Override
+    public String getType() {
+        return "recharge";
+    }
+}

+ 0 - 3
4dkankan-center-scene/src/main/java/com/fdkankan/scene/controller/TestController.java

@@ -7,7 +7,6 @@ import com.fdkankan.common.constant.ConstantFilePath;
 import com.fdkankan.common.util.MatrixToImageWriterUtil;
 import com.fdkankan.mq.message.BuildSceneMqMessage;
 import com.fdkankan.mq.util.RocketMQProducer;
-import com.fdkankan.platform.api.feign.PlatformClient;
 import com.fdkankan.platform.api.vo.User;
 import com.fdkankan.redis.util.RedisUtil;
 import com.fdkankan.scene.service.IFolderService;
@@ -36,8 +35,6 @@ import java.util.UUID;
 @RequestMapping("/api/device")
 public class TestController {
 
-    @Autowired
-    PlatformClient platformClient;
 
     @Autowired
     RedisUtil redisUtil;

+ 5 - 5
4dkankan-center-scene/src/main/java/com/fdkankan/scene/listener/BuildSceneResultMQListener.java

@@ -2,8 +2,9 @@ package com.fdkankan.scene.listener;
 
 import com.alibaba.fastjson.JSONObject;
 import com.fdkankan.common.constant.BuildStatus;
+import com.fdkankan.common.response.ResultData;
 import com.fdkankan.mq.message.BuildSceneResultMqMessage;
-import com.fdkankan.platform.api.feign.PlatformClient;
+import com.fdkankan.platform.api.feign.PlatformGoodsClient;
 import com.fdkankan.platform.api.vo.CameraDetail;
 import com.fdkankan.platform.api.vo.UserIncrement;
 import com.fdkankan.scene.entity.SceneFileBuild;
@@ -13,7 +14,6 @@ import com.fdkankan.scene.service.ISceneFileBuildService;
 import com.fdkankan.scene.service.ISceneProExtService;
 import com.fdkankan.scene.service.ISceneProService;
 import com.fdkankan.scene.service.ISceneService;
-import com.fdkankan.common.response.ResultData;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.rocketmq.spring.annotation.MessageModel;
 import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
@@ -50,7 +50,7 @@ public class BuildSceneResultMQListener implements RocketMQListener<String> {
     @Autowired
     ISceneProExtService sceneProExtService;
     @Autowired
-    PlatformClient platformClient;
+    PlatformGoodsClient platformGoodsClient;
 
 
     @Override
@@ -96,14 +96,14 @@ public class BuildSceneResultMQListener implements RocketMQListener<String> {
                 ScenePro scenePro = sceneProService.findBySceneNum(sceneCode);
                 if(Objects.nonNull(scenePro)){
                     SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId());
-                    ResultData<CameraDetail> resultData = platformClient.updateCameraDetailByCameraIdAndSpace(scenePro.getCameraId(), sceneProExt.getSpace());
+                    ResultData<CameraDetail> resultData = platformGoodsClient.updateCameraDetailByCameraIdAndSpace(scenePro.getCameraId(), sceneProExt.getSpace());
                     if(resultData.getCode() != 200){
                         log.error("调用platform服务updateCameraDetailByCameraIdAndSpace失败,参数{},{}" ,scenePro.getCameraId(), sceneProExt.getSpace());
                         return ;
                     }
                     CameraDetail cameraDetail = JSONObject.parseObject(JSONObject.toJSONString(resultData.getData()), CameraDetail.class);
 
-                    ResultData<UserIncrement> resultData1 = platformClient.getUserIncrementByCameraId(scenePro.getCameraId());
+                    ResultData<UserIncrement> resultData1 = platformGoodsClient.getUserIncrementByCameraId(scenePro.getCameraId());
                     if(resultData1.getCode() != 200){
                         log.error("调用platform服务getUserIncrementByCameraId失败,参数{}" ,scenePro.getCameraId());
                         return;

+ 27 - 26
4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneFileBuildServiceImpl.java

@@ -11,11 +11,15 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fdkankan.common.config.FileRouteConfig;
 import com.fdkankan.common.constant.*;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.common.response.ResultData;
 import com.fdkankan.common.user.SSOUser;
 import com.fdkankan.common.util.*;
+import com.fdkankan.fyun.oss.UploadToOssUtil;
 import com.fdkankan.mq.message.BuildSceneMqMessage;
 import com.fdkankan.mq.util.RocketMQProducer;
-import com.fdkankan.platform.api.feign.PlatformClient;
+import com.fdkankan.platform.api.feign.PlatformGoodsClient;
+import com.fdkankan.platform.api.feign.PlatformUserClient;
 import com.fdkankan.platform.api.vo.Camera;
 import com.fdkankan.platform.api.vo.CameraDetail;
 import com.fdkankan.platform.api.vo.Company;
@@ -24,10 +28,6 @@ import com.fdkankan.scene.entity.*;
 import com.fdkankan.scene.mapper.ISceneFileBuildMapper;
 import com.fdkankan.scene.service.*;
 import com.fdkankan.scene.vo.ResponseSceneFile;
-import com.fdkankan.common.constant.CameraConstant;
-import com.fdkankan.common.constant.ErrorCode;
-import com.fdkankan.common.exception.BusinessException;
-import com.fdkankan.common.response.ResultData;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.lang3.StringUtils;
@@ -38,7 +38,6 @@ import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.util.ObjectUtils;
 import org.springframework.web.multipart.MultipartFile;
-import com.fdkankan.fyun.oss.UploadToOssUtil;
 
 import java.io.BufferedReader;
 import java.io.File;
@@ -92,7 +91,9 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
     private String topicLaserA;
 
     @Autowired
-    PlatformClient platformClient;
+    PlatformGoodsClient platformGoodsClient;
+    @Autowired
+    PlatformUserClient platformUserClient;
 
     @Autowired
     ISceneFileUploadService sceneFileUploadService;
@@ -631,13 +632,13 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
             }
         }
         //判断 是否为激光相机
-        ResultData<Camera> cameraResult = platformClient.getCameraByChildName(mac);
+        ResultData<Camera> cameraResult = platformGoodsClient.getCameraByChildName(mac);
         if(!cameraResult.getSuccess()){
             log.error("获取不到Camera数据, childName: {}" ,  mac);
             throw new Exception();
         }
         Camera camera = cameraResult.getData();
-        ResultData<CameraDetail> cameraDetailResult = platformClient.getCameraDetailByCameraId(camera.getId());
+        ResultData<CameraDetail> cameraDetailResult = platformGoodsClient.getCameraDetailByCameraId(camera.getId());
         if(!cameraDetailResult.getSuccess()){
             log.error("获取不到CameraDetail数据, CameraId: {}" ,  camera.getId());
             throw new Exception();
@@ -699,11 +700,11 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
             throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
         }
 
-        ResultData<Camera> cameraResult = platformClient.getCameraByChildName(userName);
+        ResultData<Camera> cameraResult = platformGoodsClient.getCameraByChildName(userName);
         Camera camera = cameraResult.getData();
 
         if(camera == null){
-            cameraResult = platformClient.getCameraBySnCode(userName);
+            cameraResult = platformGoodsClient.getCameraBySnCode(userName);
             camera = cameraResult.getData();
         }
         if (camera == null){
@@ -745,17 +746,17 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
 
         String cameraName = jsonObject.getJSONObject("cam").getString("uuid");
         log.info("查询相机:" + cameraName);
-        cameraResult = platformClient.getCameraByChildName(cameraName);
+        cameraResult = platformGoodsClient.getCameraByChildName(cameraName);
         camera = cameraResult.getData();
 
         if(camera ==  null){
             log.error("该相机不存在:" + cameraName);
             //偶现data.fdage给的相机码多了或少了4DKKPRO_
             if(cameraName.contains("4DKKPRO_")){
-                cameraResult = platformClient.getCameraByChildName(cameraName.replace("4DKKPRO_", ""));
+                cameraResult = platformGoodsClient.getCameraByChildName(cameraName.replace("4DKKPRO_", ""));
                 camera = cameraResult.getData();
             }else {
-                cameraResult = platformClient.getCameraByChildName("4DKKPRO_" + cameraName);
+                cameraResult = platformGoodsClient.getCameraByChildName("4DKKPRO_" + cameraName);
                 camera = cameraResult.getData();
             }
             if(camera == null){
@@ -763,7 +764,7 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
             }
         }
 
-        ResultData<CameraDetail> detailResult = platformClient.getCameraDetailByCameraId(camera.getId());
+        ResultData<CameraDetail> detailResult = platformGoodsClient.getCameraDetailByCameraId(camera.getId());
         CameraDetail cameraDetail = detailResult.getData();
 
         if(cameraDetail ==  null){
@@ -884,19 +885,19 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
         }
 
         log.info("查询相机:" + snCode);
-        ResultData<Camera> cameraResult = platformClient.getCameraByChildName(snCode);
+        ResultData<Camera> cameraResult = platformGoodsClient.getCameraByChildName(snCode);
         Camera camera = cameraResult.getData();
 
         if(camera ==  null){
             log.error("该相机不存在:" + snCode);
-            cameraResult = platformClient.getCameraBySnCode(snCode);
+            cameraResult = platformGoodsClient.getCameraBySnCode(snCode);
             camera = cameraResult.getData();
             if(camera == null){
                 throw new BusinessException(CameraConstant.FAILURE_6003);
             }
         }
 
-        ResultData<CameraDetail> cameraDetailResult = platformClient.getCameraDetailByCameraId(camera.getId());
+        ResultData<CameraDetail> cameraDetailResult = platformGoodsClient.getCameraDetailByCameraId(camera.getId());
         CameraDetail cameraDetail = cameraDetailResult.getData();
         if(cameraDetail ==  null){
             log.error("该相机详情不存在:" + snCode);
@@ -905,7 +906,7 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
 
         String userName = null;
         if(cameraDetail.getUserId() != null){
-            ResultData<SSOUser> ssoResult = platformClient.getSSOUserByUserId(cameraDetail.getUserId());
+            ResultData<SSOUser> ssoResult = platformUserClient.getSSOUserByUserId(cameraDetail.getUserId());
             SSOUser user = ssoResult.getData();
 //            SSOUser user = mapper.convertValue(result.getData(), SSOUser.class);
             if(user != null){
@@ -977,7 +978,7 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
 
         if(cameraDetail.getCompanyId() != null){
 
-            ResultData<Company> companyResult = platformClient.getCompanyById(cameraDetail.getCompanyId());
+            ResultData<Company> companyResult = platformUserClient.getCompanyById(cameraDetail.getCompanyId());
             Company company = companyResult.getData();
             if(company != null){
 
@@ -1113,17 +1114,17 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
                 }
 
                 log.info("查询相机:" + cameraName);
-                ResultData<Camera> cameraResult = platformClient.getCameraByChildName(cameraName);
+                ResultData<Camera> cameraResult = platformGoodsClient.getCameraByChildName(cameraName);
                 Camera camera = cameraResult.getData();
 
                 if(camera ==  null){
                     log.error("该相机不存在:" + cameraName);
                     //偶现data.fdage给的相机码多了或少了4DKKPRO_
                     if(cameraName.contains("4DKKPRO_")){
-                        cameraResult = platformClient.getCameraByChildName(cameraName.replace("4DKKPRO_", ""));
+                        cameraResult = platformGoodsClient.getCameraByChildName(cameraName.replace("4DKKPRO_", ""));
                         camera = cameraResult.getData();
                     }else {
-                        cameraResult = platformClient.getCameraByChildName("4DKKPRO_" + cameraName);
+                        cameraResult = platformGoodsClient.getCameraByChildName("4DKKPRO_" + cameraName);
                         camera = cameraResult.getData();
                     }
                     if(camera == null){
@@ -1131,7 +1132,7 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
                     }
                 }
 
-                ResultData<CameraDetail> cameraDetailResult = platformClient.getCameraDetailByCameraId(camera.getId());
+                ResultData<CameraDetail> cameraDetailResult = platformGoodsClient.getCameraDetailByCameraId(camera.getId());
                 CameraDetail cameraDetail = cameraDetailResult.getData();
                 if(cameraDetail ==  null){
                     log.error("该相机详情不存在:" + cameraName);
@@ -1140,7 +1141,7 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
 
                 String userName = null;
                 if(cameraDetail.getUserId() != null){
-                    ResultData<SSOUser> ssoResult = platformClient.getSSOUserByUserId(cameraDetail.getUserId());
+                    ResultData<SSOUser> ssoResult = platformUserClient.getSSOUserByUserId(cameraDetail.getUserId());
                     SSOUser user = ssoResult.getData();
                     if(user != null){
                         userName = user.getUserName();
@@ -1222,7 +1223,7 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
                 uploadToOssUtil.delete("data/data"+sceneNum+File.separator+"houst_floor.json");
 
                 if(cameraDetail.getCompanyId() != null){
-                    ResultData<Company> companyResult = platformClient.getCompanyById(cameraDetail.getCompanyId());
+                    ResultData<Company> companyResult = platformUserClient.getCompanyById(cameraDetail.getCompanyId());
                     Company company = companyResult.getData();
                     if(company != null){
 

+ 6 - 3
4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneProServiceImpl.java

@@ -13,9 +13,11 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fdkankan.common.constant.*;
+import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.response.ResultData;
 import com.fdkankan.common.util.*;
-import com.fdkankan.platform.api.feign.PlatformClient;
+import com.fdkankan.fyun.oss.UploadToOssUtil;
+import com.fdkankan.platform.api.feign.PlatformGoodsClient;
 import com.fdkankan.redis.constant.RedisKey;
 import com.fdkankan.redis.constant.RedisLockKey;
 import com.fdkankan.redis.util.RedisLockUtil;
@@ -29,6 +31,7 @@ import com.fdkankan.common.constant.ErrorCode;
 import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.fyun.oss.UploadToOssUtil;
 import com.fdkankan.scene.vo.FileParamVO;
+import com.fdkankan.scene.vo.UploadFileParamVO;
 import lombok.extern.slf4j.Slf4j;
 import net.coobird.thumbnailator.Thumbnails;
 import org.joda.time.DateTime;
@@ -102,7 +105,7 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
     @Autowired
     ISceneDataDownloadService sceneDataDownloadService;
     @Autowired
-    PlatformClient platformClient;
+    PlatformGoodsClient platformGoodsClient;
 
     @Override
     public List<SceneVO> convert(List<ScenePro> list){
@@ -4432,7 +4435,7 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         }
         SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId());
 
-        platformClient.updateCameraDetailByCameraIdAndSpace(scenePro.getCameraId(), sceneProExt.getSpace());
+        platformGoodsClient.updateCameraDetailByCameraIdAndSpace(scenePro.getCameraId(), sceneProExt.getSpace());
 
         sceneProExt.setSpace(Long.parseLong("0"));
         sceneProExt.setUpdateTime(Calendar.getInstance().getTime());