perf: 优化新增订单逻辑;去掉自增ID 采用默认的雪花ID生成主键;

This commit is contained in:
chenxiky 2025-07-19 18:14:08 +08:00
parent eecaeda7dc
commit ab5dbd8901
12 changed files with 116 additions and 28 deletions

View File

@ -805,4 +805,24 @@ public class RedisUtils {
public Long decrement(String key) {
return redisTemplate.opsForValue().decrement(key);
}
/**
* 原子自增操作
*
* @param key Redis key
* @param digits 自增数的位数如5位数
* @return 格式化后的字符串
*/
public String increase(String key, int digits) {
Long incr = redisTemplate.opsForValue().increment(key);
if (incr == null) {
throw new RuntimeException("Redis increment failed.");
}
// 设置过期时间可选例如每天的 key 在第二天自动过期
if (incr == 1) {
// 可选设置 key 的过期时间例如 24 小时后自动过期
redisTemplate.expire(key, 24, TimeUnit.HOURS);
}
return String.format("%0" + digits + "d", incr);
}
}

View File

@ -5,6 +5,8 @@ import cn.hutool.core.util.StrUtil;
import com.aircraft.modules.order.domain.OrderDetail;
import com.aircraft.modules.order.domain.OrderMain;
import com.aircraft.modules.order.domain.OrderOperator;
import com.aircraft.modules.order.domain.constant.OrderConstant;
import com.aircraft.modules.order.domain.constant.OrderRedisConstant;
import com.aircraft.modules.order.domain.dto.AddOrderDTO;
import com.aircraft.modules.order.domain.dto.AddOrderTaskDTO;
import com.aircraft.modules.order.domain.dto.OrderMainPageQueryDTO;
@ -17,10 +19,15 @@ import com.aircraft.modules.order.service.IOrderDetailService;
import com.aircraft.modules.order.service.IOrderMainService;
import com.aircraft.modules.order.service.IOrderOperatorService;
import com.aircraft.modules.system.domain.AttachmentMaterial;
import com.aircraft.modules.system.domain.EmEmployees;
import com.aircraft.modules.system.domain.EmScenic;
import com.aircraft.modules.system.domain.enums.AttachmentMaterialBusinessTypeEnum;
import com.aircraft.modules.system.service.EmScenicService;
import com.aircraft.modules.system.service.IAttachmentMaterialService;
import com.aircraft.utils.PageResult;
import com.aircraft.utils.RedisUtils;
import com.aircraft.utils.SecurityUtils;
import com.alibaba.fastjson.JSON;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.userdetails.UserDetails;
@ -29,6 +36,8 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
@ -51,6 +60,10 @@ public class OrderBiz {
private IAttachmentMaterialService attachmentMaterialService;
@Resource
private IOrderDetailService orderDetailService;
@Resource
private EmScenicService emScenicService;
@Resource
private RedisUtils redisUtils;
public List<OrderMainPageQueryVO> queryAll(OrderMainPageQueryDTO pageQueryDTO) {
UserDetails currentUser = SecurityUtils.getCurrentUser();
@ -77,11 +90,10 @@ public class OrderBiz {
@Transactional(rollbackFor = Exception.class)
public void addOrder(AddOrderDTO addOrderDTO) {
// TODO 获取当前登录用户飞行端用户
UserDetails currentUser = SecurityUtils.getCurrentUser();
// 获取当前登录用户飞行端用户
EmEmployees emEmployees = JSON.parseObject(SecurityUtils.getCurrentEmployee(), EmEmployees.class);
// 发起人ID
Long orderInitiatorId = SecurityUtils.getCurrentUserId();
Long orderInitiatorId = emEmployees.getId();
// 新增订单
OrderMain orderMain = orderMainService.addOrder(buildOrderParam(addOrderDTO, orderInitiatorId));
// 构建保存操作人信息
@ -105,13 +117,22 @@ public class OrderBiz {
* @return {@link OrderMain}
*/
private OrderMain buildOrderParam(AddOrderDTO addOrderDTO, Long orderInitiatorId) {
// TODO 生成订单编号待优化 年月日+时分秒 +五位随机数Redis进行自增
String orderNO = "JS" + System.currentTimeMillis();
// 生成订单编号年月日 + 五位数字 Redis 进行自增
String datePrefix = LocalDateTime.now().format(DateTimeFormatter.ofPattern(OrderConstant.DATE_PREFIX));
String serialNumber = redisUtils.increase(OrderRedisConstant.ORDER_NO_PREFIX
+ datePrefix, OrderConstant.ORDER_NO_SEQUENCE);
String orderNO = OrderConstant.ORDER_NO_PREFIX+ datePrefix + serialNumber;
// 逗号分隔成字符串存储
List<Long> routeIds = addOrderDTO.getRouteIds();
// 逗号分隔成字符串
String routeIdsStr = CollectionUtil.join(routeIds, StrUtil.COMMA);
// TODO 根据重量计算总金额<取自金额配置表 待完善>
BigDecimal amount = addOrderDTO.getCargoWeight().multiply(new BigDecimal("0.01"));
// 根据景区ID 获取对应的 KG金额, 计算出金额 = 重量 * 金额
EmScenic scenic = emScenicService.obtainScenicById(addOrderDTO.getAttractionId());
BigDecimal price = scenic.getPrice();
BigDecimal amount = addOrderDTO.getCargoWeight().multiply(price);
OrderMain orderMain = new OrderMain();
orderMain.setOrderNo(orderNO);
orderMain.setOrderInitiatorId(orderInitiatorId);

View File

@ -14,6 +14,7 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@ -45,7 +46,7 @@ public class OrderMainController {
@ApiOperation("新增订单")
@PostMapping("/addOrder")
public ResponseEntity<Object> addOrder(AddOrderDTO addOrderDTO) {
public ResponseEntity<Object> addOrder(@RequestBody @Validated AddOrderDTO addOrderDTO) {
orderBiz.addOrder(addOrderDTO);
return new ResponseEntity<>(HttpStatus.OK);
}

View File

@ -1,15 +1,12 @@
package com.aircraft.modules.order.domain;
import cn.hutool.core.date.DateTime;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.aircraft.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* <p>
@ -29,7 +26,7 @@ public class OrderDetail extends BaseEntity {
/**
* 主键ID
*/
@TableId(value = "id", type = IdType.AUTO)
@ApiModelProperty(value = "主键ID")
private Long id;
/**

View File

@ -1,9 +1,8 @@
package com.aircraft.modules.order.domain;
import com.aircraft.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -28,7 +27,7 @@ public class OrderMain extends BaseEntity {
/**
* ID主键
*/
@TableId(value = "id", type = IdType.AUTO)
@ApiModelProperty(value = "主键ID")
private Long id;
/**

View File

@ -1,9 +1,7 @@
package com.aircraft.modules.order.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.aircraft.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -22,7 +20,7 @@ public class OrderOperator{
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
@ApiModelProperty(value = "主键ID")
private Long id;
/**

View File

@ -2,10 +2,9 @@ package com.aircraft.modules.order.domain;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.aircraft.base.BaseEntity;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -27,7 +26,7 @@ public class SettlementDetail extends BaseEntity {
/**
* ID主键
*/
@TableId(value = "id", type = IdType.AUTO)
@ApiModelProperty(value = "主键ID")
private Long id;
/**

View File

@ -1,10 +1,9 @@
package com.aircraft.modules.order.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.aircraft.base.BaseEntity;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -26,7 +25,7 @@ public class SettlementMain extends BaseEntity {
/**
* 主键ID
*/
@TableId(value = "id", type = IdType.AUTO)
@ApiModelProperty(value = "主键ID")
private Long id;
/**

View File

@ -0,0 +1,27 @@
package com.aircraft.modules.order.domain.constant;
/**
* 订单管理常量
*
* @author chenxiky
* @version 1.0.0
* @since 2025/7/19
*/
public class OrderConstant {
/**
* 订单编号常量
*/
public static final String ORDER_NO_PREFIX = "JS";
/**
* 年月日
*/
public static final String DATE_PREFIX = "yyyyMMdd";
/**
* 订单编号序列
*/
public static final Integer ORDER_NO_SEQUENCE = 5;
}

View File

@ -0,0 +1,15 @@
package com.aircraft.modules.order.domain.constant;
/**
* 工单管理 Redis 常量
* @author chenxiky
* @version 1.0.0
* @since 2025/7/19
*/
public class OrderRedisConstant {
/**
* redis 订单编号前缀 key
*/
public static final String ORDER_NO_PREFIX = "fly_order_no";
}

View File

@ -49,4 +49,11 @@ public interface EmScenicService extends IService<EmScenic> {
@Transactional
void countByAreaIdToUpdate();
/**
* 根据ID获取对应的景区信息
*
* @param id 主键
* @return {@link EmScenic}
*/
EmScenic obtainScenicById(Long id);
}

View File

@ -86,6 +86,11 @@ public class EmScenicServiceImpl extends ServiceImpl<EmScenicMapper, EmScenic> i
areaService.updateBatchById(organizations);
}
@Override
public EmScenic obtainScenicById(Long id) {
return this.getById(id);
}
/**
* 构建查询
*