Commit 2f3ab06b by box

Merge branch 'feature/box/券包退款' into develop

parents 1f540623 8c6db0e2
...@@ -5,6 +5,7 @@ import cn.freemud.adapter.OrderCancelReqAdapter; ...@@ -5,6 +5,7 @@ import cn.freemud.adapter.OrderCancelReqAdapter;
import cn.freemud.adapter.OrderPrintDtoAdapter; import cn.freemud.adapter.OrderPrintDtoAdapter;
import cn.freemud.adapter.OrderTaskReqAdapter; import cn.freemud.adapter.OrderTaskReqAdapter;
import cn.freemud.base.util.DateUtil; import cn.freemud.base.util.DateUtil;
import cn.freemud.demoTest.enums.TradeBizTypeEnum;
import cn.freemud.entities.dto.delivery.QueryFreightRefundSupportedResponse; import cn.freemud.entities.dto.delivery.QueryFreightRefundSupportedResponse;
import cn.freemud.entities.dto.delivery.QueryFreightRefundSupportedVo; import cn.freemud.entities.dto.delivery.QueryFreightRefundSupportedVo;
import cn.freemud.entities.dto.ecology.SendMessageRequest; import cn.freemud.entities.dto.ecology.SendMessageRequest;
...@@ -20,6 +21,8 @@ import cn.freemud.management.entities.dto.request.order.OrderManagerRequest; ...@@ -20,6 +21,8 @@ import cn.freemud.management.entities.dto.request.order.OrderManagerRequest;
import cn.freemud.management.entities.dto.response.pay.PayRefundResponse; import cn.freemud.management.entities.dto.response.pay.PayRefundResponse;
import cn.freemud.management.enums.AfterSalesRefunStateEnum; import cn.freemud.management.enums.AfterSalesRefunStateEnum;
import cn.freemud.management.service.adapter.OrderManagerAdapter; import cn.freemud.management.service.adapter.OrderManagerAdapter;
import cn.freemud.management.service.handle.CouponQueryHandle;
import cn.freemud.management.service.handle.OrderCouponHandle;
import cn.freemud.management.service.handle.OrderVerifyHandle; import cn.freemud.management.service.handle.OrderVerifyHandle;
import cn.freemud.management.service.handle.PaymentHandle; import cn.freemud.management.service.handle.PaymentHandle;
import cn.freemud.redis.RedisCache; import cn.freemud.redis.RedisCache;
...@@ -41,6 +44,7 @@ import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto; ...@@ -41,6 +44,7 @@ import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto;
import com.freemud.application.sdk.api.ordercenter.response.OrderBaseResp; import com.freemud.application.sdk.api.ordercenter.response.OrderBaseResp;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.AfterSalesOrderResp; import com.freemud.application.sdk.api.ordercenter.response.orderInfo.AfterSalesOrderResp;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs; import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderSettlementResp;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.QueryByCodeResponse; import com.freemud.application.sdk.api.ordercenter.response.orderInfo.QueryByCodeResponse;
import com.freemud.application.sdk.api.ordercenter.service.OrderSdkService; import com.freemud.application.sdk.api.ordercenter.service.OrderSdkService;
import com.freemud.application.sdk.api.structure.request.PushMessageNoticeDto; import com.freemud.application.sdk.api.structure.request.PushMessageNoticeDto;
...@@ -61,6 +65,7 @@ import java.math.BigDecimal; ...@@ -61,6 +65,7 @@ import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
import static cn.freemud.constant.OrderRefundConstant.ALLOW_REFUND; import static cn.freemud.constant.OrderRefundConstant.ALLOW_REFUND;
...@@ -87,6 +92,8 @@ public class RefundService { ...@@ -87,6 +92,8 @@ public class RefundService {
private final OrderManagerAdapter orderManagerAdapter; private final OrderManagerAdapter orderManagerAdapter;
private final OrderVerifyHandle orderVerifyHandle; private final OrderVerifyHandle orderVerifyHandle;
private final StoreManager storeManager; private final StoreManager storeManager;
private final CouponQueryHandle couponQueryHandle;
private final OrderCouponHandle orderCouponHandle;
private OrderInfoReqs preValidRefund(String partnerId, String orderCode, Byte refundMode) { private OrderInfoReqs preValidRefund(String partnerId, String orderCode, Byte refundMode) {
// 查询订单信息 // 查询订单信息
...@@ -140,6 +147,11 @@ public class RefundService { ...@@ -140,6 +147,11 @@ public class RefundService {
if (!orderVerifyHandle.getRefundConfig(order)) if (!orderVerifyHandle.getRefundConfig(order))
throw new ServiceException("该门店不支持线上退款,请联系门店进行线下处理"); throw new ServiceException("该门店不支持线上退款,请联系门店进行线下处理");
// 如果是买券订单,查询券是否已使用,如果没有使用,冻结券,否则不许退款
if (BizTypeEnum.SALE_COUPON.getBizType().equals(order.getBizType())) {
freezeCouponCode(partnerId, order);
}
// 退款是否退配送费 // 退款是否退配送费
boolean refundDeliveryFee = isRefundDeliveryFee(order, refundAmount); boolean refundDeliveryFee = isRefundDeliveryFee(order, refundAmount);
// 未接单 // 未接单
...@@ -406,4 +418,28 @@ public class RefundService { ...@@ -406,4 +418,28 @@ public class RefundService {
ErrorLog.errorConvertJson(this.getClass(), "打印退款小票异常", e); ErrorLog.errorConvertJson(this.getClass(), "打印退款小票异常", e);
} }
} }
/**
* 校验券状态,如果没有核销则冻结券,否则抛异常
* <pre></pre>
* @param partnerId
* @param orderInfo
* @throws ServiceException
*/
private void freezeCouponCode(String partnerId, OrderInfoReqs orderInfo) {
List<String> couponCodes = Optional.ofNullable(orderInfo.getOrderSettlementDetailList()).orElse(new ArrayList<>()).stream()
.filter(dto -> Objects.equals(OrderSettlementType.SEND_COUPON.getIndex(), dto.getSettlementType()) && StringUtils.isNotBlank(dto.getExternalObjectId()))
.map(OrderSettlementResp::getExternalObjectId)
.collect(Collectors.toList());
boolean couponUsed = couponQueryHandle.isCouponUsed(partnerId, couponCodes);
if (couponUsed) {
throw new ServiceException("识别到您已使用过该券包中的部分或全部券,故不支持退款。");
}
// 冻结券
boolean freeze = orderCouponHandle.freezeCodes(partnerId, orderInfo.getUserId(), couponCodes, "买券订单退款");
if (!freeze) {
throw new ServiceException("优惠券校验失败,请稍后再试!");
}
}
} }
package cn.freemud.management.entities.dto.request.coupon;
import lombok.Data;
import org.springframework.lang.Nullable;
/**
* &copy; All rights Reserved, Designed By www.freemud.cn
*
* @author wénkǎi.zhāng 2023-05-30
* @since 1.0
*/
@Data
public class CodeInfoQueryDto {
/**
* 券名称
*/
private String name;
/**
* 券号,目前最长23个字符
*/
private String code;
/**
* 券Logo
*/
private String logo;
/**
* 券类型
*/
private Integer type;
/**
* 券状态:0可用,1已核销,2部分核销
*/
private Integer state;
/**
* 当前剩余可用次数
*/
private Integer leftAvailableTimes;
/**
* 最大剩余可用次数
*/
private Integer maxLeftAvailableTimes;
/**
* 优惠券使用限制相关配置
*/
private CouponCodeUseRuleModel couponUseRule;
@Data
public static class CouponCodeUseRuleModel {
/**
* 最大可核销次数,大于1时为频次券, 默认1次
*/
private int maxRedeemTimes = 1;
/**
* 核销次数限制类型对应的可核销次数,频次券时有效,默认null不限
*/
@Nullable
private Integer limitedRedeemTimes;
}
}
package cn.freemud.management.entities.dto.response.coupon; package cn.freemud.management.entities.dto.response.coupon;
import com.fasterxml.jackson.annotation.JsonAlias;
import lombok.Data; import lombok.Data;
/** /**
...@@ -17,6 +18,7 @@ public class CouponBaseResponse<T> { ...@@ -17,6 +18,7 @@ public class CouponBaseResponse<T> {
*/ */
private String msg; private String msg;
@JsonAlias("data")
private T result; private T result;
} }
package cn.freemud.management.enums;
public enum CouponStatus {
STATUS(-1, "未激活"),
STATUS_0(0, "可用"),
STATUS_1(1, "已使用"),
STATUS_2(2, "部分使用"),
STATUS_3(3, "取消"),
STATUS_6(6, "已过期"),
;
private Integer code;
private String desc;
CouponStatus(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
public static CouponStatus getByCode(Integer code) {
for (CouponStatus payType : values()) {
if (payType.getCode().equals(code)) {
return payType;
}
}
return null;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
package cn.freemud.management.service.handle;
import cn.freemud.management.entities.dto.request.coupon.CodeInfoQueryDto;
import cn.freemud.management.entities.dto.response.coupon.CouponBaseResponse;
import cn.freemud.management.enums.CouponStatus;
import cn.freemud.management.thirdparty.CouponQueryClient;
import cn.freemud.management.thirdparty.request.coupon.CodeInfoQueryReq;
import com.alibaba.fastjson.JSONObject;
import com.freemud.application.sdk.api.log.ApiLog;
import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Component;
import java.util.*;
/**
* &copy; All rights Reserved
*
* @author wénkǎi.zhāng 2024-01-02
* @since 1.0
*/
@Component
@RequiredArgsConstructor
public class CouponQueryHandle {
private final CouponQueryClient couponQueryClient;
private final int SUCCESS_CODE = 100;
/**
* 查询券信息
* <pre>
* 1. 本方法会忽略查询失败的券,因此可能传入的券号不一定都能在返回列表中找到与之对应的券信息
* 2. 同时,本方法会对入参中的codes去重,券码接口对已归档的券也不会返回,基于本条和上一条,
* 应注意传入集合的size可能和返回列表的size不同,也许是正常现象
* 3. 本方法不保证返回的券信息顺序和入参的券号顺序相同
* </pre>
* @param partnerId
* @param codes 券号列表,支持 非码券/微信商家券/支付宝商家券
* @return 对券号列表去重后,成功查到的券信息列表
*/
public List<CodeInfoQueryDto> queryCodesInfo(String partnerId, Collection<String> codes) {
List<CodeInfoQueryDto> result = new ArrayList<>();
CodeInfoQueryReq request = new CodeInfoQueryReq();
request.setPartnerId(partnerId);
// 券码接口最大支持每次10个券号
Lists.partition(new ArrayList<>(new HashSet<>(codes)), 10).forEach(subList -> {
// 注意:如果改成并发调用,这里不能直接复用request
request.setCodes(subList);
try {
CouponBaseResponse<List<CodeInfoQueryDto>> resp = couponQueryClient.queryCodesInfo(request);
if (!Objects.equals(SUCCESS_CODE, resp.getStatusCode()) || CollectionUtils.isEmpty(resp.getResult())) {
ApiLog.warnMessage("优惠券信息查询失败:{} {}", JSONObject.toJSONString(request), JSONObject.toJSONString(resp));
return;
}
result.addAll(resp.getResult());
} catch (Throwable e) {
ApiLog.warnMessage("优惠券信息查询异常:{} {}", e.getMessage(), JSONObject.toJSONString(request));
}
});
return result;
}
/**
* 指定一组券号,判断这些券号中是否存在已使用的券
* <pre></pre>
* @param partnerId
* @param couponCodes
* @return 如果有一张或多张券没查到、或已使用、或已部分使用、或已锁定,返回true
*/
public boolean isCouponUsed(String partnerId, Collection<String> couponCodes) {
boolean used;
List<CodeInfoQueryDto> codeInfoQueryDtos = this.queryCodesInfo(partnerId, couponCodes);
// 以下条件任意一个成立,说明券已使用:
// 1. 返回的数量和查询的不一致
// 2. 存在已使用或者部分使用的券状态
// 3. 存在锁定的券(剩余核销次数!=总核销次数)
used = couponCodes.size() != codeInfoQueryDtos.size()
|| codeInfoQueryDtos.stream().anyMatch(o -> {
return CouponStatus.STATUS_1.getCode().equals(o.getState())
|| CouponStatus.STATUS_2.getCode().equals(o.getState())
|| !Objects.equals(o.getMaxLeftAvailableTimes(), o.getCouponUseRule().getMaxRedeemTimes());
});
return used;
}
}
package cn.freemud.management.service.handle;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.management.entities.dto.request.order.OrderManagerRequest;
import cn.freemud.management.entities.dto.response.coupon.CouponBaseResponse;
import cn.freemud.management.enums.ResponseResult;
import cn.freemud.management.thirdparty.CouponOnlineClient;
import cn.freemud.management.thirdparty.request.coupon.BatchCouponDiscardReq;
import cn.freemud.management.thirdparty.request.coupon.CodeFreezeReq;
import cn.freemud.management.thirdparty.request.coupon.CouponUnFreezeReq;
import cn.freemud.management.util.ResponseUtil;
import com.alibaba.fastjson.JSONObject;
import com.freemud.application.sdk.api.log.ApiLog;
import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1;
import com.freemud.application.sdk.api.ordercenter.enums.BizTypeEnum;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderSettlementResp;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.stream.Collectors;
/**
* &copy; All rights Reserved
*
* @author wénkǎi.zhāng 2024-01-02
* @since 1.0
*/
@Component
@RequiredArgsConstructor
public class OrderCouponHandle {
@Value("${coupon.partner.id:1983}")
private String couponPartnerId;
private final CouponQueryHandle couponQueryHandle;
private final CouponOnlineClient couponOnlineClient;
public BaseResponse discardOrderCoupon(String partnerId, OrderBeanV1 orderBean) {
if (BizTypeEnum.SALE_COUPON.getBizType().equals(orderBean.getBizType())) {
List<String> couponCodes = Optional.ofNullable(orderBean.getOrderSettlementDetailList()).orElse(new ArrayList<>()).stream()
// 216 = 买券订单的券信息
.filter(dto -> Objects.equals(216, dto.getSettlementType()) && StringUtils.isNotBlank(dto.getExternalObjectId()))
.map(OrderSettlementResp::getExternalObjectId)
.collect(Collectors.toList());
if (couponCodes.isEmpty()) {
return ResponseUtil.error(ResponseResult.SYSTEM_ERROR.getCode(), "订单中优惠券数据为空。");
}
// // 校验券状态是否已被使用
// if (couponQueryHandle.isCouponUsed(partnerId, couponCodes)) {
// return ResponseUtil.error(ResponseResult.SYSTEM_ERROR.getCode(), "作废优惠券失败,部分券已被使用。");
// }
BatchCouponDiscardReq discardReq = new BatchCouponDiscardReq();
discardReq.setCoupons(couponCodes.stream().map(code -> {
return new BatchCouponDiscardReq.CouponInfo(){{
setCode(code);
setMemberId(orderBean.getUserId());
}};
}).collect(Collectors.toList()));
discardReq.setPartnerId(partnerId);
discardReq.setProviderId(couponPartnerId);
discardReq.setCancelReason("券包订单退款");
CouponBaseResponse<Object> discardResp = couponOnlineClient.batchDiscard(discardReq);
if (!Objects.equals(discardResp.getStatusCode(), 100)) {
return ResponseUtil.error(ResponseResult.SYSTEM_ERROR.getCode(), "作废优惠券失败");
}
}
return ResponseUtil.success();
}
/**
* 冻结券
* <pre></pre>
* @param partnerId
* @param memberId
* @param codes 注意所有券号尾号必须相同
* @param reason
* @return
*/
public boolean freezeCodes(String partnerId, String memberId, Collection<String> codes, String reason) {
CodeFreezeReq req = new CodeFreezeReq();
req.setPartnerId(partnerId);
req.setReason(reason);
req.setCoupons(codes.stream().map(code -> {
return new CodeFreezeReq.CouponInfo(){{
setCode(code);
setMemberId(memberId);
}};
}).collect(Collectors.toList()));
CouponBaseResponse<Object> freeze = couponOnlineClient.freeze(req);
return Objects.equals(freeze.getStatusCode(), 100);
}
/**
* 解冻券
* <pre></pre>
* @param partnerId
* @param orderBean
*/
public void unfreezeOrderCoupon(String partnerId, OrderBeanV1 orderBean) {
if (BizTypeEnum.SALE_COUPON.getBizType().equals(orderBean.getBizType())) {
List<String> couponCodes = Optional.ofNullable(orderBean.getOrderSettlementDetailList()).orElse(new ArrayList<>()).stream()
// 216 = 买券订单的券信息
.filter(dto -> Objects.equals(216, dto.getSettlementType()) && StringUtils.isNotBlank(dto.getExternalObjectId()))
.map(OrderSettlementResp::getExternalObjectId)
.collect(Collectors.toList());
if (!couponCodes.isEmpty()) {
CouponUnFreezeReq unFreezeReq = new CouponUnFreezeReq();
unFreezeReq.setCoupons(couponCodes.stream().map(code -> {
return new CouponUnFreezeReq.CouponInfo(){{
setCode(code);
setMemberId(orderBean.getUserId());
}};
}).collect(Collectors.toList()));
unFreezeReq.setPartnerId(partnerId);
CouponBaseResponse<Object> unfreezeResp = couponOnlineClient.unfreeze(unFreezeReq);
if (!Objects.equals(unfreezeResp.getStatusCode(), 100)) {
ApiLog.warnMessage("refundReject 解冻券失败:{}", JSONObject.toJSONString(unfreezeResp));
}
}
}
}
}
...@@ -560,6 +560,9 @@ public class OrderVerifyHandle { ...@@ -560,6 +560,9 @@ public class OrderVerifyHandle {
// 除 未支付 拒单 和 取消外,其他可退款 // 除 未支付 拒单 和 取消外,其他可退款
return Stream.of(NewOrderStatus.PENDING_PAYMENT, NewOrderStatus.CLOSED) return Stream.of(NewOrderStatus.PENDING_PAYMENT, NewOrderStatus.CLOSED)
.noneMatch(s -> Objects.equals(order.getOrderState(), s.getIndex())); .noneMatch(s -> Objects.equals(order.getOrderState(), s.getIndex()));
} else if (BizTypeEnum.SALE_COUPON.getBizType().equals(order.getBizType())) {
// 买券订单判断,买券订单不受配置限制
return true;
} }
OrderExtInfoDto extInfo = JSON.parseObject(order.getExtInfo(), OrderExtInfoDto.class); OrderExtInfoDto extInfo = JSON.parseObject(order.getExtInfo(), OrderExtInfoDto.class);
// 查询小程序配置的退款设置 // 查询小程序配置的退款设置
......
...@@ -2,6 +2,7 @@ package cn.freemud.management.thirdparty; ...@@ -2,6 +2,7 @@ package cn.freemud.management.thirdparty;
import cn.freemud.management.entities.dto.response.coupon.CouponBaseResponse; import cn.freemud.management.entities.dto.response.coupon.CouponBaseResponse;
import cn.freemud.management.thirdparty.request.coupon.BatchCouponDiscardReq; import cn.freemud.management.thirdparty.request.coupon.BatchCouponDiscardReq;
import cn.freemud.management.thirdparty.request.coupon.CodeFreezeReq;
import cn.freemud.management.thirdparty.request.coupon.CouponUnFreezeReq; import cn.freemud.management.thirdparty.request.coupon.CouponUnFreezeReq;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
...@@ -21,6 +22,15 @@ public interface CouponOnlineClient { ...@@ -21,6 +22,15 @@ public interface CouponOnlineClient {
CouponBaseResponse<Object> batchDiscard(BatchCouponDiscardReq req); CouponBaseResponse<Object> batchDiscard(BatchCouponDiscardReq req);
/** /**
* 冻结券,注意该接口入参券号尾号必须相同,券数量最多20
* <pre></pre>
* @param req
* @return
*/
@PostMapping("/coupon/standard/ops/freeze")
CouponBaseResponse<Object> freeze(CodeFreezeReq req);
/**
* 解冻券,请求券号列表中,所有券号尾号必须一样 * 解冻券,请求券号列表中,所有券号尾号必须一样
* <pre></pre> * <pre></pre>
* @param req * @param req
......
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: CouponQueryClient
* @Package cn.freemud.service.thirdparty
* @Description:
* @author: song.cai
* @date: 2019/2/20 16:42
* @version V1.0
* @Copyright: 2019 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
package cn.freemud.management.thirdparty;
import cn.freemud.management.entities.dto.request.coupon.CodeInfoQueryDto;
import cn.freemud.management.entities.dto.response.coupon.CouponBaseResponse;
import cn.freemud.management.thirdparty.request.coupon.CodeInfoQueryReq;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@FeignClient(name = "OPEN-STORE-COUPON-QUERY-SERVICE", url = "${saas.coupon-query-service.feign.url:}")
@RequestMapping(produces = {"application/json;charset=UTF-8"})
public interface CouponQueryClient {
/**
* 查询券信息
* <pre></pre>
* @param request
* @return
*/
@PostMapping("coupon/query/info")
CouponBaseResponse<List<CodeInfoQueryDto>> queryCodesInfo(CodeInfoQueryReq request);
}
package cn.freemud.management.thirdparty.request.coupon;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.List;
/**
* &copy; All rights Reserved
*
* @author wénkǎi.zhāng 2023-12-27
* @since 1.0
*/
@Data
public class CodeFreezeReq {
@Size(min = 1, max = 20, message = "操作的券信息不能为空且最多支持20张")
private List<CouponInfo> coupons;
@NotBlank(message = "商户编号不能为空")
private String partnerId;
@ApiModelProperty("冻结原因。默认储值卡退款")
private String reason;
@Valid
@Data
public static class CouponInfo {
private String memberId;
@NotBlank(message = "券号不能为空")
private String code;
}
}
package cn.freemud.management.thirdparty.request.coupon;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* &copy; All rights Reserved, Designed By www.freemud.cn
*
* @author wénkǎi.zhāng 2023-05-30
* @since 1.0
*/
@Data
public class CodeInfoQueryReq {
@ApiModelProperty(value = "商户号", required = true, example = "1864")
private String partnerId;
@ApiModelProperty(value = "券号列表,最多支持10张券,支持 非码券/微信商家券/支付宝商家券", required = true, example = "[\"88600000001823678618\",\"88600000001823679226\"]")
private List<String> codes;
}
...@@ -49,6 +49,9 @@ public enum OrderSettlementType { ...@@ -49,6 +49,9 @@ public enum OrderSettlementType {
//待调整 //待调整
ONE_BY_ONE(207, "买一送一"), ONE_BY_ONE(207, "买一送一"),
DISCOUNT_COUPON(208, "折扣券"), DISCOUNT_COUPON(208, "折扣券"),
SEND_COUPON(216, "购买券包发的优惠券"),
FULL_DISTRIBUTION_FEE(1014, "满减配送费"), FULL_DISTRIBUTION_FEE(1014, "满减配送费"),
; ;
......
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