Commit 0789c9d4 by 徐康

Merge branch 'feature/20201229_xukang_麦咖啡p5v1'

# Conflicts:
#	order-application-service/pom.xml
#	order-application-service/src/main/java/cn/freemud/adapter/OrderAdapter.java
#	order-application-service/src/test/java/cn/freemud/service/impl/MallOrderServiceImplTest.java
parents 05c82cf9 0483bbd7
......@@ -495,7 +495,7 @@ public class OrderSdkAdapter {
if (QueryOrderAccountType.DELIVERY_AMOUNT.equals(accountRequest.getAccountType())
|| QueryOrderAccountType.PACK_AMOUNT.equals(accountRequest.getAccountType())
|| QueryOrderAccountType.CARD_ORIGINAL_AMOUNT.equals(accountRequest.getAccountType())
|| QueryOrderAccountType.MCCAFE_MONTH_CARD.equals(accountRequest.getAccountType())) {
|| QueryOrderAccountType.WITH_ORDER_BUY_COUPON_FEE.equals(accountRequest.getAccountType())) {
OrderCostCreateReq orderCostCreateReq = new OrderCostCreateReq();
orderCostCreateReq.setCostName(accountRequest.getName());
//新订单服务 1=包装费,2=运费,3=餐盒单价,4=餐盒数量
......@@ -551,7 +551,7 @@ public class OrderSdkAdapter {
case "CARD_ORIGINAL_AMOUNT":
type = 5;
break;
case "MCCAFE_MONTH_CARD":
case "WITH_ORDER_BUY_COUPON_FEE":
type = 10;
break;
default:
......
......@@ -25,7 +25,13 @@
<dependency>
<groupId>com.freemud.sdk.api.assortment</groupId>
<artifactId>assortment-orderdistributor-sdk</artifactId>
<version>3.5.6.RELEASE</version>
<version>3.5.4.RELEASE</version>
<exclusions>
<exclusion>
<groupId>cn.freemud</groupId>
<artifactId>ordercenter-sdk</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.freemud.application.service.sdk</groupId>
......
......@@ -313,19 +313,6 @@ public class DeliveryAdapter {
createDeliveryPreferentialVo.setPreferentialContent(accountBean.getName());
createDeliveryPreferentialVo.setPreferentialPrice(0-accountBean.getPrice());
createDeliveryPreferentialVos.add(createDeliveryPreferentialVo);
} else if (OldOrderAccountType.WITH_ORDER_BUY_COUPON_FEE.getCode().equals(accountBean.getType())) {
ProductInfo productInfo = new ProductInfo();
productInfo.setProductCode(accountBean.getAccountId());
productInfo.setProductName(accountBean.getName());
productInfo.setProductNumber(1);
productInfo.setProductPrice(accountBean.getPrice().intValue());
//餐道使用
productInfo.setCumulatedTotal(accountBean.getPrice().intValue());
productInfo.setTaxId("10");
productInfo.setTaxRate(6d);
productInfo.setParentCode(-1l);
productInfos.add(productInfo);
}
});
deliveryOrderRequestDto.setPreferentials(createDeliveryPreferentialVos);
......
......@@ -109,6 +109,13 @@ public class OrderAdapter {
private String mcCafePartnerId;
@Value("${mcCafe.refund.interval}")
private String mccafeRefundInterval;
@Value("${macafe.waimai.tag}")
private String maCafeWaimaiTag;
@Value("${macafe.pick.tag}")
private String maCafePickTag;
@Value("${mccafe.monthCard.goodsId}")
private String mccafeMonthCardGoodsId;
/**
* coco商户
*/
......@@ -122,10 +129,6 @@ public class OrderAdapter {
private String backOrdersChangeOrderStatusConsumerQueue;
@Value("${program.backorders_notify_activity_exchange}")
private String backOrdersNotifyActivityExchange;
@Value("${macafe.waimai.tag}")
private String maCafeWaimaiTag;
@Value("${macafe.pick.tag}")
private String maCafePickTag;
@Autowired
private ShoppingCartAdapter shoppingCartAdapter;
@Autowired
......@@ -189,6 +192,43 @@ public class OrderAdapter {
}
}
}
if(null != shoppingCartGoodsDto.getPayCardFee() && 0l != shoppingCartGoodsDto.getPayCardFee() && StringUtils.isNotBlank(createOrderVo.getCardKeyCode())) {
CreateOrderProductRequest createOrderProductDemoDto = new CreateOrderProductRequest();
createOrderProductDemoDto.setProductId(mccafeMonthCardGoodsId);
createOrderProductDemoDto.setProductName("啡常月享卡");
createOrderProductDemoDto.setSpecification(mccafeMonthCardGoodsId);
createOrderProductDemoDto.setSpecificationName("啡常月享卡");
createOrderProductDemoDto.setPrice(shoppingCartGoodsDto.getPayCardFee());
createOrderProductDemoDto.setSalePrice(shoppingCartGoodsDto.getPayCardFee());
createOrderProductDemoDto.setTotalDiscountAmount(0l);
createOrderProductDemoDto.setNumber(1);
createOrderProductDemoDto.setProductType(ProductTypeEnum.WITH_ORDER_VIRTUAL_PRODUCT.getCode());
createOrderProductDemoDto.setParentProductId("0");
createOrderProductDemoDto.setIsFixedProduct(null);
createOrderProductDemoDto.setCustomerCode(createOrderVo.getCardKeyCode());
createOrderProductDemoDto.setProductCode(createOrderVo.getCardKeyCode());
createOrderProductDemoDto.setHasStockProudct(false);
createOrderProductDemoDto.setWeight(0d);
createOrderProductDemoDto.setStapleFood(0);
createOrderProductDemoDto.setTax(0d);
createOrderProductDemoDto.setTaxId("");
if(ProductTypeEnum.TABLEWARE_PRODUCT.getCode().equals(products.get(products.size()-1).getProductType())) {
products.add(products.size()-1, createOrderProductDemoDto);
} else {
products.add(createOrderProductDemoDto);
}
CreateOrderAccountRequest createOrderAccountDto = CreateOrderAccountRequest.builder()
.accountId("")
.name("啡常月享卡")
.price(shoppingCartGoodsDto.getPayCardFee())
.accountType(QueryOrderAccountType.WITH_ORDER_BUY_COUPON_FEE)
.sequence(orderAccountIndex++)
.productId(createOrderVo.getCardKeyCode())
.build();
orderAccountDtos.add(createOrderAccountDto);
}
createOrderDto.setProducts(products);
boolean hasDeliveryMonthCard = false;
for (ActivityDiscountsDto activityDiscountsDto : activityDiscountsDtos) {
......@@ -277,17 +317,6 @@ public class OrderAdapter {
.build();
orderAccountDtos.add(createOrderAccountDto);
}
if(null != shoppingCartGoodsDto.getPayCardFee() && 0l != shoppingCartGoodsDto.getPayCardFee() && StringUtils.isNotBlank(createOrderVo.getCardKeyCode())) {
CreateOrderAccountRequest createOrderAccountDto = CreateOrderAccountRequest.builder()
.accountId("")
.name("啡常月享卡")
.price(shoppingCartGoodsDto.getPayCardFee())
.accountType(QueryOrderAccountType.MCCAFE_MONTH_CARD)
.sequence(orderAccountIndex++)
.productId(createOrderVo.getCardKeyCode())
.build();
orderAccountDtos.add(createOrderAccountDto);
}
createOrderDto.setAccounts(CollectionUtils.isNotEmpty(orderAccountDtos) ? orderAccountDtos : Collections.emptyList());
// update by miaohui 20201030 for 【ID1018638】【C端服务端】活动库存接口调整对接
......@@ -1307,19 +1336,6 @@ public class OrderAdapter {
//商品信息转换
convent2ProductVos(ordersBean.getProductList(), responseVo,ordersBean.getCompanyId());
responseVo.setOrderAccounts(convent2OrderAccountVo(ordersBean.getApportionDetails()));
if(CollectionUtils.isNotEmpty(ordersBean.getOrderCostDetailList())) {
ordersBean.getOrderCostDetailList().forEach(o -> {
if(o.getCostType() == 10 && o.getBillType() == 1) {
ProductVo productVo = new ProductVo();
productVo.setQty(1);
productVo.setName(o.getCostName());
productVo.setSpuName(o.getCostName());
productVo.setFinalPrice(o.getCostAmount().longValue());
productVo.setOriginalPrice(o.getActualCostAmount().longValue());
responseVo.getProducts().add(productVo);
}
});
}
Long promotionAmount = 0L;
Long deliveryAmount = 0L;
Long packageAmount = 0L;
......
......@@ -1292,28 +1292,6 @@ public class MCCafeOrderServiceImpl implements MCCafeOrderService {
return newSendPaySuccessNoticeMessage();
}
private PlatformBaseRequest getRequest(OrderBean orderInfo) {
PlatformBaseRequest request = new PlatformBaseRequest();
AssortmentOpenApiEncryptDto openApiEncrypts = cacheOpenApiEncryptManager.getAssortmentOpenApiEncrypt(orderInfo.getCompanyId(), OpenPlatformEncryptUrlType.REFUND_STATUS_CHANGE_NOTIFY_URL);
request.setAppId(openApiEncrypts.getAppId());
request.setPartnerId(orderInfo.getCompanyId());
request.setVer("1");
OrderRefundStatusChangeRequestBody orderBody = new OrderRefundStatusChangeRequestBody();
orderBody.setOrderCode(orderInfo.getOid());
orderBody.setTimeStamp(System.currentTimeMillis()+"");
orderBody.setRefundType(AfterSalesType.OTHER.getIndex().toString());
orderBody.setRefundStatus(com.freemud.sdk.api.assortment.order.enums.RefundStatus.COMPLETE_REFUND.getCode().toString());
orderBody.setRefundReason("门店线下退款");
request.setRequestBody(JSON.toJSONString(orderBody));
String content = MapBeanConvertUtil.sortObjWithoutSign(request);
try {
request.setSign(RSASignUtil.getSign(content, openApiEncrypts.getServerPrivateKey(), "UTF-8"));
} catch (Exception e) {
LogUtil.error("getPlatformBaseRequest", content, JSON.toJSONString(openApiEncrypts), e);
}
return request;
}
/**
* 取消配送
*
......
package cn.freemud.service.impl;
import cn.freemud.entities.vo.CreateOrderVo;
import cn.freemud.management.entities.dto.request.order.OrderManagerRequest;
import cn.freemud.management.service.adapter.OrderManagerAdapter;
import cn.freemud.management.thirdparty.MulitiPaymentClient;
......@@ -8,6 +9,8 @@ import com.freemud.application.sdk.api.ordercenter.request.OrderConditionsReq;
import com.freemud.application.sdk.api.ordercenter.service.OrderDownLoadSdkService;
import com.freemud.sdk.api.assortment.order.request.order.MultiOrderRefundRequest;
import com.freemud.sdk.api.assortment.order.response.order.MultiOrderRefundResponse;
import org.hibernate.validator.HibernateValidator;
import org.hibernate.validator.HibernateValidatorConfiguration;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -20,6 +23,11 @@ import org.springframework.core.SpringVersion;
import org.springframework.test.context.junit4.SpringRunner;
import springfox.documentation.spring.web.json.Json;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.ValidatorFactory;
import java.util.Set;
@RunWith(SpringRunner.class)
@SpringBootTest
@EnableDiscoveryClient
......@@ -27,6 +35,74 @@ import springfox.documentation.spring.web.json.Json;
@EnableAutoConfiguration
public class MallOrderServiceImplTest {
@Autowired
private OrderDownLoadSdkService orderDownLoadSdkService;
// @Autowired
// private MallOrderServiceImpl mallOrderService;
//
// @Autowired
// private MCCafeOrderServiceImpl mcCafeOrderService;
//
// @Autowired
// private MulitiPaymentClient mulitiPaymentClient;
//
// @Autowired
// private OrderManagerAdapter orderManagerAdapter;
// @Before
// public void before() throws Exception {
// }
//
// @After
// public void after() throws Exception {
// }
// @Test
// public void f1() {
// mcCafeOrderService.createOrder(JSON.parseObject("{\"channelType\":\"saas\",\"couponCode\":\"\",\"menuType\":\"saasdelivery\",\"needInvoice\":0,\"needTableware\":0,\"orderRemark\":\"\",\"orderType\":2,\"partnerId\":\"1206\",\"payChannelType\":1,\"receiveId\":\"3599568180562003060\",\"sessionId\":\"c4377678dbcbd6cdf6e7df86ea112b6f82723023\",\"shopId\":\"1450026\",\"takeMealFlag\":\"0\"}", CreateOrderVo.class),
// new StoreResponse.BizVO(),
// JSON.parseObject("{\"activityDiscountsDtos\":[],\"deliveryAmount\":10,\"discountDeliveryAmount\":10,\"isDiscountDelivery\":false,\"originalTotalAmount\":4400,\"packageAmount\":0,\"products\":[{\"activityDiscountsDtos\":[],\"attributeNames\":\"{\\\"attributeNames\\\":\\\"\\\"}\",\"cartGoodsUid\":\"eb8c7260-8ecb-44d1-9234-8d8bed0b0875\",\"classificationId\":\"\",\"classificationName\":\"\",\"comboProducts\":[{\"attributeNames\":\"{\\\"attributeNames\\\":\\\"\\\"}\",\"customerCode\":\"501642\",\"extraList\":[],\"hasProductCoupon\":false,\"isFixedProduct\":false,\"materialList\":[],\"originalPrice\":1700,\"parentProductId\":\"184437853099519288\",\"picture\":\"https://picture.sandload.cn/1598678546485.png\",\"productType\":6,\"qty\":2,\"skuId\":\"184437494035639613\",\"skuName\":\"中杯热美式\",\"spuId\":\"184437494035639613\",\"spuName\":\"中杯热美式\",\"stockLimit\":false,\"tax\":0.01,\"taxId\":\"\",\"totalDiscountAmount\":0,\"unit\":\"\",\"weight\":0.0},{\"attributeNames\":\"{\\\"attributeNames\\\":\\\"\\\"}\",\"customerCode\":\"901290\",\"extraList\":[],\"hasProductCoupon\":false,\"isFixedProduct\":false,\"materialList\":[],\"originalPrice\":500,\"parentProductId\":\"184437853099519288\",\"picture\":\"https://picture.sandload.cn/1598677404074.png\",\"productType\":6,\"qty\":2,\"skuId\":\"184436294373469463\",\"skuName\":\"经典芝士蛋糕\",\"spuId\":\"184436294373469463\",\"spuName\":\"经典芝士蛋糕\",\"stockLimit\":false,\"tax\":0.01,\"taxId\":\"\",\"totalDiscountAmount\":0,\"unit\":\"\",\"weight\":0.0}],\"customerCode\":\"901280\",\"extraList\":[],\"hasProductCoupon\":false,\"materialList\":[],\"originalPrice\":4400,\"picture\":\"https://picture.sandload.cn/1598678861518.png\",\"productCode\":\"901280\",\"productType\":6,\"qty\":2,\"salePrice\":4400,\"skuId\":\"184437853099519288\",\"skuName\":\"早餐啡常搭\",\"spuId\":\"184437853099519288\",\"spuName\":\"早餐啡常搭\",\"stockLimit\":false,\"tax\":0.01,\"taxId\":\"\",\"totalDiscountAmount\":0,\"unit\":\"\",\"weight\":0.0}],\"shareDiscountActivityDtos\":[],\"totalAmount\":4400,\"totalDiscountAmount\":0}", ShoppingCartGoodsDto.class),
// new OrderExtendedReq(),
// OrderClientType.SAAS,"www");
// }
@Test
public void f2() {
HibernateValidatorConfiguration configuration = Validation.byProvider(HibernateValidator.class)
.configure()
.failFast(false);
ValidatorFactory validatorFactory = configuration.buildValidatorFactory();
Set<ConstraintViolation<CreateOrderVo>> set = validatorFactory.getValidator().validate(new CreateOrderVo());
}
//
// @Test
// public void testPaySuccess() {
// //0元支付
// String fmId = "SPAY" + ValidationCode.getRandomUuid();
// PaysuccessNoticeMessage message = new PaysuccessNoticeMessage();
// message.setResult_code(100);
// message.setOut_trade_no(fmId);
// message.setTrans_id("16303606485084241800003");
// message.setTotal_fee(0);
// message.setOpenid("oORZK5MHMBm78PO302NdRyzIY5K0");
// message.setPlatform_coupon(0);
// message.setMerchant_coupon(0);
// mallOrderService.paySuccessCallback(message);
// }
// @Test
// public void testAffirm() {
// OrderAffirmRequestVO requestVO = new OrderAffirmRequestVO();
// requestVO.setPartnerId("1864");
// requestVO.setShopId("8899");
// requestVO.setSessionId("123123");
// requestVO.setChannelType("saasmall");
// requestVO.setOid("16303606485084241800003");
// mallOrderService.orderAffirm(requestVO);
// }
@Test
public void test() {
String version = SpringVersion.getVersion();
......
......@@ -116,15 +116,12 @@ public class PaymentHandle {
orderRefundResponse = standardPaymentService.orderRefund(orderRefundRequest, "");
}catch (Exception ex){
ErrorLog.errorConvertJson(this.getClass(), "refundError", ex);
throw new OrderServiceException(ResponseResult.REFUND_EXCEPTION);
return handlePayRefundResponse(PayRefundStatus.FAIL,orderRefundRequest.getRefundId());
}
if (orderRefundResponse==null){
throw new OrderServiceException(ResponseResult.REFUND_EXCEPTION);
if (orderRefundResponse==null || ObjectUtils.notEqual(orderRefundResponse.getCode(),SUCCESS)){
return handlePayRefundResponse(PayRefundStatus.FAIL,orderRefundRequest.getRefundId());
}
if (ObjectUtils.notEqual(orderRefundResponse.getCode(),SUCCESS)){
throw new OrderServiceException(ResponseResult.REFUND_FAIL,orderRefundResponse.getMessage());
}
refundStatus=ObjectUtils.equals( PayRefundStatus.SUCCESS.getCode(), orderRefundResponse.getData().getRefundStatus())?PayRefundStatus.SUCCESS:PayRefundStatus.RUNNING;
refundStatus=ObjectUtils.equals(PayRefundStatus.SUCCESS.getCode(), orderRefundResponse.getData().getRefundStatus())?PayRefundStatus.SUCCESS:PayRefundStatus.FAIL;
return handlePayRefundResponse(refundStatus,orderRefundRequest.getRefundId());
}
......
......@@ -15,8 +15,13 @@ import cn.freemud.management.thirdparty.CustomerMcCafeClient;
import cn.freemud.management.thirdparty.DeliveryMCCafeClient;
import cn.freemud.management.util.ResponseUtil;
import com.freemud.application.sdk.api.deliverycenter.response.DeliveryResponseDto;
import com.freemud.application.sdk.api.ordercenter.enums.AbnormalStateEnum;
import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType;
import com.freemud.application.sdk.api.ordercenter.request.SdkUpdateAbnormalState;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderCostResp;
import com.freemud.application.sdk.api.ordercenter.service.OrderSdkService;
import com.freemud.sdk.api.assortment.message.enums.OrderType;
import com.freemud.sdk.api.assortment.order.enums.PayRefundStatus;
import com.freemud.sdk.api.assortment.order.response.order.QueryOrdersResponse;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils;
......@@ -58,7 +63,7 @@ public class McCafeMangerServiceImpl implements OrderManagerService {
@Resource
private DeliveryMCCafeClient deliveryMCCafeClient;
@Resource
private CustomerMcCafeClient customerMcCafeClient;
private OrderSdkService orderSdkService;
@Value("${mccafe.partner.id}")
private String macCafePartnerId;
......@@ -124,10 +129,21 @@ public class McCafeMangerServiceImpl implements OrderManagerService {
}else {
//支付退款
PayRefundResponse refundResponse = paymentHandle.mcCafeRefund(orderManagerRequest, orderBean);
if(refundResponse.getPayRefundStatus().getCode().equals(PayRefundStatus.SUCCESS.getCode())) {
//订单拒单
saasOrderHandle.mcCafeOrderReject(orderManagerRequest, refundResponse, orderBean);
//冲正库存
stockHandle.revert(orderManagerRequest, orderBean);
} else {
SdkUpdateAbnormalState sdkUpdateAbnormalState = new SdkUpdateAbnormalState();
sdkUpdateAbnormalState.setOrderCode(request.getOrderId());
sdkUpdateAbnormalState.setPartnerId(request.getPartnerId());
sdkUpdateAbnormalState.setAbnormalState(AbnormalStateEnum.ABNORMAL.getCode());
sdkUpdateAbnormalState.setAbnormalDesc("支付退款失败,订单入机失败回调异常");
sdkUpdateAbnormalState.setOrderClient(OrderClientType.SAAS.getIndex());
sdkUpdateAbnormalState.setOperator(request.getOperator());
orderSdkService.updateAbnormalState(sdkUpdateAbnormalState);
}
}
return ResponseUtil.success();
}
......@@ -186,11 +202,22 @@ public class McCafeMangerServiceImpl implements OrderManagerService {
@Override
public BaseResponse<OrderManagerResponse> orderAgreeRefund(OrderManagerRequest request, QueryOrdersResponse.DataBean.OrderBean orderBean) {
//支付退款
PayRefundResponse refund = paymentHandle.mcCafeRefund(request, orderBean);
PayRefundResponse refundResponse = paymentHandle.mcCafeRefund(request, orderBean);
if(refundResponse.getPayRefundStatus().getCode().equals(PayRefundStatus.SUCCESS.getCode())) {
//订单拒单
saasOrderHandle.mcCafeRefundAgree(request,refund, orderBean);
saasOrderHandle.mcCafeRefundAgree(request, refundResponse, orderBean);
//冲正库存
stockHandle.revert(request, orderBean);
} else {
SdkUpdateAbnormalState sdkUpdateAbnormalState = new SdkUpdateAbnormalState();
sdkUpdateAbnormalState.setOrderCode(request.getOrderId());
sdkUpdateAbnormalState.setPartnerId(request.getPartnerId());
sdkUpdateAbnormalState.setAbnormalState(AbnormalStateEnum.ABNORMAL.getCode());
sdkUpdateAbnormalState.setAbnormalDesc("支付退款失败,订单入机失败回调异常");
sdkUpdateAbnormalState.setOrderClient(OrderClientType.SAAS.getIndex());
sdkUpdateAbnormalState.setOperator(request.getOperator());
orderSdkService.updateAbnormalState(sdkUpdateAbnormalState);
}
return ResponseUtil.success();
}
......@@ -215,11 +242,22 @@ public class McCafeMangerServiceImpl implements OrderManagerService {
@Override
public BaseResponse<OrderManagerResponse> orderCancel(OrderManagerRequest request, QueryOrdersResponse.DataBean.OrderBean orderBean) {
//支付退款
PayRefundResponse refund = paymentHandle.mcCafeRefund(request, orderBean);
PayRefundResponse refundResponse = paymentHandle.mcCafeRefund(request, orderBean);
if(refundResponse.getPayRefundStatus().getCode().equals(PayRefundStatus.SUCCESS.getCode())) {
//订单拒单
saasOrderHandle.orderCancel(request,refund, orderBean);
saasOrderHandle.orderCancel(request, refundResponse, orderBean);
//冲正库存
stockHandle.revert(request, orderBean);
} else {
SdkUpdateAbnormalState sdkUpdateAbnormalState = new SdkUpdateAbnormalState();
sdkUpdateAbnormalState.setOrderCode(request.getOrderId());
sdkUpdateAbnormalState.setPartnerId(request.getPartnerId());
sdkUpdateAbnormalState.setAbnormalState(AbnormalStateEnum.ABNORMAL.getCode());
sdkUpdateAbnormalState.setAbnormalDesc("支付退款失败,订单入机失败回调异常");
sdkUpdateAbnormalState.setOrderClient(OrderClientType.SAAS.getIndex());
sdkUpdateAbnormalState.setOperator(request.getOperator());
orderSdkService.updateAbnormalState(sdkUpdateAbnormalState);
}
return ResponseUtil.success();
}
......
......@@ -25,6 +25,7 @@ public enum ProductTypeEnum {
TABLEWARE_PRODUCT(12,"餐具商品"),
MATERIAL_PRODUCT(88,"加料商品"),
LITTLE_MATERIAL_PRODUCT(89,"小料"),
WITH_ORDER_VIRTUAL_PRODUCT(90,"随单购虚拟商品"),
;
......
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