Browse Source

导出调整

yangyb 1 week ago
parent
commit
bd9dbdde6f

+ 5 - 0
mall-service/pom.xml

@@ -68,6 +68,11 @@
             <version>5.2.4</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.1</version>
+        </dependency>
 
         <dependency>
             <groupId>com.tencentcloudapi</groupId>

+ 2 - 3
mall-service/src/main/java/com/txz/mall/business/impl/OrderServiceBusinessImpl.java

@@ -3,7 +3,6 @@ package com.txz.mall.business.impl;
 import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.txz.cif.dto.UserDTO;
 import com.txz.mall.business.OrderServiceBusiness;
 import com.txz.mall.core.RedisUtil;
 import com.txz.mall.dubbo.client.CifUserDubboServiceClient;
@@ -51,14 +50,14 @@ public class OrderServiceBusinessImpl implements OrderServiceBusiness {
         infoCriteria.andEqualTo("orderId", storeOrder.getId());
         List<StoreOrderInfo> infoList = storeOrderInfoService.findByCondition(infoCondition);
         List<StoreOrderStatus> logList = storeOrderStatusService.getLogList(storeOrder.getId());
-        UserDTO user = userDubboServiceClient.getUser(storeOrder.getUid());
+//        UserDTO user = userDubboServiceClient.getUser(storeOrder.getUid());
         UserAddress userAddress = userAddressService.findById(storeOrder.getAddressId());
         StoreOrderVO vo = new StoreOrderVO();
         BeanUtils.copyProperties(storeOrder, vo);
         vo.setOrderInfoVO(infoList);
         vo.setOrderAddressVO(userAddress);
         vo.setOrderStatusVO(logList);
-        vo.setUserVO(user);
+//        vo.setUserVO(user);
         return vo;
     }
 

+ 161 - 0
mall-service/src/main/java/com/txz/mall/core/AuthService.java

@@ -0,0 +1,161 @@
+package com.txz.mall.core;
+
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateUtil;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.ExpiredJwtException;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.ImmutableTriple;
+import org.apache.commons.lang3.tuple.Triple;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+
+@Service
+@Slf4j
+public class AuthService {
+
+    private static final String BEARER = "Bearer ";
+
+    /**
+     * jwt token 密钥,主要用于token解析,签名验证
+     */
+    @Value("${spring.security.oauth2.jwt.signingKey}")
+    private static String signingKey = "txz123456";
+
+    private static Claims getJwt(String jwtToken) {
+        if (jwtToken.startsWith(BEARER)) {
+            jwtToken = StringUtils.substring(jwtToken, BEARER.length());
+        }
+        Claims claims;
+        try {
+            claims = Jwts.parser()
+                    .setSigningKey(signingKey.getBytes())
+                    .parseClaimsJws(jwtToken).getBody();
+        } catch (ExpiredJwtException e) {
+            claims = e.getClaims();
+        }
+
+        return claims;
+    }
+
+    public String buildJwtToken(Long userId) {
+        String KEY = "txz123456";
+        Date now = DateUtil.date();
+        Date exp = DateUtil.offset(now, DateField.DAY_OF_YEAR, 30);
+        Map<String, Object> claims = new HashMap<String, Object>();
+        claims.put("userId", userId);
+
+        String jwtToken = Jwts.builder()
+                .setClaims(claims)
+                .setId(UUID.randomUUID().toString())
+                .setIssuedAt(now)
+                .setSubject("sawa")
+                .signWith(SignatureAlgorithm.HS256, KEY.getBytes())
+                .setExpiration(exp).compact();
+
+        return "Bearer " + jwtToken;
+    }
+
+    public String buildJwtTokenWithRole(Long userId, Integer role, Integer day) {
+        String KEY = "123456";
+        Date now = DateUtil.date();
+        Date exp = DateUtil.offset(now, DateField.DAY_OF_YEAR, day);
+        Map<String, Object> claims = new HashMap<String, Object>();
+        claims.put("userId", userId);
+        claims.put("role", role);
+
+        String jwtToken = Jwts.builder()
+                .setClaims(claims)
+                .setId(UUID.randomUUID().toString())
+                .setIssuedAt(now)
+                .setSubject("sawa")
+                .signWith(SignatureAlgorithm.HS256, KEY.getBytes())
+                .setExpiration(exp).compact();
+
+        return "Bearer " + jwtToken;
+    }
+
+    public Claims getClaimsFromToken(String authentication) {
+        try {
+            final Claims claims = this.getJwt(authentication);
+            boolean pass = DateUtil.compare(DateUtil.date(), claims.getExpiration()) < 0;
+            if (pass) {
+                return claims;
+            }
+        } catch (Exception e) {
+            log.error("get userId from token error:{}", e.getMessage());
+        }
+        return null;
+    }
+
+    public Long getTokenUserId(HttpServletRequest request) {
+        if (request == null) {
+            ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+            if (null != sra) {
+                request = sra.getRequest();
+            } else {
+                return null;
+            }
+        }
+        String token = request.getHeader("token");
+        Claims claims = getJwt(token);
+        return Long.valueOf(claims.get("userId").toString());
+    }
+
+    /**
+     * 验证 JWT token 的有效性
+     *
+     * @param token 待验证的 token 字符串(可带或不带 "Bearer " 前缀)
+     * @return 验证结果对象,包含:
+     * - 是否有效(boolean)
+     * - 如果无效,错误信息(String)
+     * - 如果有效,解析出的 Claims 对象(Claims)
+     */
+    public Triple<Boolean, String, Claims> verifyToken(String token) {
+        try {
+            // 1. 检查token是否为空
+            if (StringUtils.isBlank(token)) {
+                return ImmutableTriple.of(false, "Token不能为空", null);
+            }
+
+            // 2. 解析token获取Claims
+            Claims claims = getJwt(token);
+
+            // 3. 检查token是否过期
+            if (DateUtil.compare(DateUtil.date(), claims.getExpiration()) >= 0) {
+                return ImmutableTriple.of(false, "Token已过期", claims);
+            }
+
+            // 4. 检查必要字段(根据业务需求)
+            if (claims.get("userId") == null) {
+                return ImmutableTriple.of(false, "无效Token: 缺少userId字段", claims);
+            }
+
+            // 5. 所有检查通过,返回有效
+            return ImmutableTriple.of(true, null, claims);
+        } catch (ExpiredJwtException e) {
+            // 专门处理过期异常,可以获取到过期的claims
+            return ImmutableTriple.of(false, "Token已过期", e.getClaims());
+        } catch (Exception e) {
+            log.error("Token验证失败: {}", e.getMessage());
+            return ImmutableTriple.of(false, "无效Token: " + e.getMessage(), null);
+        }
+    }
+
+}
+
+
+
+

