From 05d3c17acdb2d1e10bfe88e0f3be85f592c9b3b7 Mon Sep 17 00:00:00 2001 From: fengxiaohang <15076273430@163.com> Date: Sat, 14 Jun 2025 16:58:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=A2=E5=8D=95=E5=92=8C?= =?UTF-8?q?=E5=95=86=E5=93=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...f19ff4f64892a29d2f_订单售后数据.xlsx | Bin 0 -> 4777 bytes ...d097893399e35219f8_会员信息数据.xlsx | Bin 0 -> 4555 bytes ...a39ada2fe0b7754369_会员信息数据.xlsx | Bin 0 -> 4555 bytes ...959a6e55e84f7e8d4e_订单售后数据.xlsx | Bin 0 -> 4777 bytes ...51a404d615d8211ef2_订单售后数据.xlsx | Bin 0 -> 4777 bytes qrcode/1930206182499577858.png | Bin 0 -> 419 bytes qrcode/1931192482732077058.png | Bin 0 -> 424 bytes .../src/main/resources/application.yml | 2 + ruoyi-modules/ruoyi-order/pom.xml | 23 +- .../order/controller/OrderController.java | 16 +- .../VerificationCodeController.java | 44 ++++ .../wzj/soopin/order/domain/bo/OrderBo.java | 68 +----- .../wzj/soopin/order/domain/entity/Order.java | 9 + .../soopin/order/domain/entity/OrderItem.java | 3 +- .../domain/entity/VerificationCodes.java | 48 ++++ .../order/domain/entity/VerificationLogs.java | 40 ++++ .../wzj/soopin/order/domain/vo/OrderVO.java | 24 ++ .../soopin/order/mapper/OrderItemMapper.java | 2 +- .../wzj/soopin/order/mapper/OrderMapper.java | 9 + .../order/mapper/VerificationCodesMapper.java | 12 + .../order/mapper/VerificationLogsMapper.java | 7 + .../soopin/order/service/OrderService.java | 11 + .../service/VerificationCodeService.java | 13 ++ .../service/VerificationLogsService.java | 7 + .../service/impl/OrderItemServiceImpl.java | 8 +- .../order/service/impl/OrderServiceImpl.java | 42 +++- .../impl/VerificationCodeServiceImpl.java | 208 ++++++++++++++++++ .../impl/VerificationLogsServiceImpl.java | 11 + .../soopin/order/utils/QrCodeGenerator.java | 105 +++++++++ .../order/utils/SnowflakeIdGenerator.java | 95 ++++++++ .../src/main/resources/mapper/OrderMapper.xml | 43 ++++ 31 files changed, 765 insertions(+), 85 deletions(-) create mode 100644 null/download/4b42fe607ca640f19ff4f64892a29d2f_订单售后数据.xlsx create mode 100644 null/download/5450a70ed0e242d097893399e35219f8_会员信息数据.xlsx create mode 100644 null/download/6e97b755e28945a39ada2fe0b7754369_会员信息数据.xlsx create mode 100644 null/download/b69ecabeb1974f959a6e55e84f7e8d4e_订单售后数据.xlsx create mode 100644 null/download/df88302945b34951a404d615d8211ef2_订单售后数据.xlsx create mode 100644 qrcode/1930206182499577858.png create mode 100644 qrcode/1931192482732077058.png create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/VerificationCodeController.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/VerificationCodes.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/VerificationLogs.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/VerificationCodesMapper.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/VerificationLogsMapper.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/VerificationCodeService.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/VerificationLogsService.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/VerificationCodeServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/VerificationLogsServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/utils/QrCodeGenerator.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/utils/SnowflakeIdGenerator.java diff --git a/null/download/4b42fe607ca640f19ff4f64892a29d2f_订单售后数据.xlsx b/null/download/4b42fe607ca640f19ff4f64892a29d2f_订单售后数据.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f6549ffeb0a297ccd59248726bc812d1892ab3a7 GIT binary patch literal 4777 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 literal 0 HcmV?d00001 diff --git a/null/download/5450a70ed0e242d097893399e35219f8_会员信息数据.xlsx b/null/download/5450a70ed0e242d097893399e35219f8_会员信息数据.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f54a040fcf1a26f35b12356b6315baf76965ccf4 GIT binary patch literal 4555 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 literal 0 HcmV?d00001 diff --git a/qrcode/1930206182499577858.png b/qrcode/1930206182499577858.png new file mode 100644 index 0000000000000000000000000000000000000000..19eac2e6c200f12402b25a829666110bc1192446 GIT binary patch literal 419 zcmV;U0bKrxP)$~I2Uh)#!Oa4J}E!&kV zsy(KoA%#}ea1}nLuOSK7PLGbyj*PGYS&0b-Z_C(HLg)rm8SID%MNyyjLp%2ft)WAN z+v63HT$alNA$FuYzcd6AWQg#zHUBh(`orkUp^fv?kdehcF=7HIs{%s(9Tmbj9~I$} zA>c^9XM71sW0-i&*m;nGFp-Y5w)>j((-7v=u&c0-H&d%3HF-<|*7JuFFB3X>GA&lx z;`&JlG8t3Gkx}Dj7Li%78966d6A@IT(FY!srFIpe!?^Z@(+?`KFiC7 zc~3-S;!VdhEG8!^l0Fvz*Jn?J1W$2)F-e3I0p&z5#OxIT!3nuB&KMc2O)3&leBT?widnlLAWUHd(?FPA7AnGfMfEy83;--1^VHt}l3gEF;5WKxV<@en+JzC;8qgJInfwMRud zPk2n{h|UN}ZqcI;^7cez@edM;pA`L5iDwBF0)$vHp#D+GPm*8ll1pfpoF-pcZ##No Sc|4u~0000org.dromara ruoyi-common-sse - org.dromara ruoyi-member @@ -137,6 +136,28 @@ org.springframework.boot spring-boot-starter-data-jpa + + org.dromara + ruoyi-system + + + + com.google.zxing + core + 3.4.1 + + + com.google.zxing + javase + 3.4.1 + + + + cn.hutool + hutool-all + 5.8.22 + + diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderController.java index 75f0ed11c..74518c063 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderController.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderController.java @@ -57,11 +57,17 @@ public class OrderController extends BaseController { +// @ApiOperation("查询订单列表") +// @PostMapping("/list") +// public R> list(@RequestBody OrderBo query, Page page) { +// Page list = service.page(page,query.toWrapper() ); +// return R.ok(convert.toVO(list)); +// } + @ApiOperation("查询订单列表") @PostMapping("/list") - public R> list(@RequestBody OrderBo query, Page page) { - Page list = service.page(page,query.toWrapper() ); - return R.ok(convert.toVO(list)); + public R> list1(@RequestBody OrderBo query, Page page){ + return R.ok(orderService.getlist(page,query)); } // @ApiOperation("查询订单表列表") @@ -81,7 +87,7 @@ public class OrderController extends BaseController { @ApiOperation("导出订单表列表") @Log(title = "订单售后", businessType = BusinessType.EXPORT) - @GetMapping("export") + @PostMapping("export") public ResponseEntity export(OrderBo query) { List list = service.list(query.toWrapper()); ExcelUtil util = new ExcelUtil<>(OrderVO.class); @@ -137,7 +143,7 @@ public class OrderController extends BaseController { throw new RuntimeException("发货失败"); }finally { try{ - redisService.unLock(redisKey, redisValue);; + redisService.unLock(redisKey, redisValue); }catch (Exception e){ log.error("", e); } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/VerificationCodeController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/VerificationCodeController.java new file mode 100644 index 000000000..b749a0781 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/VerificationCodeController.java @@ -0,0 +1,44 @@ +package com.wzj.soopin.order.controller; + +import com.wzj.soopin.order.service.VerificationCodeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.dromara.common.core.domain.R; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 核销码相关接口 + */ +@Api(tags = "核销码接口") +@RestController +@RequestMapping("/oms/verification") +public class VerificationCodeController { + + @Autowired + private VerificationCodeService verificationCodeService; + + + /** + * 生成核销码 + */ + @GetMapping("/generate/{orderId}") + @ApiOperation("生成核销码") + public R generateCode(@PathVariable Long orderId) { + return verificationCodeService.generateVerificationCode(orderId); + } + + /** + * 扫码核销接口 + * @param codeValue 核销码 + * @param usedMerchantId 使用商家ID + * @return 核销结果z + */ + @PostMapping("/verify") + @ApiOperation("扫码核销接口") + public R verifyCode(@RequestParam String codeValue, + @RequestParam Long usedMerchantId) { + return verificationCodeService.verifyCode(codeValue, usedMerchantId); + } + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/OrderBo.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/OrderBo.java index 27bb44fb3..e67ecc705 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/OrderBo.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/OrderBo.java @@ -25,6 +25,9 @@ public class OrderBo { @ApiModelProperty("订单编号") private String orderSn; + @ApiModelProperty("租户id") + private String tenantId; + @ApiModelProperty("用户帐号 精确匹配") private String memberUsernameLike; @@ -125,20 +128,8 @@ public class OrderBo { if (orderSn != null) { queryWrapper.eq(Order::getOrderSn, orderSn); } - if (totalAmount != null) { - queryWrapper.eq(Order::getTotalAmount, totalAmount); - } - if (purchasePrice != null) { - queryWrapper.eq(Order::getPurchasePrice, purchasePrice); - } - if (payAmount != null) { - queryWrapper.eq(Order::getPayAmount, payAmount); - } - if (merchantNote != null) { - queryWrapper.eq(Order::getMerchantNote, merchantNote); - } - if (freightAmount != null) { - queryWrapper.eq(Order::getFreightAmount, freightAmount); + if (tenantId != null) { + queryWrapper.eq(Order::getTenantId, tenantId); } if (payType != null) { queryWrapper.eq(Order::getPayType, payType); @@ -149,61 +140,12 @@ public class OrderBo { if (aftersaleStatus != null) { queryWrapper.eq(Order::getAftersaleStatus, aftersaleStatus); } - if (deliveryCompany != null &&!deliveryCompany.isEmpty()) { - queryWrapper.eq(Order::getDeliveryCompany, deliveryCompany); - } - if (deliverySn != null &&!deliverySn.isEmpty()) { - queryWrapper.eq(Order::getDeliverySn, deliverySn); - } - if (autoConfirmDay != null) { - queryWrapper.eq(Order::getAutoConfirmDay, autoConfirmDay); - } if (receiverPhone != null &&!receiverPhone.isEmpty()) { queryWrapper.eq(Order::getReceiverPhone, receiverPhone); } - if (receiverPostCode != null &&!receiverPostCode.isEmpty()) { - queryWrapper.eq(Order::getReceiverPostCode, receiverPostCode); - } - if (receiverProvince != null &&!receiverProvince.isEmpty()) { - queryWrapper.eq(Order::getReceiverProvince, receiverProvince); - } - if (receiverCity != null &&!receiverCity.isEmpty()) { - queryWrapper.eq(Order::getReceiverCity, receiverCity); - } - if (receiverDistrict != null &&!receiverDistrict.isEmpty()) { - queryWrapper.eq(Order::getReceiverDistrict, receiverDistrict); - } - if (receiverProvinceId != null) { - queryWrapper.eq(Order::getReceiverProvinceId, receiverProvinceId); - } - if (receiverCityId != null) { - queryWrapper.eq(Order::getReceiverCityId, receiverCityId); - } - if (receiverDistrictId != null) { - queryWrapper.eq(Order::getReceiverDistrictId, receiverDistrictId); - } - if (receiverDetailAddress != null &&!receiverDetailAddress.isEmpty()) { - queryWrapper.eq(Order::getReceiverDetailAddress, receiverDetailAddress); - } - if (note != null &&!note.isEmpty()) { - queryWrapper.eq(Order::getNote, note); - } - if (confirmStatus != null) { - queryWrapper.eq(Order::getConfirmStatus, confirmStatus); - } if (deleteStatus != null) { queryWrapper.eq(Order::getDeleteStatus, deleteStatus); } - if (paymentTime != null) { - queryWrapper.eq(Order::getPaymentTime, paymentTime); - } - if (deliveryTime != null) { - queryWrapper.eq(Order::getDeliveryTime, deliveryTime); - } - if (receiveTime != null) { - queryWrapper.eq(Order::getReceiveTime, receiveTime); - } - // 时间范围查询 if (startTime != null && endTime != null) { diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/Order.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/Order.java index f0bd40f42..0bcf66609 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/Order.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/Order.java @@ -34,6 +34,9 @@ public class Order extends BaseAudit { @ApiModelProperty("支付id") private Long payId; + @ApiModelProperty("租户id") + private String tenantId; + @ApiModelProperty("订单编号") @Excel(name = "订单编号") private String orderSn; @@ -164,5 +167,11 @@ public class Order extends BaseAudit { @ApiModelProperty("优惠券金额") private BigDecimal couponAmount; + @ApiModelProperty("核销时间") + private LocalDateTime usedTime; + + @ApiModelProperty("核销码url") + private String codeUrl; + } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/OrderItem.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/OrderItem.java index e6726d3c5..d0102dbfd 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/OrderItem.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/OrderItem.java @@ -24,8 +24,7 @@ public class OrderItem extends BaseAudit { @ApiModelProperty("ID") @TableId(type = IdType.ASSIGN_ID) private Long id; - @Excel(name = "商家备注") - private String merchantNote; + @ApiModelProperty("订单id") @Excel(name = "订单id") private Long orderId; diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/VerificationCodes.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/VerificationCodes.java new file mode 100644 index 000000000..545d05659 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/VerificationCodes.java @@ -0,0 +1,48 @@ +package com.wzj.soopin.order.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.dromara.common.core.domain.model.BaseAudit; + +import java.time.LocalDateTime; + +@ApiModel(description="核销码表对象") +@Data +@TableName("oms_verification_codes") +public class VerificationCodes extends BaseAudit { + + @ApiModelProperty("ID") + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + @ApiModelProperty("核销码") + private String code; + + @ApiModelProperty("关联订单id") + private Long orderId; + + @ApiModelProperty("是否使用") + private Integer status; + + @ApiModelProperty("用户id") + private Long memberId; + + @ApiModelProperty("用户昵称") + private String memberName ; + + @ApiModelProperty("使用时间") + private LocalDateTime usedTime; + + @ApiModelProperty("使用商家id") + private Long usedMerchantId; + + @ApiModelProperty("过期时间") + private LocalDateTime expireTime; + + + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/VerificationLogs.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/VerificationLogs.java new file mode 100644 index 000000000..393c4c9bb --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/VerificationLogs.java @@ -0,0 +1,40 @@ +package com.wzj.soopin.order.domain.entity; + + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.dromara.common.core.domain.model.BaseAudit; + +import java.time.LocalDateTime; + +@ApiModel(description="核销日志表对象") +@Data +@TableName("oms_verification_logs") +public class VerificationLogs extends BaseAudit { + + @ApiModelProperty("ID") + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + @ApiModelProperty("核销码id") + private Long codeId; + + @ApiModelProperty("订单id") + private Long orderId; + + @ApiModelProperty("商家ID") + private Long merchantId; + + @ApiModelProperty("核销时间") + private LocalDateTime verificationTime; + + @ApiModelProperty("核销结果") + private Integer result; + + @ApiModelProperty("失败原因") + private String reason; +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderVO.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderVO.java index 31e3320e3..472ff3c85 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderVO.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderVO.java @@ -28,6 +28,8 @@ public class OrderVO extends BaseAudit { /** MEMBER_ID */ @Excel(name = "MEMBER_ID") private Long memberId; + /** 租户id */ + private String tenantId; /** 用户帐号 */ @Excel(name = "用户帐号") private String memberUsername; @@ -118,4 +120,26 @@ public class OrderVO extends BaseAudit { @Excel(name = "确认收货时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private LocalDateTime receiveTime; private List items; + + @Excel(name = "用户昵称") + private String memberNickname; + @Excel(name = "用户手机号") + private String memberPhoneEncrypted; + + @Excel(name = "卖家昵称") + private String tenantContactName; + @Excel(name = "卖家手机号") + private String tenantContactPhone; + + @Excel(name = "item ID") + private Long itemId; + @Excel(name = "商品id") + private Long productId; + @Excel(name = "商品品牌") + private Long productBrandId; + @Excel(name = "商品名称") + private String productName; + @Excel(name = "商品价格") + private BigDecimal productPrice; + } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderItemMapper.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderItemMapper.java index b2a6600e3..4e07a81b9 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderItemMapper.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderItemMapper.java @@ -16,7 +16,7 @@ import java.util.List; */ public interface OrderItemMapper extends BaseMapper { - IPage selectOrderItem(@Param("query") OrderItemQuery query, IPage pageParam); +// IPage selectOrderItem(@Param("query") OrderItemQuery query, IPage pageParam); /** * 查询订单中所包含的商品列表 * diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderMapper.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderMapper.java index 7003af7a7..725af5028 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderMapper.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderMapper.java @@ -3,6 +3,9 @@ package com.wzj.soopin.order.mapper; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.wzj.soopin.order.domain.bo.OrderBo; import com.wzj.soopin.order.domain.entity.Order; import com.wzj.soopin.order.domain.entity.SystemStatistics; import com.wzj.soopin.order.domain.form.ManagerOrderQueryForm; @@ -47,4 +50,10 @@ public interface OrderMapper extends BaseMapper { SystemStatistics statNewAndDeal(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime); int statDealMember(@Param("startTime") LocalDateTime startTime,@Param("endTime") LocalDateTime endTime); + + + IPage getlist(@Param("page") Page page,@Param("query") OrderBo query); + + +// IPage getlist(@Param("page") Page objectPage, @Param("query") OrderBo query); } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/VerificationCodesMapper.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/VerificationCodesMapper.java new file mode 100644 index 000000000..b1eb4a6d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/VerificationCodesMapper.java @@ -0,0 +1,12 @@ +package com.wzj.soopin.order.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.wzj.soopin.order.domain.entity.VerificationCodes; +import org.apache.ibatis.annotations.Select; + +import java.time.LocalDateTime; +import java.util.List; + +public interface VerificationCodesMapper extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/VerificationLogsMapper.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/VerificationLogsMapper.java new file mode 100644 index 000000000..9e63a3d51 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/VerificationLogsMapper.java @@ -0,0 +1,7 @@ +package com.wzj.soopin.order.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.wzj.soopin.order.domain.entity.VerificationLogs; + +public interface VerificationLogsMapper extends BaseMapper { +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderService.java index 9e068c49f..d9a3a1deb 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderService.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderService.java @@ -1,7 +1,18 @@ package com.wzj.soopin.order.service; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.wzj.soopin.order.domain.bo.OrderBo; import com.wzj.soopin.order.domain.entity.Order; +import com.wzj.soopin.order.domain.vo.OrderVO; +import com.wzj.soopin.order.domain.vo.PageVO; public interface OrderService extends IService { + + + IPage getlist(Page page, OrderBo query); + +// IPage getlist(PageVO pageVO, OrderBo query); } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/VerificationCodeService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/VerificationCodeService.java new file mode 100644 index 000000000..f561185d5 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/VerificationCodeService.java @@ -0,0 +1,13 @@ +package com.wzj.soopin.order.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.wzj.soopin.order.domain.entity.VerificationCodes; +import org.dromara.common.core.domain.R; + +public interface VerificationCodeService extends IService { + + + R generateVerificationCode(Long orderId); + + R verifyCode(String codeValue, Long usedMerchantId); +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/VerificationLogsService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/VerificationLogsService.java new file mode 100644 index 000000000..195799e73 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/VerificationLogsService.java @@ -0,0 +1,7 @@ +package com.wzj.soopin.order.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.wzj.soopin.order.domain.entity.VerificationLogs; + +public interface VerificationLogsService extends IService { +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderItemServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderItemServiceImpl.java index 9dcdf167b..dc64c61b2 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderItemServiceImpl.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderItemServiceImpl.java @@ -174,8 +174,8 @@ public class OrderItemServiceImpl extends ServiceImpl pagelist(OrderItemQuery query, PageVO page) { - IPage pageParam = PageUtil.initPage(page); - return orderItemMapper.selectOrderItem(query, pageParam); - } +// public IPage pagelist(OrderItemQuery query, PageVO page) { +// IPage pageParam = PageUtil.initPage(page); +// return orderItemMapper.selectOrderItem(query, pageParam); +// } } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderServiceImpl.java index d0230fb18..20f3fd32f 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderServiceImpl.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderServiceImpl.java @@ -1,7 +1,9 @@ package com.wzj.soopin.order.service.impl; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; @@ -13,6 +15,7 @@ import com.wzj.soopin.goods.mapper.SkuMapper; import com.wzj.soopin.member.domain.po.Member; import com.wzj.soopin.order.convert.OrderConvert; import com.wzj.soopin.order.convert.OrderOperateHistoryConvert; +import com.wzj.soopin.order.domain.bo.OrderBo; import com.wzj.soopin.order.domain.entity.Order; import com.wzj.soopin.order.domain.entity.OrderDeliveryHistory; import com.wzj.soopin.order.domain.entity.OrderItem; @@ -26,12 +29,14 @@ import com.wzj.soopin.order.mapper.OrderItemMapper; import com.wzj.soopin.order.mapper.OrderMapper; import com.wzj.soopin.order.mapper.OrderOperateHistoryMapper; import com.wzj.soopin.order.service.OrderService; +import com.wzj.soopin.order.utils.PageUtil; import com.wzj.soopin.order.utils.SecurityUtils; import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.event.Constants; import org.dromara.common.core.utils.PhoneUtils; +import org.dromara.system.domain.SysOperLog; +import org.dromara.system.mapper.SysOperLogMapper; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @@ -80,6 +85,9 @@ public class OrderServiceImpl extends ServiceImpl implements @Autowired private OrderOperateHistoryConvert historyConvert; + @Autowired + private SysOperLogMapper sysOperLogMapper; + /** * 查询订单表 * @@ -234,7 +242,7 @@ public class OrderServiceImpl extends ServiceImpl implements return affectedRows > 0 ? R.ok(order) : R.fail("删除失败"); } - public Page queryOrderPage(OrderH5Query query, Pageable pageReq) { + public PageImpl queryOrderPage(OrderH5Query query, Pageable pageReq) { QueryWrapper qw = new QueryWrapper<>(); qw.eq("member_id", SecurityUtils.getUserId()); IPage page = new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(); @@ -388,13 +396,18 @@ public class OrderServiceImpl extends ServiceImpl implements * @param orderId 订单id * @return 结果 */ - public List log(Long orderId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(OrderOperateHistory::getOrderId, orderId); - wrapper.in(OrderOperateHistory::getOrderStatus, Arrays.asList(0, 1, 2, 3, 4)); - wrapper.orderByDesc(OrderOperateHistory::getCreateTime); - List historyList = orderOperateHistoryMapper.selectList(wrapper); - return historyList; + public List log(Long orderId) { +// LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); +// wrapper.eq(OrderOperateHistory::getOrderId, orderId); +// wrapper.in(OrderOperateHistory::getOrderStatus, Arrays.asList(0, 1, 2, 3, 4)); +// wrapper.orderByDesc(OrderOperateHistory::getCreateTime); +// List historyList = orderOperateHistoryMapper.selectList(wrapper); +// return historyList; + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysOperLog::getTitle, "订单表"); + wrapper.eq(SysOperLog::getOperatorType, 1); + return sysOperLogMapper.selectList(wrapper); } public R decryptPhone(Long orderId) { @@ -430,4 +443,15 @@ public class OrderServiceImpl extends ServiceImpl implements } } + @Override + public IPage getlist(Page page, OrderBo query) { + IPage resultPage = orderMapper.getlist(page,query); + return resultPage; + } + +// @Override +// public IPage getlist(PageVO pageVO, OrderBo query) { +// IPage resultPage = orderMapper.getlist(PageUtil.initPage(pageVO),query); +// return resultPage; +// } } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/VerificationCodeServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/VerificationCodeServiceImpl.java new file mode 100644 index 000000000..0df398a86 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/VerificationCodeServiceImpl.java @@ -0,0 +1,208 @@ +package com.wzj.soopin.order.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.wzj.soopin.order.domain.entity.Order; +import com.wzj.soopin.order.domain.entity.VerificationCodes; +import com.wzj.soopin.order.domain.entity.VerificationLogs; +import com.wzj.soopin.order.mapper.OrderMapper; +import com.wzj.soopin.order.mapper.VerificationCodesMapper; +import com.wzj.soopin.order.mapper.VerificationLogsMapper; +import com.wzj.soopin.order.service.VerificationCodeService; +import com.wzj.soopin.order.utils.QrCodeGenerator; +import com.wzj.soopin.order.utils.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.RandomStringUtils; +import org.dromara.common.core.domain.R; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; + +@Service +@Slf4j +public class VerificationCodeServiceImpl extends ServiceImpl implements VerificationCodeService{ + + + + @Autowired + private VerificationCodesMapper codeMapper; + @Autowired + private OrderMapper orderMapper; + @Autowired + private QrCodeGenerator qrCodeGenerator; + + @Autowired + private VerificationLogsMapper logMapper; + + /** + * 生成核销码并关联订单 + * + * @return + */ + @Override + public R generateVerificationCode(Long orderId) { + // 校验订单状态 + Order order = orderMapper.selectById(orderId); + if (order == null || order.getStatus() != 6) { + return R.fail("订单状态异常"); + } + + // 生成唯一核销码 + String codeValue = generateUniqueCode(); + + // 核销码过期时间(7天后过期) + LocalDateTime expireTime = LocalDateTime.now().plusDays(7); + + // 保存核销码到数据库 + VerificationCodes code = new VerificationCodes(); + code.setMemberId(order.getMemberId()); + code.setMemberName(order.getMemberUsername()); + code.setCode(codeValue); + code.setOrderId(orderId); + code.setExpireTime(expireTime); + code.setCreateTime(LocalDateTime.now()); + code.setStatus(0); // 未使用状态 + int insertResult = codeMapper.insert(code); + + if (insertResult != 1) { + return R.fail("核销码生成失败"); + } + + // 构建保存路径 + String filePath = "qrcode/" + orderId + ".png"; + String qrCodeUrl = qrCodeGenerator.generateQrCode( + "核销码:" + codeValue + ",订单ID:" + orderId, + 200, + 200, + filePath + ); + // 打印生成后的二维码URL + log.info("生成的二维码URL: {}", qrCodeUrl); + if (qrCodeUrl == null) { + log.error("二维码生成失败"); + } + + + // 将二维码URL保存到订单表中 + order.setCodeUrl(qrCodeUrl); + orderMapper.updateById(order); + return R.ok("核销码生成成功", code); + } + + @Override + public R verifyCode(String codeValue, Long usedMerchantId) { + // 参数校验 + if (StringUtils.isBlank(codeValue) || usedMerchantId == null) { + recordVerificationLog(null, null, usedMerchantId, 0, "参数不能为空"); + return R.fail("参数不能为空"); + } + + // 查询核销码 + VerificationCodes code = codeMapper.selectOne( + new LambdaQueryWrapper().eq(VerificationCodes::getCode, codeValue) + ); + if (code == null) { + recordVerificationLog(null, null, usedMerchantId, 0, "核销码不存在"); + return R.fail("核销码不存在"); + } + + // 检查核销码状态 + if (code.getStatus() == 1) { + recordVerificationLog(code.getId(), code.getOrderId(), usedMerchantId, 0, "核销码已使用"); + return R.fail("核销码已使用"); + } + + if (code.getStatus() == 2) { + recordVerificationLog(code.getId(), code.getOrderId(), usedMerchantId, 0, "核销码已过期"); + return R.fail("核销码已过期"); + } + + // 检查订单状态 + Order order = orderMapper.selectById(code.getOrderId()); + if (order == null || order.getStatus() != 6) { + recordVerificationLog(code.getId(), code.getOrderId(), usedMerchantId, 0, "订单状态异常,无法核销"); + return R.fail("订单状态异常,无法核销"); + } + + // 检查核销码是否过期 + if (LocalDateTime.now().isAfter(code.getExpireTime())) { + // 更新状态为已过期 + code.setStatus(3); + codeMapper.updateById(code); + recordVerificationLog(code.getId(), code.getOrderId(), usedMerchantId, 0, "核销码已过期"); + return R.fail("核销码已过期"); + } + + // 检查该订单是否已经核销过 + VerificationLogs existingLog = logMapper.selectOne( + new LambdaQueryWrapper() + .eq(VerificationLogs::getOrderId, code.getOrderId()) + .eq(VerificationLogs::getResult, 1) // 只检查成功核销的记录 + ); + + if (existingLog != null) { + recordVerificationLog(code.getId(), code.getOrderId(), usedMerchantId, 0, + "该订单已被核销,核销时间:" + existingLog.getVerificationTime()); + return R.fail("该订单已被核销,核销时间:" + existingLog.getVerificationTime()); + } + + // 执行核销 + code.setStatus(1); // 已使用 + code.setUsedTime(LocalDateTime.now()); + code.setUsedMerchantId(usedMerchantId); + int result = codeMapper.updateById(code); + + if (result != 1) { + recordVerificationLog(code.getId(), code.getOrderId(), usedMerchantId, 0, "核销失败,请重试"); + return R.fail("核销失败,请重试"); + } + + // 更新订单状态 + order.setStatus(7); // 已核销 + order.setUsedTime(LocalDateTime.now()); + orderMapper.updateById(order); + + // 记录核销日志(成功) + recordVerificationLog(code.getId(), code.getOrderId(), usedMerchantId, 1, null); + + // 返回核销成功信息 + Map resultData = new HashMap<>(); + resultData.put("orderId", order.getId()); + resultData.put("orderSn", order.getOrderSn()); + resultData.put("used_time", order.getUsedTime()); + resultData.put("code_url", order.getCodeUrl()); + + return R.ok("核销成功", resultData); + } + + + /** + * 记录核销日志 + * @param codeId 核销码ID + * @param orderId 订单ID + * @param merchantId 商户ID + * @param result 结果:1成功,0失败 + * @param reason 失败原因 + */ + private void recordVerificationLog(Long codeId, Long orderId, Long merchantId, Integer result, String reason) { + VerificationLogs log = new VerificationLogs(); + log.setCodeId(codeId); + log.setOrderId(orderId); + log.setMerchantId(merchantId); + log.setVerificationTime(LocalDateTime.now()); + log.setResult(result); + log.setReason(reason); + logMapper.insert(log); + } + + /** + * 生成唯一核销码 + */ + private String generateUniqueCode() { + String uuid = java.util.UUID.randomUUID().toString().replaceAll("-", ""); + return uuid.substring(0, 16).toUpperCase(); + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/VerificationLogsServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/VerificationLogsServiceImpl.java new file mode 100644 index 000000000..775239deb --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/VerificationLogsServiceImpl.java @@ -0,0 +1,11 @@ +package com.wzj.soopin.order.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.wzj.soopin.order.domain.entity.VerificationLogs; +import com.wzj.soopin.order.mapper.VerificationLogsMapper; +import com.wzj.soopin.order.service.VerificationLogsService; +import org.springframework.stereotype.Service; + +@Service +public class VerificationLogsServiceImpl extends ServiceImpl implements VerificationLogsService { +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/utils/QrCodeGenerator.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/utils/QrCodeGenerator.java new file mode 100644 index 000000000..cc1a266c3 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/utils/QrCodeGenerator.java @@ -0,0 +1,105 @@ +package com.wzj.soopin.order.utils; + +import com.google.zxing.*; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.common.HybridBinarizer; +import com.google.zxing.qrcode.QRCodeWriter; +import com.google.zxing.qrcode.QRCodeReader; +import lombok.extern.slf4j.Slf4j; +import org.hibernate.annotations.Comment; +import org.springframework.stereotype.Component; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; +import java.io.File; + +@Component +@Slf4j +public class QrCodeGenerator { + + /** + * 生成二维码图片并保存到指定路径 + * @param content 二维码内容 + * @param width 图片宽度 + * @param height 图片高度 + * @param filePath 保存路径 + */ + + + public String generateQrCode(String content, int width, int height, String filePath) { + try { + // 检查并创建目录 + File dir = new File(filePath).getParentFile(); + if (!dir.exists()) { + dir.mkdirs(); + } + QRCodeWriter qrCodeWriter = new QRCodeWriter(); + Map hints = new HashMap<>(); + hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); + BitMatrix bitMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, width, height, hints); + BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix); + Path path = Paths.get(filePath); + MatrixToImageWriter.writeToPath(bitMatrix, "png", path); + return filePath; + } catch (WriterException | IOException e) { + // 记录异常信息 + log.error("生成二维码时出现异常: {}", e.getMessage()); + e.printStackTrace(); + return null; + } + } + + /** + * 生成二维码图片字节数组 + * @param content 二维码内容 + * @param width 图片宽度 + * @param height 图片高度 + * @return 二维码图片字节数组 + */ + public byte[] generateQrCodeImage(String content, int width, int height) { + try { + QRCodeWriter qrCodeWriter = new QRCodeWriter(); + Map hints = new HashMap<>(); + hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); + BitMatrix bitMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, width, height, hints); + BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix); + java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream(); + javax.imageio.ImageIO.write(bufferedImage, "png", bos); + return bos.toByteArray(); + } catch (WriterException | IOException e) { + e.printStackTrace(); + return null; + } + } + + /** + * 解析二维码图片 + * @param filePath 二维码图片路径 + * @return 二维码内容 + */ + public String decodeQrCode(String filePath) { + try { + BufferedImage bufferedImage = ImageIO.read(new File(filePath)); + int width = bufferedImage.getWidth(); + int height = bufferedImage.getHeight(); + int[] pixels = new int[width * height]; + bufferedImage.getRGB(0, 0, width, height, pixels, 0, width); + LuminanceSource source = new RGBLuminanceSource(width, height, pixels); + HybridBinarizer hybridBinarizer = new HybridBinarizer(source); + BinaryBitmap binaryBitmap = new BinaryBitmap(hybridBinarizer); + MultiFormatReader reader = new MultiFormatReader(); + Result result = reader.decode(binaryBitmap); + return result.getText(); + } catch (IOException | com.google.zxing.NotFoundException e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/utils/SnowflakeIdGenerator.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/utils/SnowflakeIdGenerator.java new file mode 100644 index 000000000..c9bcafba4 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/utils/SnowflakeIdGenerator.java @@ -0,0 +1,95 @@ +package com.wzj.soopin.order.utils; + +public class SnowflakeIdGenerator { + // 起始时间戳(可以设置项目上线时间等固定时间,单位毫秒) + private static final long START_TIMESTAMP = 1609459200000L; // 2021-01-01 00:00:00 + // 机器ID所占位数 + private static final long WORKER_ID_BITS = 5L; + // 数据中心ID所占位数 + private static final long DATA_CENTER_ID_BITS = 5L; + // 序列号所占位数 + private static final long SEQUENCE_BITS = 12L; + // 最大的机器ID,2的WORKER_ID_BITS次方减1 + private static final long MAX_WORKER_ID = ~(-1L << WORKER_ID_BITS); + // 最大的数据中心ID,2的DATA_CENTER_ID_BITS次方减1 + private static final long MAX_DATA_CENTER_ID = ~(-1L << DATA_CENTER_ID_BITS); + // 序列号最大值,2的SEQUENCE_BITS次方减1 + private static final long SEQUENCE_MASK = ~(-1L << SEQUENCE_BITS); + // 时间戳左移(WORKER_ID_BITS + DATA_CENTER_ID_BITS + SEQUENCE_BITS)位 + private static final long TIMESTAMP_LEFT_SHIFT = WORKER_ID_BITS + DATA_CENTER_ID_BITS + SEQUENCE_BITS; + // 机器ID左移(DATA_CENTER_ID_BITS + SEQUENCE_BITS)位 + private static final long WORKER_ID_SHIFT = DATA_CENTER_ID_BITS + SEQUENCE_BITS; + // 数据中心ID左移SEQUENCE_BITS位 + private static final long DATA_CENTER_ID_SHIFT = SEQUENCE_BITS; + // 当前机器ID + private long workerId; + // 当前数据中心ID + private long dataCenterId; + // 序列号 + private long sequence = 0L; + // 上次生成ID的时间戳 + private long lastTimestamp = -1L; + /** + * 构造函数 + * @param workerId 机器ID(取值范围0 - MAX_WORKER_ID) + * @param dataCenterId 数据中心ID(取值范围0 - MAX_DATA_CENTER_ID ) + */ + public SnowflakeIdGenerator(long workerId, long dataCenterId) { + if (workerId > MAX_WORKER_ID || workerId < 0) { + throw new IllegalArgumentException(String.format("Worker ID can't be greater than %d or less than 0", MAX_WORKER_ID)); + } + if (dataCenterId > MAX_DATA_CENTER_ID || dataCenterId < 0) { + throw new IllegalArgumentException(String.format("Data center ID can't be greater than %d or less than 0", MAX_DATA_CENTER_ID)); + } + this.workerId = workerId; + this.dataCenterId = dataCenterId; + } + /** + * 生成唯一ID + * @return 生成的唯一ID + */ + public synchronized long nextId() { + long timestamp = timeGen(); + // 若当前时间小于上一次生成ID的时间戳,说明系统时钟回退过,抛出异常 + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + // 同一毫秒内生成,则序列号递增 + if (lastTimestamp == timestamp) { + sequence = (sequence + 1) & SEQUENCE_MASK; + // 序列号溢出,等待到下一毫秒 + if (sequence == 0) { + timestamp = tilNextMillis(lastTimestamp); + } + } else { + // 不同毫秒生成,序列号重置为0 + sequence = 0L; + } + // 记录上一次生成ID的时间戳 + lastTimestamp = timestamp; + // 生成唯一ID + return ((timestamp - START_TIMESTAMP) << TIMESTAMP_LEFT_SHIFT) | + (workerId << WORKER_ID_SHIFT) | + (dataCenterId << DATA_CENTER_ID_SHIFT) | + sequence; + } + /** + * 获取当前时间戳(单位:毫秒) + * @return 当前时间戳 + */ + private long timeGen() { + return System.currentTimeMillis(); + } + /** + * 等待直到下一个毫秒 + * @param lastTimestamp 上一次生成ID的时间戳 + * @return 下一个毫秒的时间戳 + */ + private long tilNextMillis(long lastTimestamp) { + long timestamp = timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = timeGen(); + } + return timestamp; + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderMapper.xml b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderMapper.xml index 84d63b148..66f6d544a 100644 --- a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderMapper.xml +++ b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderMapper.xml @@ -264,4 +264,47 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where status in (1,2,3) and create_time between #{startTime} and #{endTime} + + +