Compare commits

...

6 Commits

Author SHA1 Message Date
huk
ab30f6c9cc feat(app): 新增app会员与商户模块配置- 在application.yml中添加app会员模块和商户模块的包扫描配置
- 优化订单服务分页查询逻辑,支持商户维度数据筛选
- 配置knife4j文档分组,支持app模块接口文档展示
- 优化订单创建逻辑,补充商品分享人ID等字段
- 移除分账规则中的手续费相关字段与校验逻辑- 新增核销码VO,支持订单核销状态管理
2025-09-26 16:02:36 +08:00
huk
8b9a963bc6 Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-09-26 15:59:28 +08:00
huk
9a864d155d Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-09-26 14:16:11 +08:00
huk
22bee9888b Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-09-26 11:24:51 +08:00
huk
956e4e4001 Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-09-26 11:22:24 +08:00
huk
3a973e9fe3 feat(transaction): 新增查询未创建分账规则的商品分类接口 2025-09-25 18:15:28 +08:00
21 changed files with 342 additions and 141 deletions

View File

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

View File

@ -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();

View File

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

View File

@ -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;

View File

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

View File

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

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

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

View File

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

View File

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

View File

@ -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);

View File

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

View File

@ -3,6 +3,7 @@ package com.wzj.soopin.transaction.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wzj.soopin.goods.domain.vo.ProductCategoryVO;
import com.wzj.soopin.transaction.convert.DivideRuleConvert;
import com.wzj.soopin.transaction.domain.bo.DivideRuleBO;
import com.wzj.soopin.transaction.domain.po.DivideRule;
@ -16,6 +17,8 @@ import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 用户封禁
*/
@ -75,4 +78,11 @@ public class DivideRuleController {
public R<Boolean> remove(@PathVariable Long id) {
return R.ok(service.removeById(id));
}
@Operation(summary = "获取还未创建规则的商品分类")
@GetMapping("/productCategoryWithNoRule")
public R<List<ProductCategoryVO>> productCategoryWithNoRule() {
return R.ok(service.productCategoryWithNoRule());
}
}

View File

@ -44,13 +44,6 @@ public class DivideRuleBO extends BaseBO<DivideRule> {
@NotBlank(message = "名称不能为空")
private String name;
/**
* 手续费承担方式类型
*/
@Schema(description = "手续费承担方式")
@NotNull(message = "手续费承担方式不能为空")
private Integer feeType;
/**
* 状态

View File

@ -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}

View File

@ -2,6 +2,7 @@ package com.wzj.soopin.transaction.mapper;
import com.wzj.soopin.transaction.domain.po.DivideRuleDetail;
import com.wzj.soopin.transaction.domain.vo.DivideRuleDetailVO;
import org.apache.ibatis.annotations.Mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
@ -9,6 +10,7 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
*
* @author zcc
*/
@Mapper
public interface DivideRuleDetailMapper extends BaseMapperPlus<DivideRuleDetail, DivideRuleDetailVO> {
}

View File

@ -1,6 +1,7 @@
package com.wzj.soopin.transaction.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.wzj.soopin.goods.domain.vo.ProductCategoryVO;
import com.wzj.soopin.transaction.domain.bo.DivideRuleBO;
import com.wzj.soopin.transaction.domain.po.DivideRule;
import com.wzj.soopin.transaction.domain.po.DivideRuleDetail;
@ -22,5 +23,11 @@ public interface IDivideRuleService extends IService<DivideRule> {
void checkRule(List<DivideRuleDetail> details);
/**
* 查询还未创建分账规则的商品分类
* @return
*/
List<ProductCategoryVO> productCategoryWithNoRule();
}

View File

@ -1,9 +1,13 @@
package com.wzj.soopin.transaction.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wzj.soopin.goods.domain.entity.ProductCategory;
import com.wzj.soopin.goods.domain.vo.ProductCategoryVO;
import com.wzj.soopin.goods.service.ProductCategoryService;
import com.wzj.soopin.transaction.convert.DivideRuleConvert;
import com.wzj.soopin.transaction.convert.DivideRuleDetailConvert;
import com.wzj.soopin.transaction.domain.bo.DivideRuleBO;
@ -43,6 +47,8 @@ public class DivideRuleServiceImpl extends ServiceImpl<DivideRuleMapper, DivideR
private final DivideRuleConvert convert;
private final ProductCategoryService productCategoryService;
@Transactional(rollbackFor = Exception.class)
@Override
public boolean save(DivideRuleBO bo) {
@ -139,17 +145,23 @@ 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
public List<ProductCategoryVO> productCategoryWithNoRule() {
List<DivideRule> existRule = this.list();
List<ProductCategory> allProductCategories = productCategoryService.list();
List<Integer> existTypes = existRule.stream().map(item -> item.getType()).toList();
return allProductCategories.stream().filter(item -> item.getParentId() != 0)
.filter(item -> !CollUtil.contains(existTypes, item.getId()))
.map(item -> BeanUtil.copyProperties(item, ProductCategoryVO.class)).toList();
}
}