Przeglądaj źródła

add logistics info

jintao.geng 1 miesiąc temu
rodzic
commit
45979a201e

+ 74 - 0
poyi-app/src/main/java/com/tzy/controller/group/GroupOrderExpressController.java

@@ -0,0 +1,74 @@
+package com.tzy.controller.group;
+
+import com.tzy.annotation.ApiLimitRule;
+import com.tzy.annotation.ApiLog;
+import com.tzy.annotation.RequireRoles;
+import com.tzy.app.dto.user.PrizeQuery;
+import com.tzy.app.dto.user.SendPrizeParam;
+import com.tzy.common.config.handle.ApiVersion;
+import com.tzy.common.constant.MsgConstants;
+import com.tzy.common.dto.InDto;
+import com.tzy.common.dto.OutDTO;
+import com.tzy.common.dto.UserInfo;
+import com.tzy.common.enums.BusinessType;
+import com.tzy.common.utils.UserType;
+import com.tzy.common.utils.UserUtils;
+import com.tzy.dto.local.ResultDTO;
+import com.tzy.framework.web.domain.LimitRule;
+import com.tzy.sportcard.api.domain.GroupInfo;
+import com.tzy.sportcard.api.domain.GroupOrderExpress;
+import com.tzy.sportcard.api.service.GroupApiService;
+import com.tzy.sportcard.api.service.GroupOrderExpressService;
+import com.tzy.sportcard.group.service.impl.GroupActService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.*;
+import reactor.core.publisher.Mono;
+
+import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+import com.tzy.sportcard.api.dto.prize.PublicCodeResultDTO;
+
+/**
+ * 订单物流信息
+ *
+ * @author: gengjintao
+ * @date: 2026/01/28
+ *
+ */
+@Api(value = "订单物流信息接口")
+@RestController
+@RequestMapping("/api/express")
+@Slf4j
+public class GroupOrderExpressController {
+	@Resource
+	private GroupOrderExpressService expressService;
+
+	/**
+	 * 保存订单物流信息
+	 * @param express 物流信息实体
+	 * @return 保存结果
+	 */
+	@ApiLog(title = "保存订单物流信息", businessType = BusinessType.INSERT, indto = "{{express}}")
+	@PostMapping("/save")
+	public ResultDTO saveExpressInfo(@RequestBody GroupOrderExpress express) {
+		return ResultDTO.buildSuccessResult(expressService.saveExpressInfo(express));
+	}
+
+	/**
+	 * 根据订单号查询物流信息
+	 * @param orderNo 订单号
+	 * @return 物流信息结果
+	 */
+	@ApiLog(title = "查询订单物流信息", businessType = BusinessType.SEARCH, indto = "{{orderNo}}")
+	@GetMapping("/getByOrderNo")
+	public ResultDTO getExpressByOrderNo(@RequestParam String orderNo) {
+		return ResultDTO.buildSuccessResult(expressService.getExpressByOrderNo(orderNo));
+	}
+
+
+}

+ 14 - 0
tzy-common/pom.xml

@@ -164,6 +164,20 @@
             <version>32.1.2-jre</version>
         </dependency>
 
+        <!-- MapStruct核心依赖 -->
+        <dependency>
+            <groupId>org.mapstruct</groupId>
+            <artifactId>mapstruct</artifactId>
+            <version>1.5.5.Final</version>
+        </dependency>
+        <!-- MapStruct注解处理器 必须加,核心!编译期生成代码 -->
+        <dependency>
+            <groupId>org.mapstruct</groupId>
+            <artifactId>mapstruct-processor</artifactId>
+            <version>1.5.5.Final</version>
+            <scope>provided</scope>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 29 - 0
tzy-sportcard/src/main/java/com/tzy/convert/GroupOrderExpressConvert.java

@@ -0,0 +1,29 @@
+package com.tzy.convert;
+
+
+import com.tzy.sportcard.api.domain.GroupOrderExpress;
+import com.tzy.sportcard.api.dto.group.GroupOrderExpressDTO;
+import org.apache.ibatis.annotations.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.factory.Mappers;
+
+
+/**
+ * 订单转换器
+ *
+ * @author: gengjintao
+ * @date: 2026/01/20
+ */
+@Mapper
+public interface GroupOrderExpressConvert {
+
+    GroupOrderExpressConvert INSTANCE = Mappers.getMapper(GroupOrderExpressConvert.class);
+
+
+
+    @Mapping(source = "orderNo", target = "orderNo")
+    GroupOrderExpressDTO toGroupOrderExpressDTO(GroupOrderExpress po);
+
+
+
+}

