feat(app): 新增app会员与商户模块配置- 在application.yml中添加app会员模块和商户模块的包扫描配置
- 优化订单服务分页查询逻辑,支持商户维度数据筛选 - 配置knife4j文档分组,支持app模块接口文档展示 - 优化订单创建逻辑,补充商品分享人ID等字段 - 移除分账规则中的手续费相关字段与校验逻辑- 新增核销码VO,支持订单核销状态管理
This commit is contained in:
parent
8b9a963bc6
commit
ab30f6c9cc
@ -5,7 +5,6 @@ import com.wzj.soopin.content.utils.RedisOperator;
|
||||
import com.wzj.soopin.order.business.IOrderBusiness;
|
||||
import com.wzj.soopin.order.domain.bo.OrderBo;
|
||||
import com.wzj.soopin.order.domain.bo.SaveOrderBO;
|
||||
import com.wzj.soopin.order.domain.entity.Order;
|
||||
import com.wzj.soopin.order.domain.vo.OrderVO;
|
||||
import com.wzj.soopin.order.service.IMemberOrderService;
|
||||
import com.wzj.soopin.order.service.OrderService;
|
||||
@ -18,13 +17,12 @@ import org.dromara.common.core.domain.R;
|
||||
import org.dromara.common.core.domain.model.LoginUser;
|
||||
import org.dromara.common.log.annotation.Log;
|
||||
import org.dromara.common.log.enums.BusinessType;
|
||||
import org.dromara.common.mq.utils.MqUtil;
|
||||
import org.dromara.common.satoken.utils.LoginHelper;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
|
||||
@Slf4j
|
||||
@Tag(name = "订单")
|
||||
@Tag(name = "app-用户-订单接口")
|
||||
@RequestMapping("/app/order")
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
|
@ -6,6 +6,7 @@ import com.wzj.soopin.member.domain.bo.AccountBillBO;
|
||||
import com.wzj.soopin.member.domain.vo.AccountBillVO;
|
||||
import com.wzj.soopin.member.domain.vo.AccountStatisticVO;
|
||||
import com.wzj.soopin.transaction.service.IAccountBillService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@ -60,7 +61,7 @@ public class AppMerchantBillController {
|
||||
return R.ok(voPage);
|
||||
}
|
||||
|
||||
@Tag(name = "账户统计")
|
||||
@Operation(summary = "账户统计")
|
||||
@PostMapping("/statistic")
|
||||
public R<AccountStatisticVO> statistic() {
|
||||
LoginUser loginUser = LoginHelper.getLoginUser();
|
||||
|
@ -2,8 +2,9 @@ package org.dromara.app.merchant;
|
||||
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.wzj.soopin.order.business.IOrderBusiness;
|
||||
import com.wzj.soopin.order.domain.bo.OrderBo;
|
||||
import com.wzj.soopin.order.domain.bo.OrderItemBo;
|
||||
import com.wzj.soopin.order.domain.entity.Order;
|
||||
import com.wzj.soopin.order.domain.vo.MerchantOrderVO;
|
||||
import com.wzj.soopin.order.domain.vo.OrderVO;
|
||||
import com.wzj.soopin.order.service.IMerchantOrderService;
|
||||
import com.wzj.soopin.order.service.VerificationCodeService;
|
||||
@ -12,8 +13,6 @@ import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.common.core.domain.R;
|
||||
import org.dromara.common.core.domain.model.LoginUser;
|
||||
import org.dromara.common.satoken.utils.LoginHelper;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
/**
|
||||
@ -23,7 +22,7 @@ import org.springframework.web.bind.annotation.*;
|
||||
* @since 2020-12-18 16:59
|
||||
*/
|
||||
@Slf4j
|
||||
@Tag(name = "商户端,订单接口")
|
||||
@Tag(name = "app-商户-订单接口")
|
||||
@RequestMapping("/app/merchant/order")
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@ -57,9 +56,7 @@ public class AppMerchantOrderController {
|
||||
|
||||
@PostMapping("/page")
|
||||
@Operation(summary = "查询当前商家订单列表")
|
||||
public R<IPage<OrderVO>> page(@RequestBody OrderBo bo){
|
||||
LoginUser loginUser= LoginHelper.getLoginUser();
|
||||
bo.setTenantId(loginUser.getTenantId());
|
||||
public R<IPage<MerchantOrderVO>> page(@RequestBody OrderItemBo bo){
|
||||
return R.ok(merchantOrderService.page(bo));
|
||||
}
|
||||
}
|
||||
|
@ -1,10 +1,8 @@
|
||||
package org.dromara.web.controller;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaIgnore;
|
||||
import cn.dev33.satoken.exception.NotLoginException;
|
||||
import cn.dev33.satoken.stp.StpUtil;
|
||||
import cn.hutool.core.codec.Base64;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
@ -16,7 +14,6 @@ import me.zhyd.oauth.utils.AuthStateUtils;
|
||||
import org.dromara.common.core.constant.SystemConstants;
|
||||
import org.dromara.common.core.domain.R;
|
||||
import org.dromara.common.core.domain.model.LoginBody;
|
||||
import org.dromara.common.core.domain.model.LoginUser;
|
||||
import org.dromara.common.core.domain.model.RegisterBody;
|
||||
import org.dromara.common.core.domain.model.SocialLoginBody;
|
||||
import org.dromara.common.core.utils.*;
|
||||
@ -29,8 +26,6 @@ import org.dromara.common.social.utils.SocialUtils;
|
||||
import org.dromara.common.sse.dto.SseMessageDto;
|
||||
import org.dromara.common.sse.utils.SseMessageUtils;
|
||||
import org.dromara.common.tenant.helper.TenantHelper;
|
||||
import org.dromara.system.domain.SysTenant;
|
||||
import org.dromara.system.domain.bo.SysTenantBo;
|
||||
import org.dromara.system.domain.vo.SysClientVo;
|
||||
import org.dromara.system.domain.vo.SysTenantVo;
|
||||
import org.dromara.system.service.*;
|
||||
@ -43,7 +38,6 @@ import org.dromara.web.service.SysRegisterService;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.net.URL;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
@ -297,6 +297,10 @@ springdoc:
|
||||
packages-to-scan: com.wzj.soopin.im
|
||||
- group: 7.系统模块
|
||||
packages-to-scan: org.dromara.system
|
||||
- group: 8.app会员模块
|
||||
packages-to-scan: org.dromara.app.customer
|
||||
- group: 9.app商户模块
|
||||
packages-to-scan: org.dromara.app.merchant
|
||||
legacy-mode: true
|
||||
knife4j:
|
||||
enable: true
|
||||
|
@ -1,16 +1,16 @@
|
||||
package com.wzj.soopin.order.domain.bo;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.wzj.soopin.order.domain.entity.OrderItem;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import org.dromara.common.core.domain.BaseBO;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
@Data
|
||||
@Schema(description = "订单中所包含的商品 查询 对象")
|
||||
public class OrderItemBo {
|
||||
public class OrderItemBo extends BaseBO <OrderItem> {
|
||||
@Schema(description = "订单id 精确匹配")
|
||||
private Long orderId;
|
||||
|
||||
@ -32,9 +32,6 @@ public class OrderItemBo {
|
||||
@Schema(description = "sku快照id 精确匹配")
|
||||
private Long skuSnapshotId;
|
||||
|
||||
@Schema(description = "展示图片 精确匹配")
|
||||
private String pic;
|
||||
|
||||
@Schema(description = "PRODUCT_NAME 精确匹配")
|
||||
private String productNameLike;
|
||||
|
||||
@ -50,10 +47,10 @@ public class OrderItemBo {
|
||||
@Schema(description = "商品分类id 精确匹配")
|
||||
private Long productCategoryId;
|
||||
|
||||
@Schema(description = "商品sku属性:[{\"key\":\"颜色\",\"value\":\"颜色\"},{\"key\":\"容量\",\"value\":\"4G\"}] 精确匹配")
|
||||
private String spData;
|
||||
@Schema(description = "商户租户id", hidden = true)
|
||||
private String tenantId;
|
||||
|
||||
public Wrapper<OrderItem> toWrapper() {
|
||||
public LambdaQueryWrapper<OrderItem> toWrapper() {
|
||||
return new LambdaQueryWrapper<OrderItem>()
|
||||
.eq(orderId != null, OrderItem::getOrderId, orderId)
|
||||
.eq(productId != null, OrderItem::getProductId, productId)
|
||||
@ -62,12 +59,10 @@ public class OrderItemBo {
|
||||
.eq(outSkuId != null && !outSkuId.isEmpty(), OrderItem::getOutSkuId, outSkuId)
|
||||
.eq(productSnapshotId != null, OrderItem::getProductSnapshotId, productSnapshotId)
|
||||
.eq(skuSnapshotId != null, OrderItem::getSkuSnapshotId, skuSnapshotId)
|
||||
.eq(pic != null && !pic.isEmpty(), OrderItem::getPic, pic)
|
||||
.like(productNameLike != null && !productNameLike.isEmpty(), OrderItem::getProductName, productNameLike)
|
||||
.eq(salePrice != null, OrderItem::getSalePrice, salePrice)
|
||||
.eq(purchasePrice != null, OrderItem::getPurchasePrice, purchasePrice)
|
||||
.eq(quantity != null, OrderItem::getQuantity, quantity)
|
||||
.eq(productCategoryId != null, OrderItem::getProductCategoryId, productCategoryId)
|
||||
.eq(spData != null && !spData.isEmpty(), OrderItem::getSpData, spData);
|
||||
.eq(productCategoryId != null, OrderItem::getProductCategoryId, productCategoryId);
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
package com.wzj.soopin.order.domain.bo;
|
||||
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
@ -16,15 +17,15 @@ import lombok.NoArgsConstructor;
|
||||
@Builder
|
||||
public class SaveOrderSkuItemBO {
|
||||
|
||||
/**
|
||||
* 商品id
|
||||
*/
|
||||
@Schema(description = "商品id")
|
||||
@NotNull(message = "商品id不能为空")
|
||||
private Long skuId;
|
||||
|
||||
/**
|
||||
* 下单数量
|
||||
*/
|
||||
|
||||
@NotNull(message = "下单数量不能为空")
|
||||
@Schema(description = "下单数量")
|
||||
private Integer quantity;
|
||||
|
||||
@Schema(description = "商品分享人id")
|
||||
private Long shareMemberId;
|
||||
}
|
||||
|
@ -83,8 +83,8 @@ public class OrderItem extends BaseAudit {
|
||||
@Excel(name = "商品分类id")
|
||||
private Long productCategoryId;
|
||||
|
||||
@Schema(description = "商品sku属性:[{\"key\":\"颜色\",\"value\":\"颜色\"},{\"key\":\"容量\",\"value\":\"4G\"}]")
|
||||
@Excel(name = "商品sku属性:[{\"key\":\"颜色\",\"value\":\"颜色\"},{\"key\":\"容量\",\"value\":\"4G\"}]")
|
||||
@Schema(description = "商品sku属性")
|
||||
@Excel(name = "商品sku属性")
|
||||
private String spData;
|
||||
|
||||
@Schema(description = "租户id")
|
||||
@ -95,4 +95,8 @@ public class OrderItem extends BaseAudit {
|
||||
@Excel(name = "租户名称")
|
||||
private String tenantName;
|
||||
|
||||
@Schema(description = "商品分享人id")
|
||||
private Long shareMemberId;
|
||||
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,119 @@
|
||||
package com.wzj.soopin.order.domain.vo;
|
||||
|
||||
|
||||
import com.wzj.soopin.order.emum.OrderStatusEnum;
|
||||
import com.wzj.soopin.order.emum.VerificationCodeStatus;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.dromara.common.excel.annotation.Excel;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Schema(description = "商家订单详情")
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class MerchantOrderVO {
|
||||
|
||||
@Schema(description = "订单id")
|
||||
private String orderId;
|
||||
|
||||
@Schema(description = "订单编号")
|
||||
private String orderSn;
|
||||
|
||||
@Schema(description = "MEMBER_ID")
|
||||
@Excel(name = "MEMBER_ID")
|
||||
private Long memberId;
|
||||
|
||||
@Schema(description = "用户帐号")
|
||||
@Excel(name = "用户帐号")
|
||||
private String memberUsername;
|
||||
|
||||
@Schema(description = "商家备注")
|
||||
private String merchantNote;
|
||||
|
||||
@Schema(description = "支付方式")
|
||||
private Integer payType;
|
||||
|
||||
/**
|
||||
* 订单状态
|
||||
* @see OrderStatusEnum#getValue()
|
||||
*/
|
||||
@Schema(description="订单状态", implementation = OrderStatusEnum.class)
|
||||
private Integer status;
|
||||
|
||||
@Schema(description="是否处于退款状态")
|
||||
private Boolean aftersale;
|
||||
|
||||
@Schema(description = "订单明细id")
|
||||
private Long orderItemId;
|
||||
|
||||
@Schema(description = "商品id")
|
||||
private Long productId;
|
||||
|
||||
@Schema(description = "商品skuid")
|
||||
private Long skuId;
|
||||
|
||||
@Schema(description = "商品快照id")
|
||||
private Long productSnapshotId;
|
||||
|
||||
@Schema(description = "sku快照id")
|
||||
private Long skuSnapshotId;
|
||||
|
||||
@Schema(description = "展示图片")
|
||||
private String pic;
|
||||
|
||||
@Schema(description = "商品名称")
|
||||
private String productName;
|
||||
|
||||
@Schema(description = "销售价格")
|
||||
private BigDecimal salePrice;
|
||||
|
||||
@Schema(description = "购买数量")
|
||||
private Integer quantity;
|
||||
|
||||
@Schema(description = "商品分类id")
|
||||
private Long productCategoryId;
|
||||
|
||||
@Schema(description = "商品分类名称")
|
||||
private String productCategoryName;
|
||||
|
||||
@Schema(description = "商品sku属性")
|
||||
private String spData;
|
||||
|
||||
@Schema(description = "商户id")
|
||||
private String tenantId;
|
||||
|
||||
@Schema(description = "商户名称")
|
||||
private String tenantName;
|
||||
|
||||
@Schema(description = "核销码")
|
||||
private String code;
|
||||
|
||||
/**
|
||||
* 核销状态
|
||||
* @see VerificationCodeStatus#getCode()
|
||||
*/
|
||||
@Schema(description = "核销状态", implementation = VerificationCodeStatus.class)
|
||||
private Integer verificationCodeStatus;
|
||||
|
||||
@Schema(description = "核销码使用时间")
|
||||
private LocalDateTime usedTime;
|
||||
|
||||
@Schema(description = "使用商家id")
|
||||
private String usedMerchantId;
|
||||
|
||||
@Schema(description = "过期时间")
|
||||
private LocalDateTime expireTime;
|
||||
|
||||
@Schema(description = "核销时间")
|
||||
private LocalDateTime verificationTime;
|
||||
|
||||
@Schema(description = "核销失败原因")
|
||||
private String reason;
|
||||
}
|
@ -0,0 +1,59 @@
|
||||
package com.wzj.soopin.order.domain.vo;
|
||||
|
||||
import com.wzj.soopin.order.emum.VerificationCodeStatus;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
||||
import org.dromara.common.core.domain.model.BaseAudit;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Schema(description = "核销码VO")
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class VerificationCodesVO extends BaseAudit {
|
||||
|
||||
@Schema(description = "ID")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "核销码")
|
||||
private String code;
|
||||
|
||||
@Schema(description = "关联订单id")
|
||||
private Long orderId;
|
||||
|
||||
@Schema(description = "订单子项id")
|
||||
private Long orderItemId;
|
||||
|
||||
/**
|
||||
* 状态 见{@link VerificationCodeStatus}
|
||||
*/
|
||||
@Schema(description = "状态")
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "用户id")
|
||||
private Long memberId;
|
||||
|
||||
@Schema(description = "用户昵称")
|
||||
private String memberName;
|
||||
|
||||
@Schema(description = "使用时间")
|
||||
private LocalDateTime usedTime;
|
||||
|
||||
@Schema(description = "使用商家id")
|
||||
private String usedMerchantId;
|
||||
|
||||
@Schema(description = "过期时间")
|
||||
private LocalDateTime expireTime;
|
||||
|
||||
@Schema(description = "核销时间")
|
||||
private LocalDateTime verificationTime;
|
||||
|
||||
@Schema(description = "核销结果")
|
||||
private Integer result;
|
||||
|
||||
@Schema(description = "失败原因")
|
||||
private String reason;
|
||||
}
|
@ -1,9 +1,15 @@
|
||||
package com.wzj.soopin.order.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.wzj.soopin.order.domain.bo.OrderItemBo;
|
||||
import com.wzj.soopin.order.domain.entity.OrderItem;
|
||||
import com.wzj.soopin.order.domain.vo.MerchantOrderVO;
|
||||
import com.wzj.soopin.order.domain.vo.OrderItemVO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -14,7 +20,7 @@ import java.util.Map;
|
||||
* @author zcc
|
||||
*/
|
||||
@Mapper
|
||||
public interface OrderItemMapper extends BaseMapper<OrderItem> {
|
||||
public interface OrderItemMapper extends BaseMapperPlus<OrderItem, OrderItemVO> {
|
||||
/**
|
||||
* 查询订单中所包含的商品列表
|
||||
*
|
||||
@ -63,4 +69,6 @@ public interface OrderItemMapper extends BaseMapper<OrderItem> {
|
||||
|
||||
@Select("SELECT * FROM oms_order_item WHERE order_id = #{orderId}")
|
||||
List<OrderItem> findByOrderId(Long orderId);
|
||||
|
||||
IPage<MerchantOrderVO> selectMerchatOrderPage(@Param("page") Page<Object> page, @Param("query") OrderItemBo query);
|
||||
}
|
||||
|
@ -1,12 +1,12 @@
|
||||
package com.wzj.soopin.order.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.wzj.soopin.order.domain.bo.OrderBo;
|
||||
import com.wzj.soopin.order.domain.bo.OrderItemBo;
|
||||
import com.wzj.soopin.order.domain.entity.Order;
|
||||
import com.wzj.soopin.order.domain.vo.OrderVO;
|
||||
import com.wzj.soopin.order.domain.vo.MerchantOrderVO;
|
||||
|
||||
public interface IMerchantOrderService extends IService<Order> {
|
||||
Page<OrderVO> page(OrderBo bo);
|
||||
|
||||
IPage<MerchantOrderVO> page(OrderItemBo bo);
|
||||
}
|
||||
|
@ -1,68 +1,31 @@
|
||||
package com.wzj.soopin.order.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.wzj.soopin.goods.mapper.SkuMapper;
|
||||
import com.wzj.soopin.order.convert.OrderConvert;
|
||||
import com.wzj.soopin.order.convert.OrderItemConvert;
|
||||
import com.wzj.soopin.order.domain.bo.OrderBo;
|
||||
import com.wzj.soopin.order.domain.bo.OrderItemBo;
|
||||
import com.wzj.soopin.order.domain.entity.Order;
|
||||
import com.wzj.soopin.order.domain.entity.OrderItem;
|
||||
import com.wzj.soopin.order.domain.vo.OrderVO;
|
||||
import com.wzj.soopin.order.domain.vo.MerchantOrderVO;
|
||||
import com.wzj.soopin.order.mapper.OrderItemMapper;
|
||||
import com.wzj.soopin.order.mapper.OrderMapper;
|
||||
import com.wzj.soopin.order.service.IMemberOrderService;
|
||||
import com.wzj.soopin.order.service.IMerchantOrderService;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.common.tenant.helper.TenantHelper;
|
||||
import org.dromara.common.core.domain.model.LoginUser;
|
||||
import org.dromara.common.satoken.utils.LoginHelper;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
@AllArgsConstructor
|
||||
@Slf4j
|
||||
public class MerchantOrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements IMerchantOrderService {
|
||||
|
||||
private final OrderConvert convert;
|
||||
private final OrderItemMapper orderItemMapper;
|
||||
private final SkuMapper skuMapper;
|
||||
private final OrderItemConvert orderItemConvert;
|
||||
|
||||
@Override
|
||||
public Page<OrderVO> page( OrderBo bo) {
|
||||
Page<Order> resultPage = baseMapper.selectPage(bo.getPage(),bo.toWrapper());
|
||||
|
||||
Page<OrderVO> orderVOPage = convert.toVO(resultPage);
|
||||
List<OrderVO> orderVOList = orderVOPage.getRecords();
|
||||
if (orderVOList.isEmpty()) {
|
||||
return orderVOPage;
|
||||
}
|
||||
|
||||
// 获取所有订单id
|
||||
List<Long> orderIds = orderVOList.stream()
|
||||
.map(OrderVO::getId)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 根据订单id查询订单详情
|
||||
QueryWrapper<OrderItem> orderItemQueryWrapper = new QueryWrapper<>();
|
||||
orderItemQueryWrapper.in("order_id", orderIds);
|
||||
List<OrderItem> orderItemList = orderItemMapper.selectList(orderItemQueryWrapper);
|
||||
|
||||
// 按照订单id分组订单详情
|
||||
Map<Long, List<OrderItem>> orderItemMapByOrderId = orderItemList.stream()
|
||||
.collect(Collectors.groupingBy(OrderItem::getOrderId));
|
||||
|
||||
for (OrderVO orderVO : orderVOList) {
|
||||
List<OrderItem> orderItems = orderItemMapByOrderId.get(orderVO.getId());
|
||||
if (orderItems != null) {
|
||||
orderVO.setItems(orderItemConvert.toVO(orderItems));
|
||||
}
|
||||
}
|
||||
|
||||
return orderVOPage;
|
||||
public IPage<MerchantOrderVO> page(OrderItemBo bo) {
|
||||
LoginUser loginUser= LoginHelper.getLoginUser();
|
||||
bo.setTenantId(loginUser.getTenantId());
|
||||
return orderItemMapper.selectMerchatOrderPage(Page.of(bo.getCurrent(), bo.getSize()),bo);
|
||||
}
|
||||
}
|
||||
|
@ -255,11 +255,16 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
||||
.productSnapshotId(product.getProductSnapshotId())
|
||||
.skuId(sku.getId())
|
||||
.skuSnapshotId(sku.getSkuSnapshotId())
|
||||
.productName(product != null ? product.getName() : "")
|
||||
.productCategoryId(product.getCategoryId())
|
||||
.productName(product.getName())
|
||||
.outProductId(product.getOutProductId())
|
||||
.spData(sku.getSpData())
|
||||
.outSkuId(sku.getOutSkuId())
|
||||
.pic(sku.getPic())
|
||||
.salePrice(sku.getPrice())
|
||||
.quantity(map.get(sku.getId()))
|
||||
.tenantId(sku.getTenantId())
|
||||
.shareMemberId(skuItemBOList.stream().filter(item -> item.getSkuId().equals(sku.getId())).findFirst().get().getShareMemberId())
|
||||
.build();
|
||||
}).toList();
|
||||
orderItemMapper.insert(orderItemList);
|
||||
|
@ -4,38 +4,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.wzj.soopin.order.mapper.OrderItemMapper">
|
||||
|
||||
<resultMap type="OrderItem" id="OrderItemResult">
|
||||
<result property="id" column="id"/>
|
||||
<result property="orderId" column="order_id"/>
|
||||
<result property="productId" column="product_id"/>
|
||||
<result property="outProductId" column="out_product_id"/>
|
||||
<result property="skuId" column="sku_id"/>
|
||||
<result property="outSkuId" column="out_sku_id"/>
|
||||
<result property="productSnapshotId" column="product_snapshot_id"/>
|
||||
<result property="skuSnapshotId" column="sku_snapshot_id"/>
|
||||
<result property="pic" column="pic"/>
|
||||
<result property="productName" column="product_name"/>
|
||||
<result property="salePrice" column="sale_price"/>
|
||||
<result property="purchasePrice" column="purchase_price"/>
|
||||
<result property="quantity" column="quantity"/>
|
||||
<result property="productCategoryId" column="product_category_id"/>
|
||||
<result property="spData" column="sp_data"/>
|
||||
<result property="createBy" column="create_by"/>
|
||||
<result property="createTime" column="create_time"/>
|
||||
<result property="updateBy" column="update_by"/>
|
||||
<result property="updateTime" column="update_time"/>
|
||||
<result property="createBy" column="create_by"/>
|
||||
<result property="createTime" column="create_time"/>
|
||||
<result property="updateBy" column="update_by"/>
|
||||
<result property="updateTime" column="update_time" />
|
||||
</resultMap>
|
||||
|
||||
<sql id="selectOrderItemVo">
|
||||
select id, order_id, product_id, out_product_id, sku_id, out_sku_id, product_snapshot_id, sku_snapshot_id, pic, product_name, sale_price, purchase_price, quantity, product_category_id, sp_data, create_by, create_time, update_by, update_time from oms_order_item
|
||||
</sql>
|
||||
|
||||
<select id="selectByEntity" parameterType="OrderItem" resultMap="OrderItemResult">
|
||||
<include refid="selectOrderItemVo"/>
|
||||
<select id="selectByEntity" parameterType="OrderItem" resultType="OrderItem" >
|
||||
select * from oms_order_item
|
||||
<where>
|
||||
<if test="orderId != null "> and order_id = #{orderId}</if>
|
||||
<if test="productId != null "> and product_id = #{productId}</if>
|
||||
@ -54,7 +24,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
</where>
|
||||
</select>
|
||||
|
||||
<select id="selectOrderItem" parameterType="OrderItem" resultMap="OrderItemResult">
|
||||
<select id="selectOrderItem" parameterType="OrderItem" resultType="OrderItem">
|
||||
SELECT * FROM oms_order_item
|
||||
<where>
|
||||
<if test="query.orderId != null and query.orderId != ''">
|
||||
@ -101,4 +71,67 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
</if>
|
||||
</where>
|
||||
</select>
|
||||
|
||||
<select id="selectMerchatOrderPage" resultType="com.wzj.soopin.order.domain.vo.MerchantOrderVO">
|
||||
SELECT o.id AS orderId,
|
||||
o.order_sn AS orderSn,
|
||||
o.member_id AS memberId,
|
||||
o.member_username AS memberUsername,
|
||||
o.merchant_note AS merchantNote,
|
||||
o.pay_type AS payType,
|
||||
o.status AS status,
|
||||
o.aftersale AS aftersale,
|
||||
oi.id AS orderItemId,
|
||||
oi.product_id AS productId,
|
||||
oi.sku_id AS skuId,
|
||||
oi.product_snapshot_id AS productSnapshotId,
|
||||
ppc.name AS productCategoryName,
|
||||
oi.sku_snapshot_id AS skuSnapshotId,
|
||||
oi.pic AS pic,
|
||||
oi.product_name AS productName,
|
||||
oi.sale_price AS salePrice,
|
||||
oi.quantity AS quantity,
|
||||
oi.product_category_id AS productCategoryId,
|
||||
oi.sp_data AS spData,
|
||||
oi.tenant_id AS tenantId,
|
||||
oi.tenant_name AS tenantName
|
||||
FROM oms_order_item oi
|
||||
LEFT JOIN oms_order o ON oi.order_id = o.id
|
||||
LEFT JOIN pms_product_category ppc ON oi.product_category_id = ppc.id
|
||||
LEFT JOIN oms_verification_codes vc ON oi.id = vc.order_item_id
|
||||
where oi.tenant_id = #{query.tenantId}
|
||||
<if test="query.orderId != null">
|
||||
AND o.id = #{query.orderId}
|
||||
</if>
|
||||
<if test="query.productId != null">
|
||||
AND oi.product_id = #{query.productId}
|
||||
</if>
|
||||
<if test="query.outProductId != null">
|
||||
AND oi.out_product_id = #{query.outProductId}
|
||||
</if>
|
||||
<if test="query.skuId != null">
|
||||
AND oi.sku_id = #{query.skuId}
|
||||
</if>
|
||||
<if test="query.outSkuId != null">
|
||||
AND oi.out_sku_id = #{query.outSkuId}
|
||||
</if>
|
||||
<if test="query.productSnapshotId != null">
|
||||
AND oi.product_snapshot_id = #{query.productSnapshotId}
|
||||
</if>
|
||||
<if test="query.skuSnapshotId != null">
|
||||
AND oi.sku_snapshot_id = #{query.skuSnapshotId}
|
||||
</if>
|
||||
<if test="query.salePrice != null">
|
||||
AND oi.sale_price = #{query.salePrice}
|
||||
</if>
|
||||
<if test="query.productCategoryId != null">
|
||||
AND oi.product_category_id = #{query.productCategoryId}
|
||||
</if>
|
||||
<if test="query.productCategoryId != null">
|
||||
AND oi.product_category_id = #{query.productCategoryId}
|
||||
</if>
|
||||
<if test="query.productCategoryId != null">
|
||||
AND oi.product_category_id = #{query.productCategoryId}
|
||||
</if>
|
||||
</select>
|
||||
</mapper>
|
||||
|
@ -44,13 +44,6 @@ public class DivideRuleBO extends BaseBO<DivideRule> {
|
||||
@NotBlank(message = "名称不能为空")
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 手续费承担方式类型
|
||||
*/
|
||||
@Schema(description = "手续费承担方式")
|
||||
@NotNull(message = "手续费承担方式不能为空")
|
||||
private Integer feeType;
|
||||
|
||||
|
||||
/**
|
||||
* 状态
|
||||
|
@ -41,10 +41,6 @@ public class DivideRuleDetailBO extends BaseBO<DivideRuleDetail> {
|
||||
@NotNull(message = "金额占比百分值不能为空")
|
||||
private Integer moneyPercent;
|
||||
|
||||
@Schema(description ="手续费占比百分值")
|
||||
@ExcelProperty(value ="手续费占比百分值", order = 5)
|
||||
@NotNull(message = "手续费占比百分值不能为空")
|
||||
private Integer feePercent;
|
||||
|
||||
/**
|
||||
* 分账租户类型,{@link TenantType}
|
||||
|
@ -145,18 +145,14 @@ public class DivideRuleServiceImpl extends ServiceImpl<DivideRuleMapper, DivideR
|
||||
@Override
|
||||
public void checkRule(List<DivideRuleDetail> details) {
|
||||
Map<Integer, List<DivideRuleDetail>> map = details.stream().collect(Collectors.groupingBy(DivideRuleDetail::getType));
|
||||
List<DivideRuleDetail> details1 = map.get(TenantType.MERCHANT.getType());
|
||||
Assert.isTrue(details1 != null && details1.size() == 1, () -> new ServiceException("商户分账详情不能为空"));
|
||||
List<DivideRuleDetail> details2 = map.get(TenantType.PLATFORM.getType());
|
||||
Assert.isTrue(details2 != null && details2.size() == 1, () -> new ServiceException("平台分账详情不能为空"));
|
||||
List<DivideRuleDetail> details1 = map.get(TenantType.PLATFORM.getType());
|
||||
Assert.isTrue(details1 != null && details1.size() == 1, () -> new ServiceException("平台分账详情不能为空"));
|
||||
Assert.isTrue(CollUtil.size(map.get(TenantType.AGENT.getType())) <= 1 && CollUtil.size(map.get(TenantType.REFERENCE.getType())) <= 1 , () -> new ServiceException("分账详情存在重复账户类型"));
|
||||
long totalMoneyRatio = 0L;
|
||||
long totalFeeRatio = 0L;
|
||||
for (DivideRuleDetail detail : details) {
|
||||
totalMoneyRatio += detail.getMoneyPercent();
|
||||
totalFeeRatio += detail.getFeePercent();
|
||||
}
|
||||
Assert.isTrue(totalMoneyRatio == 100L, () -> new ServiceException("金额分账比例之和未等于100%"));
|
||||
Assert.isTrue(totalFeeRatio == 100L, () -> new ServiceException("手续费分账比例之和未等于100%"));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
Loading…
x
Reference in New Issue
Block a user