extra_params;
/**
* 货柜ID
@@ -42,7 +44,7 @@ public class KsRecognitionDto {
*
* 需将主摄像头,即设备左上角或右上角的摄像头(开门那侧的最优),的url作为第一个链接
*/
- private String resource_urls;
+ private List resource_urls;
/**
* 资源信息列表,与resource_urls二选一。
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuSubmitCallbackDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuSubmitCallbackDto.java
new file mode 100644
index 000000000..840194c15
--- /dev/null
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuSubmitCallbackDto.java
@@ -0,0 +1,41 @@
+package com.bsd.pjcloud.thirdparty.dto.ks;
+
+import lombok.Data;
+
+@Data
+public class KsSkuSubmitCallbackDto {
+
+ /**
+ * 该字段为使用方系统sku_id
+ */
+ private String sku_id;
+
+ /**
+ * 该字段为超级收银员平台的sku_id,后续SKU管理域所有请求都需要以该字段作为参数
+ */
+ private String ks_sku_id;
+
+ /**
+ * 该字段返回结果为字典值,不同code代表不同结果
+ */
+ private Result result;
+
+ /**
+ * 审核不通过时该字段才有值
+ */
+ private String comments;
+
+ @Data
+ public static class Result {
+
+ /**
+ * 2:审核通过
+ * 3:审核不通过
+ */
+ private Integer code;
+
+ private String desc;
+
+ }
+
+}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/door/DoorOpenCallbackVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/door/DoorOpenCallbackVo.java
deleted file mode 100644
index 4e2230948..000000000
--- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/door/DoorOpenCallbackVo.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.bsd.pjcloud.thirdparty.vo.door;
-
-import lombok.Data;
-
-@Data
-public class DoorOpenCallbackVo {
-}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/door/DoorStatusVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/door/DoorStatusVo.java
index d2bb00954..6e42eb029 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/door/DoorStatusVo.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/door/DoorStatusVo.java
@@ -59,10 +59,10 @@ public class DoorStatusVo extends DoorBaseInnerVo {
/**
* 货柜列表
*/
- private List cabinetList;
+ private List cabinetStatusList;
@Data
- public class Cabinet {
+ public static class Cabinet {
/**
* 货柜号(1,2)
@@ -72,7 +72,7 @@ public class DoorStatusVo extends DoorBaseInnerVo {
/**
* 锁在线1:在线;2:离线
*/
- private Integer isLockOnline;
+ private String isLockOnline;
/**
* 锁状态1:锁关;2:锁开
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/door/DoorVideoCallbackVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/door/DoorVideoCallbackVo.java
deleted file mode 100644
index d51a92f2f..000000000
--- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/door/DoorVideoCallbackVo.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.bsd.pjcloud.thirdparty.vo.door;
-
-import lombok.Data;
-
-@Data
-public class DoorVideoCallbackVo {
-}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsBarcodeByIdsVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsBarcodeByIdsVo.java
index 6064037d2..39af47ac0 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsBarcodeByIdsVo.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsBarcodeByIdsVo.java
@@ -2,60 +2,29 @@ package com.bsd.pjcloud.thirdparty.vo.ks;
import lombok.Data;
+import java.util.List;
+
@Data
public class KsBarcodeByIdsVo {
/**
- * 该字段为超级收银员平台的商品ID
+ * 当前页码,正整数,默认1
*/
- private String ks_sku_id;
+ private Integer page_num;
/**
- * 商品69码,集合SKU无返回
+ * 分页大小,正整数,默认10,最大50
*/
- private String barcode;
+ private Integer page_size;
/**
- * 商品名称
+ * 总数
*/
- private String sku_name;
+ private Integer total;
/**
- * 业务方sku_id
+ * 商品列表
*/
- private String sku_id;
-
- /**
- * 商品包装图片列表,用于供无人零售柜运营方确认商品包装是否同拟售卖商品一致。因69码并非包装的唯一ID,同一69码会出现包装不一致的情况。所以该确认过程非常重要。
- */
- private String img_urls;
-
- /**
- * 商品封图300*300
- */
- private String cover;
-
- /**
- * SKU类型:
- * 0:标准库
- * 1:私有库
- */
- private String sku_type;
-
- /**
- * 该字段为SKU所对应的规格,包含口味、容量、重量,taste表示口味,capacity表示容量,单位:ml,weight表示重量,单位:g
- */
- private String specs;
-
- /**
- * 是否集合SKU
- */
- private String has_sub_sku;
-
- /**
- * 集合SKU的子SKU信息,
- * 子SKU更多详情可以通过4.1.8接口根据ks_sku_id查询。
- */
- private String sub_sku;
+ private List resultList;
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsBarcodeLikeVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsBarcodeLikeVo.java
index 2e58f22d3..2e7a8af6c 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsBarcodeLikeVo.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsBarcodeLikeVo.java
@@ -2,6 +2,29 @@ package com.bsd.pjcloud.thirdparty.vo.ks;
import lombok.Data;
+import java.util.List;
+
@Data
public class KsBarcodeLikeVo extends KsBaseInnerVo {
+
+ /**
+ * 当前页码,正整数,默认1
+ */
+ private Integer page_num;
+
+ /**
+ * 分页大小,正整数,默认10,最大50
+ */
+ private Integer page_size;
+
+ /**
+ * 总数
+ */
+ private Integer total;
+
+ /**
+ * 商品列表
+ */
+ private List resultList;
+
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsBarcodeSkuVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsBarcodeSkuVo.java
index ea9258213..7e6e05cb6 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsBarcodeSkuVo.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsBarcodeSkuVo.java
@@ -2,60 +2,28 @@ package com.bsd.pjcloud.thirdparty.vo.ks;
import lombok.Data;
+import java.util.List;
+
@Data
public class KsBarcodeSkuVo {
/**
- * 该字段为超级收银员平台的商品ID
+ * 当前页码,正整数,默认1
*/
- private String ks_sku_id;
+ private Integer page_num;
/**
- * 商品69码,集合SKU无返回
+ * 分页大小,正整数,默认10,最大50
*/
- private String barcode;
+ private Integer page_size;
/**
- * 商品名称
+ * 总数
*/
- private String sku_name;
+ private Integer total;
/**
- * 业务方sku_id
+ * 商品列表
*/
- private String sku_id;
-
- /**
- * 商品包装图片列表,用于供无人零售柜运营方确认商品包装是否同拟售卖商品一致。因69码并非包装的唯一ID,同一69码会出现包装不一致的情况。所以该确认过程非常重要。
- */
- private String img_urls;
-
- /**
- * 商品封图300*300
- */
- private String cover;
-
- /**
- * SKU类型:
- * 0:标准库
- * 1:私有库
- */
- private String sku_type;
-
- /**
- * 该字段为SKU所对应的规格,包含口味、容量、重量,taste表示口味,capacity表示容量,单位:ml,weight表示重量,单位:g
- */
- private String specs;
-
- /**
- * 是否集合SKU
- */
- private String has_sub_sku;
-
- /**
- * 集合SKU的子SKU信息,
- * 子SKU更多详情可以通过4.1.8接口根据ks_sku_id查询。
- */
- private String sub_sku;
-
+ private List resultList;
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsBaseVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsBaseVo.java
index 6c5e54876..983a155e1 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsBaseVo.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsBaseVo.java
@@ -19,7 +19,7 @@ public class KsBaseVo {
private String data;
public boolean isSuccess() {
- return ObjectUtil.equal(code, KsBaseVo.successCode);
+ return ObjectUtil.isEmpty(msg);
}
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsRecognitionVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsRecognitionVo.java
index 9a2820771..5fb5030fc 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsRecognitionVo.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsRecognitionVo.java
@@ -3,7 +3,7 @@ package com.bsd.pjcloud.thirdparty.vo.ks;
import lombok.Data;
@Data
-public class KsRecognitionVo {
+public class KsRecognitionVo extends KsBaseInnerVo {
/**
* 识别任务唯一ID,用于结果获取、重新发起售后识别
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuSubmitVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuSubmitVo.java
index a2ed32c81..78d2a05ad 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuSubmitVo.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuSubmitVo.java
@@ -3,7 +3,7 @@ package com.bsd.pjcloud.thirdparty.vo.ks;
import lombok.Data;
@Data
-public class KsSkuSubmitVo {
+public class KsSkuSubmitVo extends KsBaseInnerVo {
private String ks_sku_id;
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSpuVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSpuVo.java
new file mode 100644
index 000000000..ca1fc36df
--- /dev/null
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSpuVo.java
@@ -0,0 +1,77 @@
+package com.bsd.pjcloud.thirdparty.vo.ks;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 旷世商品
+ */
+@Data
+public class KsSpuVo {
+
+ /**
+ * 该字段为超级收银员平台的商品ID
+ */
+ private String ks_sku_id;
+
+ /**
+ * 商品69码,集合SKU无返回
+ */
+ private String barcode;
+
+ /**
+ * 商品名称
+ */
+ private String sku_name;
+
+ /**
+ * 业务方sku_id
+ */
+ private String sku_id;
+
+ /**
+ * 商品包装图片列表,用于供无人零售柜运营方确认商品包装是否同拟售卖商品一致。因69码并非包装的唯一ID,同一69码会出现包装不一致的情况。所以该确认过程非常重要。
+ */
+ private List img_urls;
+
+ /**
+ * 商品封图300*300
+ */
+ private String cover;
+
+ /**
+ * SKU类型:
+ * 0:标准库
+ * 1:私有库
+ */
+ private String sku_type;
+
+ /**
+ * 该字段为SKU所对应的规格,包含口味、容量、重量,taste表示口味,capacity表示容量,单位:ml,weight表示重量,单位:g
+ */
+ private KsSpuSpecsVo specs;
+
+ /**
+ * 是否集合SKU
+ */
+ private String has_sub_sku;
+
+ /**
+ * 集合SKU的子SKU信息,
+ * 子SKU更多详情可以通过4.1.8接口根据ks_sku_id查询。
+ */
+ private List sub_sku;
+
+ @Data
+ public static class KsSpuSpecsVo {
+
+ private String taste;
+
+ private String capacity;
+
+ private String weight;
+
+ }
+
+}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/DoorConfig.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/DoorConfig.java
index ca470f931..df99f53a1 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/DoorConfig.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/DoorConfig.java
@@ -15,5 +15,18 @@ public class DoorConfig {
private String appKey;
- private String selfBaseUrl;
+ /**
+ * 回调基础url
+ */
+ private String callbackBaseUrl;
+
+ /**
+ * 开锁回调url
+ */
+ private String callbackLockUrl;
+
+ /**
+ * 视频回调url
+ */
+ private String callbackVideoUrl;
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/KsDiscernConfig.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/KsDiscernConfig.java
index 4e7c5267d..291e7a042 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/KsDiscernConfig.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/KsDiscernConfig.java
@@ -16,4 +16,19 @@ public class KsDiscernConfig {
private String accessKey;
private String secretKey;
+
+ /**
+ * 回调基础url
+ */
+ private String callbackBaseUrl;
+
+ /**
+ * sku审核回调
+ */
+ private String callbackSkuUrl;
+
+ /**
+ * 识别回调
+ */
+ private String callbackRecognitionUrl;
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/door/ThirdDoorApiController.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/door/ThirdDoorApiController.java
index ffc54f243..f53b01539 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/door/ThirdDoorApiController.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/door/ThirdDoorApiController.java
@@ -1,6 +1,7 @@
package com.bsd.pjcloud.thirdparty.controller.door;
+import cn.hutool.json.JSONUtil;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.security.annotation.Inner;
import com.bsd.pjcloud.thirdparty.dto.door.*;
@@ -10,11 +11,11 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
@RestController
@RequiredArgsConstructor
@@ -84,22 +85,25 @@ public class ThirdDoorApiController {
@Inner(value = false)
@Operation(summary = "门锁开关通知回调")
@PostMapping("/callback/open")
- public R callbackOpen(@RequestBody DoorOpenCallbackDto dto) {
- return R.ok(thirdDoorApiService.callbackOpen(dto));
+ public void callbackOpen(HttpEntity httpEntity, @RequestHeader Map headers) {
+ String body = httpEntity.getBody();
+ thirdDoorApiService.callbackOpen(body, headers);
}
@Inner(value = false)
@Operation(summary = "视频地址通知回调")
@PostMapping("/callback/video")
- public R callbackVideo(@RequestBody DoorVideoCallbackDto dto) {
- return R.ok(thirdDoorApiService.callbackVideo(dto));
+ public void callbackVideo(HttpEntity httpEntity, @RequestHeader Map headers) {
+ String body = httpEntity.getBody();
+ thirdDoorApiService.callbackVideo(body, headers);
}
@Inner(value = false)
@Operation(summary = "设备状态通知回调")
@PostMapping("/callback/status")
- public R callbackStatus(@RequestBody DoorStatusDto dto) {
- return R.ok(thirdDoorApiService.callbackStatus(dto));
+ public void callbackStatus(HttpEntity httpEntity, @RequestHeader Map headers) {
+ String body = httpEntity.getBody();
+ thirdDoorApiService.callbackStatus(body, headers);
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ks/ThirdKsApiController.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ks/ThirdKsApiController.java
index cd2365973..c3ddc02ef 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ks/ThirdKsApiController.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ks/ThirdKsApiController.java
@@ -11,9 +11,12 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.*;
+import java.util.Map;
+
@RestController
@RequiredArgsConstructor
@RequestMapping("/third-ks")
@@ -97,4 +100,24 @@ public class ThirdKsApiController {
/* ************************************* end 远程调用 end ************************************* */
+ /* ************************************* start 回调 start ************************************* */
+
+ @Inner(value = false)
+ @Operation(summary = "sku审核回调")
+ @PostMapping("/callback/sku")
+ public void callbackSKu(HttpEntity httpEntity, @RequestHeader Map headers) {
+ String body = httpEntity.getBody();
+ thirdKsApiService.callbackSKu(body, headers);
+ }
+
+ @Inner(value = false)
+ @Operation(summary = "识别回调")
+ @PostMapping("/callback/recognition")
+ public void callbackRecognition(HttpEntity httpEntity, @RequestHeader Map headers) {
+ String body = httpEntity.getBody();
+ thirdKsApiService.callbackRecognition(body, headers);
+ }
+
+ /* ************************************* end 回调 end ************************************* */
+
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdDoorApiService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdDoorApiService.java
index f68b4d062..70c23b62a 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdDoorApiService.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdDoorApiService.java
@@ -4,6 +4,8 @@ package com.bsd.pjcloud.thirdparty.service;
import com.bsd.pjcloud.thirdparty.dto.door.*;
import com.bsd.pjcloud.thirdparty.vo.door.*;
+import java.util.Map;
+
public interface ThirdDoorApiService {
/**
@@ -44,15 +46,15 @@ public interface ThirdDoorApiService {
/**
* 门锁开关通知回调
*/
- DoorOpenCallbackVo callbackOpen(DoorOpenCallbackDto dto);
+ void callbackOpen(String json, Map headers);
/**
* 视频地址通知回调
*/
- DoorVideoCallbackVo callbackVideo(DoorVideoCallbackDto dto);
+ void callbackVideo(String json, Map headers);
/**
* 设备状态通知回调
*/
- DoorStatusVo callbackStatus(DoorStatusDto dto);
+ void callbackStatus(String json, Map headers);
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdKsApiService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdKsApiService.java
index e8c7406a0..f118b2f62 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdKsApiService.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdKsApiService.java
@@ -6,6 +6,8 @@ import com.bsd.pjcloud.thirdparty.dto.ks.*;
import com.bsd.pjcloud.thirdparty.vo.door.DoorRegisterVo;
import com.bsd.pjcloud.thirdparty.vo.ks.*;
+import java.util.Map;
+
public interface ThirdKsApiService {
/**
@@ -57,4 +59,14 @@ public interface ThirdKsApiService {
* SKU识别结果主动获取
*/
KsRecognitionResultVo recognitionResult(KsRecognitionResultDto dto);
+
+ /**
+ * sku审核回调
+ */
+ void callbackSKu(String json, Map headers);
+
+ /**
+ * 识别回调
+ */
+ void callbackRecognition(String json, Map headers);
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/door/ThirdDoorApiServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/door/ThirdDoorApiServiceImpl.java
index 62c334363..96456cba1 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/door/ThirdDoorApiServiceImpl.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/door/ThirdDoorApiServiceImpl.java
@@ -3,6 +3,7 @@ package com.bsd.pjcloud.thirdparty.service.impl.door;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.json.JSONUtil;
+import com.bsd.pjcloud.hard.api.feign.RemoteHardDoorService;
import com.bsd.pjcloud.thirdparty.config.DoorConfig;
import com.bsd.pjcloud.thirdparty.dto.door.*;
import com.bsd.pjcloud.thirdparty.entity.door.ThirdDoorLogEntity;
@@ -31,6 +32,8 @@ public class ThirdDoorApiServiceImpl implements ThirdDoorApiService {
private final ThirdDoorLogService doorLogService;
+ private final RemoteHardDoorService remoteHardDoorService;
+
/**
* 设备注册
*/
@@ -212,6 +215,8 @@ public class ThirdDoorApiServiceImpl implements ThirdDoorApiService {
ThirdDoorLogEntity logEntity = api.getInitLogEntity();
logEntity.setReq(JSONUtil.toJsonStr(dto));
try {
+ dto.setLockNotifyUrl(doorConfig.getCallbackBaseUrl() + doorConfig.getCallbackLockUrl());
+ dto.setVideoNotifyUrl(doorConfig.getCallbackBaseUrl() + doorConfig.getCallbackVideoUrl());
String body = JSONUtil.toJsonStr(dto);
String res = api.getHttpRequest().header(apiCountersign(body)).body(body).execute().body();
if (ObjectUtil.isEmpty(res)) throw new RuntimeException("response响应为空");
@@ -273,25 +278,81 @@ public class ThirdDoorApiServiceImpl implements ThirdDoorApiService {
* 门锁开关通知回调
*/
@Override
- public DoorOpenCallbackVo callbackOpen(DoorOpenCallbackDto dto) {
- return null;
+ public void callbackOpen(String json, Map headers) {
+ DoorOpenCallbackDto dto = JSONUtil.toBean(json, DoorOpenCallbackDto.class);
+ boolean isSign = apiParseSign(json, headers);
+ if (!isSign) {
+ log.error("|{}| callbackOpen 签名错误", TAG);
+ return;
+ }
+ long startTime = System.currentTimeMillis();
+ DoorApi.Api api = DoorApi.OPEN_CALLBACK.setBaseUrl(doorConfig.getBaseUrl());
+ ThirdDoorLogEntity logEntity = api.getInitLogEntity();
+ logEntity.setReq(json);
+ try {
+ remoteHardDoorService.disposeLocakCallback(dto);
+ } catch (Exception e) {
+ String error = String.format("|%s||callbackOpen|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace()));
+ log.error(error);
+ logEntity.setError(error);
+ } finally {
+ logEntity.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime));
+ doorLogService.save(logEntity);
+ }
}
/**
* 视频地址通知回调
*/
@Override
- public DoorVideoCallbackVo callbackVideo(DoorVideoCallbackDto dto) {
- return null;
+ public void callbackVideo(String json, Map headers) {
+ DoorVideoCallbackDto dto = JSONUtil.toBean(json, DoorVideoCallbackDto.class);
+ boolean isSign = apiParseSign(json, headers);
+ if (!isSign) {
+ log.error("|{}| callbackVideo 签名错误", TAG);
+ return;
+ }
+ long startTime = System.currentTimeMillis();
+ DoorApi.Api api = DoorApi.VIDEO_CALLBACK.setBaseUrl(doorConfig.getBaseUrl());
+ ThirdDoorLogEntity logEntity = api.getInitLogEntity();
+ logEntity.setReq(json);
+ try {
+ remoteHardDoorService.disposeVideoCallback(dto);
+ } catch (Exception e) {
+ String error = String.format("|%s||callbackVideo|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace()));
+ log.error(error);
+ logEntity.setError(error);
+ } finally {
+ logEntity.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime));
+ doorLogService.save(logEntity);
+ }
}
/**
* 设备状态通知回调
*/
@Override
- public DoorStatusVo callbackStatus(DoorStatusDto dto) {
-
- return null;
+ public void callbackStatus(String json, Map headers) {
+ DoorStatusCallbackDto dto = JSONUtil.toBean(json, DoorStatusCallbackDto.class);
+ boolean isSign = apiParseSign(json, headers);
+ if (!isSign) {
+ log.error("|{}| callbackStatus 签名错误", TAG);
+ return;
+ }
+ long startTime = System.currentTimeMillis();
+ DoorApi.Api api = DoorApi.STATUS_CALLBACK.setBaseUrl(doorConfig.getBaseUrl());
+ ThirdDoorLogEntity logEntity = api.getInitLogEntity();
+ logEntity.setReq(json);
+ try {
+ remoteHardDoorService.disposeStatusCallback(dto);
+ } catch (Exception e) {
+ String error = String.format("|%s||callbackStatus|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace()));
+ log.error(error);
+ logEntity.setError(error);
+ } finally {
+ logEntity.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime));
+ doorLogService.save(logEntity);
+ }
}
/**
@@ -317,4 +378,35 @@ public class ThirdDoorApiServiceImpl implements ThirdDoorApiService {
header.put("sign", List.of(map.get("sign")));
return header;
}
+
+ /**
+ * 接口解签
+ */
+ private boolean apiParseSign(String json, Map headers) {
+ if (ObjectUtil.isEmpty(headers)) {
+ log.error("|{}|apiParseSign 接口解签错误headers为空dto|{}|headers|{}|", TAG, json, JSONUtil.toJsonStr(headers));
+ return false;
+ }
+ String appid = headers.get("Appid");
+ String noncestr = headers.get("Noncestr");
+ String timestamp = headers.get("Timestamp");
+ String sign = headers.get("Sign");
+ if (ObjectUtil.notEqual(doorConfig.getAppId(), appid)) {
+ log.error("|{}|apiParseSign 接口解签错误appId错误dto|{}|headers|{}|", TAG, json, JSONUtil.toJsonStr(headers));
+ return false;
+ }
+ // 计算正确的sign
+ String successSign = "";
+ successSign += doorConfig.getAppId() + "&";
+ successSign += doorConfig.getAppKey() + "&";
+ successSign += noncestr + "&";
+ successSign += timestamp + "&";
+ successSign += json;
+ String successSignMd5 = DigestUtils.md5Hex(successSign);
+ if (ObjectUtil.notEqual(successSignMd5.toLowerCase(), sign.toLowerCase())) {
+ log.error("|{}|apiParseSign 接口解签错误sign错误dto|{}|headers|{}|", TAG, json, JSONUtil.toJsonStr(headers));
+ return false;
+ }
+ return true;
+ }
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ks/ThirdKsApiServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ks/ThirdKsApiServiceImpl.java
index 255dd7d61..4490dde4f 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ks/ThirdKsApiServiceImpl.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ks/ThirdKsApiServiceImpl.java
@@ -2,17 +2,20 @@ package com.bsd.pjcloud.thirdparty.service.impl.ks;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.RandomUtil;
import cn.hutool.json.JSONUtil;
+import com.bsd.pjcloud.hard.api.feign.RemoteHardDoorService;
import com.bsd.pjcloud.thirdparty.config.KsDiscernConfig;
import com.bsd.pjcloud.thirdparty.dto.ks.*;
import com.bsd.pjcloud.thirdparty.entity.door.ThirdDoorLogEntity;
import com.bsd.pjcloud.thirdparty.service.ThirdDoorLogService;
import com.bsd.pjcloud.thirdparty.service.ThirdKsApiService;
import com.bsd.pjcloud.thirdparty.utils.ks.api.KsApi;
+import com.bsd.pjcloud.thirdparty.utils.ks.tool.KsRetailSignUtils;
import com.bsd.pjcloud.thirdparty.vo.ks.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpPost;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
@@ -31,6 +34,8 @@ public class ThirdKsApiServiceImpl implements ThirdKsApiService {
private final ThirdDoorLogService doorLogService;
+ private final RemoteHardDoorService remoteHardDoorService;
+
/**
* 常规SKU提交审核
*/
@@ -230,7 +235,8 @@ public class ThirdKsApiServiceImpl implements ThirdKsApiService {
logEntity.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime));
doorLogService.save(logEntity);
}
- return JSONUtil.toBean(ksBaseVo.getData(), KsBarcodeLikeVo.class);
+ KsBarcodeLikeVo result = JSONUtil.toBean(ksBaseVo.getData(), KsBarcodeLikeVo.class);
+ return result;
}
/**
@@ -238,13 +244,30 @@ public class ThirdKsApiServiceImpl implements ThirdKsApiService {
*/
@Override
public KsRecognitionVo recognition(KsRecognitionDto dto) {
+ dto.setNotify_url(ksDiscernConfig.getCallbackBaseUrl() + ksDiscernConfig.getCallbackRecognitionUrl());
long startTime = System.currentTimeMillis();
KsBaseVo ksBaseVo = new KsBaseVo();
- KsApi.Api api = KsApi.BARCODE_SKU.setBaseUrl(ksDiscernConfig.getBaseUrl()).setParams(BeanUtil.beanToMap(dto));
+ KsApi.Api api = KsApi.RECOGNITION.setBaseUrl(ksDiscernConfig.getBaseUrl())
+ .setParams(BeanUtil.beanToMap(dto))
+ .setAccessKey(ksDiscernConfig.getAccessKey())
+ .setSecretKey(ksDiscernConfig.getSecretKey())
+ .setHost(ksDiscernConfig.getHost());
ThirdDoorLogEntity logEntity = api.getInitLogEntity();
logEntity.setReq(JSONUtil.toJsonStr(dto));
try {
-
+ String body = JSONUtil.toJsonStr(dto);
+ api.setBody(body);
+ String res = api.getHttpRequest().execute().body();
+ if (ObjectUtil.isEmpty(res)) throw new RuntimeException("response响应为空");
+ logEntity.setRes(res);
+ ksBaseVo = JSONUtil.toBean(res, KsBaseVo.class);
+ if (!ksBaseVo.isSuccess()) {
+ String errorLog = String.format("请求错误res|%s|url|%s|body|%s|", res, api, body);
+ log.error(errorLog);
+ KsRecognitionVo errorVo = new KsRecognitionVo();
+ errorVo.setMessage(ksBaseVo.getMsg());
+ return errorVo;
+ }
} catch (Exception e) {
String error = String.format("|%s||recognition|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace()));
log.error(error);
@@ -278,4 +301,83 @@ public class ThirdKsApiServiceImpl implements ThirdKsApiService {
}
return JSONUtil.toBean(ksBaseVo.getData(), KsRecognitionResultVo.class);
}
+
+ /**
+ * sku审核回调
+ */
+ @Override
+ public void callbackSKu(String json, Map headers) {
+ KsSkuSubmitCallbackDto dto = JSONUtil.toBean(json, KsSkuSubmitCallbackDto.class);
+ boolean isSign = apiParseSign(json, ksDiscernConfig.getCallbackSkuUrl(), headers);
+ if (!isSign) {
+ log.error("|{}| callbackSKu 签名错误", TAG);
+ return;
+ }
+ long startTime = System.currentTimeMillis();
+ KsApi.Api api = KsApi.SKU_SUBMIT_CALLBACK;
+ ThirdDoorLogEntity logEntity = api.getInitLogEntity();
+ logEntity.setReq(json);
+ try {
+
+ } catch (Exception e) {
+ String error = String.format("|%s||callbackSKu|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace()));
+ log.error(error);
+ logEntity.setError(error);
+ } finally {
+ logEntity.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime));
+ doorLogService.save(logEntity);
+ }
+ }
+
+ /**
+ * 识别回调
+ */
+ @Override
+ public void callbackRecognition(String json, Map headers) {
+ KsRecognitionCallbackDto dto = JSONUtil.toBean(json, KsRecognitionCallbackDto.class);
+ boolean isSign = apiParseSign(json, ksDiscernConfig.getCallbackRecognitionUrl(), headers);
+ if (!isSign) {
+ log.error("|{}| callbackRecognition 签名错误", TAG);
+ return;
+ }
+ long startTime = System.currentTimeMillis();
+ KsApi.Api api = KsApi.RECOGNITION_CALLBACK;
+ ThirdDoorLogEntity logEntity = api.getInitLogEntity();
+ logEntity.setReq(json);
+ try {
+ remoteHardDoorService.disposeRecognitionCallback(dto);
+ } catch (Exception e) {
+ String error = String.format("|%s||callbackRecognition|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace()));
+ log.error(error);
+ logEntity.setError(error);
+ } finally {
+ logEntity.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime));
+ doorLogService.save(logEntity);
+ }
+ }
+
+ /**
+ * 接口解签
+ */
+ private boolean apiParseSign(String json, String uri, Map headers) {
+ String authorization = headers.get("Authorization");
+ if (ObjectUtil.isEmpty(authorization)) {
+ throw new RuntimeException("签名参数缺失");
+ }
+ String referer = headers.get("Referer");
+ if (ObjectUtil.isEmpty(referer)) {
+ throw new RuntimeException("签名参数缺失");
+ }
+ String cleanUrl = referer.replaceAll("^(http|https)://", "");
+ String contentType = headers.get("Content-Type");
+ if (ObjectUtil.isEmpty(contentType)) {
+ throw new RuntimeException("签名参数缺失");
+ }
+ String timestamp = headers.get("X-Request-Date");
+ if (ObjectUtil.isEmpty(timestamp)) {
+ throw new RuntimeException("签名参数缺失");
+ }
+ String signAuth = KsRetailSignUtils.getSignAuth(cleanUrl, uri, contentType, HttpPost.METHOD_NAME, Long.valueOf(timestamp), ksDiscernConfig.getAccessKey(), ksDiscernConfig.getSecretKey(), json, "");
+ return ObjectUtil.equals(signAuth, authorization);
+ }
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/ks/api/KsApi.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/ks/api/KsApi.java
index cb17e8f64..c53b2192f 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/ks/api/KsApi.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/ks/api/KsApi.java
@@ -29,34 +29,40 @@ import java.util.TreeMap;
public class KsApi {
// 常规SKU提交审核
- public static final KsApi.Api SKU_SUBMIT = KsApi.Api.builder().url("/openapi/sc/v1/sku").bizType(ThirdDoorKsApiTypeEnum.REGISTER).method(HttpPost.METHOD_NAME).contentType("application/json").build();
+ public static final KsApi.Api SKU_SUBMIT = KsApi.Api.builder().url("/openapi/sc/v1/sku").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpPost.METHOD_NAME).contentType("application/json").build();
// 集合SKU提交审核(未公开)
- public static final KsApi.Api SKU_SUBMIT_COLLECTION = KsApi.Api.builder().url("/openapi/sc/v1/sku/collection").bizType(ThirdDoorKsApiTypeEnum.REGISTER).method(HttpPost.METHOD_NAME).contentType("application/json").build();
+ public static final KsApi.Api SKU_SUBMIT_COLLECTION = KsApi.Api.builder().url("/openapi/sc/v1/sku/collection").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpPost.METHOD_NAME).contentType("application/json").build();
// SKU审核结果主动获取
- public static final KsApi.Api SKU_RESULT = KsApi.Api.builder().url("/openapi/sc/v1/sku/%s").bizType(ThirdDoorKsApiTypeEnum.REGISTER).method(HttpPost.METHOD_NAME).contentType("application/json").build();
+ public static final KsApi.Api SKU_RESULT = KsApi.Api.builder().url("/openapi/sc/v1/sku/%s").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpPost.METHOD_NAME).contentType("application/json").build();
- // 常规SKU修改
- public static final KsApi.Api SKU_EDIT = KsApi.Api.builder().url("/openapi/sc/v1/sku/%s").bizType(ThirdDoorKsApiTypeEnum.REGISTER).method(HttpPatch.METHOD_NAME).contentType("application/json").build();
+ // SKU识别结果回调通知
+ public static final KsApi.Api SKU_EDIT = KsApi.Api.builder().url("/callback").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpPatch.METHOD_NAME).contentType("application/json").build();
+
+ // SKU审核结果回调通知
+ public static final KsApi.Api SKU_SUBMIT_CALLBACK = KsApi.Api.builder().url("/openapi/sc/v1/sku/%s").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT_CALLBACK).method(HttpPatch.METHOD_NAME).contentType("application/json").build();
// SKU删除
- public static final KsApi.Api SKU_DELETE = KsApi.Api.builder().url("/openapi/sc/v1/sku/%s").bizType(ThirdDoorKsApiTypeEnum.REGISTER).method(HttpDelete.METHOD_NAME).contentType("application/json").build();
+ public static final KsApi.Api SKU_DELETE = KsApi.Api.builder().url("/openapi/sc/v1/sku/%s").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpDelete.METHOD_NAME).contentType("application/json").build();
// 根据69码查询标准库和私有库商品信息
- public static final KsApi.Api BARCODE_SKU = KsApi.Api.builder().url("/openapi/sc/v1/sku/all_sku/%s").bizType(ThirdDoorKsApiTypeEnum.REGISTER).method(HttpGet.METHOD_NAME).contentType("application/json").build();
+ public static final KsApi.Api BARCODE_SKU = KsApi.Api.builder().url("/openapi/sc/v1/sku/all_sku/%s").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpGet.METHOD_NAME).contentType("application/json").build();
// 根据ks_sku_id查询标准库和私有库商品信息
- public static final KsApi.Api BARCODE_SKU_BY_ID = KsApi.Api.builder().url("/openapi/sc/v1/sku/skus/%s").bizType(ThirdDoorKsApiTypeEnum.REGISTER).method(HttpGet.METHOD_NAME).contentType("application/json").build();
+ public static final KsApi.Api BARCODE_SKU_BY_ID = KsApi.Api.builder().url("/openapi/sc/v1/sku/skus/%s").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpGet.METHOD_NAME).contentType("application/json").build();
// 模糊查询标准库和私有库商品信息
- public static final KsApi.Api BARCODE_SKU_LIKE = KsApi.Api.builder().url("/openapi/sc/v1/sku/sku_list").bizType(ThirdDoorKsApiTypeEnum.REGISTER).method(HttpGet.METHOD_NAME).contentType("application/json").build();
+ public static final KsApi.Api BARCODE_SKU_LIKE = KsApi.Api.builder().url("/openapi/sc/v1/sku/sku_list").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpGet.METHOD_NAME).contentType("application/json").build();
// SKU提交识别
- public static final KsApi.Api RECOGNITION = KsApi.Api.builder().url("/openapi/sc/v1/recognition/%s").bizType(ThirdDoorKsApiTypeEnum.REGISTER).method(HttpPost.METHOD_NAME).contentType("application/json").build();
+ public static final KsApi.Api RECOGNITION = KsApi.Api.builder().url("/openapi/sc/v1/recognition").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpPost.METHOD_NAME).contentType("application/json").build();
+
+ // SKU识别结果回调通知
+ public static final KsApi.Api RECOGNITION_CALLBACK = KsApi.Api.builder().url("/callback").bizType(ThirdDoorKsApiTypeEnum.RECOGNITION_CALLBACK).method(HttpPost.METHOD_NAME).contentType("application/json").build();
// SKU识别结果主动获取
- public static final KsApi.Api RECOGNITION_RESULT = KsApi.Api.builder().url("/openapi/sc/v1/recognition/%s").bizType(ThirdDoorKsApiTypeEnum.REGISTER).method(HttpPost.METHOD_NAME).contentType("application/json").build();
+ public static final KsApi.Api RECOGNITION_RESULT = KsApi.Api.builder().url("/openapi/sc/v1/recognition/%s").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpPost.METHOD_NAME).contentType("application/json").build();
@Data
@Builder
@@ -113,6 +119,11 @@ public class KsApi {
return this;
}
+ public KsApi.Api setBody(String body) {
+ this.body = body;
+ return this;
+ }
+
/**
* 获取当前时间戳
*/
@@ -148,13 +159,16 @@ public class KsApi {
Map> header = new HashMap<>();
header.put("Authorization", List.of(auth));
header.put("Content-Type", List.of(getContentType()));
- header.put("X-Request-Date", List.of(String.valueOf(getXRequestDate())));
+ header.put("X-Request-Date", List.of(String.valueOf(currentTime)));
header.put("X-Request-id", List.of(requestId));
header.put("Referer", List.of("https://" + getHost()));
return header;
}
public HttpRequest getHttpRequest() {
+ // 初始化数据
+ if (ObjectUtil.isEmpty(getBody())) setBody("");
+ if (ObjectUtil.isEmpty(getParams())) setParams(new TreeMap<>());
String fullPatch = baseUrl + url;
String query = getQueryString();
if (ObjectUtil.isNotEmpty(query)) {
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml
index ed59fc894..695a11e42 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml
@@ -75,16 +75,19 @@ door:
base-url: https://www.365e-life.net:8443/bkopenapi
app-id: 2025040991646569
app-key: 2800650617d44e0d8b31ad5287431179
-
- self-base-url:
+ callback-base-url: http://h1yzkslmyx.ny.takin.cc
+ callback-lock-url: /third/third-door/callback/open
+ callback-video-url: /third/third-door/callback/video
# 旷世识别
ks-discern:
base-url: https://retail.xlsdn.com
access-key: ed5A923eF0e941A1968eGTpF
secret-key: Ex3X0kgoc94sBOtivjWm5Vz9AyZTOUpl
-
host: retail.xlsdn.com
+ callback-base-url: http://h1yzkslmyx.ny.takin.cc
+ callback-recognition-url: /third/third-ks/callback/recognition
+ callback-sku-url: /third/third-ks/callback/sku
diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysDeptServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysDeptServiceImpl.java
index c961176ab..e36155178 100644
--- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysDeptServiceImpl.java
+++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysDeptServiceImpl.java
@@ -87,6 +87,16 @@ public class SysDeptServiceImpl extends ServiceImpl impl
public Boolean removeDeptById(Long id) {
// 级联删除部门
List idList = this.listDescendant(id).stream().map(SysDept::getDeptId).collect(Collectors.toList());
+ if (idList.size() > 1) throw new RuntimeException("该部门下有子部门,无法删除");
+
+ for (Long v : idList) {
+ // 查询该部门下的用户
+ List userList = userMapper.selectList(Wrappers.lambdaQuery().eq(SysUser::getDeptId, v));
+ if (CollUtil.isNotEmpty(userList)) {
+ SysDept sysDept = baseMapper.selectById(v);
+ throw new RuntimeException("该部门<" + sysDept.getName() + ">下有" + userList.size() + "名用户,无法删除,请先删除该部门下的用户");
+ }
+ }
Optional.ofNullable(idList).filter(CollUtil::isNotEmpty).ifPresent(this::removeByIds);
diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java
index 4066c95a9..420e03e23 100644
--- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java
+++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java
@@ -78,6 +78,7 @@ import org.springframework.beans.BeanUtils;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Caching;
import org.springframework.context.annotation.Lazy;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml
index 22b807bd7..41a60a494 100644
--- a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml
+++ b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml
@@ -174,6 +174,7 @@
FROM
sys_user u
LEFT JOIN sys_dept d ON d.dept_id = u.dept_id
+ LEFT JOIN sys_user_role urole ON urole.user_id = u.user_id
u.del_flag = '0'
@@ -193,6 +194,12 @@
AND u.dept_id = #{query.deptId}
+
+ and urole.role_id IN
+
+ #{v}
+
+
@@ -224,6 +231,7 @@
+ group by u.user_id
ORDER BY u.create_time DESC, u.user_id DESC
diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletCodeBizEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletCodeBizEnum.java
index 3d415b576..91f0f6093 100644
--- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletCodeBizEnum.java
+++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletCodeBizEnum.java
@@ -13,6 +13,7 @@ public enum WalletCodeBizEnum {
FOREIGN("2", "外来人员"),
CANTEEN_RESERVE("3", "食堂线上预订"),
SUPERMARKET_RESERVE("4", "超市线上预订"),
+ USER_WALLET("5", "用户钱包二维码"),
;
private final String code;
diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletTypeEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletTypeEnum.java
index 65a7779b2..e71c525bb 100644
--- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletTypeEnum.java
+++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletTypeEnum.java
@@ -14,7 +14,7 @@ import java.util.Arrays;
public enum WalletTypeEnum {
EAT("1", "饭卡钱包"),
- PAY("2", "虚拟钱包"),
+ PAY("2", "消费钱包"),
;
private final String code;
diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletCodeUseEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletCodeUseEntity.java
index 0a1b98f9e..26d1d08cb 100644
--- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletCodeUseEntity.java
+++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletCodeUseEntity.java
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import com.bsd.pjcloud.common.core.util.TenantTable;
+
import java.time.LocalDateTime;
/**
@@ -24,94 +25,100 @@ import java.time.LocalDateTime;
public class WalletCodeUseEntity extends Model {
- /**
- * 编号
- */
+ /**
+ * 编号
+ */
@TableId(type = IdType.ASSIGN_ID)
- @Schema(description="编号")
+ @Schema(description = "编号")
private Long id;
- /**
- * 用户id
- */
- @Schema(description="用户id")
+ /**
+ * 用户id
+ */
+ @Schema(description = "用户id")
private Long userId;
- /**
- * 类型
- */
- @Schema(description="类型")
+ /**
+ * 类型
+ */
+ @Schema(description = "类型")
private String bizType;
- /**
- * 类型关联id
- */
- @Schema(description="类型关联id")
+ /**
+ * 类型关联id
+ */
+ @Schema(description = "类型关联id")
private Long bizId;
- /**
- * 是否使用
- */
- @Schema(description="是否使用")
+ /**
+ * 是否使用
+ */
+ @Schema(description = "是否使用")
private String status;
- /**
- * 二维码
- */
- @Schema(description="二维码")
+ /**
+ * 二维码
+ */
+ @Schema(description = "二维码")
private String code;
- /**
- * 二维码内容
- */
- @Schema(description="二维码内容")
+ /**
+ * 二维码内容
+ */
+ @Schema(description = "二维码内容")
private String codeContent;
- /**
- * 使用时间
- */
- @Schema(description="使用时间")
+ /**
+ * 短码
+ */
+ @Schema(description = "短码")
+ private String shortCode;
+
+ /**
+ * 使用时间
+ */
+ @Schema(description = "使用时间")
private LocalDateTime useTime;
- /**
- * 创建人
- */
- @TableField(fill = FieldFill.INSERT)
- @Schema(description="创建人")
+ /**
+ * 创建人
+ */
+ @TableField(fill = FieldFill.INSERT)
+ @Schema(description = "创建人")
private String createBy;
- /**
- * 创建时间
- */
- @TableField(fill = FieldFill.INSERT)
- @Schema(description="创建时间")
+ /**
+ * 创建时间
+ */
+ @TableField(fill = FieldFill.INSERT)
+ @Schema(description = "创建时间")
private LocalDateTime createTime;
- /**
- * 修改人
- */
- @TableField(fill = FieldFill.INSERT_UPDATE)
- @Schema(description="修改人")
+ /**
+ * 修改人
+ */
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ @Schema(description = "修改人")
private String updateBy;
- /**
- * 修改时间
- */
- @TableField(fill = FieldFill.INSERT_UPDATE)
- @Schema(description="修改时间")
+ /**
+ * 修改时间
+ */
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ @Schema(description = "修改时间")
private LocalDateTime updateTime;
- /**
- * 删除标记
- */
+ /**
+ * 删除标记
+ */
@TableLogic
- @TableField(fill = FieldFill.INSERT)
- @Schema(description="删除标记")
+ @TableField(fill = FieldFill.INSERT)
+ @Schema(description = "删除标记")
private String delFlag;
- /**
- * 租户ID
- */
- @Schema(description="租户ID")
+ /**
+ * 租户ID
+ */
+ @Schema(description = "租户ID")
private Long tenantId;
}
\ No newline at end of file
diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletService.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletService.java
index ec3118e7d..7a1510fbb 100644
--- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletService.java
+++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletService.java
@@ -52,4 +52,7 @@ public interface RemoteWalletService {
@GetMapping("/wallet-manage/is-del")
R isDel(@RequestParam Long userId);
+
+ @GetMapping("/wallet-manage/inner/is-use-door")
+ R innserIsUseDoor(@RequestParam Long userId);
}
diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplyCompareVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplyCompareVo.java
index 4ec0f4c4e..8b283f1dd 100644
--- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplyCompareVo.java
+++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplyCompareVo.java
@@ -23,6 +23,11 @@ public class WalletRechargeApplyCompareVo extends HashMap {
*/
private String userMobile;
+ /**
+ * 扣减之后的余额
+ */
+ private Integer afterBalance;
+
public void setUserId(Long userId) {
this.userId = userId;
this.put("userId", userId);
@@ -58,4 +63,13 @@ public class WalletRechargeApplyCompareVo extends HashMap {
this.userMobile = userMobile;
this.put("userMobile", userMobile);
}
+
+ public Integer getAfterBalance() {
+ return (Integer) this.get("afterBalance");
+ }
+
+ public void setAfterBalance(Integer discountBalance) {
+ this.afterBalance = discountBalance;
+ this.put("afterBalance", discountBalance);
+ }
}
diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplySelectCompareVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplySelectCompareVo.java
index 97de6fff6..89aa740ea 100644
--- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplySelectCompareVo.java
+++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplySelectCompareVo.java
@@ -18,7 +18,7 @@ public class WalletRechargeApplySelectCompareVo {
@Schema(description = "当前月的金额")
private Integer price;
- @Schema(description = "总金额(加上倒入)")
+ @Schema(description = "总金额(加上导入)")
private Integer totalPrice;
@Schema(description = "充值月", requiredMode = Schema.RequiredMode.REQUIRED)
diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletCodeUseController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletCodeUseController.java
index 332b1a7d1..8cabfb93f 100644
--- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletCodeUseController.java
+++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletCodeUseController.java
@@ -7,7 +7,6 @@ import com.bsd.pjcloud.common.security.annotation.Inner;
import com.bsd.pjcloud.wallet.api.constant.WalletCodeBizEnum;
import com.bsd.pjcloud.wallet.api.dto.WalletCodeUseDto;
import com.bsd.pjcloud.wallet.api.entity.WalletCodeUseEntity;
-import com.bsd.pjcloud.wallet.api.vo.WalletCodeUseVo;
import com.bsd.pjcloud.wallet.service.WalletCodeUseService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
@@ -33,24 +32,37 @@ public class WalletCodeUseController {
private final WalletCodeUseService walletCodeUseService;
/* ************************************* start 远程调用 start ************************************* */
+
+ /**
+ * 核销二维码
+ */
@Inner
@GetMapping("/cancel-code")
public R cancelCode(@RequestParam Long id) {
return R.ok(walletCodeUseService.cancelCode(id));
}
+ /**
+ * 是否核销
+ */
@Inner
@GetMapping("/is-cancel-code")
public R isCancelCode(@RequestParam Long id) {
return R.ok(walletCodeUseService.isCancelCode(id));
}
+ /**
+ * 生成二维码
+ */
@Inner
@GetMapping("/generate-code")
public R generateCode(@RequestParam Long id, @RequestParam Long userId, @RequestParam WalletCodeBizEnum walletCodeBiz, @RequestParam Integer count) {
return R.ok(walletCodeUseService.generate(id, userId, walletCodeBiz, count));
}
+ /**
+ * 根据ids查询
+ */
@Inner
@GetMapping("/get-by-biz-ids")
public R> getByBizIds(@RequestParam List ids) {
@@ -60,6 +72,9 @@ public class WalletCodeUseController {
return R.ok(list);
}
+ /**
+ * 根据id查询
+ */
@Inner
@GetMapping("/get-by-biz-id")
public R getByBizId(@RequestParam Long id) {
@@ -78,6 +93,14 @@ public class WalletCodeUseController {
}
/* ************************************* end app end ************************************* */
+ /* ************************************* start android start ************************************* */
+ @Operation(summary = "根据短码查询加密信息", description = "根据短码查询加密信息")
+ @GetMapping("/ad/by-short-code")
+ public R adByShortCode(@RequestParam String shortCode) {
+ return R.ok(walletCodeUseService.getByShortCode(shortCode));
+ }
+ /* ************************************* end android end ************************************* */
+
@Operation(summary = "二维码列表", description = "二维码列表")
@GetMapping("/code-list")
public R codeList(@ParameterObject Page page, @ParameterObject WalletCodeUseDto dto) {
diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletManageController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletManageController.java
index 7aca69942..96cf6bb9e 100644
--- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletManageController.java
+++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletManageController.java
@@ -126,11 +126,22 @@ public class WalletManageController {
return R.ok(true);
}
+ /**
+ * 这个用户是否能够删除
+ */
@GetMapping("/is-del")
public R isDel(@RequestParam Long userId) {
return R.ok(walletManageService.isDel(userId));
}
+ /**
+ * 这个用户是否能够使用智能柜
+ */
+ @GetMapping("/inner/is-use-door")
+ public R innserIsUseDoor(@RequestParam Long userId) {
+ return R.ok(walletManageService.isUseDoor(userId));
+ }
+
/* ************************************* end 远程调用 end ************************************* */
@@ -159,6 +170,13 @@ public class WalletManageController {
public R getQrCode(@RequestParam Long walletId) {
return R.ok(walletManageService.getQrCode(walletId));
}
+
+ @GetMapping("/app/is-use-door")
+ @Operation(summary = "是够能够使用智能柜")
+ public R isUseDoor() {
+ PjcloudUser user = SecurityUtils.getUser();
+ return R.ok(walletManageService.isUseDoor(user.getId()));
+ }
/* ************************************* end app end ************************************* */
@Operation(summary = "分页查询", description = "分页查询")
diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletCodeUseService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletCodeUseService.java
index 81821a017..f0dec9a0d 100644
--- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletCodeUseService.java
+++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletCodeUseService.java
@@ -10,22 +10,30 @@ import jakarta.validation.constraints.NotNull;
public interface WalletCodeUseService extends IService {
+ /**
+ * 生成二维码
+ */
Boolean generate(@NotNull Long id, @NotNull Long userId, @NotNull WalletCodeBizEnum walletCodeBizEnum, @NotNull Integer count);
+ /**
+ * 生成钱包二码
+ */
+ WalletCodeUseEntity generateWallet(@NotNull Long walletId);
+
Page pageJoin(Page page, WalletCodeUseDto dto);
/**
* 核销二维码
- * @param id useCodeId
- * @return
*/
Boolean cancelCode(Long id);
/**
* 二维码是否核销
- * @param id useCodeId
- * @return
*/
Boolean isCancelCode(Long id);
+ /**
+ * 根据短码查询加密信息
+ */
+ String getByShortCode(String shortCode);
}
\ No newline at end of file
diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletManageService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletManageService.java
index ab9ab2751..7d5524869 100644
--- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletManageService.java
+++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletManageService.java
@@ -97,4 +97,9 @@ public interface WalletManageService extends IService {
* 是否可以删除该用户
*/
String isDel(Long userId);
+
+ /**
+ * 是够能够使用智能柜
+ */
+ String isUseDoor(Long userId);
}
\ No newline at end of file
diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletCodeUseServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletCodeUseServiceImpl.java
index 8cec2034b..a39b48a63 100644
--- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletCodeUseServiceImpl.java
+++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletCodeUseServiceImpl.java
@@ -1,32 +1,42 @@
package com.bsd.pjcloud.wallet.service.impl;
+import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.extra.spring.SpringUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.bsd.pjcloud.admin.api.dto.UserInfo;
import com.bsd.pjcloud.admin.api.entity.SysUser;
import com.bsd.pjcloud.admin.api.feign.RemoteFileService;
import com.bsd.pjcloud.admin.api.feign.RemoteUserService;
import com.bsd.pjcloud.admin.api.utils.DataUtil;
import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum;
+import com.bsd.pjcloud.common.core.util.BeanUtils;
import com.bsd.pjcloud.common.core.util.CollectionUtils;
import com.bsd.pjcloud.common.core.util.QRCodeImageGenerator;
import com.bsd.pjcloud.common.core.util.R;
+import com.bsd.pjcloud.hard.api.dto.code.QRCodeExtraDto;
import com.bsd.pjcloud.wallet.api.constant.WalletCodeBizEnum;
import com.bsd.pjcloud.wallet.api.dto.WalletCodeUseDto;
import com.bsd.pjcloud.wallet.api.entity.WalletCodeUseEntity;
+import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity;
import com.bsd.pjcloud.wallet.api.vo.WalletCodeUseVo;
+import com.bsd.pjcloud.wallet.api.vo.WalletSettingVo;
import com.bsd.pjcloud.wallet.mapper.WalletCodeUseMapper;
import com.bsd.pjcloud.wallet.service.WalletCodeUseService;
import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum;
import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum;
import com.bsd.pjcloud.hard.api.dto.code.QRCodeDto;
import com.bsd.pjcloud.hard.api.utils.HardUtil;
+import com.bsd.pjcloud.wallet.service.WalletManageService;
+import com.bsd.pjcloud.wallet.service.WalletSettingService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
-import org.apache.seata.spring.annotation.GlobalTransactional;
+import org.springframework.context.annotation.Lazy;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -35,6 +45,7 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.time.LocalDateTime;
+import java.time.ZoneId;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -53,9 +64,16 @@ public class WalletCodeUseServiceImpl extends ServiceImpl()
+ .eq(WalletCodeUseEntity::getUserId, wallet.getUserId())
+ .eq(WalletCodeUseEntity::getBizType, WalletCodeBizEnum.USER_WALLET.getCode())
+ .eq(WalletCodeUseEntity::getBizId, wallet.getId())
+ );
+ String shortCode = generateShortCode(encodeJson);
+ WalletCodeUseEntity codeUseEntity = WalletCodeUseEntity.builder()
+ .userId(wallet.getUserId())
+ .bizType(WalletCodeBizEnum.USER_WALLET.getCode())
+ .bizId(wallet.getId())
+ .status(YesNoEnum.NO.getCode())
+ .code("")
+ .codeContent(encodeJson)
+ .shortCode(shortCode)
+ .build();
+ baseMapper.insert(codeUseEntity);
+ return codeUseEntity;
+ }
+
+
@Override
public Page pageJoin(Page page, WalletCodeUseDto dto) {
Page list = baseMapper.pageJoin(page, dto);
@@ -126,4 +200,34 @@ public class WalletCodeUseServiceImpl extends ServiceImpl()
+ .eq(WalletCodeUseEntity::getShortCode, shortCode)
+ .orderByDesc(WalletCodeUseEntity::getCreateTime)
+ .orderByDesc(WalletCodeUseEntity::getId)
+ .last("limit 1")
+ );
+ return detail.getCodeContent();
+ }
+
+ // 生成短码
+ public String generateShortCode(String codeContent) {
+ while (true) {
+ String shortCode = DigestUtils.md5Hex(codeContent);
+ // 判断code是否存在
+ Long count = baseMapper.selectCount(new LambdaQueryWrapper().eq(WalletCodeUseEntity::getShortCode, shortCode));
+ if (count == 0) {
+ return shortCode;
+ }
+ }
+ }
+
+ private WalletCodeUseServiceImpl getSelf() {
+ return SpringUtil.getBean(getClass());
+ }
}
\ No newline at end of file
diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletManageServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletManageServiceImpl.java
index 0e905f96f..14cd09685 100644
--- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletManageServiceImpl.java
+++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletManageServiceImpl.java
@@ -4,9 +4,7 @@ import cn.hutool.core.codec.Base64;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.io.resource.ResourceUtil;
-import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.ZipUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
@@ -25,29 +23,20 @@ import com.bsd.pjcloud.admin.api.feign.RemoteUserService;
import com.bsd.pjcloud.admin.api.utils.DataUtil;
import com.bsd.pjcloud.common.core.constant.CacheConstants;
import com.bsd.pjcloud.common.core.constant.CommonRoleConstant;
-import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum;
import com.bsd.pjcloud.common.core.util.BeanUtils;
import com.bsd.pjcloud.common.core.util.CollectionUtils;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.common.data.resolver.ParamResolver;
-import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum;
-import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum;
-import com.bsd.pjcloud.hard.api.dto.code.QRCodeDto;
-import com.bsd.pjcloud.hard.api.dto.code.QRCodeExtraDto;
import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum;
import com.bsd.pjcloud.wallet.api.dto.WalletManageBalanceDto;
import com.bsd.pjcloud.wallet.api.dto.WalletManageDto;
import com.bsd.pjcloud.wallet.api.dto.WalletTypeDto;
-import com.bsd.pjcloud.wallet.api.entity.WalletActiveEntity;
-import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity;
-import com.bsd.pjcloud.wallet.api.entity.WalletTransactionEntity;
-import com.bsd.pjcloud.wallet.api.entity.WalletTypeEntity;
+import com.bsd.pjcloud.wallet.api.entity.*;
import com.bsd.pjcloud.wallet.api.utils.WalletDataUtil;
import com.bsd.pjcloud.wallet.api.vo.MchManageVo;
import com.bsd.pjcloud.wallet.api.vo.WalletManageBalanceVo;
import com.bsd.pjcloud.wallet.api.vo.WalletManageVo;
-import com.bsd.pjcloud.wallet.api.vo.WalletSettingVo;
import com.bsd.pjcloud.wallet.mapper.WalletManageMapper;
import com.bsd.pjcloud.wallet.mapper.WalletTransactionMapper;
import com.bsd.pjcloud.wallet.mapper.WalletTypeMapper;
@@ -65,8 +54,6 @@ import org.springframework.validation.annotation.Validated;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
import java.util.*;
/**
@@ -86,7 +73,7 @@ public class WalletManageServiceImpl extends ServiceImpl= 100 * 100) {
+ return null;
+ }
+ return "消费钱包余额不足100元";
+ }
+
private void disposeList(List list, WalletManageDto dto) {
if (ObjectUtil.isNotEmpty(list)) {
// 用户
diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyComposeServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyComposeServiceImpl.java
index 01f46e362..88e536a58 100644
--- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyComposeServiceImpl.java
+++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyComposeServiceImpl.java
@@ -7,14 +7,18 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsd.pjcloud.common.core.util.BeanUtils;
import com.bsd.pjcloud.wallet.api.constant.WalletBizEnum;
+import com.bsd.pjcloud.wallet.api.constant.WalletBizRechargeEnum;
+import com.bsd.pjcloud.wallet.api.dto.WalletManageDto;
import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeApplyDto;
import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeImportDto;
+import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity;
import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeApplyEntity;
import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeImportEntity;
import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeApplyCompareAceVo;
import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeApplyCompareVo;
import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeApplySelectCompareVo;
import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeImportVo;
+import com.bsd.pjcloud.wallet.mapper.WalletManageMapper;
import com.bsd.pjcloud.wallet.mapper.WalletTransactionMapper;
import com.bsd.pjcloud.wallet.service.WalletRechargeApplyComposeService;
import lombok.RequiredArgsConstructor;
@@ -38,6 +42,7 @@ public class WalletRechargeApplyComposeServiceImpl implements WalletRechargeAppl
private final WalletRechargeApplyServiceImpl rechargeApplyService;
private final WalletTransactionMapper walletTransactionMapper;
+ private final WalletManageMapper walletManageMapper;
@Override
@Transactional(rollbackFor = Exception.class)
@@ -145,6 +150,7 @@ public class WalletRechargeApplyComposeServiceImpl implements WalletRechargeAppl
v.put(currentImportKey + "_price", target.getPrice());
}
}
+
resultVo.setRecords(resultList);
List tableListStr = new ArrayList<>();
tableListStr.add(merge.get(0) + "(上个月总充值金额)");
diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java
index 382408e0b..07322e262 100644
--- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java
+++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java
@@ -16,6 +16,7 @@ import com.bsd.pjcloud.admin.api.entity.SysUser;
import com.bsd.pjcloud.admin.api.feign.RemoteDeptService;
import com.bsd.pjcloud.admin.api.feign.RemoteUserService;
import com.bsd.pjcloud.admin.api.utils.DataUtil;
+import com.bsd.pjcloud.admin.api.vo.UserVO;
import com.bsd.pjcloud.common.core.exception.ErrorCodes;
import com.bsd.pjcloud.common.core.util.BeanUtils;
import com.bsd.pjcloud.common.core.util.CollectionUtils;
@@ -32,6 +33,7 @@ import com.bsd.pjcloud.flow.task.dto.TaskDto;
import com.bsd.pjcloud.wallet.api.constant.WalletBizEnum;
import com.bsd.pjcloud.wallet.api.constant.WalletBizRechargeEnum;
import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum;
+import com.bsd.pjcloud.wallet.api.dto.WalletManageDto;
import com.bsd.pjcloud.wallet.api.dto.WalletTypeDto;
import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeApplyDto;
import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeImportDto;
@@ -41,9 +43,11 @@ import com.bsd.pjcloud.wallet.api.entity.WalletTypeEntity;
import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeApplyEntity;
import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeImportEntity;
import com.bsd.pjcloud.wallet.api.utils.WalletDataUtil;
+import com.bsd.pjcloud.wallet.api.vo.WalletManageVo;
import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeApplyVo;
import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeImportVo;
import com.bsd.pjcloud.wallet.api.vo.recharge.excel.WalletRechargeByApplyExcelVo;
+import com.bsd.pjcloud.wallet.mapper.WalletManageMapper;
import com.bsd.pjcloud.wallet.mapper.WalletTransactionMapper;
import com.bsd.pjcloud.wallet.mapper.WalletTypeMapper;
import com.bsd.pjcloud.wallet.mapper.recharge.WalletRechargeApplyMapper;
@@ -82,10 +86,11 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl batchSaveList = list.stream().map(v -> WalletRechargeImportEntity.builder().price(v.getPriceNumber()).userId(v.getUserId()).userDeptId(v.getUserDeptId()).build()).toList();
batchSaveList.forEach(v -> v.setApplyId(insertObj.getId()));
rechargeImportService.saveBatch(batchSaveList);
- return R.ok(null, MsgUtils.getMessage(ErrorCodes.SYS_USER_IMPORT_SUCCEED));
+ return R.ok(null, "导入成功");
}
/* ************************************* end excel end ************************************* */
@@ -444,6 +452,113 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl= 3;
}
+ /**
+ * 判断申请下如果类型为记账扣款,余额是否够扣款
+ */
+ private void validateWalletBalance(WalletRechargeApplyEntity applyDto) {
+ if (ObjectUtil.notEqual(applyDto.getBizType(), WalletBizRechargeEnum.REDUCTION.getCode())) return;
+ List importList = rechargeImportService.list(new LambdaQueryWrapper()
+ .eq(WalletRechargeImportEntity::getApplyId, applyDto.getId())
+ );
+ List importUserIds = importList.stream().map(WalletRechargeImportEntity::getUserId).distinct().toList();
+ // 查询用户
+ List userList = userService.getUserDeptByIds(importUserIds).getData();
+ // 错误信息
+ StringBuilder errorMsg = new StringBuilder();
+ // 查询用户钱包
+ WalletManageDto userWalletDto = new WalletManageDto();
+ userWalletDto.setUserIds(importUserIds);
+ List userWalletList = walletManageMapper.joinList(userWalletDto);
+ for (WalletRechargeImportEntity i : importList) {
+ List walletList = userWalletList.stream().filter(j -> ObjectUtil.equals(i.getUserId(), j.getUserId())).toList();
+ int walletBalance = walletList.stream().map(WalletManageEntity::getBalance).map(BigDecimal::valueOf).reduce(BigDecimal::add).get().intValue();
+ int discountPrice = walletBalance - i.getPrice();
+ if (discountPrice < 0) {
+ // 查询用户名字
+ UserVO userTarget = userList.stream().filter(j -> ObjectUtil.equals(i.getUserId(), j.getUserId())).findFirst().get();
+ if (ObjectUtil.isEmpty(userTarget)) {
+ errorMsg.append("用户id<").append(i.getUserId()).append(">");
+ } else {
+ errorMsg.append("用户名<").append(userTarget.getName()).append(">");
+ }
+ errorMsg.append("记账扣款失败,");
+ for (WalletManageVo j : walletList) {
+ WalletTypeEnum walletTypeEnum = WalletTypeEnum.valueOfByCode(j.getWalletTypeUniqueCode());
+ errorMsg.append(walletTypeEnum.getDesc()).append("余额为<").append(j.getBalance() / 100).append(">,");
+ }
+ errorMsg.append("总余额为<").append(walletBalance / 100).append(">");
+ errorMsg.append("记账扣款的金额<").append(i.getPrice() / 100).append(">,");
+ errorMsg.append("记账扣款后的金额<").append(discountPrice / 100).append(">\n");
+ }
+ }
+ String errorMsgString = errorMsg.toString();
+ if (ObjectUtil.isNotEmpty(errorMsgString)) throw new RuntimeException(errorMsgString);
+ }
+
+ private void validateWalletBalanceByType(WalletRechargeApplyEntity applyDto) {
+ if (ObjectUtil.notEqual(applyDto.getBizType(), WalletBizRechargeEnum.REDUCTION.getCode())) return;
+ List importList = rechargeImportService.list(new LambdaQueryWrapper()
+ .eq(WalletRechargeImportEntity::getApplyId, applyDto.getId())
+ );
+ List