feat: h5页面-积分商城-外部服务接口

This commit is contained in:
2026-07-27 15:36:26 +08:00
parent a2b769aeff
commit 0eefc705a1
22 changed files with 817 additions and 86 deletions
@@ -1,18 +0,0 @@
package com.budwk.app.zhgh.pointsmall.h5.loveaid;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
@IocBean
@Ok("json:full")
@At("/platform/h5/points-mall/loveAid")
public class PointsMallH5LoveAidController {
@At("")
@Ok("beetl:/platform/zhghh5/points-mall/loveAid/index.html")
@SaCheckPermission("h5.points.mall")
public void index() {
}
}
@@ -1,50 +0,0 @@
package com.budwk.app.zhgh.pointsmall.h5.me;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.pointsmall.points.service.PointsMallUserPointsService;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
@IocBean
@Ok("json:full")
@At("/platform/h5/points-mall/me")
public class PointsMallH5MeController {
@Inject
private PointsMallUserPointsService pointsMallUserPointsService;
@At("")
@Ok("beetl:/platform/zhghh5/points-mall/me/index.html")
@SaCheckPermission("h5.points.mall")
public void index() {
}
@At("/points")
@SaCheckPermission("h5.points.mall")
public Result points(@Param("userId") String userId) {
return Result.success(pointsMallUserPointsService.availablePoints(currentUserId(userId)));
}
@At("/userInfo")
@SaCheckPermission("h5.points.mall")
public Result userInfo(@Param("userId") String userId) {
return Result.success(pointsMallUserPointsService.userInfo(currentUserId(userId)));
}
private String currentUserId(String userId) {
if (StrUtil.isNotBlank(userId)) {
return userId;
}
try {
return StpUtil.getLoginIdAsString();
} catch (Exception e) {
return "";
}
}
}
@@ -1,18 +0,0 @@
package com.budwk.app.zhgh.pointsmall.h5.movies;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
@IocBean
@Ok("json:full")
@At("/platform/h5/points-mall/movies")
public class PointsMallH5MoviesController {
@At("")
@Ok("beetl:/platform/zhghh5/points-mall/movies/index.html")
@SaCheckPermission("h5.points.mall")
public void index() {
}
}
@@ -0,0 +1,113 @@
package com.budwk.app.zhgh.pointsmall.mallbridge.controller;
import com.budwk.app.zhgh.pointsmall.mallbridge.dto.*;
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallInboundPointsResult;
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallInboundResult;
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallOutboundResult;
import com.budwk.app.zhgh.pointsmall.mallbridge.service.PointsMallBridgeService;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.POST;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
@IocBean
@Ok("json:full")
@At("/open")
public class PointsMallBridgeController {
@Inject
private PointsMallBridgeService pointsMallBridgeService;
@POST
@At("/connect/token")
public MallInboundResult getToken(HttpServletRequest request) {
try {
return pointsMallBridgeService.getToken(readBody(request, MallTokenDTO.class));
} catch (Exception e) {
return MallInboundResult.fail(401, e.getMessage());
}
}
@POST
@At("/connect/refreshToken")
public MallInboundResult refreshToken(HttpServletRequest request) {
try {
return pointsMallBridgeService.refreshToken(readBody(request, MallTokenRefreshDTO.class));
} catch (Exception e) {
return MallInboundResult.fail(401, e.getMessage());
}
}
@POST
@At("/pointOrder/queryPoints")
public MallInboundPointsResult queryPoints(HttpServletRequest request) {
try {
return pointsMallBridgeService.queryPoints(readBody(request, MallPointQueryDTO.class));
} catch (Exception e) {
return MallInboundPointsResult.fail(401, e.getMessage());
}
}
@POST
@At("/pointOrder/pendingOrderInfo")
public MallInboundResult receivePending(HttpServletRequest request) {
return inbound(() -> pointsMallBridgeService.receivePending(readBody(request, MallPendingOrderDTO.class)));
}
@POST
@At("/pointOrder/confirmPurchase")
public MallInboundResult confirmPurchase(HttpServletRequest request) {
return inbound(() -> pointsMallBridgeService.confirmPurchase(readBody(request, MallPurchaseConfirmDTO.class)));
}
@POST
@At("/pointOrder/purchaseResult")
public MallInboundResult purchaseResult(HttpServletRequest request) {
return inbound(() -> pointsMallBridgeService.purchaseResult(readBody(request, MallPurchaseResultDTO.class)));
}
@POST
@At("/pointOrder/pushOrderInfoMsg")
public MallInboundResult receiveEvent(HttpServletRequest request) {
return inbound(() -> pointsMallBridgeService.receiveEvent(readBody(request, MallOrderEventDTO.class)));
}
@POST
@At("/pointOrder/queryOrderInfo")
public MallOutboundResult queryOrderInfo(HttpServletRequest request) {
try {
return pointsMallBridgeService.queryOrderInfo(readBody(request, MallOrderQueryDTO.class));
} catch (Exception e) {
return MallOutboundResult.fail(401, e.getMessage());
}
}
private MallInboundResult inbound(InboundCall call) {
try {
return call.get();
} catch (Exception e) {
return MallInboundResult.fail(401, e.getMessage());
}
}
private <T> T readBody(HttpServletRequest request, Class<T> type) throws IOException {
StringBuilder body = new StringBuilder();
try (BufferedReader reader = request.getReader()) {
String line;
while ((line = reader.readLine()) != null) {
body.append(line);
}
}
return Json.fromJson(type, body.toString());
}
private interface InboundCall {
MallInboundResult get() throws Exception;
}
}
@@ -0,0 +1,14 @@
package com.budwk.app.zhgh.pointsmall.mallbridge.dto;
import lombok.Data;
@Data
public class MallOrderEventDTO {
private String supplierId;
private String token;
private Integer orderType;
private String orderId;
private String mainOrderId;
private String userId;
private Long time;
}
@@ -0,0 +1,12 @@
package com.budwk.app.zhgh.pointsmall.mallbridge.dto;
import lombok.Data;
@Data
public class MallOrderQueryDTO {
private String supplierId;
private String token;
private Integer orderType;
private String orderId;
private Long timestamp;
}
@@ -0,0 +1,11 @@
package com.budwk.app.zhgh.pointsmall.mallbridge.dto;
import lombok.Data;
@Data
public class MallPendingOrderDTO {
private String supplierId;
private String token;
private String userId;
private OrderInfoDTO orderInfo;
}
@@ -0,0 +1,10 @@
package com.budwk.app.zhgh.pointsmall.mallbridge.dto;
import lombok.Data;
@Data
public class MallPointQueryDTO {
private String supplierId;
private String token;
private String userId;
}
@@ -0,0 +1,15 @@
package com.budwk.app.zhgh.pointsmall.mallbridge.dto;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class MallPurchaseConfirmDTO {
private String supplierId;
private String token;
private String orderId;
private BigDecimal totalPrice;
private BigDecimal wPayOrAPay;
private BigDecimal pointsPrice;
}
@@ -0,0 +1,17 @@
package com.budwk.app.zhgh.pointsmall.mallbridge.dto;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class MallPurchaseResultDTO {
private String supplierId;
private String token;
private String orderId;
private BigDecimal totalPrice;
private BigDecimal wPayOrAPay;
private BigDecimal pointsPrice;
private Boolean purchaseResult;
private String message;
}
@@ -0,0 +1,12 @@
package com.budwk.app.zhgh.pointsmall.mallbridge.dto;
import lombok.Data;
@Data
public class MallTokenDTO {
private String supplierId;
private String clientId;
private String clientSecret;
private String code;
private String timestamp;
}
@@ -0,0 +1,12 @@
package com.budwk.app.zhgh.pointsmall.mallbridge.dto;
import lombok.Data;
@Data
public class MallTokenRefreshDTO {
private String supplierId;
private String refreshToken;
private String clientId;
private String clientSecret;
private String timestamp;
}
@@ -0,0 +1,14 @@
package com.budwk.app.zhgh.pointsmall.mallbridge.dto;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class MallTokenResDTO {
private String time;
private String accessToken;
private String refreshToken;
private long expire;
private long refreshExpire;
}
@@ -0,0 +1,33 @@
package com.budwk.app.zhgh.pointsmall.mallbridge.dto;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class OrderInfoDTO {
private String orderId;
private String orderNumberId;
private String supplierId;
private String token;
private String aplName;
private String createTime;
private String updateTime;
private String deliveryTime;
private String orderFinishTime;
private String completeTime;
private String deliveryStatus;
private BigDecimal freightCost;
private BigDecimal wPayOrAPayFreightCost;
private BigDecimal refund;
private BigDecimal wPayOrAPayRefund;
private String logisticsOrderId;
private String crrgBsnNm;
private Integer orderState;
private BigDecimal totalPrice;
private BigDecimal wPayOrAPay;
private BigDecimal pointsPrice;
private String invoiceCode;
private List<OrderProInfoDTO> orderProInfos;
}
@@ -0,0 +1,18 @@
package com.budwk.app.zhgh.pointsmall.mallbridge.dto;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class OrderProInfoDTO {
private String sku;
private Integer number;
private BigDecimal price;
private String name;
private BigDecimal taxRate;
private List<String> picInfo;
private String fileId;
private String filePath;
}
@@ -0,0 +1,27 @@
package com.budwk.app.zhgh.pointsmall.mallbridge.model;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class MallInboundPointsResult {
private int resultCode;
private String message;
private BigDecimal userPoints;
public static MallInboundPointsResult success(BigDecimal points) {
MallInboundPointsResult result = new MallInboundPointsResult();
result.setResultCode(0);
result.setMessage("成功");
result.setUserPoints(points);
return result;
}
public static MallInboundPointsResult fail(int code, String message) {
MallInboundPointsResult result = new MallInboundPointsResult();
result.setResultCode(code);
result.setMessage(message);
return result;
}
}
@@ -0,0 +1,23 @@
package com.budwk.app.zhgh.pointsmall.mallbridge.model;
import lombok.Data;
@Data
public class MallInboundResult {
private int resultCode;
private String message;
public static MallInboundResult success() {
MallInboundResult result = new MallInboundResult();
result.setResultCode(0);
result.setMessage("成功");
return result;
}
public static MallInboundResult fail(int code, String message) {
MallInboundResult result = new MallInboundResult();
result.setResultCode(code);
result.setMessage(message);
return result;
}
}
@@ -0,0 +1,26 @@
package com.budwk.app.zhgh.pointsmall.mallbridge.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
public class MallInboundTokenResult extends MallInboundResult {
private String time;
private String accessToken;
private String refreshToken;
private Long expire;
private Long refreshExpire;
public static MallInboundTokenResult success(String time, String accessToken, String refreshToken, long expire, long refreshExpire) {
MallInboundTokenResult result = new MallInboundTokenResult();
result.setResultCode(0);
result.setMessage("成功");
result.setTime(time);
result.setAccessToken(accessToken);
result.setRefreshToken(refreshToken);
result.setExpire(expire);
result.setRefreshExpire(refreshExpire);
return result;
}
}
@@ -0,0 +1,28 @@
package com.budwk.app.zhgh.pointsmall.mallbridge.model;
import com.budwk.app.zhgh.pointsmall.mallbridge.dto.OrderInfoDTO;
import lombok.Data;
import java.util.List;
@Data
public class MallOutboundResult {
private int resultCode;
private String message;
private List<OrderInfoDTO> orderInfo;
public static MallOutboundResult success(List<OrderInfoDTO> orderInfo) {
MallOutboundResult result = new MallOutboundResult();
result.setResultCode(0);
result.setMessage("成功");
result.setOrderInfo(orderInfo);
return result;
}
public static MallOutboundResult fail(int code, String message) {
MallOutboundResult result = new MallOutboundResult();
result.setResultCode(code);
result.setMessage(message);
return result;
}
}
@@ -0,0 +1,49 @@
package com.budwk.app.zhgh.pointsmall.mallbridge.models;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.io.Serializable;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = true)
@Table("points_mall_supplier_token_store")
@Comment("积分商城供应商Token")
public class PointsMallSupplierTokenStore extends BaseModel implements Serializable {
@Name
@Column
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@ColDefine(type = ColType.VARCHAR, width = 64)
private String supplierId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 128)
private String clientId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 1000)
private String accessToken;
@Column
@ColDefine(type = ColType.VARCHAR, width = 1000)
private String refreshToken;
@Column
private Date accessExpireTime;
@Column
private Date refreshExpireTime;
@Column
private Boolean isValid;
}
@@ -0,0 +1,25 @@
package com.budwk.app.zhgh.pointsmall.mallbridge.service;
import com.budwk.app.zhgh.pointsmall.mallbridge.dto.*;
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallInboundPointsResult;
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallInboundResult;
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallInboundTokenResult;
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallOutboundResult;
public interface PointsMallBridgeService {
MallInboundTokenResult getToken(MallTokenDTO dto);
MallInboundTokenResult refreshToken(MallTokenRefreshDTO dto);
MallInboundPointsResult queryPoints(MallPointQueryDTO dto);
MallInboundResult receivePending(MallPendingOrderDTO dto);
MallInboundResult confirmPurchase(MallPurchaseConfirmDTO dto);
MallInboundResult purchaseResult(MallPurchaseResultDTO dto);
MallInboundResult receiveEvent(MallOrderEventDTO dto);
MallOutboundResult queryOrderInfo(MallOrderQueryDTO dto);
}
@@ -0,0 +1,358 @@
package com.budwk.app.zhgh.pointsmall.mallbridge.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.json.JSONUtil;
import com.budwk.app.zhgh.pointsmall.mallbridge.dto.*;
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallInboundPointsResult;
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallInboundResult;
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallInboundTokenResult;
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallOutboundResult;
import com.budwk.app.zhgh.pointsmall.mallbridge.models.PointsMallSupplierTokenStore;
import com.budwk.app.zhgh.pointsmall.mallbridge.service.PointsMallBridgeService;
import com.budwk.app.zhgh.pointsmall.order.models.PointsMallOrderMain;
import com.budwk.app.zhgh.pointsmall.order.models.PointsMallOrderSub;
import com.budwk.app.zhgh.pointsmall.order.models.PointsMallOrderSubProduct;
import com.budwk.app.zhgh.pointsmall.points.service.PointsMallUserPointsService;
import com.budwk.app.zhgh.pointsmall.supplier.models.PointsMallSupplier;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.entity.Record;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.trans.Atom;
import org.nutz.trans.Trans;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
@IocBean(args = {"refer:dao"})
public class PointsMallBridgeServiceImpl implements PointsMallBridgeService {
private static final long ACCESS_EXPIRE_SECONDS = 3600;
private static final long REFRESH_EXPIRE_SECONDS = 86400L * 7;
private final Dao dao;
@Inject
private PointsMallUserPointsService pointsMallUserPointsService;
public PointsMallBridgeServiceImpl(Dao dao) {
this.dao = dao;
}
@Override
public MallInboundTokenResult getToken(MallTokenDTO dto) {
PointsMallSupplier supplier = checkedSupplier(dto.getSupplierId(), dto.getClientId(), dto.getClientSecret(), dto.getTimestamp());
invalidateOldToken(supplier.getSupplierId(), supplier.getClientId());
return createToken(supplier);
}
@Override
public MallInboundTokenResult refreshToken(MallTokenRefreshDTO dto) {
PointsMallSupplier supplier = checkedSupplier(dto.getSupplierId(), dto.getClientId(), dto.getClientSecret(), dto.getTimestamp());
PointsMallSupplierTokenStore store = dao.fetch(PointsMallSupplierTokenStore.class, Cnd.where("supplierId", "=", supplier.getSupplierId())
.and("refreshToken", "=", dto.getRefreshToken()).and("isValid", "=", true));
if (store == null || store.getRefreshExpireTime() == null || new Date().after(store.getRefreshExpireTime())) {
throw new IllegalArgumentException("刷新令牌无效或已过期");
}
invalidateOldToken(supplier.getSupplierId(), supplier.getClientId());
return createToken(supplier);
}
@Override
public MallInboundPointsResult queryPoints(MallPointQueryDTO dto) {
validateToken(dto.getSupplierId(), dto.getToken());
return MallInboundPointsResult.success(pointsMallUserPointsService.availablePoints(dto.getUserId()));
}
@Override
public MallInboundResult receivePending(MallPendingOrderDTO dto) {
validateToken(dto.getSupplierId(), dto.getToken());
if (dto.getOrderInfo() == null || StrUtil.isBlank(dto.getOrderInfo().getOrderId())) {
return MallInboundResult.fail(400, "订单信息不能为空");
}
if (dao.count(PointsMallOrderMain.class, Cnd.where("orderId", "=", dto.getOrderInfo().getOrderId()).and("supplierId", "=", dto.getSupplierId()).and("delFlag", "=", false)) > 0) {
return MallInboundResult.fail(-1, "订单已存在");
}
Trans.exec((Atom) () -> dao.insert(toMain(dto.getSupplierId(), dto.getUserId(), dto.getOrderInfo(), 0)));
return MallInboundResult.success();
}
@Override
public MallInboundResult confirmPurchase(MallPurchaseConfirmDTO dto) {
validateToken(dto.getSupplierId(), dto.getToken());
return updateMainOrderPay(dto.getSupplierId(), dto.getOrderId(), 1, dto.getTotalPrice(), dto.getWPayOrAPay(), dto.getPointsPrice());
}
@Override
public MallInboundResult purchaseResult(MallPurchaseResultDTO dto) {
validateToken(dto.getSupplierId(), dto.getToken());
int state = Boolean.TRUE.equals(dto.getPurchaseResult()) ? 1 : 0;
return updateMainOrderPay(dto.getSupplierId(), dto.getOrderId(), state, dto.getTotalPrice(), dto.getWPayOrAPay(), dto.getPointsPrice());
}
@Override
public MallInboundResult receiveEvent(MallOrderEventDTO dto) {
validateToken(dto.getSupplierId(), dto.getToken());
Integer type = dto.getOrderType();
if (type == null) {
return MallInboundResult.fail(400, "订单事件类型不能为空");
}
if (type == 2) {
return splitSubOrder(dto);
}
if (type == 3) {
return updateSubState(dto, 3);
}
if (type == 4) {
return updateSubState(dto, 4);
}
if (type == 5) {
return updateSubState(dto, 5);
}
if (type == 6) {
return updateSubState(dto, 6);
}
if (type == 7) {
return updateSubState(dto, 7);
}
return MallInboundResult.success();
}
@Override
public MallOutboundResult queryOrderInfo(MallOrderQueryDTO dto) {
validateToken(dto.getSupplierId(), dto.getToken());
Sql sql = Sqls.create("select * from points_mall_order_main where supplierId=@supplierId and orderId=@orderId and delFlag=0");
sql.params().set("supplierId", dto.getSupplierId());
sql.params().set("orderId", dto.getOrderId());
sql.setCallback(Sqls.callback.records());
dao.execute(sql);
List<OrderInfoDTO> list = sql.getList(Record.class).stream().map(this::toOrderInfo).collect(Collectors.toList());
return MallOutboundResult.success(list);
}
private PointsMallSupplier checkedSupplier(String supplierId, String clientId, String clientSecret, String timestamp) {
if (StrUtil.hasBlank(supplierId, clientId, clientSecret, timestamp)) {
throw new IllegalArgumentException("供应商认证参数不能为空");
}
PointsMallSupplier supplier = dao.fetch(PointsMallSupplier.class, Cnd.where("supplierId", "=", supplierId)
.and("clientId", "=", clientId).and("delFlag", "=", false));
if (supplier == null) {
throw new IllegalArgumentException("供应商和客户端信息不匹配");
}
String serverSha256 = SecureUtil.sha256(supplier.getClientId() + supplier.getClientSecret() + timestamp + clientSecret);
if (!Objects.equals(clientSecret, serverSha256)) {
throw new IllegalArgumentException("签名验证信息错误");
}
return supplier;
}
private void validateToken(String supplierId, String token) {
if (StrUtil.hasBlank(supplierId, token)) {
throw new IllegalArgumentException("供应商ID和token不能为空");
}
PointsMallSupplierTokenStore store = dao.fetch(PointsMallSupplierTokenStore.class, Cnd.where("supplierId", "=", supplierId)
.and("accessToken", "=", token).and("isValid", "=", true));
if (store == null || store.getAccessExpireTime() == null || new Date().after(store.getAccessExpireTime())) {
throw new IllegalArgumentException("token无效或已过期");
}
}
private MallInboundTokenResult createToken(PointsMallSupplier supplier) {
String accessToken = UUID.randomUUID().toString().replace("-", "");
String refreshToken = UUID.randomUUID().toString().replace("-", "");
Date now = new Date();
PointsMallSupplierTokenStore store = new PointsMallSupplierTokenStore();
store.setSupplierId(supplier.getSupplierId());
store.setClientId(supplier.getClientId());
store.setAccessToken(accessToken);
store.setRefreshToken(refreshToken);
store.setAccessExpireTime(DateUtil.offsetSecond(now, (int) ACCESS_EXPIRE_SECONDS));
store.setRefreshExpireTime(DateUtil.offsetSecond(now, (int) REFRESH_EXPIRE_SECONDS));
store.setIsValid(true);
dao.insert(store);
return MallInboundTokenResult.success(DateUtil.format(now, "yyyyMMddHHmmss"), accessToken, refreshToken, ACCESS_EXPIRE_SECONDS, REFRESH_EXPIRE_SECONDS);
}
private void invalidateOldToken(String supplierId, String clientId) {
dao.clear(PointsMallSupplierTokenStore.class, Cnd.where("supplierId", "=", supplierId).and("clientId", "=", clientId));
}
private MallInboundResult updateMainOrderPay(String supplierId, String orderId, Integer cashPaid, BigDecimal totalPrice, BigDecimal cash, BigDecimal points) {
PointsMallOrderMain main = dao.fetch(PointsMallOrderMain.class, Cnd.where("supplierId", "=", supplierId).and("orderId", "=", orderId).and("delFlag", "=", false));
if (main == null) {
return MallInboundResult.fail(404, "订单不存在");
}
main.setCashPaid(cashPaid);
main.setTotalPrice(nvl(totalPrice, main.getTotalPrice()));
main.setWPayOrAPay(nvl(cash, main.getWPayOrAPay()));
main.setPointsPrice(nvl(points, main.getPointsPrice()));
main.setOrderState(cashPaid == 1 ? 1 : main.getOrderState());
main.setOrderUpdateTime(new Date());
dao.updateIgnoreNull(main);
return MallInboundResult.success();
}
private MallInboundResult splitSubOrder(MallOrderEventDTO dto) {
PointsMallOrderMain main = dao.fetch(PointsMallOrderMain.class, Cnd.where("supplierId", "=", dto.getSupplierId())
.and("orderId", "=", dto.getMainOrderId()).and("delFlag", "=", false));
if (main == null) {
return MallInboundResult.fail(404, "主订单不存在");
}
if (dao.count(PointsMallOrderSub.class, Cnd.where("orderId", "=", dto.getOrderId()).and("supplierId", "=", dto.getSupplierId()).and("delFlag", "=", false)) > 0) {
return MallInboundResult.fail(-1, "子订单已存在");
}
Trans.exec((Atom) () -> {
PointsMallOrderSub sub = toSub(main, dto.getOrderId());
dao.insert(sub);
List<OrderProInfoDTO> products = StrUtil.isBlank(main.getExtJson()) || "null".equalsIgnoreCase(main.getExtJson()) ? Collections.emptyList() : JSONUtil.toList(main.getExtJson(), OrderProInfoDTO.class);
insertProducts(dto.getOrderId(), products);
});
return MallInboundResult.success();
}
private MallInboundResult updateSubState(MallOrderEventDTO dto, int state) {
PointsMallOrderSub sub = dao.fetch(PointsMallOrderSub.class, Cnd.where("supplierId", "=", dto.getSupplierId())
.and("orderId", "=", dto.getOrderId()).and("delFlag", "=", false));
if (sub == null) {
return MallInboundResult.fail(404, "订单不存在");
}
sub.setOrderState(state);
sub.setOrderUpdateTime(new Date());
if (state == 4) {
sub.setOrderFinishTime(new Date());
}
if (state == 5) {
sub.setOrderCompleteTime(new Date());
}
dao.updateIgnoreNull(sub);
return MallInboundResult.success();
}
private PointsMallOrderMain toMain(String supplierId, String userId, OrderInfoDTO orderInfo, Integer state) {
PointsMallOrderMain main = new PointsMallOrderMain();
main.setOrderId(orderInfo.getOrderId());
main.setSupplierId(supplierId);
main.setOrderNumberId(orderInfo.getOrderNumberId());
main.setUserId(userId);
main.setAplName(orderInfo.getAplName());
main.setOrderCreateTime(parseDate(orderInfo.getCreateTime()));
main.setOrderUpdateTime(parseDate(orderInfo.getUpdateTime()));
main.setDeliveryTime(parseDate(orderInfo.getDeliveryTime()));
main.setOrderFinishTime(parseDate(orderInfo.getOrderFinishTime()));
main.setOrderCompleteTime(parseDate(orderInfo.getCompleteTime()));
main.setDeliveryStatus(orderInfo.getDeliveryStatus());
main.setFreightCost(nvl(orderInfo.getFreightCost()));
main.setRefund(nvl(orderInfo.getRefund()));
main.setLogisticsOrderId(orderInfo.getLogisticsOrderId());
main.setCrrgBsnNm(orderInfo.getCrrgBsnNm());
main.setOrderState(state);
main.setTotalPrice(nvl(orderInfo.getTotalPrice()));
main.setWPayOrAPay(nvl(orderInfo.getWPayOrAPay()));
main.setPointsPrice(nvl(orderInfo.getPointsPrice()));
main.setInvoiceCode(orderInfo.getInvoiceCode());
main.setExtJson(JSONUtil.toJsonStr(orderInfo.getOrderProInfos() == null ? Collections.emptyList() : orderInfo.getOrderProInfos()));
main.setCashPaid(0);
return main;
}
private PointsMallOrderSub toSub(PointsMallOrderMain main, String subOrderId) {
PointsMallOrderSub sub = new PointsMallOrderSub();
sub.setOrderId(StrUtil.blankToDefault(subOrderId, main.getOrderId()));
sub.setOrderNumberId(main.getOrderNumberId());
sub.setMainOrderId(main.getOrderId());
sub.setSupplierId(main.getSupplierId());
sub.setUserId(main.getUserId());
sub.setAplName(main.getAplName());
sub.setOrderCreateTime(main.getOrderCreateTime());
sub.setOrderUpdateTime(new Date());
sub.setDeliveryTime(main.getDeliveryTime());
sub.setOrderFinishTime(main.getOrderFinishTime());
sub.setOrderCompleteTime(main.getOrderCompleteTime());
sub.setDeliveryStatus(parseInteger(main.getDeliveryStatus()));
sub.setFreightCost(main.getFreightCost());
sub.setRefund(main.getRefund());
sub.setLogisticsOrderId(main.getLogisticsOrderId());
sub.setCrrgBsnNm(main.getCrrgBsnNm());
sub.setOrderState(main.getOrderState());
sub.setTotalPrice(main.getTotalPrice());
sub.setWPayOrAPay(main.getWPayOrAPay());
sub.setPointsPrice(main.getPointsPrice());
sub.setInvoiceCode(main.getInvoiceCode());
sub.setExtJson(main.getExtJson());
sub.setReconciliationStatus(0);
sub.setInvoiceStatus(0);
return sub;
}
private void insertProducts(String orderSubId, List<OrderProInfoDTO> products) {
if (products == null) {
return;
}
for (OrderProInfoDTO item : products) {
PointsMallOrderSubProduct product = new PointsMallOrderSubProduct();
product.setOrderSubId(orderSubId);
product.setSku(item.getSku());
product.setNumber(item.getNumber());
product.setPrice(item.getPrice());
product.setName(item.getName());
product.setTaxRate(item.getTaxRate());
product.setPicInfo(item.getPicInfo() == null || item.getPicInfo().isEmpty() ? null : item.getPicInfo().get(0));
dao.insert(product);
}
}
private OrderInfoDTO toOrderInfo(Record record) {
OrderInfoDTO dto = new OrderInfoDTO();
dto.setOrderId(record.getString("orderId"));
dto.setOrderNumberId(record.getString("orderNumberId"));
dto.setSupplierId(record.getString("supplierId"));
dto.setAplName(record.getString("aplName"));
dto.setDeliveryStatus(record.getString("deliveryStatus"));
dto.setFreightCost(decimal(record.get("freightCost")));
dto.setRefund(decimal(record.get("refund")));
dto.setLogisticsOrderId(record.getString("logisticsOrderId"));
dto.setCrrgBsnNm(record.getString("crrgBsnNm"));
dto.setOrderState(record.getInt("orderState"));
dto.setTotalPrice(decimal(record.get("totalPrice")));
dto.setWPayOrAPay(decimal(record.get("wPayOrAPay")));
dto.setPointsPrice(decimal(record.get("pointsPrice")));
dto.setInvoiceCode(record.getString("invoiceCode"));
return dto;
}
private Date parseDate(String value) {
if (StrUtil.isBlank(value)) {
return null;
}
return DateUtil.parse(value.replace("T", " "));
}
private BigDecimal nvl(BigDecimal value) {
return value == null ? BigDecimal.ZERO : value;
}
private BigDecimal nvl(BigDecimal value, BigDecimal defaultValue) {
return value == null ? defaultValue : value;
}
private BigDecimal decimal(Object value) {
return Convert.toBigDecimal(value, BigDecimal.ZERO);
}
private Integer parseInteger(String value) {
if (StrUtil.isBlank(value)) {
return null;
}
try {
return Integer.valueOf(value);
} catch (NumberFormatException e) {
return null;
}
}
}