Jelajahi Sumber

Merge branch 'feature/20260206-logistics' of AHX-Bid/poyee-app into dev

jintao.geng 1 Minggu lalu
induk
melakukan
7429c71813
20 mengubah file dengan 1004 tambahan dan 0 penghapusan
  1. 1 0
      poyi-app/src/main/java/com/tzy/controller/business/AppUserBusinessSettledController.java
  2. 74 0
      poyi-app/src/main/java/com/tzy/controller/group/GroupOrderExpressController.java
  3. 49 0
      poyi-app/src/main/java/com/tzy/controller/home/DiamondPositionController.java
  4. 14 0
      poyi-pojo/pom.xml
  5. 29 0
      tzy-sportcard/src/main/java/com/tzy/convert/GroupOrderExpressConvert.java
  6. 27 0
      tzy-sportcard/src/main/java/com/tzy/home/convert/DiamondPositionConvert.java
  7. 113 0
      tzy-sportcard/src/main/java/com/tzy/home/domain/DiamondPosition.java
  8. 59 0
      tzy-sportcard/src/main/java/com/tzy/home/dto/OrderInvoiceRecordDto.java
  9. 13 0
      tzy-sportcard/src/main/java/com/tzy/home/mapper/DiamondPositionMapper.java
  10. 15 0
      tzy-sportcard/src/main/java/com/tzy/home/request/DiamondPositionQueryRequest.java
  11. 35 0
      tzy-sportcard/src/main/java/com/tzy/home/response/DiamondPositionResponse.java
  12. 21 0
      tzy-sportcard/src/main/java/com/tzy/home/service/IDiamondPositionService.java
  13. 54 0
      tzy-sportcard/src/main/java/com/tzy/home/service/impl/DiamondPositionServiceImpl.java
  14. 57 0
      tzy-sportcard/src/main/java/com/tzy/sportcard/api/domain/GroupOrderExpress.java
  15. 56 0
      tzy-sportcard/src/main/java/com/tzy/sportcard/api/dto/group/GroupOrderExpressDTO.java
  16. 46 0
      tzy-sportcard/src/main/java/com/tzy/sportcard/api/mapper/GroupOrderExpressMapper.java
  17. 62 0
      tzy-sportcard/src/main/java/com/tzy/sportcard/api/service/GroupOrderExpressService.java
  18. 77 0
      tzy-sportcard/src/main/java/com/tzy/sportcard/api/service/impl/GroupOrderExpressServiceImpl.java
  19. 61 0
      tzy-sportcard/src/main/resources/mapper/api/GroupOrderExpressMapper.xml
  20. 141 0
      tzy-sportcard/src/main/resources/mapper/home/DiamondPositionMapper.xml

+ 1 - 0
poyi-app/src/main/java/com/tzy/controller/business/AppUserBusinessSettledController.java

@@ -67,6 +67,7 @@ public class AppUserBusinessSettledController extends BaseController {
         } catch (InvocationTargetException e) {
             e.printStackTrace();
         }
+        //
         appUserBusinessSettledService.insertAppUserBusinessSettled(appUserBusinessSettled);
         return OutDTO.ok();
     }

+ 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));
+	}
+
+
+}

+ 49 - 0
poyi-app/src/main/java/com/tzy/controller/home/DiamondPositionController.java

@@ -0,0 +1,49 @@
+package com.tzy.controller.home;
+
+
+import com.tzy.annotation.ApiLog;
+import com.tzy.common.core.domain.AjaxResult;
+import com.tzy.common.dto.UserInfo;
+import com.tzy.common.enums.BusinessType;
+import com.tzy.common.utils.UserUtils;
+import com.tzy.home.domain.DiamondPosition;
+import com.tzy.home.request.DiamondPositionQueryRequest;
+import com.tzy.home.response.DiamondPositionResponse;
+import com.tzy.home.service.IDiamondPositionService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 首页-金刚位
+ */
+@RestController
+@RequestMapping("/api/home/auction")
+@Slf4j
+@Api(tags = "首页-金刚位")
+public class DiamondPositionController  {
+
+    @Resource
+    IDiamondPositionService diamondPositionService;
+
+
+    /**
+     * 查询有效的金刚位列表
+     */
+    @PostMapping("/active")
+    @ApiLog(title = "查询金刚位列表",businessType = BusinessType.SEARCH,indto = "{{inDto}}")
+    @ResponseBody
+    @ApiOperation("查询有效的金刚位列表")
+    public AjaxResult active(@RequestBody DiamondPositionQueryRequest request) {
+        List<DiamondPositionResponse> diamondPositionResponses = diamondPositionService.selectActiveDiamondPositions(request);
+        return AjaxResult.success(diamondPositionResponses);
+    }
+}