+ 57 - 0
tzy-sportcard/src/main/java/com/tzy/sportcard/api/domain/GroupOrderExpress.java

@@ -0,0 +1,57 @@
+package com.tzy.sportcard.api.domain;
+
+import com.tzy.common.annotation.Excel;
+import com.tzy.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * 订单物流信息实体类
+ * 对应数据库表:public.group_order_express
+ *
+ * @author: gengjintao
+ * @date: 2026/01/28
+ */
+@Data
+public class GroupOrderExpress extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 主键ID
+     */
+    private Integer id;
+
+    /**
+     * 订单号
+     */
+    private String orderNo;
+
+    /**
+     * 快递单号
+     */
+    private String courierNo;
+
+    /**
+     * 签收状态:0未签收 1已签收
+     */
+    private Integer signStatus = 0; // 默认未签收
+
+    /**
+     * 物流结果(JSON/文本格式)
+     */
+    private String result;
+
+    /**
+     * 同步时间
+     */
+    private LocalDateTime syncTime;
+
+    /**
+     * 物流公司(如:顺丰、京东物流)
+     */
+    private String logisticsCompany;
+
+
+}

+ 56 - 0
tzy-sportcard/src/main/java/com/tzy/sportcard/api/dto/group/GroupOrderExpressDTO.java

@@ -0,0 +1,56 @@
+package com.tzy.sportcard.api.dto.group;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.tzy.common.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 订单物流信息实体类
+ * 对应数据库表:public.group_order_express
+ *
+ * @author: gengjintao
+ * @date: 2026/01/28
+ */
+@Data
+public class GroupOrderExpressDTO extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 主键ID
+     */
+    private Integer id;
+
+    /**
+     * 订单号
+     */
+    private String orderNo;
+
+    /**
+     * 快递单号
+     */
+    private String courierNo;
+
+    /**
+     * 签收状态:0未签收 1已签收
+     */
+    private Integer signStatus; // 默认未签收
+
+    /**
+     * 物流结果(JSON/文本格式)
+     */
+    private String result;
+
+    /**
+     * 同步时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime syncTime;
+
+    /**
+     * 物流公司(如:顺丰、京东物流)
+     */
+    private String logisticsCompany;
+
+
+}

+ 46 - 0
tzy-sportcard/src/main/java/com/tzy/sportcard/api/mapper/GroupOrderExpressMapper.java

@@ -0,0 +1,46 @@
+package com.tzy.sportcard.api.mapper;
+
+import com.tzy.sportcard.api.bean.marketplace.AppVersionParam;
+import com.tzy.sportcard.api.domain.ApplicationInfo;
+import com.tzy.sportcard.api.domain.GroupOrderExpress;
+import org.apache.ibatis.annotations.Param;
+
+
+
+/**
+ * 订单物流信息Mapper接口(关联XML)
+ *
+ * @author: gengjintao
+ * @date: 2026/01/28
+ */
+public interface GroupOrderExpressMapper {
+
+    /**
+     * 新增物流信息(对应XML中insertExpress)
+     * @param express 物流信息实体
+     * @return 影响行数
+     */
+    int insert(GroupOrderExpress express);
+
+    /**
+     * 根据订单号查询物流信息(对应XML中selectByOrderNo)
+     * @param orderNo 订单号
+     * @return 物流信息
+     */
+    GroupOrderExpress selectByOrderNo(@Param("orderNo") String orderNo);
+
+    /**
+     * 可选:根据快递单号查询
+     * @param courierNo 快递单号
+     * @return 物流信息
+     */
+    GroupOrderExpress selectByCourierNo(@Param("courierNo") String courierNo);
+
+    /**
+     * 可选:更新签收状态
+     * @param orderNo 订单号
+     * @param signStatus 签收状态
+     * @return 影响行数
+     */
+    int updateSignStatus(@Param("orderNo") String orderNo, @Param("signStatus") Integer signStatus);
+}

+ 62 - 0
tzy-sportcard/src/main/java/com/tzy/sportcard/api/service/GroupOrderExpressService.java