+ 42 - 13
mall-service/src/main/java/com/txz/mall/service/impl/StoreOrderServiceImpl.java

@@ -35,7 +35,7 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
-import po.OrderDeliveryPO;
+import po.StoreOrderExportPO;
 import tk.mybatis.mapper.entity.Condition;
 import tk.mybatis.mapper.entity.Example;
 import vo.*;
@@ -243,23 +243,40 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
     @Override
     public void exportFile(StoreOrderDTO dto, HttpServletResponse response) {
         List<StoreOrderVO> list = orderList(dto);
-        List<String> rowHead = CollUtil.newArrayList("订单号", "商品信息", "数量", "用户名", "付款金额", "订单状态", "物流信息", "下单时间", "付款时间");
+        List<String> rowHead = CollUtil.newArrayList("ID", "订单号", "用户ID", "用户注册手机号", "订单状态", "订单金额", "下单时间", "支付时间", "商品ID", "商品名称", "商品规格", "购买数量", "收件人姓名", "收件人手机", "收件人详细地址", "邮编", "快递公司", "快递单号");
         ExcelWriter writer = ExcelUtil.getWriter();
         try {
             writer.writeHeadRow(rowHead);
             List<List<Object>> rows = new LinkedList<>();
+            StoreOrderInfo storeOrderInfo = null;
             if (CollUtil.isNotEmpty(list)) {
                 for (StoreOrderVO vo : list) {
+                    List<StoreOrderInfo> orderInfoVO = vo.getOrderInfoVO();
+                    if (CollectionUtils.isNotEmpty(orderInfoVO)) {
+                        storeOrderInfo = orderInfoVO.get(0);
+                    }
+                    UserAddress orderAddressVO = vo.getOrderAddressVO();
                     List<Object> rowA = CollUtil.newArrayList(
+                            vo.getId(),
                             vo.getOrderId(),
-                            JSONObject.toJSONString(vo.getOrderInfoVO()),
-                            vo.getTotalNum(),
-                            vo.getRealName(),
-                            vo.getPayPrice(),
+                            vo.getUid(),
+                            vo.getUserPhone(),
                             vo.getStatus(),
-                            vo.getDeliveryId(),
+                            vo.getPayPrice(),
                             vo.getCreateTime() == null ? "" : DateUtil.format(vo.getCreateTime(), "yyyy-MM-dd HH:mm:ss"),
-                            vo.getPayTime() == null ? "" : DateUtil.format(vo.getPayTime(), "yyyy-MM-dd HH:mm:ss")
+                            vo.getPayTime() == null ? "" : DateUtil.format(vo.getPayTime(), "yyyy-MM-dd HH:mm:ss"),
+
+                            storeOrderInfo.getProductId(),
+                            storeOrderInfo.getProductName(),
+                            storeOrderInfo.getSku(),
+                            storeOrderInfo.getPayNum(),
+
+                            vo.getRealName(),
+                            vo.getUserPhone(),
+                            vo.getUserAddress(),
+                            orderAddressVO.getPostCode(),
+                            vo.getDeliveryName(),
+                            vo.getDeliveryId()
                     );
                     rows.add(rowA);
                 }
@@ -1337,8 +1354,12 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
     @Override
     public void close(Long id) {
         StoreOrder storeOrder = findById(id);
-        storeOrder.setStatus(Constants.ORDER_STATUS_H5_CLOSE);
-//        update(storeOrder);
+        if (storeOrder.getStatus().equals(Constants.ORDER_STATUS_H5_COMPLETE)) {
+            storeOrder.setStatus(Constants.ORDER_STATUS_H5_CLOSE);
+            update(storeOrder);
+        } else {
+            throw new ServiceException("当前状态不支持关闭");
+        }
     }
 
     @Override
@@ -1354,7 +1375,7 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
 
     @Override
     public void exportDelivery(HttpServletResponse response) {
-        List<String> rowHead = CollUtil.newArrayList("订单号", "配送方式", "配送单号");
+        List<String> rowHead = CollUtil.newArrayList("ID", "订单号", "用户ID", "用户注册手机号", "订单状态", "订单金额", "下单时间", "支付时间", "商品ID", "商品名称", "商品规格", "购买数量", "收件人姓名", "收件人手机", "收件人详细地址", "邮编", "快递公司", "快递单号");
         ExcelWriter writer = ExcelUtil.getWriter();
         try {
             writer.writeHeadRow(rowHead);
@@ -1391,14 +1412,22 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
             throw new ServiceException("请传入xlsx或xls文档格式文件");
         }
         try {
-            List<OrderDeliveryPO> list = EasyExcelUtil.syncReadModel(file.getInputStream(),
-                    OrderDeliveryPO.class,
+            List<StoreOrderExportPO> list = EasyExcelUtil.syncReadModel(file.getInputStream(),
+                    StoreOrderExportPO.class,
                     0,
                     1);
 
             if (CollUtil.isEmpty(list)) {
                 throw new ServiceException("请填写内容后再提交!");
             }
+
+            for (StoreOrderExportPO po : list) {
+                StoreOrder storeOrder = new StoreOrder();
+                storeOrder.setId(po.getId());
+                storeOrder.setDeliveryId(po.getDeliveryId());
+                storeOrder.setDeliveryName(po.getDeliveryName());
+                update(storeOrder);
+            }
         } catch (IOException e) {
             throw new RuntimeException(e);
         }

+ 41 - 0
mall-service/src/main/java/com/txz/mall/util/QueryUtil.java

@@ -0,0 +1,41 @@
+package com.txz.mall.util;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotNull;
+import java.util.Map;
+
+/**
+ * 分页工具
+ *
+ * @author PmsGroup
+ */
+@Data
+@Accessors(chain = true)
+@ApiModel(description = "查询条件")
+public class QueryUtil {
+    /**
+     * 当前页
+     */
+    @ApiModelProperty(value = "当前页")
+    @NotNull(message = "开始页不能为空")
+    public Integer page;
+
+    /**
+     * 每页的数量
+     */
+    @ApiModelProperty(value = "每页的数量")
+    @NotNull(message = "每页数量不能为空")
+    public Integer size;
+
+    /**
+     * 请求参数
+     */
+    @TableField(exist = false)
+    @ApiModelProperty(value = "请求参数")
+    private Map<String, Object> params;
+}

+ 73 - 0
mall-service/src/main/java/po/StoreOrderExportPO.java

@@ -0,0 +1,73 @@
+/*
+ *
+ * StoreOrderDTO.java
+ * Copyright(C) 2017-2020 fendo公司
+ * @date 2025-07-15
+ */
+package po;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class StoreOrderExportPO implements Serializable {
+
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "订单号")
+    private String orderId;
+
+    @ApiModelProperty(value = "用户id")
+    private Long uid;
+
+    @ApiModelProperty(value = "用户注册手机号")
+    private String userPhone;
+
+    @ApiModelProperty(value = "订单状态")
+    private Integer status;
+
+    @ApiModelProperty(value = "订单金额")
+    private BigDecimal payPrice;
+
+    @ApiModelProperty(value = "下单时间")
+    private Date createTime;
+
+    @ApiModelProperty(value = "支付时间")
+    private Date payTime;
+
+    @ApiModelProperty(value = "商品ID")
+    private Long productId;
+
+    @ApiModelProperty(value = "商品名称")
+    private String productName;
+
+    @ApiModelProperty(value = "商品规格")
+    private String productAttr;
+
+    @ApiModelProperty(value = "购买数量")
+    private Integer payNum;
+
+    @ApiModelProperty(value = "收件人姓名")
+    private String realName;
+
+    @ApiModelProperty(value = "收件人电话")
+    private String phone;
+
+    @ApiModelProperty(value = "收件人地址")
+    private String userAddress;
+
+    @ApiModelProperty(value = "邮编")
+    private String postCode;
+
+    @ApiModelProperty(value = "快递公司")
+    private String deliveryName;
+
+    @ApiModelProperty(value = "快递单号")
+    private String deliveryId;
+
+}