+ 14 - 0
poyi-pojo/pom.xml

@@ -64,5 +64,19 @@
             <optional>true</optional>
         </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);
+
+
+
+}

+ 27 - 0
tzy-sportcard/src/main/java/com/tzy/home/convert/DiamondPositionConvert.java

@@ -0,0 +1,27 @@
+package com.tzy.home.convert;
+
+
+import com.tzy.home.domain.DiamondPosition;
+import com.tzy.home.response.DiamondPositionResponse;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+
+/**
+ * 金刚位转换器
+ *
+ * @author: gengjintao
+ * @date: 2026/01/20
+ */
+@Mapper
+public interface DiamondPositionConvert {
+
+    DiamondPositionConvert INSTANCE = Mappers.getMapper(DiamondPositionConvert.class);
+
+
+
+    DiamondPositionResponse toDiamondPositionResponse(DiamondPosition po);
+
+
+
+}

+ 113 - 0
tzy-sportcard/src/main/java/com/tzy/home/domain/DiamondPosition.java

@@ -0,0 +1,113 @@
+package com.tzy.home.domain;
+
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 金刚位表
+ *
+ * @author ruoyi
+ */
+
+@Data
+@ApiModel("金刚位表")
+public class DiamondPosition {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 金刚位名称
+     */
+    private String name;
+
+    /**
+     * 图标URL
+     */
+    private String iconUrl;
+
+    /**
+     * 类型:home_ad-首页横屏异形banner图、home_alien_banner-首页新版异形轮播图
+     */
+    private String type;
+
+    /**
+     * 跳转地址/路径
+     */
+    private String jumpUrl;
+
+    /**
+     * 跳转参数(JSON格式)
+     */
+    private String jumpParams;
+
+    /**
+     * 描述
+     */
+    private String description;
+
+    /**
+     * 业务模块(如HOME-首页,ORDER-订单,USER-用户中心)
+     */
+    private String businessModule;
+
+    /**
+     * 版本
+     */
+    private String version;
+
+    /**
+     * 状态:0-禁用,1-启用
+     */
+    private Integer status;
+
+
+    /**
+     * 备注说明
+     */
+    private String remark;
+
+
+    /**
+     * 删除标识:0-未删,1-已删
+     */
+    private Integer delFlag;
+
+    /**
+     * 生效开始时间
+     */
+    private LocalDateTime effectiveStartTime;
+
+    /**
+     * 生效结束时间
+     */
+    private LocalDateTime effectiveEndTime;
+
+    /**
+     * 创建id
+     */
+    private String createUser;
+
+    /**
+     * 更新id
+     */
+    private String updateUser;
+
+    /** 创建时间 */
+    private LocalDateTime createTime;
+
+
+    /** 更新时间 */
+    private LocalDateTime updateTime;
+
+    /**
+     * 排序(数字越小越靠前)
+     */
+    private Integer sort;
+}

+ 59 - 0
tzy-sportcard/src/main/java/com/tzy/home/dto/OrderInvoiceRecordDto.java

@@ -0,0 +1,59 @@
+package com.tzy.home.dto;
+
+import lombok.Data;
+
+/**
+ *  订单开票信息
+ */
+@Data
+public class OrderInvoiceRecordDto {
+    /** 主键 */
+    private Long id;
+    /** 用户开票id */
+    private Long appUserInvoiceId;
+    /** 订单id */
+    private Long orderId;
+    /** 发票类型:normal-普票, special-专票 */
+    private String type;
+    /** 发票子类型:person-个人, company-公司|单位 */
+    private String subType;
+    /** 抬头名称 */
+    private String invoiceName;
+    /** 税号 */
+    private String taxId;
+    /** 开户行 */
+    private String companyBank;
+    /** 开户行账号 */
+    private String bankAccount;
+    /** 公司地址 */
+    private String companyAddress;
+    /** 联系电话 */
+    private String telPhone;
+    /** 接收邮箱 */
+    private String email;
+    /** 状态:0=未结束,100=待申请,200=待开票,300=完成开票,999=驳回开票 */
+    private String status;
+    /** 申请时间 */
+    private String applyTime;
+    /** 申请备注 */
+    private String applyMsg;
+    /** 审核时间 */
+    private String reviewTime;
+    /** 审核备注 */
+    private String reviewMsg;
+    /** 开票时间 */
+    private String invoiceTime;
+    /** 开票备注 */
+    private String invoiceMsg;
+    /** 操作记录 */
+    private String record;
+    /** 扩展字段-发票地址 */
+    private String prop1;
+    /** 扩展字段 */
+    private String prop2;
+    /** 扩展字段 */
+    private String prop3;
+    /** 扩展字段 */
+    private String prop4;
+
+}

+ 13 - 0
tzy-sportcard/src/main/java/com/tzy/home/mapper/DiamondPositionMapper.java

@@ -0,0 +1,13 @@
+package com.tzy.home.mapper;
+
+import com.tzy.home.domain.DiamondPosition;
+import com.tzy.home.request.DiamondPositionQueryRequest;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface DiamondPositionMapper {
+
+
+    List<DiamondPosition> selectActiveDiamondPositions(@Param("request") DiamondPositionQueryRequest request);
+}

+ 15 - 0
tzy-sportcard/src/main/java/com/tzy/home/request/DiamondPositionQueryRequest.java

@@ -0,0 +1,15 @@
+package com.tzy.home.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("金刚位查询条件对象")
+public class DiamondPositionQueryRequest {
+
+
+    @ApiModelProperty("业务模块(如HOME-首页,ORDER-订单,USER-用户中心)")
+    private String businessModule;
+
+}

+ 35 - 0
tzy-sportcard/src/main/java/com/tzy/home/response/DiamondPositionResponse.java

@@ -0,0 +1,35 @@
+package com.tzy.home.response;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+@ApiModel("金刚位响应对象")
+public class DiamondPositionResponse {
+
+
+    @ApiModelProperty("金刚位名称")
+    private String name;
+
+    @ApiModelProperty("图标URL")
+    private String iconUrl;
+
+    @ApiModelProperty("类型:home_ad-首页横屏异形banner图、home_alien_banner-首页新版异形轮播图")
+    private String type;
+
+    @ApiModelProperty("跳转地址/路径")
+    private String jumpUrl;
+
+    @ApiModelProperty("描述")
+    private String description;
+
+    @ApiModelProperty("业务模块(如HOME-首页,ORDER-订单,USER-用户中心)")
+    private String businessModule;
+
+    @ApiModelProperty("排序(数字越小越靠前)")
+    private Integer sort;
+}

+ 21 - 0
tzy-sportcard/src/main/java/com/tzy/home/service/IDiamondPositionService.java

@@ -0,0 +1,21 @@
+package com.tzy.home.service;
+
+
+import com.tzy.home.domain.DiamondPosition;
+import com.tzy.home.request.DiamondPositionQueryRequest;
+import com.tzy.home.response.DiamondPositionResponse;
+
+import java.util.List;
+
+public interface IDiamondPositionService {
+
+
+    /**
+     * 查询有效的金刚位列表
+     * @param request 查询条件
+     * @return 有效的金刚位列表
+     */
+    List<DiamondPositionResponse> selectActiveDiamondPositions(DiamondPositionQueryRequest request);
+
+
+}

+ 54 - 0
tzy-sportcard/src/main/java/com/tzy/home/service/impl/DiamondPositionServiceImpl.java

@@ -0,0 +1,54 @@
+package com.tzy.home.service.impl;
+
+
+import com.google.common.collect.Lists;
+import com.tzy.home.convert.DiamondPositionConvert;
+import com.tzy.home.domain.DiamondPosition;
+import com.tzy.home.mapper.DiamondPositionMapper;
+import com.tzy.home.request.DiamondPositionQueryRequest;
+import com.tzy.home.response.DiamondPositionResponse;
+import com.tzy.home.service.IDiamondPositionService;
+import jodd.util.CollectionUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+public class DiamondPositionServiceImpl implements IDiamondPositionService {
+
+    @Resource
+    DiamondPositionMapper diamondPositionMapper;
+
+
+    @Override
+    public List<DiamondPositionResponse> selectActiveDiamondPositions(DiamondPositionQueryRequest request) {
+        if (Objects.isNull(request)) {
+            return Lists.newArrayList();
+        }
+        List<DiamondPosition> diamondPositionList = diamondPositionMapper.selectActiveDiamondPositions(request);
+        if (CollectionUtils.isEmpty(diamondPositionList)) {
+            return Lists.newArrayList();
+        }
+        List<DiamondPositionResponse> collect = diamondPositionList.stream().map(item -> {
+            DiamondPositionResponse response = new DiamondPositionResponse();
+            response.setName(item.getName());
+            response.setIconUrl(item.getIconUrl());
+            response.setType(item.getType());
+            response.setJumpUrl(item.getJumpUrl());
+            response.setDescription(item.getDescription());
+            response.setBusinessModule(item.getBusinessModule());
+            response.setSort(item.getSort());
+            return response;
+        }).collect(Collectors.toList());
+        return collect;
+    }
+
+}

+ 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>

+ 141 - 0
tzy-sportcard/src/main/resources/mapper/home/DiamondPositionMapper.xml

@@ -0,0 +1,141 @@
+<?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.home.mapper.DiamondPositionMapper">
+
+    <resultMap type="com.tzy.home.domain.DiamondPosition" id="BaseResultMap">
+        <id     property="id"                   column="id"                   />
+        <result property="name"                 column="name"                 />
+        <result property="iconUrl"              column="icon_url"             />
+        <result property="type"                 column="type"                 />
+        <result property="jumpUrl"              column="jump_url"             />
+        <result property="jumpParams"           column="jump_params"          />
+        <result property="description"          column="description"          />
+        <result property="businessModule"       column="business_module"      />
+        <result property="version"              column="version"              />
+        <result property="status"               column="status"               />
+        <result property="remark"               column="remark"               />
+        <result property="createUser"           column="create_user"          />
+        <result property="createTime"           column="create_time"          />
+        <result property="updateUser"           column="update_user"          />
+        <result property="updateTime"           column="update_time"          />
+        <result property="delFlag"              column="del_flag"             />
+        <result property="effectiveStartTime"   column="effective_start_time"  />
+        <result property="effectiveEndTime"     column="effective_end_time"    />
+        <result property="sort"                 column="sort"                 />
+    </resultMap>
+
+    <sql id="baseColumnList">
+        select id, name, icon_url, type, jump_url, jump_params, description,
+               business_module, version, status, remark, create_user, create_time,
+               update_user, update_time, del_flag, effective_start_time, effective_end_time, sort
+        from t_diamond_position
+    </sql>
+
+    <select id="selectDiamondPositionById" parameterType="Long" resultMap="BaseResultMap">
+        <include refid="baseColumnList"/>
+        where id = #{id} and del_flag = 0
+    </select>
+
+    <select id="selectDiamondPositionList" parameterType="com.tzy.home.domain.DiamondPosition" resultMap="BaseResultMap">
+        <include refid="baseColumnList"/>
+        <where>
+            del_flag = 0
+            <if test="request.name != null and request.name != ''">
+                AND name like concat('%', #{request.name}, '%')
+            </if>
+            <if test="request.type != null and request.type != ''">
+                AND type = #{request.type}
+            </if>
+            <if test="request.status != null">
+                AND status = #{request.status}
+            </if>
+        </where>
+        order by sort asc, create_time desc
+    </select>
+
+    <select id="selectActiveDiamondPositions" resultMap="BaseResultMap">
+        <include refid="baseColumnList"/>
+        <where>
+            del_flag = 0
+            AND status = 1
+            <if test="request.businessModule != null and request.businessModule != ''">
+                AND business_module = #{request.businessModule}
+            </if>
+            AND (effective_start_time is null OR effective_start_time &lt;= CURRENT_TIMESTAMP)
+            AND (effective_end_time is null OR effective_end_time &gt;= CURRENT_TIMESTAMP)
+        </where>
+        order by sort asc
+    </select>
+
+    <insert id="insertDiamondPosition" parameterType="com.tzy.home.domain.DiamondPosition" useGeneratedKeys="true" keyProperty="id">
+        insert into t_diamond_position
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="name != null and name != ''">name,</if>
+            <if test="iconUrl != null and iconUrl != ''">icon_url,</if>
+            <if test="type != null and type != ''">type,</if>
+            <if test="jumpUrl != null and jumpUrl != ''">jump_url,</if>
+            <if test="jumpParams != null and jumpParams != ''">jump_params,</if>
+            <if test="description != null and description != ''">description,</if>
+            <if test="businessModule != null and businessModule != ''">business_module,</if>
+            <if test="version != null and version != ''">version,</if>
+            <if test="status != null">status,</if>
+            <if test="remark != null and remark != ''">remark,</if>
+            <if test="createUser != null and createUser != ''">create_user,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateUser != null and updateUser != ''">update_user,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="effectiveStartTime != null">effective_start_time,</if>
+            <if test="effectiveEndTime != null">effective_end_time,</if>
+            <if test="sort != null">sort,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="name != null and name != ''">#{name},</if>
+            <if test="iconUrl != null and iconUrl != ''">#{iconUrl},</if>
+            <if test="type != null and type != ''">#{type},</if>
+            <if test="jumpUrl != null and jumpUrl != ''">#{jumpUrl},</if>
+            <if test="jumpParams != null and jumpParams != ''">#{jumpParams},</if>
+            <if test="description != null and description != ''">#{description},</if>
+            <if test="businessModule != null and businessModule != ''">#{businessModule},</if>
+            <if test="version != null and version != ''">#{version},</if>
+            <if test="status != null">#{status},</if>
+            <if test="remark != null and remark != ''">#{remark},</if>
+            <if test="createUser != null and createUser != ''">#{createUser},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateUser != null and updateUser != ''">#{updateUser},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="effectiveStartTime != null">#{effectiveStartTime},</if>
+            <if test="effectiveEndTime != null">#{effectiveEndTime},</if>
+            <if test="sort != null">#{sort},</if>
+        </trim>
+    </insert>
+
+    <update id="updateDiamondPosition" parameterType="com.tzy.home.domain.DiamondPosition">
+        update t_diamond_position
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="name != null and name != ''">name = #{name},</if>
+            <if test="iconUrl != null">icon_url = #{iconUrl},</if>
+            <if test="type != null and type != ''">type = #{type},</if>
+            <if test="jumpUrl != null">jump_url = #{jumpUrl},</if>
+            <if test="jumpParams != null">jump_params = #{jumpParams},</if>
+            <if test="description != null">description = #{description},</if>
+            <if test="businessModule != null and businessModule != ''">business_module = #{businessModule},</if>
+            <if test="version != null and version != ''">version = #{version},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="updateUser != null and updateUser != ''">update_user = #{updateUser},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="effectiveStartTime != null">effective_start_time = #{effectiveStartTime},</if>
+            <if test="effectiveEndTime != null">effective_end_time = #{effectiveEndTime},</if>
+            <if test="sort != null">sort = #{sort},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <update id="deleteDiamondPositionById">
+        update t_diamond_position set del_flag = 1, update_user = #{updateUser}, update_time = CURRENT_TIMESTAMP
+        where id = #{id}
+    </update>
+
+</mapper>