@@ -0,0 +1,62 @@
+package com.tzy.sportcard.api.service;
+
+import com.github.pagehelper.PageInfo;
+import com.tzy.app.domain.act.CodeRecordDTO;
+import com.tzy.app.dto.TypeCountDTO;
+import com.tzy.common.dto.GoodsQuery;
+import com.tzy.common.dto.GroupTeamDTO;
+import com.tzy.common.dto.InDto;
+import com.tzy.common.dto.OutDTO;
+import com.tzy.common.dto.act.GroupSaleCodeDTO;
+import com.tzy.common.dto.act.InfoGiveActDTO;
+import com.tzy.common.dto.group.GroupOrderUserDTO;
+import com.tzy.common.dto.group.GroupQuery;
+import com.tzy.common.dto.group.SimpleGroupGoodsDTO;
+import com.tzy.common.utils.http.forest.param.ResultDTO;
+import com.tzy.sportcard.api.bean.act.GoodsActRecord;
+import com.tzy.sportcard.api.bean.act.UserCollectListDTO;
+import com.tzy.sportcard.api.bean.act.UserListActParam;
+import com.tzy.sportcard.api.bean.goods.PaniniCheckList;
+import com.tzy.sportcard.api.bean.goods.SimpleSku;
+import com.tzy.sportcard.api.bean.param.GroupPublicParam;
+import com.tzy.sportcard.api.bean.param.ShippingQuery;
+import com.tzy.sportcard.api.domain.*;
+import com.tzy.sportcard.api.dto.*;
+import com.tzy.sportcard.api.dto.group.GroupOrderExpressDTO;
+import com.tzy.sportcard.api.dto.group.GroupStatusInfoDto;
+import com.tzy.sportcard.api.dto.group.LiveListDTO;
+import com.tzy.sportcard.api.dto.group.RecommendInfoDTO;
+import com.tzy.sportcard.group.domain.CardGroupGoods;
+import com.tzy.sportcard.group.domain.CardGroupInfo;
+import com.tzy.sportcard.group.domain.CardGroupLivesConfig;
+import com.tzy.sportcard.group.domain.CardGroupOrderInfo;
+import com.tzy.sportcard.group.dto.GroupReportDTO;
+import com.tzy.sportcard.point.domain.AppUserPointRecord;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * 订单物流信息服务接口
+ *
+ * @author: gengjintao
+ * @date: 2026/01/28
+ */
+public interface GroupOrderExpressService {
+    /**
+     * 保存订单物流信息
+     * @param express 物流信息实体
+     * @return 保存结果
+     */
+    Boolean saveExpressInfo(GroupOrderExpress express);
+
+    /**
+     * 根据订单号查询物流信息
+     * @param orderNo 订单号
+     * @return 物流信息结果
+     */
+    GroupOrderExpressDTO getExpressByOrderNo(String orderNo);
+}

+ 77 - 0
tzy-sportcard/src/main/java/com/tzy/sportcard/api/service/impl/GroupOrderExpressServiceImpl.java

@@ -0,0 +1,77 @@
+package com.tzy.sportcard.api.service.impl;
+
+import com.tzy.common.utils.http.forest.param.ResultDTO;
+import com.tzy.convert.GroupOrderExpressConvert;
+import com.tzy.sportcard.api.bean.marketplace.AppVersionParam;
+import com.tzy.sportcard.api.domain.ApplicationInfo;
+import com.tzy.sportcard.api.domain.GroupOrderExpress;
+import com.tzy.sportcard.api.dto.group.GroupOrderExpressDTO;
+import com.tzy.sportcard.api.mapper.BaseApiMapper;
+import com.tzy.sportcard.api.mapper.GroupOrderExpressMapper;
+import com.tzy.sportcard.api.service.BaseApiService;
+import com.tzy.sportcard.api.service.GroupOrderExpressService;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+
+@Service
+@Log4j2
+public class GroupOrderExpressServiceImpl implements GroupOrderExpressService {
+
+    @Resource
+    private GroupOrderExpressMapper groupOrderExpressMapper;
+
+    /**
+     * 保存订单物流信息
+     *
+     * @param express 物流信息实体
+     * @return 保存结果
+     */
+    @Override
+    public Boolean saveExpressInfo(GroupOrderExpress express) {
+        // 参数校验
+        if (!StringUtils.isEmpty(express.getOrderNo())) {
+            log.error("订单号不能为空");
+            return Boolean.FALSE;
+        }
+        if (!StringUtils.isEmpty(express.getCourierNo())) {
+            log.error("快递单号不能为空");
+            return Boolean.FALSE;
+        }
+
+        // 设置默认值
+        if (express.getSignStatus() == null) {
+            express.setSignStatus(0); // 默认未签收
+        }
+        express.setSyncTime(LocalDateTime.now());
+
+        try {
+            int insert = groupOrderExpressMapper.insert(express);
+            return insert > 0;
+        } catch (Exception e) {
+            log.error("保存订单物流信息异常,订单号:{},异常信息:{}", express.getOrderNo(), e.getMessage(), e);
+            return Boolean.FALSE;
+        }
+    }
+
+    /**
+     * 根据订单号查询物流信息
+     *
+     * @param orderNo 订单号
+     * @return 物流信息结果
+     */
+    @Override
+    public GroupOrderExpressDTO getExpressByOrderNo(String orderNo) {
+        // 参数校验
+        if (!StringUtils.isEmpty(orderNo)) {
+            log.error("订单号不能为空");
+            return null;
+        }
+        GroupOrderExpress express = groupOrderExpressMapper.selectByOrderNo(orderNo);
+        GroupOrderExpressDTO result = GroupOrderExpressConvert.INSTANCE.toGroupOrderExpressDTO(express);
+        return result;
+    }
+}

+ 61 - 0
tzy-sportcard/src/main/resources/mapper/api/GroupOrderExpressMapper.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.tzy.sportcard.api.mapper.GroupOrderExpressMapper">
+
+    <resultMap id="BaseResultMap" type="com.tzy.sportcard.api.domain.GroupOrderExpress">
+        <id column="id" property="id" jdbcType="INTEGER"/>
+        <result column="order_no" property="orderNo" jdbcType="VARCHAR"/>
+        <result column="courier_no" property="courierNo" jdbcType="VARCHAR"/>
+        <result column="sign_status" property="signStatus" jdbcType="INTEGER"/>
+        <result column="result" property="result" jdbcType="VARCHAR"/>
+        <result column="sync_time" property="syncTime" jdbcType="TIMESTAMP"/>
+        <result column="logistics_company" property="logisticsCompany" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id, order_no, courier_no, sign_status, result, sync_time, logistics_company
+    </sql>
+
+    <insert id="insert" parameterType="GroupOrderExpress">
+        INSERT INTO group_order_express
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="orderNo != null and orderNo != ''">order_no,</if>
+            <if test="courierNo != null and courierNo != ''">courier_no,</if>
+            <if test="signStatus != null">sign_status,</if>
+            <if test="result != null and result != ''">result,</if>
+            <if test="logisticsCompany != null and logisticsCompany != ''">logistics_company,</if>
+            <if test="true">sync_time,</if>
+        </trim>
+        <trim prefix="VALUES (" suffix=")" suffixOverrides=",">
+            <if test="orderNo != null and orderNo != ''">#{orderNo,jdbcType=VARCHAR},</if>
+            <if test="courierNo != null and courierNo != ''">#{courierNo,jdbcType=VARCHAR},</if>
+            <if test="signStatus != null">#{signStatus,jdbcType=INTEGER},</if>
+            <if test="result != null and result != ''">#{result,jdbcType=LONGVARCHAR},</if>
+            <if test="logisticsCompany != null and logisticsCompany != ''">#{logisticsCompany,jdbcType=VARCHAR},</if>
+            <if test="true">now(),</if>
+        </trim>
+    </insert>
+
+    <select id="selectByOrderNo" resultMap="BaseResultMap" parameterType="java.lang.String">
+        SELECT
+        <include refid="Base_Column_List"/>
+        FROM group_order_express
+        WHERE order_no = #{orderNo,jdbcType=VARCHAR}
+    </select>
+
+    <select id="selectByCourierNo" resultMap="BaseResultMap" parameterType="java.lang.String">
+        SELECT
+        <include refid="Base_Column_List"/>
+        FROM group_order_express
+        WHERE courier_no = #{courierNo,jdbcType=VARCHAR}
+    </select>
+
+    <update id="updateSignStatus" parameterType="java.util.Map">
+        UPDATE group_order_express
+        SET sign_status = #{signStatus,jdbcType=INTEGER},
+            sync_time = NOW()
+        WHERE order_no = #{orderNo,jdbcType=VARCHAR}
+    </update>
+
+
+</mapper>