Commit 729fc716 by 胡敬轩

Merge remote-tracking branch 'origin/feature/zxh/套餐商品库存新模式-20221018'

parents 52c761ca 2a89242b
......@@ -21,6 +21,13 @@ import java.util.List;
@Data
public class CreateOrderProductRequest extends BaseConfig {
/**
* 库存模式,目前该模式只针对套餐商品会起作用
* 1-使用套餐库存(非关联模式):即套餐库存和套餐中子商品品库存分别存在、互不影响
* 2-使用联动库存(关联模式):即套餐商品的库存为套餐库存和套餐中子商品的库存,当用户购买套餐商品时,同时扣减套餐库存和套餐中子商品的库存,当套餐中任一子商品库存为0或套餐商品的库存为0时,该套餐将不能购买
*/
protected Integer stockMode = 1;
/**
* 商品
*/
private String productId;
......
......@@ -20,8 +20,18 @@ import java.util.List;
@Data
public class OrderProductAddInfoDto extends BaseConfig {
/**
* 库存模式,目前该模式只针对套餐商品会起作用
* 1-使用套餐库存(非关联模式):即套餐库存和套餐中子商品品库存分别存在、互不影响
* 2-使用联动库存(关联模式):即套餐商品的库存为套餐库存和套餐中子商品的库存,当用户购买套餐商品时,同时扣减套餐库存和套餐中子商品的库存,当套餐中任一子商品库存为0或套餐商品的库存为0时,该套餐将不能购买
*/
protected Integer stockMode = 1;
/**
* 是否扣库存
*/
protected boolean stockLimit;
/**
* 属性名称 多糖/冷/常温
*/
private String attributeNames;
......
......@@ -15,7 +15,6 @@ package com.freemud.sdk.api.assortment.order.request.stock;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
@Data
......@@ -36,19 +35,26 @@ public class UpdateProductStockRequestDto {
private String remark;
//交易号, maxLength = 36
private String transNo;
//2019-02-19T06:56:14.543Z"
private Date transTime;
/**
* 交易类型 格式类型 yyyy-MM-dd HH:mm:ss
*/
private String transTime;
@NoArgsConstructor
@Data
public static class ProductStock {
private String customerCode;
private Long productId;
private String productId;
private Integer qty;
private Integer safeQty;
//虚拟库存数, 可不传,默认为0
private String virtualQty;
/**
* 商品类型 主要库存服务需要区分套餐商品用
*/
private Integer productType;
}
}
......@@ -2529,6 +2529,7 @@ public class OrderAdapter {
createOrderProductDemoDto.setCustomerCode(cartGoodsDetailDto.getCustomerCode());
createOrderProductDemoDto.setProductCode(cartGoodsDetailDto.getProductCode());
createOrderProductDemoDto.setHasStockProudct(cartGoodsDetailDto.isStockLimit());
createOrderProductDemoDto.setStockMode(cartGoodsDetailDto.getStockMode());
createOrderProductDemoDto.setWeight(cartGoodsDetailDto.getWeight());
createOrderProductDemoDto.setUnit(cartGoodsDetailDto.getUnit());
createOrderProductDemoDto.setStapleFood(0);
......
......@@ -133,6 +133,13 @@ public class ShoppingCartGoodsDto {
private String spuId;
/**
* 库存模式,目前该模式只针对套餐商品会起作用
* 1-使用套餐库存:即套餐库存和套餐中子商品品库存分别存在、互不影响
* 2-使用联动库存:即套餐商品的库存为套餐库存和套餐中子商品的库存,当用户购买套餐商品时,同时扣减套餐库存和套餐中子商品的库存,当套餐中任一子商品库存为0或套餐商品的库存为0时,该套餐将不能购买
*/
protected Integer stockMode = 1;
/**
* 原有商品类型
*
* 溯源: 订单有自己的商品逻辑 无法使用原有字段类型记录处理
......
......@@ -27,13 +27,12 @@ import cn.freemud.entities.dto.shoppingCart.GetShoppingCartGoodsApportionDto;
import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto;
import cn.freemud.entities.dto.store.StoreMixResponseDto;
import cn.freemud.entities.vo.CreateOrderBaseVo;
import cn.freemud.entities.vo.CreateOrderVo;
import cn.freemud.entities.vo.GetProductsVo;
import cn.freemud.entities.vo.ShoppingCartInfoRequestVo;
import cn.freemud.enums.*;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.service.adapter.OrderCheckAdapter;
import cn.freemud.service.impl.ItemServiceImpl;
import cn.freemud.service.impl.OrderItemServiceImpl;
import cn.freemud.service.impl.StoreServiceImpl;
import cn.freemud.service.order.OrderRelationFactory;
import cn.freemud.service.order.OrderRelationService;
......@@ -102,7 +101,7 @@ public abstract class CheckOrderUniversal {
@Autowired
private StoreServiceImpl storeService;
@Autowired
private ItemServiceImpl itemService;
private OrderItemServiceImpl itemService;
// 配送费逻辑是否使用旧的
@Value("${store.delivery.use.old}")
......
package cn.freemud.service.business.impl;
import cn.freemud.amqp.MQService;
import cn.freemud.base.util.DateUtil;
import cn.freemud.entities.dto.GetMemberExtendInfoRequestDto;
import cn.freemud.entities.dto.GetMemberExtendInfoResponseDto;
......@@ -11,6 +10,7 @@ import cn.freemud.service.impl.OrderQueueService;
import cn.freemud.service.thirdparty.CustomerApplicationClient;
import cn.freemud.service.thirdparty.CustomerClient;
import cn.freemud.service.thirdparty.PromotionDiscountClient;
import cn.freemud.service.thirdparty.StockClient;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.freemud.application.sdk.api.base.BaseResponse;
......@@ -33,8 +33,6 @@ import com.freemud.application.sdk.api.ordercenter.response.PaySuccessResp;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs;
import com.freemud.application.sdk.api.ordercenter.service.OrderSdkService;
import com.freemud.application.sdk.api.promotioncenter.response.PromotionResponseDTO;
import com.freemud.application.sdk.api.promotioncenter.service.PromotionSdkService;
import com.freemud.application.sdk.api.stockapi.request.UpdateStocksRequest;
import com.freemud.application.sdk.api.stockapi.service.StockSdkService;
import com.freemud.application.sdk.api.storecenter.request.StoreInfoRequest;
import com.freemud.application.sdk.api.storecenter.request.vo.GetOrgTreeListRequest;
......@@ -47,6 +45,7 @@ import com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant;
import com.freemud.sdk.api.assortment.order.entities.promption.ActivityUpdateStockRequest;
import com.freemud.sdk.api.assortment.order.enums.*;
import com.freemud.sdk.api.assortment.order.request.order.*;
import com.freemud.sdk.api.assortment.order.request.stock.UpdateProductStockRequestDto;
import com.freemud.sdk.api.assortment.order.response.order.BaseOrderResponse;
import com.freemud.sdk.api.assortment.order.response.order.CreateOrderResponse;
import com.freemud.sdk.api.assortment.order.response.order.PayAccessResponse;
......@@ -84,15 +83,10 @@ public class OrderBusinessServiceImpl implements OrderBusinessService {
@Autowired
private StockSdkService stockSdkService;
@Autowired
private PromotionSdkService promotionSdkService;
@Autowired
private CustomerApplicationClient customerApplicationClient;
// private MemberScoreService memberScoreService;
@Autowired
private OfflineCouponSdkService offlineCouponSdkService;
@Autowired
private MQService mqService;
@Autowired
private OrderQueueService orderQueueService;
@Value("${version.upgrade.weekDay:}")
......@@ -106,7 +100,8 @@ public class OrderBusinessServiceImpl implements OrderBusinessService {
@Autowired
private PromotionDiscountClient promotionDiscountClient;
@Autowired
private StockClient stockClient;
@Override
......@@ -270,9 +265,9 @@ public class OrderBusinessServiceImpl implements OrderBusinessService {
private BaseOrderResponse updateStockAndScore(OrderBeanV1 orderBean, List<CreateOrderProductRequest> products, ActivityUpdateStockRequest updateStockRequest,
List<CreateOrderAccountRequest> accounts, String menuType, String openId,Long totalScore) {
//TODO 转换获取库存信息,扣减库存
UpdateStocksRequest updateStocksRequest = orderSdkAdapter.getUpdateProductStock(orderBean, products, StockChangeType.REDUCE,menuType);
UpdateProductStockRequestDto updateStocksRequest = orderSdkAdapter.getUpdateProductStockByFeign(orderBean, products, StockChangeType.REDUCE,menuType);
if (updateStocksRequest != null && CollectionUtils.isNotEmpty(updateStocksRequest.getProductStocks())) {
BaseResponse baseResponse = stockSdkService.reducesStocks(updateStocksRequest, "");
cn.freemud.base.entity.BaseResponse baseResponse = stockClient.reducesStocks(updateStocksRequest);
if (!ObjectUtils.equals(RESPONSE_SUCCESS_STR, baseResponse.getCode())) {
//TODO 失败取消订单
CancelOrderRequest cancelOrderRequest = orderSdkAdapter.convent2CancelOrderRequest(orderBean.getOid(), orderBean.getCompanyId(),
......
......@@ -51,7 +51,6 @@ import com.freemud.application.sdk.api.membercenter.service.MemberPropertyServic
import com.freemud.application.sdk.api.ordercenter.constant.ResponseConstant;
import com.freemud.application.sdk.api.ordercenter.enums.ProductTypeEnum;
import com.freemud.application.sdk.api.storecenter.request.QueryDeliveryRequest;
import com.freemud.application.sdk.api.storecenter.request.StoreInfoRequest;
import com.freemud.application.sdk.api.storecenter.response.QueryDeliverDetailResponse;
import com.freemud.application.sdk.api.storecenter.response.StoreResponse;
import com.freemud.application.sdk.api.storecenter.service.StoreCenterService;
......@@ -97,7 +96,7 @@ public class CheckMCCafeOrder {
// @Autowired
// private StockClient stockClient;
@Autowired
private ItemServiceImpl itemService;
private OrderItemServiceImpl itemService;
@Autowired
private CouponService couponService;
@Autowired
......
......@@ -758,27 +758,6 @@ public class CheckOrder {
.build();
shoppingCartInfoRequestVo.setTrackingNo(LogThreadLocal.getTrackingNo());
shoppingCartInfoRequestVo.setEnableSharing(createOrderVo.getEnableSharing());
// 如果使用优惠券或者商品券,校验 couponCode
// if (StringUtils.isNotBlank(createOrderVo.getCouponCode())) {
// // 校验couponCode
// GetCouponDetailResponseDto getCouponDetailResponseDto = couponService.getMemberCoupon(GetMemberCouponRequestVo.builder()
// .partnerId(createOrderVo.getPartnerId())
// .couponCode(createOrderVo.getCouponCode()).build());
// if (Objects.equals(getCouponDetailResponseDto, null) || CollectionUtils.isEmpty(getCouponDetailResponseDto.getDetails())
// || getCouponDetailResponseDto.getDetails().get(0).getActive() == null
// || getCouponDetailResponseDto.getDetails().get(0).getActive().getActiveCode() == null) {
// // 返回信息为空
// throw new ServiceException(ResponseResult.COUPON_GETINFO_INVAILD);
// }
// List<GetCouponDetailResponseDto.ActiveRedeemTimeInterval> activeRedeemTimeIntervalList = getCouponDetailResponseDto.getDetails().get(0).getActiveRedeemTimeIntervalList();
// checkCouonRedeemTime(activeRedeemTimeIntervalList);
// String activeCode = getCouponDetailResponseDto.getDetails().get(0).getActive().getActiveCode();
// // 校验点餐方式,查询购物车接口内部已校验
// shoppingCartInfoRequestVo.setCouponCode(createOrderVo.getCouponCode());
// // 活动code
// shoppingCartInfoRequestVo.setActivityCode(activeCode);
// shoppingCartInfoRequestVo.setCardCode(createOrderVo.getCardCode());
// }
Set<String> codes = new HashSet<>();
if (StringUtils.isNotBlank(createOrderVo.getCouponCode())) {
......
......@@ -192,7 +192,7 @@ public class MCCafeOrderServiceImpl implements MCCafeOrderService {
@Autowired
private CustomerApplicationClient customerApplicationClient;
@Autowired
private ItemServiceImpl itemService;
private OrderItemServiceImpl itemService;
@Autowired
private BuriedPointService buriedPointService;
@Autowired
......
......@@ -115,7 +115,7 @@ public class MallOrderServiceImpl implements MallOrderService {
@Autowired
private OrderAdapter orderAdapter;
@Autowired
private ItemServiceImpl itemService;
private OrderItemServiceImpl itemService;
@Autowired
private ShoppingCartClient shoppingCartClient;
@Autowired
......
......@@ -44,7 +44,7 @@ import java.util.function.Predicate;
import java.util.stream.Collectors;
@Service
public class CouponServiceImpl implements CouponService {
public class OrderCouponServiceImpl implements CouponService {
@Autowired
private CouponOnlineClient couponOnlineClient;
......
......@@ -33,7 +33,7 @@ import java.util.*;
import java.util.stream.Collectors;
@Service
public class ItemServiceImpl implements ItemService{
public class OrderItemServiceImpl implements ItemService{
private static Gson gson = new Gson();
......
......@@ -105,6 +105,7 @@ import com.freemud.application.sdk.api.ordercenter.entities.v1.RefundBeanV1;
import com.freemud.application.sdk.api.ordercenter.enums.*;
import com.freemud.application.sdk.api.ordercenter.enums.orderv1.*;
import com.freemud.application.sdk.api.ordercenter.enums.orderv1.OrderStatusV1;
import com.freemud.application.sdk.api.ordercenter.enums.orderv1.OrderStatusV1;
import com.freemud.application.sdk.api.ordercenter.enums.orderv1.OrderTypeV1;
import com.freemud.application.sdk.api.ordercenter.request.*;
import com.freemud.application.sdk.api.ordercenter.request.carpark.ParkingOrderCreateReq;
......@@ -202,7 +203,7 @@ public class OrderServiceImpl implements Orderservice {
@Autowired
private CustomerApplicationClient customerApplicationClient;
@Autowired
private ItemServiceImpl itemService;
private OrderItemServiceImpl itemService;
@Autowired
private CouponActivityService couponActivityService;
@Autowired
......
......@@ -13,7 +13,7 @@
package cn.freemud.service.thirdparty;
import cn.freemud.base.entity.BaseResponse;
import com.freemud.application.sdk.api.stockapi.request.UpdateStocksRequest;
import com.freemud.sdk.api.assortment.order.request.stock.UpdateProductStockRequestDto;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
......@@ -28,7 +28,7 @@ public interface StockClient {
* 扣减库存
*/
@PostMapping("/reduceStocks")
BaseResponse reducesStocks(@RequestBody UpdateStocksRequest requestDto);
BaseResponse reducesStocks(@RequestBody UpdateProductStockRequestDto requestDto);
}
......@@ -22,7 +22,7 @@ import cn.freemud.enums.ResponseResult;
import cn.freemud.enums.*;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.service.MallOrderService;
import cn.freemud.service.impl.ItemServiceImpl;
import cn.freemud.service.impl.OrderItemServiceImpl;
import cn.freemud.service.universal.UniversalOrderService;
import cn.freemud.utils.AppLogUtil;
import cn.freemud.utils.ResponseUtil;
......@@ -83,7 +83,7 @@ public class SaasMallOrderService extends UniversalOrderService {
private OrderAdapter orderAdapter;
@Autowired
private ItemServiceImpl itemService;
private OrderItemServiceImpl itemService;
@Autowired
private OrderSdkAdapter orderSdkAdapter;
......
......@@ -12,11 +12,48 @@
<properties>
<jacoco.version>0.7.5.201505241946</jacoco.version>
<junit.version>4.12</junit.version>
<spock.version>1.3-groovy-2.5</spock.version>
<powermock.version>2.0.4</powermock.version>
</properties>
<artifactId>shopping-cart-application-service</artifactId>
<dependencies>
<!--引入spock 核心包-->
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>${spock.version}</version>
<scope>test</scope>
</dependency>
<!--引入spock 与 spring 集成包-->
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-spring</artifactId>
<version>${spock.version}</version>
<scope>test</scope>
</dependency>
<!-- power mock -->
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.3.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.freemud.application.service.sdk</groupId>
<artifactId>paymentcenter-sdk</artifactId>
......
......@@ -682,6 +682,7 @@ public class ShoppingCartConvertAdapter {
cartGoods.setPic(spuProduct.getPicture());
cartGoods.setPackPrice(isSkuProduct ? skuProduct.getPackPrice() : spuProduct.getPackPrice());
cartGoods.setStockLimit(isSkuProduct ? ObjectUtils.equals(1, skuProduct.getStockLimit()) : ObjectUtils.equals(1, spuProduct.getStockLimit()));
cartGoods.setStockMode(spuProduct.getStockMode());
cartGoods.setCustomerCode(isSkuProduct ? skuProduct.getCustomerCode() : spuProduct.getCustomerCode());
cartGoods.setRiseSell(isSkuProduct ? skuProduct.getRiseSell() : spuProduct.getRiseSell());
cartGoods.setMemberDiscount(spuProduct.getMemberDiscountResult());
......@@ -1408,11 +1409,13 @@ public class ShoppingCartConvertAdapter {
if (isComboxGoods) {
productComboType = parentProductBean.getProductComboList().stream().filter(p -> ObjectUtils.equals(comboxGoods.getGoodsId(), p.getProductId())).findFirst().orElse(new ProductComboType());
comboxGoods.setLinkedId(productComboType.getLinkedId());
comboxGoods.setStockLimit(Objects.equals(1,productComboType.getStockLimit()));
} else {
Map<String, GroupDetailType> map = new HashMap<>();
parentProductBean.getProductGroupList().stream().map(t -> t.getGroupDetail()).forEach(group -> group.forEach(detailType -> map.put(detailType.getProductId(), detailType)));
groupDetailType = map.get(comboxGoods.getGoodsId());
comboxGoods.setLinkedId(groupDetailType.getLinkedId());
comboxGoods.setStockLimit(Objects.equals(1,groupDetailType.getStockLimit()));
}
// 若是固定商品则取商品详情的FinalPrice,若是可选商品则取MarkUpPrice
......
......@@ -73,6 +73,15 @@ public class ProductTypeBeanDTO {
*/
private Integer singleOrder;
/**
* 库存模式,目前该模式只针对套餐商品会起作用
* 1-使用套餐库存:即套餐库存和套餐中子商品品库存分别存在、互不影响
* 2-使用联动库存:即套餐商品的库存为套餐库存和套餐中子商品的库存,当用户购买套餐商品时,同时扣减套餐库存和套餐中子商品的库存,当套餐中任一子商品库存为0或套餐商品的库存为0时,该套餐将不能购买
*/
protected Integer stockMode = 1;
public Integer getMemberDiscountResult() {
return this.openMemberDiscount != null && this.openMemberDiscount == 1 ? this.memberDiscount : 100;
}
......
......@@ -25,4 +25,5 @@ public class ProductComboType {
* 【订C,“POS编码”让凌顶那边去匹配商品】 https://www.tapd.cn/43862731/prong/stories/view/1143862731001039549
*/
private String linkedId ;
private Integer stockLimit;
}
......@@ -284,6 +284,13 @@ public class ShoppingCartGoodsDto {
* 用于创建订单时,是否扣减库存
*/
private boolean isStockLimit;
/**
* 库存模式,目前该模式只针对套餐商品会起作用
* 1-使用套餐库存:即套餐库存和套餐中子商品品库存分别存在、互不影响
* 2-使用联动库存:即套餐商品的库存为套餐库存和套餐中子商品的库存,当用户购买套餐商品时,同时扣减套餐库存和套餐中子商品的库存,当套餐中任一子商品库存为0或套餐商品的库存为0时,该套餐将不能购买
*/
protected Integer stockMode = 1;
/**
* 是否餐具商品
*/
......
......@@ -28,6 +28,14 @@ import java.util.UUID;
@Data
public class CartGoods {
/**
* 库存模式,目前该模式只针对套餐商品会起作用
* 1-使用套餐库存:即套餐库存和套餐中子商品品库存分别存在、互不影响
* 2-使用联动库存:即套餐商品的库存为套餐库存和套餐中子商品的库存,当用户购买套餐商品时,同时扣减套餐库存和套餐中子商品的库存,当套餐中任一子商品库存为0或套餐商品的库存为0时,该套餐将不能购买
*/
protected Integer stockMode = 1;
/**
* 如果加价购是虚拟券商品 这个集合会有券商品赠送的券信息
*/
......@@ -391,6 +399,12 @@ public class CartGoods {
@Data
public final static class ComboxGoods {
/**
* 是否限制库存
* 用于创建订单时,是否扣减库存
* 2022年10月19日11:20:11 tapd 新增套餐商品 可选搭配是否扣除库存 不走套餐主商品配置
*/
private boolean isStockLimit;
/**
* 【订C,“POS编码”让凌顶那边去匹配商品】 https://www.tapd.cn/43862731/prong/stories/view/1143862731001039549
*/
private String linkedId ;
......
......@@ -443,6 +443,7 @@ public class CalculationCommonService {
cartGoodsDetailDto.setCategoryName(cartGoods.getCategoryName());
cartGoodsDetailDto.setCouponCode(cartGoods.getCouponCode());
cartGoodsDetailDto.setStockLimit(cartGoods.isStockLimit());
cartGoodsDetailDto.setStockMode(cartGoods.getStockMode());
cartGoodsDetailDto.setProductCode(cartGoods.getCustomerCode());
cartGoodsDetailDto.setCustomerCode(cartGoods.getCustomerCode());
cartGoodsDetailDto.setWeight(cartGoods.getWeight());
......@@ -624,7 +625,7 @@ public class CalculationCommonService {
com.setProductType(comb.isWeightType() ? ProductType.WEIGHT_PRODUCT.getCode() : ProductType.SETMEAL.getCode());
com.setParentProductId(cartGoods.getGoodsId());
com.setIsFixedProduct(isFixed);
com.setStockLimit(cartGoods.isStockLimit());
com.setStockLimit(comb.isStockLimit());
com.setCustomerCode(comb.getCustomerCode());
com.setWeight(comb.getWeight());
com.setUnit(comb.getUnit());
......
package cn.freemud.adapter
import cn.freemud.adapter.ActivityAdapter
import cn.freemud.entities.vo.GetShoppingCartGoodsApportionRequestVo
import cn.freemud.service.impl.ShoppingCartNewServiceImpl
import com.alibaba.fastjson.JSON
import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo
import com.freemud.api.assortment.datamanager.manager.customer.AssortmentCustomerInfoManager
import org.junit.runner.RunWith
import org.mockito.Mockito
import org.powermock.api.mockito.PowerMockito
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.PowerMockRunner
import org.powermock.modules.junit4.PowerMockRunnerDelegate
import org.spockframework.runtime.Sputnik
import spock.lang.Specification
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/3/7 9:35
* @description :
*/
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Sputnik.class)
@PrepareForTest()
class DemoSpockMock extends Specification {
def shoppingCartNewServiceImpl = new ShoppingCartNewServiceImpl()
def customerInfoManager = PowerMockito.mock(AssortmentCustomerInfoManager)
void setup() {
shoppingCartNewServiceImpl.customerInfoManager = customerInfoManager
}
def "testMockEnable"() {
given: "设置请求参数"
def customerInfoVo = JSON.parseObject("{\"accessToken\":\"\",\"alipayUserId\":\"\",\"appId\":\"wx3f7ca0c75b213380\",\"appSecret\":\"\",\"appsecret\":\"\",\"channel\":\"1\",\"customerId\":\"\",\"devBrand\":\"\",\"devModel\":\"\",\"iappId\":\"7\",\"memberId\":\"3614319825989629832\",\"mobile\":\"17327190802\",\"newMember\":false,\"nickName\":\"SWEET SUGA\",\"openId\":\"o98fP4qjUo7xm-nT-JAaVEk9yBqM\",\"openid\":\"o98fP4qjUo7xm-nT-JAaVEk9yBqM\",\"partnerId\":\"2581\",\"photoUrl\":\"https://thirdwx.qlogo.cn/mmopen/vi_32/zahIlicTNSM0IA0qjOryv6s0SzIhlwW9EpQKvL63GbPhBwficMAibDohDEibSCQU0I5KohibIpp0yL57TWRcVKrRH2A/132\",\"registerTime\":\"2021-02-26 14:10:26\",\"sessionId\":\"eac53a53f8ae62def7f40cb1e47a1bd9791d95a8\",\"sessionKey\":\"GCyyapzbBSM4yXh9AduGOw==\",\"session_key\":\"GCyyapzbBSM4yXh9AduGOw==\",\"storeId\":\"\",\"tableNumber\":\"\",\"thirdPartyMemberID\":\"\",\"thirdPartyPartnerID\":\"\",\"unionId\":\"o7cEm68JPFhbrzqb0a0BcQE-dDVA\",\"wxAppId\":\"wx3f7ca0c75b213380\",\"wxAppid\":\"wx3f7ca0c75b213380\"}"
, AssortmentCustomerInfoVo.class)
def getShoppingCartGoodsApportionRequestVo = JSON.parseObject("{\"shoppingCartInfoRequestVo\":{\"activityCode\":\"G1643164091158349\",\"buyType\":0,\"couponCode\":\"88709227085491207040\",\"couponCodes\":[{\"activityCode\":\"G1643164091158349\",\"couponCode\":\"88709227085491207040\",\"couponType\":7,\"discountAmount\":800,\"index\":1}],\"flag\":0,\"menuType\":\"saas\",\"orderType\":1,\"partnerId\":\"2581\",\"reachStoreType\":5,\"sendGoods\":[],\"sessionId\":\"eac53a53f8ae62def7f40cb1e47a1bd9791d95a8\",\"shopId\":\"229830\",\"trackingNo\":\"8283bc4c7e5f4bbb8b357e3c0bef7183\",\"useCouponFlag\":1,\"useCustomerScore\":2,\"version\":\"2.0.60.6\"}}"
, GetShoppingCartGoodsApportionRequestVo.class)
def premiumExchangeActivity = getShoppingCartGoodsApportionRequestVo.getPremiumExchangeActivity()
def shoppingCartInfoRequestVo = getShoppingCartGoodsApportionRequestVo.getShoppingCartInfoRequestVo()
and: "mock掉接口返回的用户信息"
Mockito.when(customerInfoManager.getCustomerInfoByObject(Mockito.anyString())).thenReturn(customerInfoVo)
when: "调用获取用户信息方法"
def response = shoppingCartNewServiceImpl.getShoppingCartGoods(shoppingCartInfoRequestVo, premiumExchangeActivity)
then: "验证返回结果是否符合预期值"
}
}
package cn.freemud.service.impl
import cn.freemud.adapter.ShoppingCartConvertAdapter
import cn.freemud.adapter.StoreItemAdapter
import cn.freemud.entities.dto.GetCouponDetailResponseDto
import cn.freemud.entities.dto.ProductBaseResponse
import cn.freemud.entities.dto.ProductInfosDto
import cn.freemud.entities.dto.ProductListDto
import cn.freemud.entities.dto.product.CheckCartRequest
import cn.freemud.entities.dto.product.ValiadShopProductResponse
import cn.freemud.entities.vo.AddShoppingCartGoodsRequestVo
import cn.freemud.entities.vo.CartGoods
import cn.freemud.service.CouponService
import cn.freemud.service.ItemService
import cn.freemud.service.thirdparty.CouponOnlineClient
import cn.freemud.service.thirdparty.ProductClient
import com.alibaba.fastjson.JSON
import com.alibaba.fastjson.TypeReference
import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo
import com.freemud.api.assortment.datamanager.manager.customer.AssortmentCustomerInfoManager
import com.freemud.application.sdk.api.base.SDKCommonBaseContextWare
import org.junit.runner.RunWith
import org.mockito.Mockito
import org.powermock.api.mockito.PowerMockito
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.PowerMockRunner
import org.powermock.modules.junit4.PowerMockRunnerDelegate
import org.spockframework.runtime.Sputnik
import spock.lang.Specification
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/3/16 15:16
* @description :
*/
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Sputnik.class)
@PrepareForTest([ShoppingCartConvertAdapter.class,
SDKCommonBaseContextWare.class])
class ShoppingCartNewServiceImpt2PowerMockTest extends Specification {
def shoppingCartNewServiceImpl = new ShoppingCartNewServiceImpl()
def customerInfoManager = PowerMockito.mock(AssortmentCustomerInfoManager)
def assortmentSdkService = new AssortmentSdkService()
def couponServiceImpl = new CouponServiceImpl()
def couponOnlineClient = PowerMockito.mock(CouponOnlineClient)
def itemService = new ItemServiceImpl()
def storeItemAdapter = new StoreItemAdapter()
def storeItemClient = PowerMockito.mock(ProductClient)
void setup() {
shoppingCartNewServiceImpl.customerInfoManager = customerInfoManager
shoppingCartNewServiceImpl.assortmentSdkService = assortmentSdkService
couponServiceImpl.couponOnlineClient = couponOnlineClient
couponServiceImpl.itemService = itemService
couponServiceImpl.storeItemClient = storeItemClient
itemService.storeItemAdapter = storeItemAdapter
itemService.storeItemClient = storeItemClient
assortmentSdkService.storeItemClient = storeItemClient
// mock静态类
PowerMockito.mockStatic(SDKCommonBaseContextWare.class)
}
def "测试 /addGoods"() {
given: "request 请求参数"
def addShoppingCartGoodsRequestVo = JSON.parseObject("{\"channelType\":\"saas\",\"channel\":1,\"partnerId\":\"2690\",\"appId\":\"wxa1f272347828dae8\",\"version\":\"2.0.68.7\",\"sessionId\":\"1410a547ea1bf178f17032a9e12ac6606db8cc6f\",\"orderType\":1,\"menuType\":\"saas\",\"shopId\":\"QAJIALE001\",\"spuId\":\"215809930343585821\",\"skuId\":\"\",\"qty\":1,\"categoryId\":\"0101\",\"productMaterialList\":[],\"categoryName\":\"单品\",\"productComboList\":[],\"productGroupList\":[],\"receiveId\":\"\",\"bizType\":null}"
, AddShoppingCartGoodsRequestVo.class)
and: "模拟第三方响应结果数据"
def customerInfoVo = JSON.parseObject("{\"accessToken\":\"\",\"alipayUserId\":\"\",\"appId\":\"wx3f7ca0c75b213380\",\"appSecret\":\"\",\"appsecret\":\"\",\"channel\":\"1\",\"customerId\":\"\",\"devBrand\":\"\",\"devModel\":\"\",\"iappId\":\"7\",\"memberId\":\"3614319825989629832\",\"mobile\":\"17327190802\",\"newMember\":false,\"nickName\":\"SWEET SUGA\",\"openId\":\"o98fP4qjUo7xm-nT-JAaVEk9yBqM\",\"openid\":\"o98fP4qjUo7xm-nT-JAaVEk9yBqM\",\"partnerId\":\"2581\",\"photoUrl\":\"https://thirdwx.qlogo.cn/mmopen/vi_32/zahIlicTNSM0IA0qjOryv6s0SzIhlwW9EpQKvL63GbPhBwficMAibDohDEibSCQU0I5KohibIpp0yL57TWRcVKrRH2A/132\",\"registerTime\":\"2021-02-26 14:10:26\",\"sessionId\":\"eac53a53f8ae62def7f40cb1e47a1bd9791d95a8\",\"sessionKey\":\"GCyyapzbBSM4yXh9AduGOw==\",\"session_key\":\"GCyyapzbBSM4yXh9AduGOw==\",\"storeId\":\"\",\"tableNumber\":\"\",\"thirdPartyMemberID\":\"\",\"thirdPartyPartnerID\":\"\",\"unionId\":\"o7cEm68JPFhbrzqb0a0BcQE-dDVA\",\"wxAppId\":\"wx3f7ca0c75b213380\",\"wxAppid\":\"wx3f7ca0c75b213380\"}"
, AssortmentCustomerInfoVo.class)
def responseDto = JSON.parseObject(""
, GetCouponDetailResponseDto.class)
def productInfosDto = JSON.parseObject(""
, ProductInfosDto.class)
def productListDto = JSON.parseObject(""
, ProductListDto.class)
def valiadProductResponse = JSON.parseObject(""
, new TypeReference<ProductBaseResponse<ValiadShopProductResponse>>() {})
def productInfosDto2 = JSON.parseObject(""
, new TypeReference<ProductInfosDto>() {})
// 模拟购物车商品
def goodList = JSON.parseArray("[{\"addCartTime\":1646286585880,\"amount\":800,\"canUseCoupon\":0,\"cartGoodsUid\":\"b8eca7b4-8627-4726-8560-b1d9f74a1c8b\",\"couponCode\":\"88709227085491207040\",\"createTimeMili\":1646286585880,\"extra\":[],\"goodsId\":\"spq88709227085491207040\",\"goodsType\":10,\"isB3S1Coupon\":0,\"isB3S1CouponGoods\":0,\"isMonthCard\":0,\"isMonthCardGoods\":0,\"isSunnyCoupon\":0,\"isUseMonthCard\":0,\"linkedId\":\"\",\"originalAmount\":0,\"originalPrice\":800,\"originalProductType\":1,\"packPrice\":0,\"pic\":\"https://picture.sandload.cn/1619081297921.jpg\",\"productComboList\":[],\"productGroupList\":[],\"productMaterialList\":[],\"qty\":2,\"skuId\":\"201889966261817090\",\"skuName\":\"鸡米花T\",\"spuId\":\"201889966261817090\",\"stockLimit\":false,\"unit\":\"\",\"weight\":0.0,\"weightType\":false},{\"addCartTime\":1646286600492,\"amount\":500,\"canUseCoupon\":1,\"cartGoodsUid\":\"87653424-e6ef-45c7-ad84-2ebc777cccc9\",\"categoryName\":\"缤纷小食\",\"classificationForeignName\":\"正价单品\",\"classificationId\":\"0102\",\"classificationName\":\"正价单品\",\"createTimeMili\":1646286600492,\"customerCode\":\"hn80180054\",\"finalPrice\":500,\"foreignName\":\"\",\"goodsId\":\"201889968054882060\",\"goodsType\":5,\"isB3S1Coupon\":0,\"isB3S1CouponGoods\":0,\"isMonthCard\":0,\"isMonthCardGoods\":0,\"isSunnyCoupon\":0,\"isUseMonthCard\":0,\"linkedId\":\"\",\"materialAmount\":0,\"memberDiscount\":100,\"name\":\"元气鸡排T\",\"originalAmount\":500,\"originalMaterialAmount\":0,\"originalPrice\":500,\"originalProductType\":1,\"packPrice\":0,\"pic\":\"https://picture.sandload.cn/1619082050722.jpg\",\"productComboList\":[],\"productGroupList\":[],\"productMaterialList\":[],\"qty\":1,\"riseSell\":1,\"singleOrder\":0,\"skuForeignName\":\"\",\"skuId\":\"\",\"skuName\":\"元气鸡排T\",\"spuForeignName\":\"\",\"spuId\":\"201889968054882060\",\"spuName\":\"元气鸡排T\",\"stockLimit\":false,\"subForeignName\":\"\",\"subName\":\"\",\"tax\":0.01,\"taxId\":\"\",\"unit\":\"\",\"weight\":0.0,\"weightType\":false}]"
, CartGoods.class)
and: "模拟第三方调用"
Mockito.when(customerInfoManager.getCustomerInfoByObject(Mockito.any())).thenReturn(customerInfoVo)
Mockito.when(couponOnlineClient.getCouponDetails(Mockito.any())).thenReturn(responseDto)
Mockito.when(storeItemClient.listProductInfos(Mockito.any())).thenReturn(productInfosDto)
Mockito.when(storeItemClient.getSpuIdsBySkuIds(Mockito.any())).thenReturn(productListDto)
Mockito.when(storeItemClient.validateShopProduct(Mockito.any())).thenReturn(valiadProductResponse)
Mockito.when(storeItemClient.listProductInfos(Mockito.any())).thenReturn(productInfosDto2)
Mockito.when(assortmentSdkService.getShoppingCart(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(goodList)
and: "静态方法mock"
PowerMockito.when(SDKCommonBaseContextWare.getBean(CouponService.class)).thenReturn(couponServiceImpl)
when: "调用方法逻辑"
def response = shoppingCartNewServiceImpl.addGoods(addShoppingCartGoodsRequestVo)
then: "验证 返回结果"
with(response) {
code == "100"
message == "success"
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment