feat(order): 实现订单地址快照功能

- 移除 GltTicketOrder 实体中 address 字段的 @TableField(exist = false) 注解
- 添加 ShopUserAddress 和 ShopUserAddressService 的依赖注入
- 在订单创建时实现地址快照逻辑,将用户地址信息保存到订单表
- 添加地址验证和权限检查功能
- 实现默认地址获取和地址拼接功能
- 添加订单参数空值校验
This commit is contained in:
2026-02-06 13:43:08 +08:00
parent 6285429753
commit fe15c7120f
2 changed files with 48 additions and 1 deletions

View File

@@ -9,6 +9,9 @@ import com.gxwebsoft.common.system.entity.User;
import com.gxwebsoft.glt.entity.GltTicketOrder; import com.gxwebsoft.glt.entity.GltTicketOrder;
import com.gxwebsoft.glt.param.GltTicketOrderParam; import com.gxwebsoft.glt.param.GltTicketOrderParam;
import com.gxwebsoft.glt.service.GltTicketOrderService; import com.gxwebsoft.glt.service.GltTicketOrderService;
import com.gxwebsoft.shop.entity.ShopUserAddress;
import com.gxwebsoft.shop.service.ShopUserAddressService;
import cn.hutool.core.util.StrUtil;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
@@ -29,6 +32,8 @@ import java.util.List;
public class GltTicketOrderController extends BaseController { public class GltTicketOrderController extends BaseController {
@Resource @Resource
private GltTicketOrderService gltTicketOrderService; private GltTicketOrderService gltTicketOrderService;
@Resource
private ShopUserAddressService shopUserAddressService;
@Operation(summary = "分页查询送水订单") @Operation(summary = "分页查询送水订单")
@GetMapping("/page") @GetMapping("/page")
@@ -59,10 +64,53 @@ public class GltTicketOrderController extends BaseController {
if (loginUser == null) { if (loginUser == null) {
return fail("请先登录"); return fail("请先登录");
} }
if (gltTicketOrder == null) {
return fail("订单参数不能为空");
}
// 地址快照:把用户关联的“详细地址”落到 glt_ticket_order.address避免用户后续修改地址导致历史订单丢失
ShopUserAddress userAddress = null;
if (gltTicketOrder.getAddressId() != null) {
userAddress = shopUserAddressService.getByIdRel(gltTicketOrder.getAddressId());
} else {
userAddress = shopUserAddressService.getDefaultAddress(loginUser.getUserId());
}
if (userAddress == null) {
return fail("请先添加收货地址");
}
if (!loginUser.getUserId().equals(userAddress.getUserId())) {
return fail("收货地址不存在或无权限");
}
if (loginUser.getTenantId() != null && userAddress.getTenantId() != null
&& !loginUser.getTenantId().equals(userAddress.getTenantId())) {
return fail("收货地址不存在或无权限");
}
gltTicketOrder.setAddressId(userAddress.getId());
gltTicketOrder.setAddress(buildAddressSnapshot(userAddress));
gltTicketOrderService.createWithWriteOff(gltTicketOrder, loginUser.getUserId(), loginUser.getTenantId()); gltTicketOrderService.createWithWriteOff(gltTicketOrder, loginUser.getUserId(), loginUser.getTenantId());
return success("下单成功"); return success("下单成功");
} }
private String buildAddressSnapshot(ShopUserAddress addr) {
if (addr == null) {
return null;
}
if (StrUtil.isNotBlank(addr.getFullAddress())) {
return addr.getFullAddress();
}
// 兼容旧数据fullAddress 为空时,拼接省市区 + 详细地址
return StrUtil.blankToDefault(
StrUtil.join("",
StrUtil.nullToEmpty(addr.getProvince()),
StrUtil.nullToEmpty(addr.getCity()),
StrUtil.nullToEmpty(addr.getRegion()),
StrUtil.nullToEmpty(addr.getAddress())
),
addr.getAddress()
);
}
@PreAuthorize("hasAuthority('glt:gltTicketOrder:update')") @PreAuthorize("hasAuthority('glt:gltTicketOrder:update')")
@OperationLog @OperationLog
@Operation(summary = "修改送水订单") @Operation(summary = "修改送水订单")

View File

@@ -44,7 +44,6 @@ public class GltTicketOrder implements Serializable {
private Integer addressId; private Integer addressId;
@Schema(description = "收货地址") @Schema(description = "收货地址")
@TableField(exist = false)
private String address; private String address;
@Schema(description = "") @Schema(description = "")