浏览代码

测试版

mac 1 年之前
父节点
当前提交
df50685e7b
共有 45 个文件被更改,包括 1128 次插入110 次删除
  1. 27 0
      kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/valid/IdCard.java
  2. 1 1
      kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/valid/Phone.java
  3. 4 0
      kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/valid/group/Insert.java
  4. 4 0
      kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/valid/group/Update.java
  5. 33 0
      kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/valid/impl/IdCardValidator.java
  6. 2 2
      kxs-common/kxs-common-pay/pom.xml
  7. 3 0
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/enums/PayStatusCommEnum.java
  8. 1 1
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/model/QueryResponse.java
  9. 25 3
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/service/wechat/WechatPayService.java
  10. 103 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/amqp/RabbitOrderTimeoutQueueMQ.java
  11. 24 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/constant/enums/OpTypeEnum.java
  12. 24 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/constant/enums/OrderStatusEnum.java
  13. 3 1
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/admin/sysNotify/SysNotifyPageDTO.java
  14. 二进制
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/NumbersReq.java
  15. 4 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/PackagesReq.java
  16. 4 4
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbGoods.java
  17. 2 4
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbGoodsActivities.java
  18. 2 6
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbGoodsSku.java
  19. 39 7
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbOrder.java
  20. 0 8
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbOrderRecharge.java
  21. 10 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbUser.java
  22. 1 6
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/admin/sysOrder/QueryLogisticsVO.java
  23. 46 0
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/cusmoter/goods/GoodsInfoVO.java
  24. 18 4
      lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/tongyi/NumbersRes.java
  25. 二进制
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/BasicService.java
  26. 1 1
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/tongyi/TyBasicService.java
  27. 7 5
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/tongyi/TyCustomerService.java
  28. 3 3
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/admin/SysGoodsController.java
  29. 28 13
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/admin/SysOrderController.java
  30. 2 1
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/admin/SysRechargeController.java
  31. 54 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/handlers/WxPayMessageHandler.java
  32. 61 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mq/RabbitOrderTimeoutQueueListener.java
  33. 14 11
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mq/model/params/BindNotify.java
  34. 5 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbAreaService.java
  35. 14 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbGoodsService.java
  36. 3 0
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbNotifyService.java
  37. 27 2
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbOrderService.java
  38. 5 8
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbAreaServiceImpl.java
  39. 173 4
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbGoodsServiceImpl.java
  40. 26 2
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbNotifyServiceImpl.java
  41. 315 8
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbOrderServiceImpl.java
  42. 2 1
      lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LlbUserServiceImpl.java
  43. 6 3
      lhb-basic/lhb-basic-biz/src/main/resources/mapper/LhbOrderMapper.xml
  44. 0 1
      lhb-basic/lhb-basic-biz/src/main/resources/mapper/LhbOrderRechargeMapper.xml
  45. 2 0
      lhb-basic/lhb-basic-biz/src/main/resources/mapper/LhbUserMapper.xml

+ 27 - 0
kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/valid/IdCard.java

