Compare commits

..

No commits in common. "ab30f6c9cc7606a6b271195647290498312f7553" and "773a93b5ff2a8100770c626e810414ff2782d100" have entirely different histories.

21 changed files with 141 additions and 342 deletions

View File

@ -5,6 +5,7 @@ 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;
@ -17,12 +18,13 @@ 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 = "app-用户-订单接口")
@Tag(name = "订单")
@RequestMapping("/app/order")
@RestController
@RequiredArgsConstructor

View File

@ -6,7 +6,6 @@ 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;
@ -61,7 +60,7 @@ public class AppMerchantBillController {
return R.ok(voPage);
}
@Operation(summary = "账户统计")
@Tag(name = "账户统计")
@PostMapping("/statistic")
public R<AccountStatisticVO> statistic() {
LoginUser loginUser = LoginHelper.getLoginUser();

View File

@ -2,9 +2,8 @@ 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.OrderItemBo;
import com.wzj.soopin.order.domain.bo.OrderBo;
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;
@ -13,6 +12,8 @@ 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.*;
/**
@ -22,7 +23,7 @@ import org.springframework.web.bind.annotation.*;
* @since 2020-12-18 16:59
*/
@Slf4j
@Tag(name = "app-商户-订单接口")
@Tag(name = "商户端,订单接口")
@RequestMapping("/app/merchant/order")
@RestController
@RequiredArgsConstructor
@ -56,7 +57,9 @@ public class AppMerchantOrderController {
@PostMapping("/page")
@Operation(summary = "查询当前商家订单列表")
public R<IPage<MerchantOrderVO>> page(@RequestBody OrderItemBo bo){
public R<IPage<OrderVO>> page(@RequestBody OrderBo bo){
LoginUser loginUser= LoginHelper.getLoginUser();
bo.setTenantId(loginUser.getTenantId());
return R.ok(merchantOrderService.page(bo));
}
}

View File

@ -1,8 +1,10 @@
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;
@ -14,6 +16,7 @@ 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.*;
@ -26,6 +29,8 @@ 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.*;
@ -38,6 +43,7 @@ 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,10 +297,6 @@ 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 extends BaseBO <OrderItem> {
public class OrderItemBo {
@Schema(description = "订单id 精确匹配")
private Long orderId;
@ -32,6 +32,9 @@ public class OrderItemBo extends BaseBO <OrderItem> {
@Schema(description = "sku快照id 精确匹配")
private Long skuSnapshotId;
@Schema(description = "展示图片 精确匹配")
private String pic;
@Schema(description = "PRODUCT_NAME 精确匹配")
private String productNameLike;
@ -47,10 +50,10 @@ public class OrderItemBo extends BaseBO <OrderItem> {
@Schema(description = "商品分类id 精确匹配")
private Long productCategoryId;
@Schema(description = "户租户id", hidden = true)
private String tenantId;
@Schema(description = "品sku属性:[{\"key\":\"颜色\",\"value\":\"颜色\"},{\"key\":\"容量\",\"value\":\"4G\"}] 精确匹配")
private String spData;
public LambdaQueryWrapper<OrderItem> toWrapper() {
public Wrapper<OrderItem> toWrapper() {
return new LambdaQueryWrapper<OrderItem>()
.eq(orderId != null, OrderItem::getOrderId, orderId)
.eq(productId != null, OrderItem::getProductId, productId)
@ -59,10 +62,12 @@ public class OrderItemBo extends BaseBO <OrderItem> {
.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(productCategoryId != null, OrderItem::getProductCategoryId, productCategoryId)
.eq(spData != null && !spData.isEmpty(), OrderItem::getSpData, spData);
}
}

View File

@ -1,7 +1,6 @@
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;
@ -17,15 +16,15 @@ import lombok.NoArgsConstructor;
@Builder
public class SaveOrderSkuItemBO {
@Schema(description = "商品id")
/**
* 商品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属性")
@Excel(name = "商品sku属性")
@Schema(description = "商品sku属性:[{\"key\":\"颜色\",\"value\":\"颜色\"},{\"key\":\"容量\",\"value\":\"4G\"}]")
@Excel(name = "商品sku属性:[{\"key\":\"颜色\",\"value\":\"颜色\"},{\"key\":\"容量\",\"value\":\"4G\"}]")
private String spData;
@Schema(description = "租户id")
@ -95,8 +95,4 @@ public class OrderItem extends BaseAudit {
@Excel(name = "租户名称")
private String tenantName;
@Schema(description = "商品分享人id")
private Long shareMemberId;
}

View File

@ -1,119 +0,0 @@
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

@ -1,59 +0,0 @@
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,15 +1,9 @@
package com.wzj.soopin.order.mapper;
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.baomidou.mybatisplus.core.mapper.BaseMapper;
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;
@ -20,7 +14,7 @@ import java.util.Map;
* @author zcc
*/
@Mapper
public interface OrderItemMapper extends BaseMapperPlus<OrderItem, OrderItemVO> {
public interface OrderItemMapper extends BaseMapper<OrderItem> {
/**
* 查询订单中所包含的商品列表
*
@ -69,6 +63,4 @@ public interface OrderItemMapper extends BaseMapperPlus<OrderItem, OrderItemVO>
@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.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.wzj.soopin.order.domain.bo.OrderItemBo;
import com.wzj.soopin.order.domain.bo.OrderBo;
import com.wzj.soopin.order.domain.entity.Order;
import com.wzj.soopin.order.domain.vo.MerchantOrderVO;
import com.wzj.soopin.order.domain.vo.OrderVO;
public interface IMerchantOrderService extends IService<Order> {
Page<OrderVO> page(OrderBo bo);
IPage<MerchantOrderVO> page(OrderItemBo bo);
}

View File

@ -1,31 +1,68 @@
package com.wzj.soopin.order.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wzj.soopin.order.domain.bo.OrderItemBo;
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.entity.Order;
import com.wzj.soopin.order.domain.vo.MerchantOrderVO;
import com.wzj.soopin.order.domain.entity.OrderItem;
import com.wzj.soopin.order.domain.vo.OrderVO;
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.core.domain.model.LoginUser;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.helper.TenantHelper;
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 IPage<MerchantOrderVO> page(OrderItemBo bo) {
LoginUser loginUser= LoginHelper.getLoginUser();
bo.setTenantId(loginUser.getTenantId());
return orderItemMapper.selectMerchatOrderPage(Page.of(bo.getCurrent(), bo.getSize()),bo);
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;
}
}

View File

@ -255,16 +255,11 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
.productSnapshotId(product.getProductSnapshotId())
.skuId(sku.getId())
.skuSnapshotId(sku.getSkuSnapshotId())
.productCategoryId(product.getCategoryId())
.productName(product.getName())
.outProductId(product.getOutProductId())
.spData(sku.getSpData())
.outSkuId(sku.getOutSkuId())
.productName(product != null ? product.getName() : "")
.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,8 +4,38 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wzj.soopin.order.mapper.OrderItemMapper">
<select id="selectByEntity" parameterType="OrderItem" resultType="OrderItem" >
select * from oms_order_item
<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"/>
<where>
<if test="orderId != null "> and order_id = #{orderId}</if>
<if test="productId != null "> and product_id = #{productId}</if>
@ -24,7 +54,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</where>
</select>
<select id="selectOrderItem" parameterType="OrderItem" resultType="OrderItem">
<select id="selectOrderItem" parameterType="OrderItem" resultMap="OrderItemResult">
SELECT * FROM oms_order_item
<where>
<if test="query.orderId != null and query.orderId != ''">
@ -71,67 +101,4 @@ 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,7 +3,6 @@ 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;
@ -17,8 +16,6 @@ import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 用户封禁
*/
@ -78,11 +75,4 @@ 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,6 +44,13 @@ public class DivideRuleBO extends BaseBO<DivideRule> {
@NotBlank(message = "名称不能为空")
private String name;
/**
* 手续费承担方式类型
*/
@Schema(description = "手续费承担方式")
@NotNull(message = "手续费承担方式不能为空")
private Integer feeType;
/**
* 状态

View File

@ -41,6 +41,10 @@ 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,7 +2,6 @@ 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;
/**
@ -10,7 +9,6 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
*
* @author zcc
*/
@Mapper
public interface DivideRuleDetailMapper extends BaseMapperPlus<DivideRuleDetail, DivideRuleDetailVO> {
}

View File

@ -1,7 +1,6 @@
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;
@ -23,11 +22,5 @@ public interface IDivideRuleService extends IService<DivideRule> {
void checkRule(List<DivideRuleDetail> details);
/**
* 查询还未创建分账规则的商品分类
* @return
*/
List<ProductCategoryVO> productCategoryWithNoRule();
}

View File

@ -1,13 +1,9 @@
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;
@ -47,8 +43,6 @@ 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) {
@ -145,23 +139,17 @@ 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.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("分账详情存在重复账户类型"));
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("平台分账详情不能为空"));
long totalMoneyRatio = 0L;
long totalFeeRatio = 0L;
for (DivideRuleDetail detail : details) {
totalMoneyRatio += detail.getMoneyPercent();
totalFeeRatio += detail.getFeePercent();
}
Assert.isTrue(totalMoneyRatio == 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();
Assert.isTrue(totalFeeRatio == 100L, () -> new ServiceException("手续费分账比例之和未等于100%"));
}
}