feat(orders.manager):新增状态机管理订单状态

This commit is contained in:
JIAN
2024-09-21 12:52:37 +08:00
parent 554aa38576
commit b03c51e50a
25 changed files with 621 additions and 113 deletions

View File

@@ -7,23 +7,23 @@ package com.jzo2o.statemachine.core;
* @date 2023/9/18 11:07
*/
public abstract class StateMachineSnapshot {
/**
* 返回快照id
* @return
*/
public abstract String getSnapshotId();
/**
* 返回快照状态
* @return
*/
public abstract Integer getSnapshotStatus();
/**
* 设置快照id
*/
public abstract void setSnapshotId(String snapshotId);
/**
* 设置快照状态
*/
public abstract void setSnapshotStatus(Integer snapshotStatus);
}
}

View File

@@ -2,12 +2,9 @@ package com.jzo2o.statemachine.core;
/**
* 状态变量事件抽象接口
*
* @author itcast
*/
public interface StatusChangeEvent {
/**
* 原始状态
*/
@@ -27,5 +24,4 @@ public interface StatusChangeEvent {
* @return 返回事件代码
*/
String getCode();
}

View File

@@ -6,17 +6,14 @@ package com.jzo2o.statemachine.core;
* 1、功能说明:状态变更时执行的业务逻辑
* 2、接口实现类的bean名称规则为:状态机名称_状态变更事件名称
* 例如:在实现类上添加 @Component("order_close_dispatching_order") order为状态机名称close_dispatching_order为取消正常派单订单的事件名称
*
* @author itcast
*/
public interface StatusChangeHandler<T extends StateMachineSnapshot> {
/**
* 状态变化处理逻辑
*
* @param bizId 业务id
* @param bizId 业务id
* @param statusChangeEventEnum 状态变更事件
* @param bizSnapshot 快照
* @param bizSnapshot 快照
*/
void handler(String bizId,StatusChangeEvent statusChangeEventEnum,T bizSnapshot);
}
void handler(String bizId, StatusChangeEvent statusChangeEventEnum, T bizSnapshot);
}

View File

@@ -2,11 +2,9 @@ package com.jzo2o.statemachine.core;
/**
* 状态抽象接口
*
* @author itcast
*/
public interface StatusDefine {
/**
* @return 返回状态编号
*/
@@ -21,4 +19,4 @@ public interface StatusDefine {
* @return 返回状态代码
*/
String getCode();
}
}

View File

@@ -47,11 +47,11 @@
<groupId>com.jzo2o</groupId>
<artifactId>jzo2o-canal-sync</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.jzo2o</groupId>-->
<!-- <artifactId>jzo2o-statemachine</artifactId>-->
<!-- <version>1.0-SNAPSHOT</version>-->
<!-- </dependency>-->
<dependency>
<groupId>com.jzo2o</groupId>
<artifactId>jzo2o-statemachine</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--seata-->
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->

View File

@@ -6,12 +6,14 @@ import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
/**
* 自动导入订单相关配置
* @author JIAN
*/
@Configuration
@ComponentScan({"com.jzo2o.orders.base.service","com.jzo2o.orders.base.handler"})
@ComponentScan({"com.jzo2o.orders.base.service", "com.jzo2o.orders.base.handler"})
@MapperScan("com.jzo2o.orders.base.mapper")
//@Import({OrderStateMachine.class})
@EnableConfigurationProperties({DispatchProperties.class, ExecutorProperties.class})
public class AutoImportConfiguration {
}
}

View File