@@ -0,0 +1,27 @@
+package com.kxs.common.core.valid;
+
+
+import com.kxs.common.core.valid.impl.IdCardValidator;
+import jakarta.validation.Constraint;
+import jakarta.validation.Payload;
+
+import java.lang.annotation.*;
+
+/**
+ * 身份证验证
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-23
+ */
+@Target({ElementType.FIELD,ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Constraint(validatedBy = {IdCardValidator.class})// 指定约束处理器
+public @interface IdCard {
+
+    String message() default "身份证格式错误";
+
+    Class<?>[] groups() default { }; // groups用来指定分组,可以让校验采取不同的机制,当前默认未指定任何分组机制,默认每次都要进行校验
+
+    Class<? extends Payload>[] payload() default { };
+}

+ 1 - 1
kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/valid/Phone.java

@@ -18,7 +18,7 @@ public @interface Phone {
 
     String pattern() default "^(?:(?:\\+|00)86)?1\\d{10}$";
 
-    String message() default "手机号格式非法";
+    String message() default "手机号格式错误";
 
     Class<?>[] groups() default { }; // groups用来指定分组,可以让校验采取不同的机制,当前默认未指定任何分组机制,默认每次都要进行校验
 

+ 4 - 0
kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/valid/group/Insert.java

@@ -0,0 +1,4 @@
+package com.kxs.common.core.valid.group;
+
+public interface Insert {
+}

+ 4 - 0
kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/valid/group/Update.java

@@ -0,0 +1,4 @@
+package com.kxs.common.core.valid.group;
+
+public interface Update {
+}

+ 33 - 0
kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/valid/impl/IdCardValidator.java

@@ -0,0 +1,33 @@
+package com.kxs.common.core.valid.impl;
+
+import cn.hutool.core.util.IdcardUtil;
+import com.kxs.common.core.valid.IdCard;
+import com.kxs.common.core.valid.Sn;
+import jakarta.validation.ConstraintValidator;
+import jakarta.validation.ConstraintValidatorContext;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * sn格式校验器
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-11
+ */
+public class IdCardValidator implements ConstraintValidator<IdCard, String> {
+
+    @Override
+    public void initialize(IdCard constraintAnnotation) {
+        // 注解对象
+    }
+
+    @Override
+    public boolean isValid(String value, ConstraintValidatorContext context) {
+        if (value == null || value.isEmpty()){
+            return false;
+        }
+        return IdcardUtil.isValidCard(value);
+    }
+}
+

+ 2 - 2
kxs-common/kxs-common-pay/pom.xml

@@ -44,8 +44,8 @@
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
                 <configuration>
-                    <source>11</source>
-                    <target>11</target>
+                    <source>14</source>
+                    <target>14</target>
                 </configuration>
             </plugin>
         </plugins>

+ 3 - 0
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/enums/PayStatusCommEnum.java

@@ -17,14 +17,17 @@ public enum PayStatusCommEnum {
      * 等待买家付款
      */
     WAIT_BUYER_PAY,
+
     /**
      * 未付款交易超时关闭,或支付完成后全额退款
      */
     TRADE_CLOSED,
+
     /**
      * 交易成功
      */
     TRADE_SUCCESS,
+
     /**
      * 交易完成
      */

+ 1 - 1
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/model/QueryResponse.java

@@ -33,7 +33,7 @@ public class QueryResponse {
     private String tradeNo;
 
     /**
-     * 买家支付宝账号
+     * 买家账号
      */
     private String buyerLogonId;
 

+ 25 - 3
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/service/wechat/WechatPayService.java

@@ -3,8 +3,10 @@ package com.kxs.common.pay.service.wechat;
 import cn.hutool.core.util.NumberUtil;
 import com.github.binarywang.wxpay.bean.notify.SignatureHeader;
 import com.github.binarywang.wxpay.bean.notify.WxPayNotifyV3Result;
+import com.github.binarywang.wxpay.bean.request.WxPayOrderQueryV3Request;
 import com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request;
 import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request;
+import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryV3Result;
 import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result;
 import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
 import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
@@ -12,6 +14,7 @@ import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.kxs.common.core.exception.GlobalCustomerException;
 import com.kxs.common.pay.enums.PayPlatformEnum;
+import com.kxs.common.pay.enums.PayStatusCommEnum;
 import com.kxs.common.pay.handlers.PayMessageHandler;
 import com.kxs.common.pay.model.*;
 import com.kxs.common.pay.service.PayService;
@@ -56,7 +59,6 @@ public class WechatPayService implements PayService {
         try {
 
             WxPayUnifiedOrderV3Request req = new WxPayUnifiedOrderV3Request();
-
             //支付金额
             WxPayUnifiedOrderV3Request.Amount amount = new WxPayUnifiedOrderV3Request.Amount();
             BigDecimal totalAmt = NumberUtil.mul(BigDecimal.valueOf(payReq.getTotalAmount()), 100);
@@ -85,7 +87,28 @@ public class WechatPayService implements PayService {
 
     @Override
     public QueryResponse query(QueryRequest queryReq) {
-        return null;
+
+        try {
+            WxPayOrderQueryV3Request req = new WxPayOrderQueryV3Request();
+            req.setOutTradeNo(queryReq.getOutTradeNo());
+            WxPayOrderQueryV3Result response = wxPayService.queryOrderV3(req);
+            PayStatusCommEnum payStatusCommEnum;
+
+            switch (response.getTradeState()){
+                case "USERPAYING" -> payStatusCommEnum = PayStatusCommEnum.WAIT_BUYER_PAY;
+                case "SUCCESS"-> payStatusCommEnum = PayStatusCommEnum.TRADE_SUCCESS;
+                default -> payStatusCommEnum = PayStatusCommEnum.TRADE_CLOSED;
+            }
+
+            return QueryResponse.builder()
+                    .outTradeNo(response.getOutTradeNo())
+                    .tradeNo(response.getOutTradeNo())
+                    .tradeStatus(payStatusCommEnum)
+                    .payPlatformEnum(PayPlatformEnum.WX).build();
+        } catch (WxPayException e) {
+            log.error("微信查询订单异常:{}", queryReq.getOutTradeNo(), e);
+            throw new GlobalCustomerException(e.getMessage());
+        }
     }
 
     @Override
@@ -94,7 +117,6 @@ public class WechatPayService implements PayService {
         try {
 
             WxPayRefundV3Request req = new WxPayRefundV3Request();
-
             //支付金额
             WxPayRefundV3Request.Amount amount = new WxPayRefundV3Request.Amount();
             BigDecimal totalAmt = NumberUtil.mul(BigDecimal.valueOf(refundReq.getTotalFee()), 100);

+ 103 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/amqp/RabbitOrderTimeoutQueueMQ.java

@@ -0,0 +1,103 @@
+package com.kxs.lhb.basic.api.amqp;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.kxs.common.mq.enums.MQSendTypeEnum;
+import com.kxs.common.mq.model.AbstractMQ;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.core.MessageBuilder;
+import org.springframework.amqp.core.MessageDeliveryMode;
+import org.springframework.amqp.core.MessageProperties;
+
+import java.util.UUID;
+
+/**
+ * mq 订单过期普通队列 配置
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class RabbitOrderTimeoutQueueMQ extends AbstractMQ {
+
+
+    /**
+     * 订单交易队列
+     */
+    public static final String QUEUE_NAME = "QUEUE_LHB_ORDER_TIMEOUT_DIVISION";
+
+    /**
+     * 死队列名称
+     */
+    public static final String DEAD_QUEUE_NAME = null;
+
+    /**
+     * 内置msg 消息体定义
+     **/
+    private MsgEntity msgEntity;
+
+    /**
+     *  定义Msg消息载体
+     **/
+    @Data
+    public static class MsgEntity {
+
+        /**
+         * 订单ID
+         */
+        private Integer orderId;
+
+    }
+
+    @Override
+    public String getQueueName() {
+
+        return QUEUE_NAME;
+    }
+
+    @Override
+    public String getDeadQueueName() {
+
+        return DEAD_QUEUE_NAME;
+    }
+
+    @Override
+    public MQSendTypeEnum getMqType() {
+
+        return MQSendTypeEnum.DELAY;
+    }
+
+    @Override
+    public Message toMessage() {
+        String message = JSONObject.toJSONString(msgEntity);
+        // 构建消息体
+        return MessageBuilder.withBody(message.getBytes())
+                .setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN)
+                .setDeliveryMode(MessageDeliveryMode.PERSISTENT)
+                .setMessageId(UUID.randomUUID().toString())
+                .build();
+    }
+
+    /**
+     * 构造发送消息
+     */
+    public static RabbitOrderTimeoutQueueMQ build(MsgEntity message){
+
+        return new RabbitOrderTimeoutQueueMQ(message);
+    }
+
+    /**
+     * 解析MQ消息, 一般用于接收MQ消息时
+     */
+    public static MsgEntity parse(String msg){
+        return JSON.parseObject(msg, MsgEntity.class);
+    }
+
+}

+ 24 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/constant/enums/OpTypeEnum.java

@@ -0,0 +1,24 @@
+package com.kxs.lhb.basic.api.constant.enums;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+/**
+ * 订单枚举
+ *
+ * @author 没秃顶的码农
+ * @date 2024-09-04
+ */
+@Getter
+@RequiredArgsConstructor
+public enum OpTypeEnum {
+
+    DX(1, "电信"),
+    YD(2, "移动"),
+    LT(3, "联通"),
+    GD(4, "广电");
+
+    private final int code;
+
+    private final String description;
+}

+ 24 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/constant/enums/OrderStatusEnum.java

@@ -0,0 +1,24 @@
+package com.kxs.lhb.basic.api.constant.enums;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+/**
+ * 订单枚举
+ *
+ * @author 没秃顶的码农
+ * @date 2024-09-04
+ */
+@Getter
+@RequiredArgsConstructor
+public enum OrderStatusEnum {
+
+    CANCEL(-1, "已取消"),
+    NO_PAY(0, "待支付"),
+    PAY(1, "已支付"),
+    REFUND(2, "已退款");
+
+    private final int code;
+
+    private final String description;
+}

+ 3 - 1
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/admin/sysNotify/SysNotifyPageDTO.java

@@ -42,7 +42,9 @@ public class SysNotifyPageDTO{
     @Schema(description = "推送类型")
     private String className;
 
-    private String sn;
+    private String mobile;
+
+    private String orderNo;
 
     /**
      * 创建时间区间 [开始时间,结束时间]

二进制
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/NumbersReq.java


+ 4 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/dto/tongyi/PackagesReq.java

@@ -1,6 +1,8 @@
 package com.kxs.lhb.basic.api.dto.tongyi;
 
+import lombok.Builder;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import java.util.List;
 
@@ -10,7 +12,9 @@ import java.util.List;
  * @author 没秃顶的码农
  * @date 2024-10-18
  */
+@EqualsAndHashCode(callSuper = true)
 @Data
+@Builder
 public class PackagesReq extends TyCommonReq{
 
     private String areaCode;

+ 4 - 4
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbGoods.java

@@ -5,10 +5,7 @@ import java.io.Serializable;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
-import com.baomidou.mybatisplus.annotation.FieldFill;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
@@ -58,6 +55,7 @@ public class LhbGoods extends Model<LhbGoods> implements Serializable {
     /**
      * 删除标记,0未删除,1已删除
      */
+    @TableLogic
     @Schema(description = "删除标记,0未删除,1已删除")
     private Integer delFlag;
 
@@ -136,6 +134,7 @@ public class LhbGoods extends Model<LhbGoods> implements Serializable {
      * 创建人
      */
     @Schema(description = "创建人")
+    @TableField(fill = FieldFill.INSERT)
     private String createBy;
 
 
@@ -143,6 +142,7 @@ public class LhbGoods extends Model<LhbGoods> implements Serializable {
      * 修改人
      */
     @Schema(description = "修改人")
+    @TableField(fill = FieldFill.UPDATE)
     private String updateBy;
 
 

+ 2 - 4
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbGoodsActivities.java

@@ -5,10 +5,7 @@ import java.io.Serializable;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
-import com.baomidou.mybatisplus.annotation.FieldFill;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
@@ -98,6 +95,7 @@ public class LhbGoodsActivities extends Model<LhbGoodsActivities> implements Ser
     /**
      * 删除标记,0未删除,1已删除
      */
+    @TableLogic
     @Schema(description = "删除标记,0未删除,1已删除")
     private Integer delFlag;
 

+ 2 - 6
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbGoodsSku.java

@@ -5,16 +5,11 @@ import java.io.Serializable;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
-import com.baomidou.mybatisplus.annotation.FieldFill;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import com.kxs.common.core.valid.Phone;
-import jakarta.validation.constraints.NotBlank;
 
 /**
  * 套餐表(LhbGoodsSku)表实体类
@@ -105,6 +100,7 @@ public class LhbGoodsSku extends Model<LhbGoodsSku> implements Serializable {
     /**
      * 删除标记,0未删除,1已删除
      */
+    @TableLogic
     @Schema(description = "删除标记,0未删除,1已删除")
     private Integer delFlag;
 

+ 39 - 7
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbOrder.java

@@ -10,7 +10,11 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.kxs.common.core.valid.IdCard;
+import com.kxs.common.core.valid.group.Insert;
+import com.kxs.common.core.valid.group.Update;
 import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import com.kxs.common.core.valid.Phone;
@@ -36,6 +40,7 @@ public class LhbOrder extends Model<LhbOrder> implements Serializable {
      */
     @Schema(description = "主键ID")
     @TableId(type = IdType.AUTO)
+    @NotNull(groups = Update.class, message = "订单ID不能为空")
     private Integer id;
 
 
@@ -80,7 +85,7 @@ public class LhbOrder extends Model<LhbOrder> implements Serializable {
      * 用户ID
      */
     @Schema(description = "用户ID")
-    private Integer userId;
+    private Long userId;
 
 
     /**
@@ -89,19 +94,27 @@ public class LhbOrder extends Model<LhbOrder> implements Serializable {
     @Schema(description = "订单号")
     private String orderSn;
 
+    /**
+     * 商品 ID
+     */
+    @Schema(description = "商品 ID")
+    @NotNull(groups = Update.class, message = "商品 ID不能为空")
+    private Integer goodsId;
 
     /**
-     * 套餐ID
+     * SKU ID
      */
-    @Schema(description = "套餐ID")
-    private Integer productId;
+    @Schema(description = "SKU ID")
+    @NotNull(groups = Update.class, message = "SKU ID不能为空")
+    private Integer skuId;
 
 
     /**
      * 服务费 单位分
      */
     @Schema(description = "服务费 单位分")
-    private BigDecimal cashFee;
+    @NotNull(groups = Update.class, message = "服务费不能为空")
+    private BigDecimal serverFee;
 
 
     /**
@@ -115,6 +128,7 @@ public class LhbOrder extends Model<LhbOrder> implements Serializable {
      * 办理手机号码
      */
     @Schema(description = "办理手机号码")
+    @Phone(groups = {Insert.class, Update.class}, message = "预购手机号码格式错误")
     private String makeMobile;
 
 
@@ -136,7 +150,8 @@ public class LhbOrder extends Model<LhbOrder> implements Serializable {
      * 套餐名称
      */
     @Schema(description = "套餐名称")
-    private String productName;
+    @NotBlank(groups = Update.class, message = "套餐名称不能为空")
+    private String packageName;
 
 
     /**
@@ -192,6 +207,7 @@ public class LhbOrder extends Model<LhbOrder> implements Serializable {
      * 服务商号
      */
     @Schema(description = "服务商号")
+    @NotBlank(groups = Insert.class, message = "服务商号不能为空")
     private String isvNo;
 
 
@@ -213,6 +229,7 @@ public class LhbOrder extends Model<LhbOrder> implements Serializable {
      * 客户姓名
      */
     @Schema(description = "客户姓名")
+    @NotBlank(message = "客户姓名不能为空")
     private String custName;
 
 
@@ -220,6 +237,7 @@ public class LhbOrder extends Model<LhbOrder> implements Serializable {
      * 身份证号
      */
     @Schema(description = "身份证号")
+    @IdCard(groups = Insert.class)
     private String idCard;
 
 
@@ -227,6 +245,7 @@ public class LhbOrder extends Model<LhbOrder> implements Serializable {
      * 收货人手机号码
      */
     @Schema(description = "收货人手机号码")
+    @Phone(groups = Update.class)
     private String contMobile;
 
 
@@ -234,6 +253,7 @@ public class LhbOrder extends Model<LhbOrder> implements Serializable {
      * 地市编码
      */
     @Schema(description = "地市编码")
+    @NotBlank(groups = {Insert.class, Update.class}, message = "地市编码不能为空")
     private String regionId;
 
 
@@ -241,6 +261,7 @@ public class LhbOrder extends Model<LhbOrder> implements Serializable {
      * 收货省市县编码,用英文逗号分割
      */
     @Schema(description = "收货省市县编码,用英文逗号分割")
+    @NotBlank(groups = Update.class, message = "收货省市县编码不能为空")
     private String area;
 
 
@@ -248,6 +269,7 @@ public class LhbOrder extends Model<LhbOrder> implements Serializable {
      * 收货人详细地址 精确到门牌号
      */
     @Schema(description = "收货人详细地址 精确到门牌号")
+    @NotBlank(groups = Update.class, message = "收货人详细地址不能为空")
     private String address;
 
 
@@ -255,6 +277,7 @@ public class LhbOrder extends Model<LhbOrder> implements Serializable {
      * 工号
      */
     @Schema(description = "工号")
+    @NotBlank(groups = Insert.class, message = "服务商号不能为空")
     private String employNum;
 
 
@@ -271,8 +294,17 @@ public class LhbOrder extends Model<LhbOrder> implements Serializable {
     @Schema(description = "是否激活 1激活")
     private Integer isAct;
 
+    /**
+     * 快递单号
+     */
+    @Schema(description = "快递单号")
+    private String expressNo;
 
-
+    /**
+     * 首充金额
+     */
+    @Schema(description = "首充金额")
+    private BigDecimal firstCharge;
 
 }
 

+ 0 - 8
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbOrderRecharge.java

@@ -38,14 +38,6 @@ public class LhbOrderRecharge extends Model<LhbOrderRecharge> implements Seriali
     @TableId(type = IdType.AUTO)
     private Integer id;
 
-
-    /**
-     * 排序
-     */
-    @Schema(description = "排序")
-    private Integer sort;
-
-
     /**
      * 修改人
      */

+ 10 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbUser.java

@@ -142,7 +142,17 @@ public class LhbUser extends Model<LhbUser> implements Serializable {
     @Schema(description = "备注")
     private String remark;
 
+    /**
+     * 工号
+     */
+    @Schema(description = "工号")
+    private String employNum;
 
+    /**
+     * 服务商号
+     */
+    @Schema(description = "服务商号")
+    private String isvNo;
 
 
 }

+ 1 - 6
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/admin/sysOrder/QueryLogisticsVO.java

@@ -40,12 +40,7 @@ public class QueryLogisticsVO implements Serializable {
      * 时间
      */
     @Schema(description = "时间")
-    private LocalDateTime operationTime;
+    private String operationTime;
 
 
-
-
-
-	
-
 }

+ 46 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/cusmoter/goods/GoodsInfoVO.java

@@ -0,0 +1,46 @@
+package com.kxs.lhb.basic.api.vo.cusmoter.goods;
+
+import com.kxs.lhb.basic.api.model.LhbGoods;
+import com.kxs.lhb.basic.api.model.LhbGoodsActivities;
+import com.kxs.lhb.basic.api.model.LhbGoodsSku;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ * 商品详情
+ *
+ * @author 系统
+ * @date 2024-10-22 14:41:49
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Schema(description = "商品详情")
+public class GoodsInfoVO extends LhbGoods implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * SKU
+     */
+    private List<GoodsSkuVO> skuList;
+
+
+    @EqualsAndHashCode(callSuper = true)
+    @Data
+    public static class GoodsSkuVO extends LhbGoodsSku{
+
+        /**
+         * 活动列表
+         */
+        private List<LhbGoodsActivities> goodsActivities;
+    }
+
+}

+ 18 - 4
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/tongyi/NumbersRes.java

@@ -2,6 +2,8 @@ package com.kxs.lhb.basic.api.vo.tongyi;
 
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * 选号列表RES
  *
@@ -11,12 +13,24 @@ import lombok.Data;
 @Data
 public class NumbersRes {
 
+    private Integer pageNum;
+    private Integer total;
+    private Integer totalPage;
+    private List<NumList> numList;
+
+    @Data
+    public static class NumList{
+
+        private String accessNum;
+
+        private String beautifulTag;
 
-    private String id;
+        private String reserveFee;
 
-    private String parentId;
+        private String levelId;
 
-    private String areaCode;
+        private String depositMonth;
 
-    private String areaName;
+        private String depositAmount;
+    }
 }

二进制
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/BasicService.java


+ 1 - 1
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/tongyi/TyBasicService.java

@@ -50,7 +50,7 @@ public abstract class TyBasicService{
 
         TyCommRes<T> res = JSONUtil.toBean(response, new TypeReference<>() {}, true);
         if(res.getCode() != 200){
-            throw new GlobalCustomerException("tong yi返回错误信息" + res.getMsg());
+            throw new GlobalCustomerException("返回错误信息" + res.getMsg());
         }
 
         return res;

+ 7 - 5
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/channel/tongyi/TyCustomerService.java

@@ -1,5 +1,6 @@
 package com.kxs.lhb.basic.biz.channel.tongyi;
 
+import cn.hutool.core.lang.TypeReference;
 import cn.hutool.json.JSONUtil;
 import com.kxs.lhb.basic.api.dto.tongyi.*;
 import com.kxs.lhb.basic.api.vo.tongyi.*;
@@ -33,10 +34,10 @@ public class TyCustomerService extends TyBasicService implements BasicService {
     }
 
     @Override
-    public List<NumbersRes> getNumbers(NumbersReq req) {
+    public NumbersRes getNumbers(NumbersReq req) {
 
         TyCommRes<Object> commRes = sendToUrl(req, "/api/v1/guangdian/numbers");
-        return JSONUtil.toList(JSONUtil.toJsonStr(commRes.getData()), NumbersRes.class);
+        return JSONUtil.toBean(JSONUtil.toJsonStr(commRes.getData()), NumbersRes.class);
     }
 
     @Override
@@ -62,14 +63,15 @@ public class TyCustomerService extends TyBasicService implements BasicService {
     public QueryLogisticsRes queryLogistics(QueryOrderReq req) {
 
         TyCommRes<Object> commRes = sendToUrl(req, "/api/v1/guangdian/queryLogistics");
-        return JSONUtil.toBean(JSONUtil.toJsonStr(commRes.getData()), QueryLogisticsRes.class);
+        TyCommRes<QueryLogisticsRes> res = JSONUtil.toBean(commRes.getData().toString(), new TypeReference<>() {}, true);
+        return JSONUtil.toBean(JSONUtil.toJsonStr(res.getData()), QueryLogisticsRes.class);
     }
 
     @Override
-    public Integer queryStatus(QueryOrderReq req) {
+    public String queryStatus(QueryOrderReq req) {
 
         TyCommRes<Object> commRes = sendToUrl(req, "/api/v1/guangdian/queryStatus");
-        return (Integer) commRes.getData();
+        return commRes.getData().toString();
     }
 
     @Override

+ 3 - 3
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/admin/SysGoodsController.java

@@ -65,7 +65,7 @@ public class SysGoodsController {
     @PreAuthorize("@pms.hasPermission('lhb_goods_add')")
     public R add(@RequestBody LhbGoods param) {
 
-        return R.ok(lhbGoodsService.save(param));
+        return R.ok(lhbGoodsService.addGoods(param));
     }
 
 
@@ -80,7 +80,7 @@ public class SysGoodsController {
     @PreAuthorize("@pms.hasPermission('lhb_goods_update')")
     public R update(@RequestBody LhbGoods param) {
 
-        return R.ok(lhbGoodsService.updateById(param));
+        return R.ok(lhbGoodsService.updateGoods(param));
     }
 
 
@@ -95,7 +95,7 @@ public class SysGoodsController {
     @PreAuthorize("@pms.hasPermission('lhb_goods_removeById')")
     public R removeById(@PathVariable Integer id) {
 
-        return R.ok(lhbGoodsService.removeById(id));
+        return R.ok(lhbGoodsService.removeByGoodsId(id));
     }
 
 

+ 28 - 13
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/admin/SysOrderController.java

@@ -1,16 +1,14 @@
 package com.kxs.lhb.basic.biz.controller.admin;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.kxs.common.core.util.R;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.kxs.common.security.annotation.Inner;
 import com.kxs.common.log.annotation.SysLog;
+import com.kxs.common.security.annotation.Inner;
 import org.springdoc.core.annotations.ParameterObject;
 import io.swagger.v3.oas.annotations.security.SecurityRequirement;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import com.kxs.lhb.basic.api.model.LhbOrder;
-import org.apache.ibatis.annotations.Param;
 import com.kxs.lhb.basic.biz.service.LhbOrderService;
 import com.kxs.lhb.basic.api.vo.admin.sysOrder.QueryLogisticsVO;
 
@@ -18,7 +16,6 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.http.HttpHeaders;
 import org.springframework.security.access.prepost.PreAuthorize;
 
-import java.util.List;
 import lombok.RequiredArgsConstructor;
 
 /**
@@ -61,11 +58,11 @@ public class SysOrderController {
      * @return 取消订单
      */
     @SysLog("订单表修改")
-    @PutMapping("/cacenOrder")
-    @PreAuthorize("@pms.hasPermission('lhb_order_cacenOrder')")
-    public R cacenOrder(@RequestBody LhbOrder param) {
+    @PutMapping("/cancelOrder")
+    @PreAuthorize("@pms.hasPermission('lhb_order_cancelOrder')")
+    public R cancelOrder(@RequestBody LhbOrder param) {
 
-        return R.ok(lhbOrderService.updateById(param));
+        return R.ok(lhbOrderService.cancelOrder(param));
     }
 
 
@@ -87,14 +84,13 @@ public class SysOrderController {
     /**
      * 物流轨迹
      *
-     * @param page 分页对象
      * @RequestParam param 实体参数
      * @return 物流轨迹
      */
     @GetMapping("/queryLogistics")
-    public R queryLogistics(@ParameterObject Page<QueryLogisticsVO> page, @RequestParam LhbOrder param) {
-        Page<QueryLogisticsVO> result = lhbOrderService.queryLogistics(page, param);
-        return R.ok(result);
+    public R queryLogistics(@RequestParam("id") Integer id) {
+
+        return R.ok(lhbOrderService.queryLogistics(id));
     }
 
 
@@ -106,12 +102,31 @@ public class SysOrderController {
      * @return 服务费退还记录
      */
     @GetMapping("/refundPage")
-    public R refundPage(@ParameterObject Page<LhbOrder> page, @RequestParam LhbOrder param) {
+    public R refundPage(@ParameterObject Page<LhbOrder> page, @ParameterObject LhbOrder param) {
+
         return R.ok(lhbOrderService.page(page, new QueryWrapper<>(param)));
     }
 
 
+    /**
+     * 更新订单状态
+     */
+    @Inner(value = false)
+    @GetMapping("/orderStatusTask")
+    public void orderStatusTask() {
+
+        lhbOrderService.orderStatusTask();
+    }
 
+    /**
+     * 查询订单是否首冲
+     */
+    @Inner(value = false)
+    @GetMapping("/orderFirstCharge")
+    public void orderFirstCharge() {
+
+        lhbOrderService.orderFirstCharge();
+    }
 
 
 }

+ 2 - 1
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/admin/SysRechargeController.java

@@ -48,7 +48,8 @@ public class SysRechargeController {
      * @return 列表
      */
     @GetMapping("/page")
-    public R page(@ParameterObject Page<LhbOrderRecharge> page, @RequestParam LhbOrderRecharge param) {
+    public R page(@ParameterObject Page<LhbOrderRecharge> page, @ParameterObject LhbOrderRecharge param) {
+
         return R.ok(lhbOrderRechargeService.page(page, new QueryWrapper<>(param)));
     }
 

+ 54 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/handlers/WxPayMessageHandler.java

@@ -0,0 +1,54 @@
+package com.kxs.lhb.basic.biz.handlers;
+
+import com.github.binarywang.wxpay.bean.notify.WxPayNotifyV3Response;
+import com.kxs.common.core.constant.CommonConstants;
+import com.kxs.common.pay.enums.PayPlatformEnum;
+import com.kxs.common.pay.handlers.PayMessageHandler;
+import com.kxs.common.pay.model.WxPayMessage;
+import com.kxs.common.pay.service.wechat.WechatPayService;
+import com.kxs.lhb.basic.biz.service.LhbOrderService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+
+/**
+ * 支付宝支付回调处理器
+ * @author mac
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class WxPayMessageHandler implements PayMessageHandler<WxPayMessage, WechatPayService> {
+
+    private final LhbOrderService orderService;
+
+    /**
+     * 处理支付回调消息的处理器接口
+     *
+     * @param payMessage 支付消息
+     * @param payService 支付服务
+     * @return xml, text格式的消息,如果在异步规则里处理的话,可以返回null
+     */
+    @Override
+    public String handle(WxPayMessage payMessage, WechatPayService payService) {
+        log.info("微信支付回调消息处理,订单号:{}", payMessage.getOutTradeNo());
+
+        //套餐订单处理
+        if (payMessage.getAttach().equals(CommonConstants.PRODUCT_FLAG)) {
+
+            orderService.payBack(payMessage.getOutTradeNo(), payMessage.getTransactionId());
+        }
+        return WxPayNotifyV3Response.success("处理成功");
+    }
+
+    @Override
+    public boolean support(PayPlatformEnum payPlatformEnum) {
+        return PayPlatformEnum.WX.equals(payPlatformEnum);
+    }
+
+    @Override
+    public int getOrder() {
+        return Integer.MIN_VALUE + 1;
+    }
+}

+ 61 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mq/RabbitOrderTimeoutQueueListener.java

@@ -0,0 +1,61 @@
+package com.kxs.lhb.basic.biz.mq;
+
+import com.alibaba.fastjson.JSON;
+import com.kxs.common.pay.factory.PaymentFactory;
+import com.kxs.lhb.basic.api.amqp.RabbitOrderTimeoutQueueMQ;
+import com.kxs.lhb.basic.api.constant.enums.OrderStatusEnum;
+import com.kxs.lhb.basic.api.model.LhbOrder;
+import com.kxs.lhb.basic.biz.service.LhbOrderService;
+import com.rabbitmq.client.Channel;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.annotation.RabbitHandler;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+
+/**
+ * rabbit 队列侦听器 商品下单过期队列
+ *
+ * @author Pota1ovO
+ * @date 2024-05-07
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class RabbitOrderTimeoutQueueListener {
+
+	private final LhbOrderService orderService;
+
+	private final PaymentFactory paymentFactory;
+
+	/**
+	 * 监听 商品下单过期 队列的处理器
+	 *
+	 * @param message 消息
+	 */
+	@RabbitListener(queues = RabbitOrderTimeoutQueueMQ.QUEUE_NAME, ackMode = "MANUAL")
+	@RabbitHandler
+	public void onMessage(String msg, Message message, Channel channel){
+		log.info("商品下单过期队列: " + RabbitOrderTimeoutQueueMQ.parse(msg));
+        try {
+			RabbitOrderTimeoutQueueMQ.MsgEntity parse = RabbitOrderTimeoutQueueMQ.parse(msg);
+			Integer id = parse.getOrderId();
+			//根据订单号查询该订单是否付款成功,如果仍未付款成功,关闭订单
+			LhbOrder order = orderService.getById(id);
+			if (order != null && order.getStatus().equals(OrderStatusEnum.NO_PAY.getCode())){
+				orderService.changeTimeoutOrder(order);
+			}
+			channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
+        } catch (Exception e) {
+			log.error("商品下单过期队列消费失败:{}", JSON.toJSONString(msg), e);
+			try {
+				channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
+			} catch (IOException ex) {
+				log.error("商品下单过期进入死信队列失败" + ex.getMessage(), ex);
+			}
+        }
+    }
+}

+ 14 - 11
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mq/model/params/BindNotify.java

@@ -3,6 +3,8 @@ package com.kxs.lhb.basic.biz.mq.model.params;
 import lombok.Builder;
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 /**
  * 绑定通知
  *
@@ -14,20 +16,21 @@ import lombok.Data;
 public class BindNotify {
 
 
-    private String sn;
+    private String mobile;
+
+    private String productName;
+
+    private BigDecimal firstRechargeAmount;
+
+    private String receiveName;
 
-    private String mchNo;
+    private String receiveMobile;
 
-    private String bindTime;
+    private String receiveAddress;
 
-    /**
-     * 设备类型 UFI=0 MIFI=1 CPE=2 能量塔=3
-     */
-    private Integer snType;
+    private String orderNo;
 
-    /**
-     * 通知类型 1绑定 0解绑
-     */
-    private Integer notifyType;
+    private String userName;
 
+    private String createTime;
 }

+ 5 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbAreaService.java

@@ -1,7 +1,12 @@
 package com.kxs.lhb.basic.biz.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseService;
+import com.kxs.lhb.basic.api.dto.cusmoter.goods.NumbersDTO;
 import com.kxs.lhb.basic.api.model.LhbArea;
+import com.kxs.lhb.basic.api.vo.cusmoter.goods.NumbersVO;
+
+import java.util.List;
 
 
 /**

+ 14 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbGoodsService.java

@@ -1,7 +1,12 @@
 package com.kxs.lhb.basic.biz.service;
 
 import com.github.yulichang.base.MPJBaseService;
+import com.kxs.lhb.basic.api.dto.cusmoter.goods.NumbersDTO;
 import com.kxs.lhb.basic.api.model.LhbGoods;
+import com.kxs.lhb.basic.api.vo.cusmoter.goods.GoodsInfoVO;
+import com.kxs.lhb.basic.api.vo.cusmoter.goods.NumbersVO;
+
+import java.util.List;
 
 
 /**
@@ -12,5 +17,14 @@ import com.kxs.lhb.basic.api.model.LhbGoods;
  */
 public interface LhbGoodsService extends MPJBaseService<LhbGoods> {
 
+    Boolean addGoods(LhbGoods param);
+
+    Boolean updateGoods(LhbGoods param);
+
+    Boolean removeByGoodsId(Integer id);
+
+    List<NumbersVO> getNumbers(NumbersDTO param);
+
+    GoodsInfoVO detail(Integer id);
 }
 

+ 3 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbNotifyService.java

@@ -5,6 +5,7 @@ import com.github.yulichang.base.MPJBaseService;
 import com.kxs.lhb.basic.api.dto.admin.sysNotify.SysNotifyDTO;
 import com.kxs.lhb.basic.api.dto.admin.sysNotify.SysNotifyPageDTO;
 import com.kxs.lhb.basic.api.model.LhbNotify;
+import com.kxs.lhb.basic.biz.mq.model.params.BindNotify;
 
 
 /**
@@ -17,6 +18,8 @@ public interface LhbNotifyService extends MPJBaseService<LhbNotify> {
 
     LhbNotify getByNoteId(String notifyId);
 
+    void bindPush(BindNotify bindNotify, String isvNo);
+
     Page<LhbNotify> notifyPage(Page<LhbNotify> page, SysNotifyPageDTO param);
 
     Boolean notifyBatchData(SysNotifyDTO param);

+ 27 - 2
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbOrderService.java

@@ -1,10 +1,11 @@
 package com.kxs.lhb.basic.biz.service;
 
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseService;
 import com.kxs.lhb.basic.api.model.LhbOrder;
 import com.kxs.lhb.basic.api.vo.admin.sysOrder.QueryLogisticsVO;
 
+import java.util.List;
+
 
 /**
  * 订单表(LhbOrder)表服务接口
@@ -14,6 +15,30 @@ import com.kxs.lhb.basic.api.vo.admin.sysOrder.QueryLogisticsVO;
  */
 public interface LhbOrderService extends MPJBaseService<LhbOrder> {
 
-    Page<QueryLogisticsVO> queryLogistics(Page<QueryLogisticsVO> page, LhbOrder param);
+    List<QueryLogisticsVO> queryLogistics(Integer id);
+
+    Integer submit(LhbOrder param);
+
+    void payBack(String outTradeNo, String transactionId);
+
+    Object payOrder(LhbOrder param);
+
+    Integer prePhone(LhbOrder param);
+
+    void changeTimeoutOrder(LhbOrder order);
+
+    Boolean cancelOrder(LhbOrder param);
+
+    /**
+     * 更新订单状态
+     */
+    void orderStatusTask();
+
+    /**
+     * 查询订单是否首冲
+     */
+    void orderFirstCharge();
+
+
 }
 

+ 5 - 8
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbAreaServiceImpl.java

@@ -1,17 +1,14 @@
 package com.kxs.lhb.basic.biz.service.impl;
 
-import cn.hutool.core.bean.BeanUtil;
 import com.github.yulichang.base.MPJBaseServiceImpl;
-import com.github.yulichang.toolkit.JoinWrappers;
-import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.kxs.lhb.basic.api.model.LhbArea;
 import com.kxs.lhb.basic.api.vo.tongyi.AreaRes;
-import com.kxs.lhb.basic.biz.channel.tongyi.TyCustomerService;
+import com.kxs.lhb.basic.biz.channel.BasicService;
 import com.kxs.lhb.basic.biz.mapper.LhbAreaMapper;
 import com.kxs.lhb.basic.biz.service.LhbAreaService;
-import org.springframework.stereotype.Service;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import com.kxs.lhb.basic.api.model.LhbArea;
+import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
@@ -28,13 +25,13 @@ import java.util.List;
 @Slf4j
 public class LhbAreaServiceImpl extends MPJBaseServiceImpl<LhbAreaMapper, LhbArea> implements LhbAreaService {
 
-    private final TyCustomerService customerService;
+    private final BasicService basicService;
 
     @Override
     @Transactional
     public void refresh() {
 
-        List<AreaRes> resList = customerService.getArea();
+        List<AreaRes> resList = basicService.getArea();
         for (AreaRes areaRes : resList) {
             LhbArea lhbArea = new LhbArea();
             lhbArea.setId(areaRes.getId());

+ 173 - 4
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbGoodsServiceImpl.java

@@ -1,14 +1,34 @@
 package com.kxs.lhb.basic.biz.service.impl;
 
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
-import com.github.yulichang.toolkit.JoinWrappers;
-import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.kxs.common.core.exception.GlobalCustomerException;
+import com.kxs.lhb.basic.api.dto.cusmoter.goods.NumbersDTO;
+import com.kxs.lhb.basic.api.dto.tongyi.NumbersReq;
+import com.kxs.lhb.basic.api.dto.tongyi.PackagesReq;
+import com.kxs.lhb.basic.api.model.LhbGoods;
+import com.kxs.lhb.basic.api.model.LhbGoodsActivities;
+import com.kxs.lhb.basic.api.model.LhbGoodsSku;
+import com.kxs.lhb.basic.api.vo.cusmoter.goods.GoodsInfoVO;
+import com.kxs.lhb.basic.api.vo.cusmoter.goods.NumbersVO;
+import com.kxs.lhb.basic.api.vo.tongyi.NumbersRes;
+import com.kxs.lhb.basic.api.vo.tongyi.PackagesRes;
+import com.kxs.lhb.basic.biz.channel.BasicService;
 import com.kxs.lhb.basic.biz.mapper.LhbGoodsMapper;
+import com.kxs.lhb.basic.biz.service.LhbGoodsActivitiesService;
 import com.kxs.lhb.basic.biz.service.LhbGoodsService;
-import org.springframework.stereotype.Service;
+import com.kxs.lhb.basic.biz.service.LhbGoodsSkuService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import com.kxs.lhb.basic.api.model.LhbGoods;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
 
 
 /**
@@ -22,5 +42,154 @@ import com.kxs.lhb.basic.api.model.LhbGoods;
 @Slf4j
 public class LhbGoodsServiceImpl extends MPJBaseServiceImpl<LhbGoodsMapper, LhbGoods> implements LhbGoodsService {
 
+    private final BasicService basicService;
+
+    private final LhbGoodsSkuService goodsSkuService;
+
+    private final LhbGoodsActivitiesService goodsActivitiesService;
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean addGoods(LhbGoods param) {
+
+        List<PackagesRes> packages = basicService.getPackages(PackagesReq.builder().build());
+
+        Optional<PackagesRes> first = packages.stream().filter(item -> param.getExternalId().equals(item.getId())).findFirst();
+
+        if (first.isEmpty()) {
+            throw new GlobalCustomerException("未查询到第三方套餐ID");
+        }
+        first.ifPresent(item -> {
+
+            save(param);
+            refreshGoods(param, item);
+        });
+
+        return Boolean.TRUE;
+    }
+
+    @Override
+    public Boolean updateGoods(LhbGoods param) {
+
+        List<PackagesRes> packages = basicService.getPackages(PackagesReq.builder().build());
+
+        Optional<PackagesRes> first = packages.stream().filter(item -> param.getExternalId().equals(item.getId())).findFirst();
+
+        if (first.isEmpty()) {
+            throw new GlobalCustomerException("未查询到第三方套餐ID");
+        }
+
+        first.ifPresent(item -> {
+
+            updateById(param);
+            refreshGoods(param, item);
+        });
+
+        return Boolean.TRUE;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean removeByGoodsId(Integer id) {
+
+        removeById(id);
+
+        goodsSkuService.list(Wrappers.lambdaQuery(LhbGoodsSku.class).eq(LhbGoodsSku::getGoodsId, id)).forEach(goodsSku -> {
+            goodsActivitiesService.remove(Wrappers.lambdaQuery(LhbGoodsActivities.class).eq(LhbGoodsActivities::getSkuId, goodsSku.getId()));
+            goodsSkuService.removeById(goodsSku.getId());
+        });
+
+        return Boolean.TRUE;
+    }
+
+    @Override
+    public List<NumbersVO> getNumbers(NumbersDTO param) {
+
+        NumbersRes numbersRes = basicService.getNumbers(NumbersReq.builder().regionId(param.getAreaCode())
+                .pageSize(30)
+                .currentPage(1)
+                .fuzzyTag(param.getFuzzyTag())
+                .fuzzyKey(param.getFuzzyKey()).build());
+
+        List<NumbersVO> list = new ArrayList<>();
+        numbersRes.getNumList().forEach(item -> {
+            NumbersVO numbersVO = new NumbersVO();
+            numbersVO.setPhone(item.getAccessNum());
+            numbersVO.setBeautifulTag(item.getBeautifulTag());
+            numbersVO.setReserveFee(item.getReserveFee());
+            list.add(numbersVO);
+        });
+        return list;
+    }
+
+    @Override
+    public GoodsInfoVO detail(Integer id) {
+
+        LhbGoods goods = getById(id);
+        GoodsInfoVO goodsInfoVO = new GoodsInfoVO();
+        BeanUtils.copyProperties(goods, goodsInfoVO);
+        goodsInfoVO.setSkuList(new ArrayList<>());
+        List<LhbGoodsSku> goodsSku = goodsSkuService.list(Wrappers.lambdaQuery(LhbGoodsSku.class).eq(LhbGoodsSku::getGoodsId, id));
+        goodsSku.forEach(item -> {
+            GoodsInfoVO.GoodsSkuVO goodsSkuVO = new GoodsInfoVO.GoodsSkuVO();
+            BeanUtils.copyProperties(item, goodsSkuVO);
+            List<LhbGoodsActivities> activities = goodsActivitiesService.list(Wrappers.lambdaQuery(LhbGoodsActivities.class).eq(LhbGoodsActivities::getSkuId, item.getId()));
+            goodsSkuVO.setGoodsActivities(activities);
+            goodsInfoVO.getSkuList().add(goodsSkuVO);
+        });
+
+        return goodsInfoVO;
+    }
+
+
+    private void refreshGoods(LhbGoods goods, PackagesRes packages) {
+
+        List<PackagesRes.GoodsChild> goodsChildList = packages.getGoodsChildList();
+
+        //删除不存在的sku
+        goodsSkuService.remove(Wrappers.lambdaQuery(LhbGoodsSku.class)
+                .notIn(LhbGoodsSku::getExternalSkuId, goodsChildList.stream().map(PackagesRes.GoodsChild::getId).toList()));
+
+        goodsChildList.forEach(goodsChild -> {
+            LhbGoodsSku goodsSku = goodsSkuService.getOne(Wrappers.lambdaQuery(LhbGoodsSku.class).eq(LhbGoodsSku::getExternalSkuId, goodsChild.getId()));
+            if (goodsSku == null) {
+                goodsSku = new LhbGoodsSku();
+            }
+            goodsSku.setGoodsId(goods.getId());
+            goodsSku.setExternalSkuId(goodsChild.getId());
+            goodsSku.setDetails(goodsChild.getChildInfo());
+            goodsSku.setPackageName(goodsChild.getChildName());
+            goodsSku.setMonthFee(new BigDecimal(goodsChild.getChildFee()));
+            goodsSku.setProductId(goodsChild.getProductId());
+            goodsSkuService.saveOrUpdate(goodsSku);
+            //活动信息
+            List<PackagesRes.Activities> activities = goodsChild.getActivities();
+            //删除不存在的活动
+            goodsActivitiesService.remove(Wrappers.lambdaQuery(LhbGoodsActivities.class)
+                    .notIn(LhbGoodsActivities::getActivityCode, activities.stream().map(PackagesRes.Activities::getOfferCode).toList()));
+
+            for (PackagesRes.Activities activitiesItem : activities) {
+
+                goodsSkuService.remove(Wrappers.lambdaQuery(LhbGoodsSku.class)
+                        .notIn(LhbGoodsSku::getExternalSkuId, goodsChildList.stream().map(PackagesRes.GoodsChild::getId).toList()));
+
+                LhbGoodsActivities goodsActivities = goodsActivitiesService.getOne(Wrappers.lambdaQuery(LhbGoodsActivities.class)
+                        .eq(LhbGoodsActivities::getActivityCode, activitiesItem.getOfferCode()));
+                if (goodsActivities == null) {
+                    goodsActivities = new LhbGoodsActivities();
+                }
+                goodsActivities.setSkuId(goodsSku.getId());
+                goodsActivities.setActivityCode(activitiesItem.getOfferCode());
+                goodsActivities.setActivityName(activitiesItem.getOfferName());
+                goodsActivities.setActivityDesc(activitiesItem.getOfferDesc());
+                goodsActivities.setDiscount(StrUtil.isNotBlank(activitiesItem.getOfferDiscount()) ? Integer.valueOf(activitiesItem.getOfferDiscount()) : null);
+                goodsActivities.setModels(Integer.valueOf(activitiesItem.getOfferModes()));
+                goodsActivities.setDownAmt(StrUtil.isNotBlank(activitiesItem.getStraightDownAmount()) ? new BigDecimal(activitiesItem.getStraightDownAmount()) : null);
+                goodsActivitiesService.saveOrUpdate(goodsActivities);
+            }
+        });
+    }
+
 }
 

+ 26 - 2
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbNotifyServiceImpl.java

@@ -1,6 +1,7 @@
 package com.kxs.lhb.basic.biz.service.impl;
 
 import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -14,11 +15,13 @@ import com.kxs.lhb.basic.api.amqp.RabbitLhbOrderQueueMQ;
 import com.kxs.lhb.basic.api.dto.admin.sysNotify.SysNotifyDTO;
 import com.kxs.lhb.basic.api.dto.admin.sysNotify.SysNotifyPageDTO;
 import com.kxs.lhb.basic.biz.mapper.LhbNotifyMapper;
+import com.kxs.lhb.basic.biz.mq.model.params.BindNotify;
 import com.kxs.lhb.basic.biz.service.LhbNotifyService;
 import org.springframework.stereotype.Service;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import com.kxs.lhb.basic.api.model.LhbNotify;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -42,6 +45,24 @@ public class LhbNotifyServiceImpl extends MPJBaseServiceImpl<LhbNotifyMapper, Lh
         return this.getOne(Wrappers.<LhbNotify>lambdaQuery().eq(LhbNotify::getNotifyId, notifyId));
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void bindPush(BindNotify bindNotify, String isvNo) {
+
+        //保存推送消息次数
+        LhbNotify notify = new LhbNotify();
+        notify.setIsvNo(isvNo);
+        notify.setNotifyId(IdUtil.simpleUUID());
+        notify.setParams(JSON.toJSONString(bindNotify));
+        notify.setClassName(CommonConstants.BIND_PUSH_NAME);
+        save(notify);
+        //推送绑定数据
+        RabbitLhbBindQueueMQ.MsgEntity msgEntity = new RabbitLhbBindQueueMQ.MsgEntity();
+        msgEntity.setNotifyId(notify.getNotifyId());
+        mqSender.send(RabbitLhbBindQueueMQ.build(msgEntity), 5);
+        log.info("手机号码:{},推送绑定数据成功:{}", bindNotify.getMobile(), JSON.toJSONString(bindNotify));
+    }
+
     @Override
     public Page<LhbNotify> notifyPage(Page<LhbNotify> page, SysNotifyPageDTO param) {
         QueryWrapper<LhbNotify> wrapper = Wrappers.query();
@@ -54,8 +75,11 @@ public class LhbNotifyServiceImpl extends MPJBaseServiceImpl<LhbNotifyMapper, Lh
         if (StrUtil.isNotBlank(param.getNotifyId())) {
             wrapper.eq("notify_id", param.getNotifyId());
         }
-        if (StrUtil.isNotBlank(param.getSn())) {
-            wrapper.eq("JSON_EXTRACT(params, '$.sn')", param.getSn());
+        if (StrUtil.isNotBlank(param.getMobile())) {
+            wrapper.eq("JSON_EXTRACT(params, '$.mobile')", param.getMobile());
+        }
+        if (StrUtil.isNotBlank(param.getOrderNo())) {
+            wrapper.eq("JSON_EXTRACT(params, '$.orderNo')", param.getOrderNo());
         }
         if (param.getStatus() != null) {
             wrapper.eq("status", param.getStatus());

+ 315 - 8
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbOrderServiceImpl.java

@@ -1,16 +1,47 @@
 package com.kxs.lhb.basic.biz.service.impl;
 
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
-import com.github.yulichang.toolkit.JoinWrappers;
-import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.kxs.common.core.constant.CommonConstants;
+import com.kxs.common.core.exception.GlobalCustomerException;
+import com.kxs.common.core.util.AssertUtil;
+import com.kxs.common.mq.handlers.IMQSender;
+import com.kxs.common.pay.enums.PayPlatformEnum;
+import com.kxs.common.pay.enums.PayStatusCommEnum;
+import com.kxs.common.pay.factory.PaymentFactory;
+import com.kxs.common.pay.model.PayRequest;
+import com.kxs.common.pay.model.QueryRequest;
+import com.kxs.common.pay.model.QueryResponse;
+import com.kxs.common.security.util.SecurityUtils;
+import com.kxs.lhb.basic.api.amqp.RabbitOrderTimeoutQueueMQ;
+import com.kxs.lhb.basic.api.constant.enums.OrderStatusEnum;
+import com.kxs.lhb.basic.api.dto.tongyi.*;
+import com.kxs.lhb.basic.api.model.*;
 import com.kxs.lhb.basic.api.vo.admin.sysOrder.QueryLogisticsVO;
+import com.kxs.lhb.basic.api.vo.tongyi.OrderChargeLevelRes;
+import com.kxs.lhb.basic.api.vo.tongyi.QueryLogisticsRes;
+import com.kxs.lhb.basic.biz.channel.BasicService;
 import com.kxs.lhb.basic.biz.mapper.LhbOrderMapper;
-import com.kxs.lhb.basic.biz.service.LhbOrderService;
-import org.springframework.stereotype.Service;
+import com.kxs.lhb.basic.biz.mq.model.params.BindNotify;
+import com.kxs.lhb.basic.biz.service.*;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import com.kxs.lhb.basic.api.model.LhbOrder;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
 
 
 /**
@@ -24,10 +55,286 @@ import com.kxs.lhb.basic.api.model.LhbOrder;
 @Slf4j
 public class LhbOrderServiceImpl extends MPJBaseServiceImpl<LhbOrderMapper, LhbOrder> implements LhbOrderService {
 
+    private final BasicService basicService;
+
+    private final LhbUserService userService;
+
+    private final LhbGoodsService goodsService;
+
+    private final LhbGoodsSkuService goodsSkuService;
+
+    private final LhbGoodsActivitiesService goodsActivitiesService;
+
+    private final PaymentFactory paymentFactory;
+
+    private final IMQSender mqSender;
+
+    private final LhbNotifyService notifyService;
+
+    private final LhbAreaService areaService;
+
+    @Override
+    public List<QueryLogisticsVO> queryLogistics(Integer id) {
+
+        LhbOrder order = getById(id);
+
+        if(StrUtil.isBlank(order.getOutOrderSn())){
+            throw new GlobalCustomerException("订单未下单");
+        }
+        QueryOrderReq req = QueryOrderReq.builder().orderId(order.getOutOrderSn()).build();
+        QueryLogisticsRes queryLogisticsRes = basicService.queryLogistics(req);
+        order.setExpressNo(queryLogisticsRes.getExpressNo());
+        order.updateById();
+
+        List<QueryLogisticsVO> list = new ArrayList<>();
+        queryLogisticsRes.getInfoList().forEach(item -> {
+            QueryLogisticsVO logisticsVO = new QueryLogisticsVO();
+            logisticsVO.setExpressNo(queryLogisticsRes.getExpressNo());
+            logisticsVO.setContent(item.getContent());
+            logisticsVO.setOperationTime(item.getOperationTime());
+            list.add(logisticsVO);
+        });
+        return list;
+    }
+
+
+    @Override
+    public Integer prePhone(LhbOrder order) {
+
+        LhbUser user = userService.getById(SecurityUtils.getUser().getId());
+
+        //订单号
+        String orderSn = CommonConstants.ORDER_SN_PREFIX + IdUtil.getSnowflakeNextIdStr();
+        order.setOrderSn(orderSn);
+        order.setEmployNum(user.getEmployNum());
+        order.setUserId(user.getId());
+
+        //预占号码
+        PreNumbersReq req = PreNumbersReq.builder()
+                .regionId(order.getRegionId())
+                .idenNr(order.getIdCard())
+                .number(order.getMakeMobile()).build();
+        basicService.preNumber(req);
+
+        order.insert();
+
+        //发送订单延时取消消息
+        RabbitOrderTimeoutQueueMQ.MsgEntity msgEntity = new RabbitOrderTimeoutQueueMQ.MsgEntity();
+        msgEntity.setOrderId(order.getId());
+        mqSender.send(RabbitOrderTimeoutQueueMQ.build(msgEntity), 60 * 20);
+
+        return order.getId();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Integer submit(LhbOrder param) {
+
+        LhbOrder order = getById(param.getId());
+        AssertUtil.isTrue(order.getStatus().equals(OrderStatusEnum.NO_PAY.getCode()), "订单状态异常");
+
+        LhbGoods goods = goodsService.getById(param.getGoodsId());
+        if(goods.getServerFee().compareTo(param.getServerFee()) != 0){
+
+            throw new GlobalCustomerException("服务费与传入的服务费不匹配");
+        }
+        order.setOperators(goods.getOperators());
+        order.setAddress(param.getAddress());
+        order.setArea(param.getArea());
+        order.setContMobile(param.getContMobile());
+        order.setCustName(param.getCustName());
+        order.setPackageName(param.getPackageName());
+        order.setGoodsId(param.getGoodsId());
+        order.setSkuId(param.getSkuId());
+
+
+        LhbGoodsSku goodsSku = goodsSkuService.getById(param.getSkuId());
+        List<LhbGoodsActivities> activities = goodsActivitiesService.list(Wrappers.lambdaQuery(LhbGoodsActivities.class).eq(LhbGoodsActivities::getSkuId, goodsSku.getId()));
+
+        //如果有服务费 需要先支付 在回调再下单
+        if(order.getServerFee().compareTo(BigDecimal.ZERO) == 0){
+
+            order.setStatus(OrderStatusEnum.PAY.getCode());
+            order.setPayTime(LocalDateTime.now());
+            //三方下单
+            OrderSubmitReq req = OrderSubmitReq.builder()
+                    .goodsId(goods.getExternalId())
+                    .goodsSkuId(goodsSku.getExternalSkuId())
+                    .offerCodes(!activities.isEmpty() ? activities.stream().map(LhbGoodsActivities::getActivityCode).collect(Collectors.joining(",")) : "")
+                    .payMoney("0")
+                    .number(order.getMakeMobile())
+                    .custName(order.getCustName())
+                    .contNumber(order.getContMobile())
+                    .idenNr(order.getIdCard())
+                    .receiveName(order.getCustName())
+                    .receiveMobile(order.getContMobile())
+                    .receiveAddress(order.getAddress())
+                    .area(order.getArea())
+                    .preNumber(Boolean.FALSE)
+                    .regionId(order.getRegionId()).build();
+            String orderId = basicService.orderSubmit(req);
+            order.setOutOrderSn(orderId);
+        }
+        order.updateById();
+        return order.getId();
+    }
+
     @Override
-    public Page<QueryLogisticsVO> queryLogistics(Page<QueryLogisticsVO> page, LhbOrder param) {
+    @Transactional(rollbackFor = Exception.class)
+    public void payBack(String outTradeNo, String transactionId) {
+        LhbOrder order = getOne(Wrappers.lambdaQuery(LhbOrder.class).eq(LhbOrder::getOrderSn, outTradeNo));
+        if(order.getStatus() != OrderStatusEnum.NO_PAY.getCode()){
+            throw new GlobalCustomerException("订单状态错误");
+        }
+        LhbGoods goods = goodsService.getById(order.getGoodsId());
+        LhbGoodsSku goodsSku = goodsSkuService.getById(order.getSkuId());
 
-        return null;
+        order.setPayTradeNo(transactionId);
+        order.setStatus(OrderStatusEnum.PAY.getCode());
+        order.setPayTime(LocalDateTime.now());
+
+        //三方下单
+        OrderSubmitReq req = OrderSubmitReq.builder()
+                .goodsId(goods.getExternalId())
+                .goodsSkuId(goodsSku.getExternalSkuId())
+                .payMoney("0")
+                .number(order.getMakeMobile())
+                .custName(order.getCustName())
+                .contNumber(order.getContMobile())
+                .idenNr(order.getIdCard())
+                .receiveName(order.getCustName())
+                .receiveMobile(order.getContMobile())
+                .receiveAddress(order.getAddress())
+                .area(order.getArea())
+                .preNumber(Boolean.FALSE)
+                .regionId(order.getRegionId()).build();
+        String orderId = basicService.orderSubmit(req);
+        order.setOutOrderSn(orderId);
+        order.updateById();
+
+    }
+
+    @Override
+    public Object payOrder(LhbOrder param) {
+
+        LhbUser user = userService.getById(SecurityUtils.getUser().getId());
+
+        LhbOrder order = getById(param.getId());
+
+        PayRequest payReq = new PayRequest();
+        payReq.setPayTypeEnum(PayPlatformEnum.WX);
+        payReq.setOutTradeNo(order.getOrderSn());
+        payReq.setSubject(order.getPackageName());
+        payReq.setTotalAmount(order.getServerFee().doubleValue());
+        //扩展参数
+        payReq.setPassbackParams(CommonConstants.PRODUCT_FLAG);
+        payReq.setOpenid(user.getWxOpenid());
+
+        return paymentFactory.getPayService(PayPlatformEnum.WX.getType()).jsPay(payReq);
+    }
+
+    @Override
+    public void changeTimeoutOrder(LhbOrder order) {
+
+        order.setStatus(OrderStatusEnum.CANCEL.getCode());
+
+        //有押金才查询是否支付
+        if(order.getServerFee().compareTo(BigDecimal.ZERO) > 0){
+            QueryRequest queryReq = QueryRequest.builder()
+                    .outTradeNo(order.getOrderSn())
+                    .build();
+
+            QueryResponse query = paymentFactory.getPayService(PayPlatformEnum.WX.getType()).query(queryReq);
+
+            if (query != null && PayStatusCommEnum.TRADE_SUCCESS == query.getTradeStatus() ) {
+                order.setStatus( OrderStatusEnum.PAY.getCode());
+                order.setPayTime(LocalDateTime.now());
+            }
+        }
+        updateById(order);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean cancelOrder(LhbOrder param) {
+
+        LhbOrder order = getById(param.getId());
+        if(order.getIsAct() == 1){
+            throw new GlobalCustomerException("订单已激活,无法取消");
+        }
+        if(order.getOutStatus() == 41){
+            throw new GlobalCustomerException("配送中,不可取消订单");
+        }
+        if(order.getOutStatus() == 6){
+            throw new GlobalCustomerException("订单正在取消中");
+        }
+
+
+        order.setStatus(OrderStatusEnum.CANCEL.getCode());
+        order.setRemark(param.getRemark());
+        order.updateById();
+
+        OrderCancelReq req = OrderCancelReq.builder()
+                .orderId(order.getOutOrderSn())
+                .returnCause(param.getRemark())
+                .applyPerson(SecurityUtils.getUser().getName()).build();
+        basicService.orderCancel(req);
+
+        return Boolean.TRUE;
     }
+
+    @Override
+    @Async
+    public void orderStatusTask() {
+        List<LhbOrder> orders = list(Wrappers.lambdaQuery(LhbOrder.class)
+                .eq(LhbOrder::getIsAct, CommonConstants.FAIL)
+                .eq(LhbOrder::getStatus, OrderStatusEnum.PAY.getCode()));
+
+        orders.forEach(order -> {
+            QueryOrderReq req = QueryOrderReq.builder().orderId(order.getOutOrderSn()).build();
+            String outStatus = basicService.queryStatus(req);
+            //更新状态
+            update(Wrappers.lambdaUpdate(LhbOrder.class).eq(LhbOrder::getId, order.getId()).set(LhbOrder::getOutStatus, outStatus));
+        });
+    }
+
+    @Override
+    @Async
+    public void orderFirstCharge() {
+        List<LhbOrder> orders = list(Wrappers.lambdaQuery(LhbOrder.class)
+                .eq(LhbOrder::getIsAct, CommonConstants.FAIL)
+                .eq(LhbOrder::getStatus, OrderStatusEnum.PAY.getCode()));
+
+        orders.forEach(order -> {
+            QueryOrderReq req = QueryOrderReq.builder().orderId(order.getOutOrderSn()).build();
+            String firstCharge = basicService.queryFirstCharge(req);
+            if(firstCharge.contains("50") || firstCharge.contains("100")){
+
+                BigDecimal firstChargeAmt = firstCharge.contains("50") ? new BigDecimal("5000") : new BigDecimal("10000");
+
+                //更新状态
+                update(Wrappers.lambdaUpdate(LhbOrder.class).eq(LhbOrder::getId, order.getId())
+                        .set(LhbOrder::getIsAct, CommonConstants.SUCCESS)
+                        .set(LhbOrder::getFirstCharge, firstChargeAmt)
+                        .set(LhbOrder::getIsFirstRecharge, CommonConstants.SUCCESS));
+
+                //构建推送消息
+                BindNotify bindNotify = BindNotify.builder().mobile(order.getMakeMobile())
+                        .productName(order.getPackageName())
+                        .firstRechargeAmount(firstChargeAmt)
+                        .userName(order.getCustName())
+                        .orderNo(order.getOrderSn())
+                        .receiveName(order.getCustName())
+                        .receiveMobile(order.getContMobile())
+                        .receiveAddress(order.getAddress())
+                        .createTime(LocalDateTimeUtil.format(LocalDate.now(), DatePattern.NORM_DATETIME_PATTERN))
+                        .build();
+                notifyService.bindPush(bindNotify, order.getIsvNo());
+            }
+
+        });
+    }
+
+
 }
 

+ 2 - 1
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LlbUserServiceImpl.java

@@ -43,11 +43,12 @@ public class LlbUserServiceImpl extends MPJBaseServiceImpl<LhbUserMapper, LhbUse
 //            WxOAuth2AccessToken accessToken = wxMpService.getOAuth2Service().getAccessToken(code);
 
             WxOAuth2AccessToken accessToken = new WxOAuth2AccessToken();
-            accessToken.setOpenId("oCZLJ5wJ4YqY4Q8z7Y9ZJx9e8ZJL");
+            accessToken.setOpenId(code);
 
             LhbUser user = getOne(Wrappers.lambdaQuery(LhbUser.class).eq(LhbUser::getWxOpenid, accessToken.getOpenId()));
             if (user == null) {
                 user = new LhbUser();
+
                 //加盐
                 String salt = UUID.randomUUID().toString();
                 user.setSalt(salt);

+ 6 - 3
lhb-basic/lhb-basic-biz/src/main/resources/mapper/LhbOrderMapper.xml

@@ -11,13 +11,14 @@
         <result column="status" property="status" />
         <result column="user_id" property="userId" />
         <result column="order_sn" property="orderSn" />
-        <result column="product_id" property="productId" />
-        <result column="cash_fee" property="cashFee" />
+        <result column="goods_id" property="goodsId" />
+        <result column="sku_id" property="skuId" />
+        <result column="server_fee" property="serverFee" />
         <result column="pay_time" property="payTime" />
         <result column="make_mobile" property="makeMobile" />
         <result column="pay_type" property="payType" />
         <result column="out_order_sn" property="outOrderSn" />
-        <result column="product_name" property="productName" />
+        <result column="package_name" property="packageName" />
         <result column="is_first_recharge" property="isFirstRecharge" />
         <result column="out_status" property="outStatus" />
         <result column="pay_trade_no" property="payTradeNo" />
@@ -37,6 +38,8 @@
         <result column="employ_num" property="employNum" />
         <result column="operators" property="operators" />
         <result column="is_act" property="isAct" />
+        <result column="express_no" property="expressNo" />
+        <result column="first_charge" property="firstCharge" />
 
     </resultMap>
 

+ 0 - 1
lhb-basic/lhb-basic-biz/src/main/resources/mapper/LhbOrderRechargeMapper.xml

@@ -4,7 +4,6 @@
 
     <resultMap type="com.kxs.lhb.basic.api.model.LhbOrderRecharge" id="LhbOrderRechargeMap">
         <result column="id" property="id" />
-        <result column="sort" property="sort" />
         <result column="update_by" property="updateBy" />
         <result column="create_by" property="createBy" />
         <result column="recharge_fee" property="rechargeFee" />

+ 2 - 0
lhb-basic/lhb-basic-biz/src/main/resources/mapper/LhbUserMapper.xml

@@ -18,7 +18,9 @@
         <result column="password" property="password" />
         <result column="username" property="username" />
         <result column="status" property="status" />
+        <result column="employ_num" property="employNum" />
         <result column="remark" property="remark" />
+        <result column="isv_no" property="isvNo" />
 
     </resultMap>