@@ -1,5 +1,6 @@
package com.jzo2o.orders.base.enums;
import com.jzo2o.statemachine.core.StatusChangeEvent;
import lombok.AllArgsConstructor;
import lombok.Getter;
@@ -8,18 +9,18 @@ import lombok.Getter;
*/
@Getter
@AllArgsConstructor
public enum OrderStatusChangeEventEnum {
public enum OrderStatusChangeEventEnum implements StatusChangeEvent {
PAYED(OrderStatusEnum.NO_PAY, OrderStatusEnum.DISPATCHING, "支付成功", "payed"),
DISPATCH(OrderStatusEnum.DISPATCHING, OrderStatusEnum.NO_SERVE, "接单/抢单成功", "dispatch"),
START_SERVE(OrderStatusEnum.NO_SERVE, OrderStatusEnum.SERVING, "开始服务", "start_serve"),
COMPLETE_SERVE(OrderStatusEnum.SERVING, OrderStatusEnum.FINISHED, "完成服务", "complete_serve"),
// EVALUATE(OrderStatusEnum.NO_EVALUATION, OrderStatusEnum.FINISHED, "评价完成", "evaluate"),
EVALUATE(OrderStatusEnum.NO_EVALUATION, OrderStatusEnum.FINISHED, "评价完成", "evaluate"),
CANCEL(OrderStatusEnum.NO_PAY, OrderStatusEnum.CANCELED, "取消订单", "cancel"),
SERVE_PROVIDER_CANCEL(OrderStatusEnum.NO_SERVE, OrderStatusEnum.DISPATCHING, "服务人员/机构取消订单", "serve_provider_cancel"),
CLOSE_DISPATCHING_ORDER(OrderStatusEnum.DISPATCHING, OrderStatusEnum.CLOSED, "派单中订单关闭", "close_dispatching_order"),
CLOSE_NO_SERVE_ORDER(OrderStatusEnum.NO_SERVE, OrderStatusEnum.CLOSED, "待服务订单关闭", "close_no_serve_order"),
CLOSE_SERVING_ORDER(OrderStatusEnum.SERVING, OrderStatusEnum.CLOSED, "服务中订单关闭", "close_serving_order"),
// CLOSE_NO_EVALUATION_ORDER(OrderStatusEnum.NO_EVALUATION, OrderStatusEnum.CLOSED, "待评价订单关闭", "close_no_evaluation_order"),
CLOSE_NO_EVALUATION_ORDER(OrderStatusEnum.NO_EVALUATION, OrderStatusEnum.CLOSED, "待评价订单关闭", "close_no_evaluation_order"),
CLOSE_FINISHED_ORDER(OrderStatusEnum.FINISHED, OrderStatusEnum.CLOSED, "已完成订单关闭", "close_finished_order");
/**

View File

@@ -1,5 +1,6 @@
package com.jzo2o.orders.base.enums;
import com.jzo2o.statemachine.core.StatusDefine;
import lombok.AllArgsConstructor;
import lombok.Getter;
@@ -8,12 +9,12 @@ import lombok.Getter;
*/
@Getter
@AllArgsConstructor
public enum OrderStatusEnum {
public enum OrderStatusEnum implements StatusDefine {
NO_PAY(0, "待支付", "NO_PAY"),
DISPATCHING(100, "派单中", "DISPATCHING"),
NO_SERVE(200, "待服务", "NO_SERVE"),
SERVING(300, "服务中", "SERVING"),
// NO_EVALUATION(400, "待评价", "NO_EVALUATION"),
NO_EVALUATION(400, "待评价", "NO_EVALUATION"),
FINISHED(500, "已完成", "FINISHED"),
CANCELED(600, "已取消", "CANCELED"),
CLOSED(700, "已关闭", "CLOSED");
@@ -36,4 +37,4 @@ public enum OrderStatusEnum {
}
return null;
}
}
}

View File

@@ -0,0 +1,41 @@
package com.jzo2o.orders.base.handler;
import com.jzo2o.orders.base.enums.OrderStatusEnum;
import com.jzo2o.orders.base.model.dto.OrderSnapshotDTO;
import com.jzo2o.statemachine.AbstractStateMachine;
import com.jzo2o.statemachine.core.StatusDefine;
import com.jzo2o.statemachine.persist.StateMachinePersister;
import com.jzo2o.statemachine.snapshot.BizSnapshotService;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
/**
* 订单状态机
* @author JIAN
*/
@Component
public class OrderStateMachine extends AbstractStateMachine<OrderSnapshotDTO> {
/**
* 构造方法
* @param stateMachinePersister 状态机持久化程序
* @param bizSnapshotService 业务快照服务层程序
* @param redisTemplate redis处理程序
*/
public OrderStateMachine(StateMachinePersister stateMachinePersister, BizSnapshotService bizSnapshotService, RedisTemplate redisTemplate) {
super(stateMachinePersister, bizSnapshotService, redisTemplate);
}
@Override
public String getName() {
return "order";
}
@Override
public void postProcessor(OrderSnapshotDTO bizSnapshot) {
}
@Override
public StatusDefine getInitState() {
return OrderStatusEnum.NO_PAY;
}
}

View File

@@ -0,0 +1,43 @@
package com.jzo2o.orders.base.handler.actions;
import cn.hutool.db.DbRuntimeException;
import com.jzo2o.orders.base.enums.OrderStatusEnum;
import com.jzo2o.orders.base.model.dto.OrderSnapshotDTO;
import com.jzo2o.orders.base.model.dto.OrderUpdateStatusDTO;
import com.jzo2o.orders.base.service.IOrdersCommonService;
import com.jzo2o.statemachine.core.StatusChangeEvent;
import com.jzo2o.statemachine.core.StatusChangeHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 未支付时订单取消处理器
* @author itcast
* @create 2023/8/17 18:08
**/
@Slf4j
@Component("order_cancel")
public class OrderCancelHandler implements StatusChangeHandler<OrderSnapshotDTO> {
@Resource
private IOrdersCommonService ordersService;
/**
* 订单评价处理逻辑
* @param bizId 业务id
* @param bizSnapshot 快照
*/
@Override
public void handler(String bizId, StatusChangeEvent statusChangeEventEnum, OrderSnapshotDTO bizSnapshot) {
log.info("订单取消事件处理逻辑开始, 订单号: {}", bizId);
// 修改订单状态
if (!ordersService.updateStatus(OrderUpdateStatusDTO.builder()
.id(Long.valueOf(bizId))
.originStatus(OrderStatusEnum.NO_PAY.getStatus())
.targetStatus(OrderStatusEnum.CANCELED.getStatus())
.build())) {
throw new DbRuntimeException("订单取消事件处理失败");
}
}
}

View File

@@ -0,0 +1,46 @@
package com.jzo2o.orders.base.handler.actions;
import cn.hutool.db.DbRuntimeException;
import com.jzo2o.orders.base.enums.OrderRefundStatusEnum;
import com.jzo2o.orders.base.enums.OrderStatusEnum;
import com.jzo2o.orders.base.model.dto.OrderSnapshotDTO;
import com.jzo2o.orders.base.model.dto.OrderUpdateStatusDTO;
import com.jzo2o.orders.base.service.IOrdersCommonService;
import com.jzo2o.statemachine.core.StatusChangeEvent;
import com.jzo2o.statemachine.core.StatusChangeHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 派单中订单关闭处理器
* @author itcast
* @create 2023/8/17 18:08
**/
@Slf4j
@Component("order_close_dispatching_order")
public class OrderCloseDispatchingOrderHandler implements StatusChangeHandler<OrderSnapshotDTO> {
@Resource
private IOrdersCommonService ordersService;
/**
* 派单中订单关闭处理逻辑
* @param bizId 业务id
* @param bizSnapshot 快照
*/
@Override
public void handler(String bizId, StatusChangeEvent statusChangeEventEnum, OrderSnapshotDTO bizSnapshot) {
log.info("派单中订单关闭事件处理逻辑开始, 订单号: {}", bizId);
// 修改订单状态
if (!ordersService.updateStatus(OrderUpdateStatusDTO.builder()
.id(Long.valueOf(bizId))
.originStatus(OrderStatusEnum.DISPATCHING.getStatus())
.targetStatus(OrderStatusEnum.CLOSED.getStatus())
// 退款状态为退款中
.refundStatus(OrderRefundStatusEnum.REFUNDING.getStatus())
.build())) {
throw new DbRuntimeException("派单中订单关闭事件处理失败");
}
}
}

View File

@@ -0,0 +1,46 @@
package com.jzo2o.orders.base.handler.actions;
import cn.hutool.db.DbRuntimeException;
import com.jzo2o.orders.base.enums.OrderRefundStatusEnum;
import com.jzo2o.orders.base.enums.OrderStatusEnum;
import com.jzo2o.orders.base.model.dto.OrderSnapshotDTO;
import com.jzo2o.orders.base.model.dto.OrderUpdateStatusDTO;
import com.jzo2o.orders.base.service.IOrdersCommonService;
import com.jzo2o.statemachine.core.StatusChangeEvent;
import com.jzo2o.statemachine.core.StatusChangeHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 已完成订单关闭处理器
* @author itcast
* @create 2023/8/17 18:08
**/
@Slf4j
@Component("order_close_finished_order")
public class OrderCloseFinishedOrderHandler implements StatusChangeHandler<OrderSnapshotDTO> {
@Resource
private IOrdersCommonService ordersService;
/**
* 已完成订单关闭处理逻辑
* @param bizId 业务id
* @param bizSnapshot 快照
*/
@Override
public void handler(String bizId, StatusChangeEvent statusChangeEventEnum, OrderSnapshotDTO bizSnapshot) {
log.info("已完成订单关闭事件处理逻辑开始, 订单号: {}", bizId);
// 修改订单状态
if (!ordersService.updateStatus(OrderUpdateStatusDTO.builder()
.id(Long.valueOf(bizId))
.originStatus(OrderStatusEnum.FINISHED.getStatus())
.targetStatus(OrderStatusEnum.CLOSED.getStatus())
// 退款状态为退款中
.refundStatus(OrderRefundStatusEnum.REFUNDING.getStatus())
.build())) {
throw new DbRuntimeException("已完成订单关闭事件处理失败");
}
}
}

View File

@@ -0,0 +1,46 @@
package com.jzo2o.orders.base.handler.actions;
import cn.hutool.db.DbRuntimeException;
import com.jzo2o.orders.base.enums.OrderRefundStatusEnum;
import com.jzo2o.orders.base.enums.OrderStatusEnum;
import com.jzo2o.orders.base.model.dto.OrderSnapshotDTO;
import com.jzo2o.orders.base.model.dto.OrderUpdateStatusDTO;
import com.jzo2o.orders.base.service.IOrdersCommonService;
import com.jzo2o.statemachine.core.StatusChangeEvent;
import com.jzo2o.statemachine.core.StatusChangeHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 待服务订单关闭处理器
* @author itcast
* @create 2023/8/17 18:08
**/
@Slf4j
@Component("order_close_no_serve_order")
public class OrderCloseNoServeOrderHandler implements StatusChangeHandler<OrderSnapshotDTO> {
@Resource
private IOrdersCommonService ordersService;
/**
* 待服务订单关闭处理逻辑
* @param bizId 业务id
* @param bizSnapshot 快照
*/
@Override
public void handler(String bizId, StatusChangeEvent statusChangeEventEnum, OrderSnapshotDTO bizSnapshot) {
log.info("待服务订单关闭事件处理逻辑开始, 订单号: {}", bizId);
// 修改订单状态
if (!ordersService.updateStatus(OrderUpdateStatusDTO.builder()
.id(Long.valueOf(bizId))
.originStatus(OrderStatusEnum.NO_SERVE.getStatus())
.targetStatus(OrderStatusEnum.CLOSED.getStatus())
// 退款状态为退款中
.refundStatus(OrderRefundStatusEnum.REFUNDING.getStatus())
.build())) {
throw new DbRuntimeException("待服务订单关闭事件处理失败");
}
}
}

View File

@@ -0,0 +1,46 @@
package com.jzo2o.orders.base.handler.actions;
import cn.hutool.db.DbRuntimeException;
import com.jzo2o.orders.base.enums.OrderRefundStatusEnum;
import com.jzo2o.orders.base.enums.OrderStatusEnum;
import com.jzo2o.orders.base.model.dto.OrderSnapshotDTO;
import com.jzo2o.orders.base.model.dto.OrderUpdateStatusDTO;
import com.jzo2o.orders.base.service.IOrdersCommonService;
import com.jzo2o.statemachine.core.StatusChangeEvent;
import com.jzo2o.statemachine.core.StatusChangeHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 服务中订单关闭处理器
* @author itcast
* @create 2023/8/17 18:08
**/
@Slf4j
@Component("order_close_serving_order")
public class OrderCloseServingOrderHandler implements StatusChangeHandler<OrderSnapshotDTO> {
@Resource
private IOrdersCommonService ordersService;
/**
* 服务中订单关闭处理逻辑
* @param bizId 业务id
* @param bizSnapshot 快照
*/
@Override
public void handler(String bizId, StatusChangeEvent statusChangeEventEnum, OrderSnapshotDTO bizSnapshot) {
log.info("服务中订单关闭事件处理逻辑开始, 订单号: {}", bizId);
// 修改订单状态
if (!ordersService.updateStatus(OrderUpdateStatusDTO.builder()
.id(Long.valueOf(bizId))
.originStatus(OrderStatusEnum.SERVING.getStatus())
.targetStatus(OrderStatusEnum.CLOSED.getStatus())
// 退款状态为退款中
.refundStatus(OrderRefundStatusEnum.REFUNDING.getStatus())
.build())) {
throw new DbRuntimeException("服务中订单关闭事件处理失败");
}
}
}

View File

@@ -0,0 +1,44 @@
package com.jzo2o.orders.base.handler.actions;
import cn.hutool.db.DbRuntimeException;
import com.jzo2o.orders.base.enums.OrderStatusEnum;
import com.jzo2o.orders.base.model.dto.OrderSnapshotDTO;
import com.jzo2o.orders.base.model.dto.OrderUpdateStatusDTO;
import com.jzo2o.orders.base.service.IOrdersCommonService;
import com.jzo2o.statemachine.core.StatusChangeEvent;
import com.jzo2o.statemachine.core.StatusChangeHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 订单完成服务处理器
* @author itcast
* @create 2023/8/17 18:08
**/
@Slf4j
@Component("order_complete_serve")
public class OrderCompleteServeHandler implements StatusChangeHandler<OrderSnapshotDTO> {
@Resource
private IOrdersCommonService ordersService;
/**
* 订单完成服务处理逻辑
* @param bizId 业务id
* @param bizSnapshot 快照
*/
@Override
public void handler(String bizId, StatusChangeEvent statusChangeEventEnum, OrderSnapshotDTO bizSnapshot) {
log.info("订单完成服务事件处理逻辑开始, 订单号: {}", bizId);
// 修改订单状态
if (!ordersService.updateStatus(OrderUpdateStatusDTO.builder()
.id(Long.valueOf(bizId))
.originStatus(OrderStatusEnum.SERVING.getStatus())
.targetStatus(OrderStatusEnum.FINISHED.getStatus())
.realServeEndTime(bizSnapshot.getRealServeEndTime())
.build())) {
throw new DbRuntimeException("订单完成服务事件处理失败");
}
}
}

View File

@@ -0,0 +1,43 @@
package com.jzo2o.orders.base.handler.actions;
import cn.hutool.db.DbRuntimeException;
import com.jzo2o.orders.base.enums.OrderStatusEnum;
import com.jzo2o.orders.base.model.dto.OrderSnapshotDTO;
import com.jzo2o.orders.base.model.dto.OrderUpdateStatusDTO;
import com.jzo2o.orders.base.service.IOrdersCommonService;
import com.jzo2o.statemachine.core.StatusChangeEvent;
import com.jzo2o.statemachine.core.StatusChangeHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 订单派送处理器
* @author itcast
* @create 2023/8/17 18:08
**/
@Slf4j
@Component("order_dispatch")
public class OrderDispatchHandler implements StatusChangeHandler<OrderSnapshotDTO> {
@Resource
private IOrdersCommonService ordersService;
/**
* 订单派送处理逻辑
* @param bizId 业务id
* @param bizSnapshot 快照
*/
@Override
public void handler(String bizId, StatusChangeEvent statusChangeEventEnum, OrderSnapshotDTO bizSnapshot) {
log.info("派送事件处理逻辑开始, 订单号: {}", bizId);
// 修改订单状态
if (!ordersService.updateStatus(OrderUpdateStatusDTO.builder()
.id(Long.valueOf(bizId))
.originStatus(OrderStatusEnum.DISPATCHING.getStatus())
.targetStatus(OrderStatusEnum.NO_SERVE.getStatus())
.build())) {
throw new DbRuntimeException("派送事件处理失败");
}
}
}

View File

@@ -0,0 +1,50 @@
package com.jzo2o.orders.base.handler.actions;
import cn.hutool.db.DbRuntimeException;
import com.jzo2o.orders.base.enums.OrderPayStatusEnum;
import com.jzo2o.orders.base.enums.OrderStatusEnum;
import com.jzo2o.orders.base.model.dto.OrderSnapshotDTO;
import com.jzo2o.orders.base.model.dto.OrderUpdateStatusDTO;
import com.jzo2o.orders.base.service.IOrdersCommonService;
import com.jzo2o.statemachine.core.StatusChangeEvent;
import com.jzo2o.statemachine.core.StatusChangeHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 订单支付成功处理器
* @author itcast
* @create 2023/8/17 18:08
**/
@Slf4j
@Component("order_payed")
public class OrderPayedHandler implements StatusChangeHandler<OrderSnapshotDTO> {
@Resource
private IOrdersCommonService ordersService;
/**
* 订单支付处理逻辑
* @param bizId 业务id
* @param statusChangeEventEnum 状态变更事件
* @param bizSnapshot 快照
*/
@Override
public void handler(String bizId, StatusChangeEvent statusChangeEventEnum, OrderSnapshotDTO bizSnapshot) {
log.info("支付事件处理逻辑开始, 订单号: {}", bizId);
// 修改订单状态和支付状态
if (!ordersService.updateStatus(OrderUpdateStatusDTO.builder()
.id(Long.valueOf(bizId))
.originStatus(OrderStatusEnum.NO_PAY.getStatus())
.targetStatus(OrderStatusEnum.DISPATCHING.getStatus())
.payTime(bizSnapshot.getPayTime())
.payStatus(OrderPayStatusEnum.PAY_SUCCESS.getStatus())
.tradingOrderNo(bizSnapshot.getTradingOrderNo())
.transactionId(bizSnapshot.getThirdOrderId())
.tradingChannel(bizSnapshot.getTradingChannel())
.build())) {
throw new DbRuntimeException("支付事件处理失败");
}
}
}

View File

@@ -0,0 +1,43 @@
package com.jzo2o.orders.base.handler.actions;
import cn.hutool.db.DbRuntimeException;
import com.jzo2o.orders.base.enums.OrderStatusEnum;
import com.jzo2o.orders.base.model.dto.OrderSnapshotDTO;
import com.jzo2o.orders.base.model.dto.OrderUpdateStatusDTO;
import com.jzo2o.orders.base.service.IOrdersCommonService;
import com.jzo2o.statemachine.core.StatusChangeEvent;
import com.jzo2o.statemachine.core.StatusChangeHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 服务人员/机构取消订单处理器
* @author itcast
* @create 2023/8/17 18:08
**/
@Slf4j
@Component("order_serve_provider_cancel")
public class OrderServeProviderCancelHandler implements StatusChangeHandler<OrderSnapshotDTO> {
@Resource
private IOrdersCommonService ordersService;
/**
* 服务人员/机构取消订单处理逻辑
* @param bizId 业务id
* @param bizSnapshot 快照
*/
@Override
public void handler(String bizId, StatusChangeEvent statusChangeEventEnum, OrderSnapshotDTO bizSnapshot) {
log.info("服务人员/机构取消订单事件处理逻辑开始, 订单号: {}", bizId);
// 修改订单状态
if (!ordersService.updateStatus(OrderUpdateStatusDTO.builder()
.id(Long.valueOf(bizId))
.originStatus(OrderStatusEnum.NO_SERVE.getStatus())
.targetStatus(OrderStatusEnum.DISPATCHING.getStatus())
.build())) {
throw new DbRuntimeException("服务人员/机构取消订单事件处理失败");
}
}
}

View File

@@ -0,0 +1,43 @@
package com.jzo2o.orders.base.handler.actions;
import cn.hutool.db.DbRuntimeException;
import com.jzo2o.orders.base.enums.OrderStatusEnum;
import com.jzo2o.orders.base.model.dto.OrderSnapshotDTO;
import com.jzo2o.orders.base.model.dto.OrderUpdateStatusDTO;
import com.jzo2o.orders.base.service.IOrdersCommonService;
import com.jzo2o.statemachine.core.StatusChangeEvent;
import com.jzo2o.statemachine.core.StatusChangeHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 订单开始服务处理器
* @author itcast
* @create 2023/8/17 18:08
**/
@Slf4j
@Component("order_start_serve")
public class OrderStartServeHandler implements StatusChangeHandler<OrderSnapshotDTO> {
@Resource
private IOrdersCommonService ordersService;
/**
* 订单开始服务处理逻辑
* @param bizId 业务id
* @param bizSnapshot 快照
*/
@Override
public void handler(String bizId, StatusChangeEvent statusChangeEventEnum, OrderSnapshotDTO bizSnapshot) {
log.info("订单开始服务事件处理逻辑开始, 订单号: {}", bizId);
// 修改订单状态
if (!ordersService.updateStatus(OrderUpdateStatusDTO.builder()
.id(Long.valueOf(bizId))
.originStatus(OrderStatusEnum.NO_SERVE.getStatus())
.targetStatus(OrderStatusEnum.SERVING.getStatus())
.build())) {
throw new DbRuntimeException("订单开始服务事件处理失败");
}
}
}

View File

@@ -140,6 +140,11 @@ public class Orders implements Serializable {
*/
private LocalDateTime serveStartTime;
/**
* 服务实际结束时间
*/
private LocalDateTime realServeEndTime;
/**
* 经度
*/
@@ -160,6 +165,11 @@ public class Orders implements Serializable {
*/
private LocalDateTime evaluationTime;
/**
* 评价状态
*/
private Integer evaluationStatus;
/**
* 用户端是否展示1展示0隐藏
*/

View File

@@ -1,25 +1,22 @@
package com.jzo2o.orders.base.model.dto;
//import com.jzo2o.statemachine.core.StateMachineSnapshot;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import com.jzo2o.statemachine.core.StateMachineSnapshot;
import lombok.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 订单快照
*
* @author itcast
* @create 2023/8/19 10:30
**/
@Data
@Builder
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
public class OrderSnapshotDTO {
public class OrderSnapshotDTO extends StateMachineSnapshot {
/**
* 订单id
*/
@@ -171,7 +168,6 @@ public class OrderSnapshotDTO {
private Long refundNo;
/**
* 支付渠道【支付宝、微信、现金、免单挂账】
*/
@@ -224,24 +220,23 @@ public class OrderSnapshotDTO {
*/
private Integer evaluationStatus;
@Override
public String getSnapshotId() {
return String.valueOf(id);
}
// @Override
// public String getSnapshotId() {
// return String.valueOf(id);
// }
//
// @Override
// public Integer getSnapshotStatus() {
// return ordersStatus;
// }
//
// @Override
// public void setSnapshotId(String snapshotId) {
// this.id = Long.parseLong(snapshotId);
// }
//
// @Override
// public void setSnapshotStatus(Integer snapshotStatus) {
// this.ordersStatus = snapshotStatus;
// }
}
@Override
public Integer getSnapshotStatus() {
return ordersStatus;
}
@Override
public void setSnapshotId(String snapshotId) {
this.id = Long.parseLong(snapshotId);
}
@Override
public void setSnapshotStatus(Integer snapshotStatus) {
this.ordersStatus = snapshotStatus;
}
}

View File

@@ -33,6 +33,8 @@ public class OrdersCommonServiceImpl extends ServiceImpl<OrdersMapper, Orders> i
.set(ObjectUtil.isNotNull(orderUpdateStatusReqDTO.getRefundStatus()), Orders::getRefundStatus, orderUpdateStatusReqDTO.getRefundStatus())
.set(ObjectUtil.isNotNull(orderUpdateStatusReqDTO.getRefundNo()), Orders::getRefundNo, orderUpdateStatusReqDTO.getRefundNo())
.set(ObjectUtil.isNotNull(orderUpdateStatusReqDTO.getRefundId()), Orders::getRefundId, orderUpdateStatusReqDTO.getRefundId())
.set(ObjectUtil.isNotNull(orderUpdateStatusReqDTO.getRealServeEndTime()), Orders::getRealServeEndTime, orderUpdateStatusReqDTO.getRealServeEndTime())
.set(ObjectUtil.isNotNull(orderUpdateStatusReqDTO.getEvaluationStatus()), Orders::getEvaluationStatus, orderUpdateStatusReqDTO.getEvaluationStatus())
.update();
}
}

View File

@@ -3,13 +3,13 @@ package com.jzo2o.orders.manager.listener;
import com.alibaba.fastjson.JSON;
import com.jzo2o.api.trade.enums.TradingStateEnum;
import com.jzo2o.common.constants.MqConstants;
import com.jzo2o.common.expcetions.DBException;
import com.jzo2o.common.model.msg.TradeStatusMsg;
import com.jzo2o.common.utils.CollUtils;
import com.jzo2o.orders.base.enums.OrderPayStatusEnum;
import com.jzo2o.orders.base.enums.OrderStatusChangeEventEnum;
import com.jzo2o.orders.base.enums.OrderStatusEnum;
import com.jzo2o.orders.base.model.dto.OrderUpdateStatusDTO;
import com.jzo2o.orders.base.service.IOrdersCommonService;
import com.jzo2o.orders.base.handler.OrderStateMachine;
import com.jzo2o.orders.base.model.dto.OrderSnapshotDTO;
import com.jzo2o.orders.manager.service.IOrdersCreateService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
@@ -32,13 +32,10 @@ import java.util.stream.Collectors;
@Slf4j
@Component
public class TradeStatusListener {
@Resource
private IOrdersCreateService ordersCreateService;
@Resource
private IOrdersCommonService ordersCommonService;
@Resource
private TransactionTemplate transactionTemplate;
@Resource
private OrderStateMachine orderStateMachine;
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = MqConstants.Queues.ORDERS_TRADE_UPDATE_STATUS),
@@ -54,23 +51,24 @@ public class TradeStatusListener {
// 处理当前微服务并且支付成功的订单
List<TradeStatusMsg> tradeStatusMsgList = msgList.stream()
.filter(statusMsg -> ordersCreateService.PRODUCT_APP_ID.equals(statusMsg.getProductAppId())
.filter(statusMsg -> IOrdersCreateService.PRODUCT_APP_ID.equals(statusMsg.getProductAppId())
&& TradingStateEnum.YJS.getCode().equals(statusMsg.getStatusCode()))
.collect(Collectors.toList());
transactionTemplate.executeWithoutResult(status -> {
for (TradeStatusMsg tradeStatusMsg : tradeStatusMsgList) {
if (!ordersCommonService.updateStatus(OrderUpdateStatusDTO.builder()
.id(tradeStatusMsg.getProductOrderNo())
.originStatus(OrderStatusEnum.NO_PAY.getStatus())
.targetStatus(OrderStatusEnum.DISPATCHING.getStatus())
.payStatus(OrderPayStatusEnum.PAY_SUCCESS.getStatus())
.tradingOrderNo(tradeStatusMsg.getTradingOrderNo())
.transactionId(tradeStatusMsg.getTransactionId())
.tradingChannel(tradeStatusMsg.getTradingChannel())
.payTime(LocalDateTime.now()).build())) {
throw new DBException("更新订单状态失败");
}
// 构造订单快照
Long orderId = tradeStatusMsg.getProductOrderNo();
orderStateMachine.changeStatus(null, orderId.toString(),
OrderStatusChangeEventEnum.PAYED, OrderSnapshotDTO.builder()
.id(orderId)
.ordersStatus(OrderStatusEnum.DISPATCHING.getStatus())
.payStatus(OrderPayStatusEnum.PAY_SUCCESS.getStatus())
.tradingOrderNo(tradeStatusMsg.getTradingOrderNo())
.thirdOrderId(tradeStatusMsg.getTransactionId())
.tradingChannel(tradeStatusMsg.getTradingChannel())
.payTime(LocalDateTime.now())
.build());
}
});
}

View File

@@ -10,13 +10,14 @@ import com.jzo2o.common.expcetions.DBException;
import com.jzo2o.common.expcetions.ForbiddenOperationException;
import com.jzo2o.common.utils.ObjectUtils;
import com.jzo2o.orders.base.enums.OrderRefundStatusEnum;
import com.jzo2o.orders.base.enums.OrderStatusChangeEventEnum;
import com.jzo2o.orders.base.enums.OrderStatusEnum;
import com.jzo2o.orders.base.handler.OrderStateMachine;
import com.jzo2o.orders.base.mapper.OrdersCanceledMapper;
import com.jzo2o.orders.base.model.domain.Orders;
import com.jzo2o.orders.base.model.domain.OrdersCanceled;
import com.jzo2o.orders.base.model.domain.OrdersRefund;
import com.jzo2o.orders.base.model.dto.OrderUpdateStatusDTO;
import com.jzo2o.orders.base.service.IOrdersCommonService;
import com.jzo2o.orders.base.model.dto.OrderSnapshotDTO;
import com.jzo2o.orders.manager.model.dto.OrderCancelDTO;
import com.jzo2o.orders.manager.service.IOrdersCanceledService;
import com.jzo2o.orders.manager.service.IOrdersManagerService;
@@ -37,8 +38,6 @@ import java.time.LocalDateTime;
*/
@Service
public class OrdersCanceledServiceImpl extends ServiceImpl<OrdersCanceledMapper, OrdersCanceled> implements IOrdersCanceledService {
@Resource
private IOrdersCommonService ordersCommonService;
@Resource
private IOrdersManagerService ordersManagerService;
@Resource
@@ -47,6 +46,8 @@ public class OrdersCanceledServiceImpl extends ServiceImpl<OrdersCanceledMapper,
private TransactionTemplate transactionTemplate;
@Resource
private TradingApi tradingApi;
@Resource
private OrderStateMachine orderStateMachine;
@Override
public void cancel(OrderCancelDTO orderCancelDTO) {
@@ -95,23 +96,39 @@ public class OrdersCanceledServiceImpl extends ServiceImpl<OrdersCanceledMapper,
}
private void cancelNoPayOrder(OrderCancelDTO orderCancelDTO) {
Long orderId = orderCancelDTO.getId();
OrderSnapshotDTO orderSnapshotDTO = OrderSnapshotDTO.builder()
.id(orderId)
.cancellerId(orderCancelDTO.getCurrentUserId())
.cancelerName(orderCancelDTO.getCurrentUserName())
.cancellerType(orderCancelDTO.getCurrentUserType())
.cancelTime(LocalDateTime.now())
.ordersStatus(OrderStatusEnum.CANCELED.getStatus())
.build();
transactionTemplate.executeWithoutResult(status -> {
if (!saveCancelInfo(orderCancelDTO)) {
throw new DBException("订单取消表记录表更新失败");
}
if (!ordersCommonService.updateStatus(OrderUpdateStatusDTO.builder()
.id(orderCancelDTO.getId())
.originStatus(OrderStatusEnum.NO_PAY.getStatus())
.targetStatus(OrderStatusEnum.CANCELED.getStatus())
.build())) {
throw new DBException("订单表订单状态更新失败");
}
// 更新状态
orderStateMachine.changeStatus(null, orderId.toString(),
OrderStatusChangeEventEnum.CANCEL, orderSnapshotDTO);
});
}
private void cancelDispatchingOrder(OrderCancelDTO orderCancelDTO) {
Long orderId = orderCancelDTO.getId();
OrderSnapshotDTO orderSnapshotDTO = OrderSnapshotDTO.builder()
.id(orderId)
.cancellerId(orderCancelDTO.getCurrentUserId())
.cancelerName(orderCancelDTO.getCurrentUserName())
.cancellerType(orderCancelDTO.getCurrentUserType())
.cancelTime(LocalDateTime.now())
.ordersStatus(OrderStatusEnum.CLOSED.getStatus())
.refundStatus(OrderRefundStatusEnum.REFUNDING.getStatus())
.build();
// 更新数据库信息
// 1. 订单状态信息 2. 取消记录表 2. 退款记录表
transactionTemplate.executeWithoutResult(status -> {
@@ -123,14 +140,8 @@ public class OrdersCanceledServiceImpl extends ServiceImpl<OrdersCanceledMapper,
throw new DBException("订单退款记录表更新失败");
}
if (!ordersCommonService.updateStatus(OrderUpdateStatusDTO.builder()
.id(orderId)
.originStatus(OrderStatusEnum.DISPATCHING.getStatus())
.targetStatus(OrderStatusEnum.CLOSED.getStatus())
.refundStatus(OrderRefundStatusEnum.REFUNDING.getStatus())
.build())) {
throw new DBException("订单表订单状态更新失败");
}
orderStateMachine.changeStatus(null, orderId.toString(),
OrderStatusChangeEventEnum.CLOSE_DISPATCHING_ORDER, orderSnapshotDTO);
});
// 启动新线程执行退款任务

View File

@@ -1,6 +1,7 @@
package com.jzo2o.orders.manager.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.jzo2o.api.customer.dto.response.AddressBookResDTO;
import com.jzo2o.api.foundations.dto.response.ServeAggregationResDTO;
import com.jzo2o.api.trade.NativePayApi;
@@ -18,11 +19,12 @@ import com.jzo2o.common.utils.ObjectUtils;
import com.jzo2o.mvc.utils.UserContext;
import com.jzo2o.orders.base.constants.RedisConstants;
import com.jzo2o.orders.base.enums.OrderPayStatusEnum;
import com.jzo2o.orders.base.enums.OrderStatusChangeEventEnum;
import com.jzo2o.orders.base.enums.OrderStatusEnum;
import com.jzo2o.orders.base.handler.OrderStateMachine;
import com.jzo2o.orders.base.mapper.OrdersMapper;
import com.jzo2o.orders.base.model.domain.Orders;
import com.jzo2o.orders.base.model.dto.OrderUpdateStatusDTO;
import com.jzo2o.orders.base.service.IOrdersCommonService;
import com.jzo2o.orders.base.model.dto.OrderSnapshotDTO;
import com.jzo2o.orders.manager.model.dto.request.OrdersPayReqDTO;
import com.jzo2o.orders.manager.model.dto.request.PlaceOrderReqDTO;
import com.jzo2o.orders.manager.model.dto.response.OrdersPayResDTO;
@@ -62,7 +64,7 @@ public class OrdersCreateServiceImpl extends ServiceImpl<OrdersMapper, Orders> i
@Resource
private TradeProperties tradeProperties;
@Resource
private IOrdersCommonService ordersCommonService;
private OrderStateMachine orderStateMachine;
/**
* 生成订单号(2位年+2位月+2位日+13位序号)
@@ -121,13 +123,16 @@ public class OrdersCreateServiceImpl extends ServiceImpl<OrdersMapper, Orders> i
.lon(address.getLon())
.lat(address.getLat())
.sortBy(sortColumn).build();
OrderSnapshotDTO orderSnapshotDTO = BeanUtils.toBean(orderToPay, OrderSnapshotDTO.class);
// 减小事务管理的颗粒度
return new PlaceOrderResDTO(
transactionTemplate.execute(status -> {
if (baseMapper.insert(orderToPay) == 0) {
if (!SqlHelper.retBool(baseMapper.insert(orderToPay))) {
throw new CommonException("下单失败");
}
// 初始化订单状态机
orderStateMachine.start(null, orderId.toString(), orderSnapshotDTO);
return orderToPay.getId();
}));
}
@@ -203,16 +208,17 @@ public class OrdersCreateServiceImpl extends ServiceImpl<OrdersMapper, Orders> i
// 支付成功
if (ObjectUtils.isNotEmpty(tradingResDTO)
&& tradingResDTO.getTradingState() == TradingStateEnum.YJS) {
// 构造订单快照
OrderSnapshotDTO orderSnapshotDTO = BeanUtils.toBean(orders, OrderSnapshotDTO.class);
orderSnapshotDTO.setOrdersStatus(OrderStatusEnum.DISPATCHING.getStatus());
orderSnapshotDTO.setPayStatus(OrderPayStatusEnum.PAY_SUCCESS.getStatus());
orderSnapshotDTO.setTradingOrderNo(tradingResDTO.getTradingOrderNo());
orderSnapshotDTO.setThirdOrderId(tradingResDTO.getTransactionId());
orderSnapshotDTO.setTradingChannel(tradingResDTO.getTradingChannel());
orderSnapshotDTO.setPayTime(LocalDateTime.now());
ordersCommonService.updateStatus(OrderUpdateStatusDTO.builder()
.id(id)
.originStatus(OrderStatusEnum.NO_PAY.getStatus())
.targetStatus(OrderStatusEnum.DISPATCHING.getStatus())
.payStatus(OrderPayStatusEnum.PAY_SUCCESS.getStatus())
.tradingOrderNo(tradingResDTO.getTradingOrderNo())
.transactionId(tradingResDTO.getTransactionId())
.tradingChannel(tradingResDTO.getTradingChannel())
.payTime(LocalDateTime.now()).build());
orderStateMachine.changeStatus(null, id.toString(),
OrderStatusChangeEventEnum.PAYED, orderSnapshotDTO);
// 支付成功更新最终响应信息的状态
ordersPayResDTO.setPayStatus(OrderPayStatusEnum.PAY_SUCCESS.getStatus());