Commit 0fcac50f by 周晓航

Merge branch 'master' into master-spock

parents 9cb9de2c 656dd94d
......@@ -19,7 +19,8 @@ public enum PayRefundStatus {
/**
* 额外状态码 用于判断逻辑,
*/
NOT_SUFFICIENT_FUNDS(8200201,"余额不足");
NOT_SUFFICIENT_FUNDS(8200201,"余额不足"),
COMPATIBILITY_STATUS(9999999,"退款异常");
private Integer code;
private String desc;
......
......@@ -12,6 +12,10 @@
*/
package com.freemud.sdk.api.assortment.order.enums;
import java.util.Arrays;
import java.util.List;
/**
* 请勿使用已过期请用OldOrderAccountType 龚爱奇2019-05-19
*/
......@@ -44,19 +48,20 @@ public enum QueryOrderAccountType {
FULL_DISTRIBUTION_FEE("FULL_DISTRIBUTION_FEE", "满减配送费"),
OFFLINE_PAY("OFFLINE_PAY", "线下支付"),
GATHER_SPOT("GATHER_SPOT", "集点活动"),
MEMBER_PRICE_DISCOUNT("MEMBER_PRICE_DISCOUNT","会员价优惠"),
MCCAFE_MONTH_CARD("MCCAFE_MONTH_CARD","麦咖啡月卡"),
MEMBER_PRICE_DISCOUNT("MEMBER_PRICE_DISCOUNT", "会员价优惠"),
MCCAFE_MONTH_CARD("MCCAFE_MONTH_CARD", "麦咖啡月卡"),
WITH_ORDER_BUY_COUPON_FEE("WITH_ORDER_BUY_COUPON_FEE", "随单买月卡"),
COCO_PRODUCT_CASH_COUPON("COCO_PRODUCT_CASH_COUPON", "coco商品代金券"),
FULL_BUYM_SENDN("FULL_BUYM_SENDN", "满赠"),
FULL_M_COUNT_N_FOLD("FULL_M_COUNT_N_FOLD", "满M件N折"),
SCORE_PRODUCT_ACTIVITY("SCORE_PRODUCT_ACTIVITY", "积分商品活动"),
SINGLE_PRODUCT_REDUCTION("SINGLE_PRODUCT_REDUCTION", "单品立减")
;
SINGLE_PRODUCT_REDUCTION("SINGLE_PRODUCT_REDUCTION", "单品立减");
private String code;
private String desc;
public static List<QueryOrderAccountType> useCouponList = Arrays.asList(COUPON, B3S1_COUPON, FREIGHT_COUPON, PRODUCT_COUPON, DISCOUNT_COUPON);
QueryOrderAccountType(String code, String desc) {
this.code = code;
this.desc = desc;
......
package com.freemud.sdk.api.assortment.order.response.order;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
......@@ -22,7 +23,16 @@ public class MultiOrderRefundResponse<T> {
}
@Data
public static class RefundPlatformResponse{
public static class RefundPlatformResponse {
/**
* 退款中状态码需要单独处理
*/
public static Integer REFUNDED_RESULTCODE = 8200305;
/**
* 退款成功
*/
public static Integer REFUND_SUCCESS = 100;
private String endTransTradeNo;
private String fmRefundNo;
private String fmTradeNo;
......@@ -39,5 +49,11 @@ public class MultiOrderRefundResponse<T> {
private Integer totalAmount;
private String transId;
private String ebcode;
@ApiModelProperty(value = "业务返回码 8200305 代表退款中 100是成功 其他 都是失败")
private Integer resultCode;
@ApiModelProperty(value = "业务返回消息")
private String resultMsg;
}
}
\ No newline at end of file
......@@ -2036,7 +2036,7 @@ public class OrderAdapter {
String attr = "";
String attrEng = "";
for (OrderSpecialExtraAttrRequest special : extInfo.getSpecialAttrs()) {
if (special.getAttributeName().indexOf("冰") >= 0) {
if (Objects.nonNull(special.getAttributeName()) && special.getAttributeName().indexOf("冰") >= 0) {
attr = special.getAttributeName();
attrEng = special.getAttributeForeignName();
break;
......
......@@ -94,4 +94,13 @@ public class ExposureOrderController {
return ResponseUtil.success();
}
/**
* 新商城支付门店配置
*/
@ApiAnnotation(logMessage = "新商城支付门店配置")
@PostMapping("/getMallPayConfig")
public BaseResponse<PayConfigVo> getMallPayConfig(@Validated @LogParams @RequestBody GetMallPayConfigVo req) {
return ResponseUtil.success(exposureOrderService.getMallPayConfig(req));
}
}
......@@ -22,6 +22,7 @@ import cn.freemud.entities.vo.encircle.CreateReserveOrderVo;
import cn.freemud.entities.vo.encircle.EncircleReserveBaseVo;
import cn.freemud.entities.vo.order.*;
import cn.freemud.handler.OrderReportJobHandler;
import cn.freemud.management.entities.dto.request.order.RefundSuccessCallbackVo;
import cn.freemud.service.EncircleOrderService;
import cn.freemud.service.Orderservice;
import cn.freemud.service.PointsMallOrderService;
......
......@@ -3,6 +3,7 @@ package cn.freemud.controller.delivery;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.dto.delivery.CallbackUrlRequestDto;
import cn.freemud.entities.dto.delivery.MacCafeCallbackUrlRequestDto;
import cn.freemud.entities.dto.delivery.MallCallbackRequestDto;
import cn.freemud.entities.dto.delivery.WeixinDeliveryAddressDto;
import cn.freemud.service.ThirdDeliveryService;
import com.freemud.application.sdk.api.log.ApiAnnotation;
......@@ -59,7 +60,7 @@ public class DeliveryController {
@ApiAnnotation(logMessage = "商城配送回调")
@ApiOperation(value = "商城配送回调", notes = "商城配送回调", produces = "application/json")
@PostMapping("/delivery/mallCallbackUrl")
public BaseResponse mallCallbackUrl(@Valid @LogParams @RequestBody CallbackUrlRequestDto request) {
public BaseResponse mallCallbackUrl(@Valid @LogParams @RequestBody MallCallbackRequestDto request) {
return deliveryService.mallCallbackUrl(request);
}
......
package cn.freemud.entities.dto.blacklist;
import lombok.Data;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/5/27 13:40
* @description :
*/
@Data
public class BlacklistDto {
/**
* 商户号
*/
private String partnerId;
/**
* 用户id
*/
private String memberId;
/**
* 是否使用用户积分
* 1=不显示积分
* 2=显示积分但不扣减
* 3=显示积分且扣减
* 消费黑名单用户 不管是否满足 都不能使用积分消费
*/
private Integer useCustomerScore;
/**
* 当前这一笔订单需要消费的金额
*/
private Long amount;
private boolean useCoupon = false;
}
package cn.freemud.entities.dto.blacklist;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/5/27 15:06
* @description : 返回前端提示数据
*/
@Data
public class OrderBlacklistResp {
@ApiModelProperty(value = "客服电话")
private String moblie;
@ApiModelProperty(value = "金额限制(单位:分)")
private Long surplusAmount;
}
package cn.freemud.entities.dto.blacklist;
import lombok.Data;
import java.util.Objects;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/5/27 14:49
* @description :
*/
@Data
public class Result<T> {
private boolean status = false;
private String message;
private T result;
private String statusCode;
public boolean isOk() {
return Objects.equals(statusCode, "200");
}
}
package cn.freemud.entities.dto.blacklist.req;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotBlank;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/5/27 14:34
* @description :
*/
@Data
public class BlackListQueryByClient {
/**
* 0储值卡黑名单
*/
public static final int RECORD_TYPE_SVC = 0;
/**
* 1消费黑名单
*/
public static final int RECORD_TYPE_CUSTOMER = 1;
@ApiModelProperty(value = "商户id")
@NotBlank(message = "商户id不能为空")
private String partnerId;
@ApiModelProperty("会员id")
private String memberId;
@ApiModelProperty("添加的黑名单类型 0储值卡黑名单 1消费黑名单")
@Range(min = 0, max = 1, message = "添加的黑名单类型 0储值卡黑名单 1消费黑名单")
private Integer recordType;
}
package cn.freemud.entities.dto.blacklist.resp;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/5/27 14:35
* @description :
*/
@Data
public class MemberBlacklistVO {
/**
* 是否存在黑名单中
*/
private boolean exist;
// ---------> 消费黑名单才有下面的配置
@ApiModelProperty(value = "客服电话")
private String moblie;
@ApiModelProperty(value = "金额限制(单位:分)")
private Long limitAmount;
@ApiModelProperty(value = "已经消费的累积金额(单位:分)")
private Long shoppingTotalAmount;
}
......@@ -31,7 +31,7 @@ public class CallbackUrlRequestDto {
*/
private String channelDeliveryId;
/**
* 订单状态枚举值
* 状态枚举值
*/
private int deliveryStatus;
/**
......
package cn.freemud.entities.dto.delivery;
import lombok.Data;
import java.util.List;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Title: MallCallbackRequestDto
* @Package cn.freemud.entities.dto.delivery
* @Description:
* @author: ping.wu
* @date: 22-5-31 下午2:54
* @Copyright: 2022 www.freemud.cn Inc. All rights reserved.
*/
@Data
public class MallCallbackRequestDto {
//商户号
private String partnerId;
//订单号
private String tid;
//物流状态:0-未发货 1-已发货
private Integer logisticsStatus;
//物流单号
private String logisticsNo;
//物流公司名称
private String logisticsName;
//子商品物流状态集合
private List<LogisticsDetail> goodsList;
@Data
public static class LogisticsDetail {
//原始单id
private String tid;
//原始子单id
private String oid;
//三方平台唯一编号
private String specId;
//非码spuId
private String spuId;
//非码skuId
private String skuId;
//物流状态:0-未发货 1-已发货
private Integer logisticsStatus;
//非码商品编号
private String productId;
//限购数量
private Integer limitNumber;
//物流单号
private String logisticsNo;
//物流公司名称
private String logisticsName;
}
}
package cn.freemud.entities.dto.ecology;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class ReportActivityBehaviorsRequest {
@ApiModelProperty(value = "商户号", required = true)
private String partnerId;
@ApiModelProperty(value = "活动号", required = true)
private String activityId;
@ApiModelProperty(value = "用户标识", required = true)
private String openId;
@ApiModelProperty(value = "微信订单号", required = true)
private String transactionId;
@ApiModelProperty(value = "小程序appid", required = true)
private String miniAppId;
}
package cn.freemud.entities.vo;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Title: GetMallPayConfigVo
* @Package cn.freemud.entities.vo
* @Description:
* @author: ping.wu
* @date: 22-5-24 下午5:51
* @Copyright: 2022 www.freemud.cn Inc. All rights reserved.
*/
@Data
public class GetMallPayConfigVo {
@NotBlank(message = "商户号不能为空")
private String partnerId;
@NotBlank(message = "小程序id不能为空")
private String appId;
}
package cn.freemud.entities.vo.order;
import lombok.Data;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Title: DirectDeliveryReq
* @Package cn.freemud.entities.vo.order
* @Description:
* @author: ping.wu
* @date: 22-5-30 上午10:06
* @Copyright: 2022 www.freemud.cn Inc. All rights reserved.
*/
@Data
public class DirectDeliveryReq {
private String orderCode;
private String partnerId;
private String operator;
/**
* 自动收货任务执行时间毫秒时间戳
*/
private Long taskTime;
}
package cn.freemud.entities.vo.order;
import lombok.Data;
import java.util.List;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Title: EditLogisticsReq
* @Package cn.freemud.entities.vo
* @Description:
* @author: ping.wu
* @date: 22-5-26 下午10:24
* @Copyright: 2022 www.freemud.cn Inc. All rights reserved.
*/
@Data
public class EditLogisticsReq {
/**
* 【必填】订单编号
*/
private String orderCode;
/**
* 【必填】物流接入渠道 1.人工 2.旺店通ERP
*/
private Integer logisticsAccessChannel;
/**
* 【非必填】操作人
*/
private String operator;
/**
* 【必填】商户编号
*/
private String partnerId;
/**
* 物流
*/
private List<LogisticsList> logisticsList;
}
package cn.freemud.entities.vo.order;
import lombok.Data;
import java.util.List;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Title: LogisticsList
* @Package cn.freemud.entities.vo.order
* @Description:
* @author: ping.wu
* @date: 22-5-30 上午11:12
* @Copyright: 2022 www.freemud.cn Inc. All rights reserved.
*/
@Data
public class LogisticsList {
/**
* 【非必填】物流公司编号
*/
private String logisticsCompanyCode;
/**
* 【必填】物流公司名称
*/
private String logisticsCompanyName;
/**
* 【必填】物流单号
*/
private String expressNo;
/**
* 【必填】物流状态 1:已发货 2:已签收 4:异常 5:取消
*/
private Integer state;
/**
* 物流商品
*/
private List<OrderPack> orderPackList;
}
package cn.freemud.entities.vo.order;
import lombok.Data;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Title: OrderPack
* @Package cn.freemud.entities.vo.order
* @Description:
* @author: ping.wu
* @date: 22-5-30 上午11:13
* @Copyright: 2022 www.freemud.cn Inc. All rights reserved.
*/
@Data
public class OrderPack {
/**
* 订单商品明细ID
*/
private Long orderItemId;
/**
* 商品编号
*/
private String productId;
/**
* 商品序号
*/
private Integer productSeq;
}
......@@ -24,4 +24,9 @@ public class PayConfigVo {
* 门店支付编号
*/
private String payCode;
/**
* 支付门店
*/
private String storeId;
}
......@@ -195,6 +195,7 @@ public enum ResponseResult {
ORDER_BIZ_TYPE_ERROR("45086", "订单业务类型异常",""),
COUPON_ORDER_VERIFY_FAIL("45087","买券订单校验异常",""),
COUPON_ORDER_COMMON_VERIFY_FAIL("45088","卖券订单基础校验失败",""),
TOUCH_SHOPPING_BLACK_LIST("45089","触发消费黑名单",""),
/**
* 售后单
......@@ -206,6 +207,7 @@ public enum ResponseResult {
*/
PAY_BACKEND_CONFIG_ERROR("58003", "支付交易异常","Abnormal payment transaction"),
PAY_SVC_CONFIG_ERROR("58004", "不支持储值卡支付",""),
PAY_REFUND_ERROR("58005", "退款已受理,请等待",""),
/**
* 优惠券活动
*/
......
package cn.freemud.handler;
import cn.freemud.constant.CustomerScoreConstant;
import cn.freemud.entities.dto.blacklist.BlacklistDto;
import cn.freemud.entities.dto.blacklist.Result;
import cn.freemud.entities.dto.blacklist.req.BlackListQueryByClient;
import cn.freemud.entities.dto.blacklist.resp.MemberBlacklistVO;
import cn.freemud.service.thirdparty.DataCenterClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.Objects;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/5/27 11:59
* @description :
*/
@Component
public class MemberBlacklistHandler {
@Autowired
private DataCenterClient dataCenterClient;
/**
* 查询用户是否在黑名单中
*
* @param blacklistDto
*/
public String checkisTrueBlacklist(BlacklistDto blacklistDto) {
//step1 查询是否存在
BlackListQueryByClient req = new BlackListQueryByClient();
req.setPartnerId(blacklistDto.getPartnerId());
req.setMemberId(blacklistDto.getMemberId());
// 默认只查询消费黑名单
req.setRecordType(BlackListQueryByClient.RECORD_TYPE_CUSTOMER);
Result<MemberBlacklistVO> memberBlacklistVOResult = dataCenterClient.queryByMemberId(req);
if (!memberBlacklistVOResult.isOk()) {
return null;
}
MemberBlacklistVO result = memberBlacklistVOResult.getResult();
if (!result.isExist()) {
return null;
}
StringBuilder sb = new StringBuilder();
// 消费黑名单用户 不可使用积分支付
if (Objects.nonNull(blacklistDto.getUseCustomerScore()) && blacklistDto.getUseCustomerScore().compareTo(CustomerScoreConstant.SUBSTRACT.getValue()) == 0) {
sb.append("您已列入消费黑名单暂不可使用积分");
return sb.toString();
}
// 黑名单用户 不可使用优惠券
if (blacklistDto.isUseCoupon()) {
sb.append("您已列入消费黑名单暂不可使用优惠券");
return sb.toString();
}
//step2 存在校验剩余余额
Long limitAmount = result.getLimitAmount();
Long shoppingTotalAmount = result.getShoppingTotalAmount();
if (limitAmount.compareTo(shoppingTotalAmount + blacklistDto.getAmount()) >= 0) {
// 满足
return null;
}
// step3 余额不足组装前端参数 考虑负数默认0
long surplusAmount = limitAmount - shoppingTotalAmount;
// OrderBlacklistResp orderBlacklistResp = new OrderBlacklistResp();
// orderBlacklistResp.setMoblie(result.getMoblie());
// orderBlacklistResp.setSurplusAmount(surplusAmount < 0 ? 0L : surplusAmount);
// return orderBlacklistResp;
// 您的消费额度还有3元,暂无法支付,如有疑问,详询客服热线4008899096
BigDecimal amount = new BigDecimal(Math.max(surplusAmount, 0L)).divide(new BigDecimal("100"), 2, BigDecimal.ROUND_DOWN);
if (amount.compareTo(BigDecimal.ZERO) <= 0) {
sb.append("您的消费金额额度已用完,暂无法支付,如有疑问,详询客服热线").append(result.getMoblie());
} else {
sb.append("您的消费额度还有")
.append(amount)
.append("元,暂无法支付,如有疑问,详询客服热线")
.append(result.getMoblie());
}
return sb.toString();
}
}
package cn.freemud.service;
import cn.freemud.entities.vo.GetMallPayConfigVo;
import cn.freemud.entities.vo.GetPayConfigVo;
import cn.freemud.entities.vo.GetPaySuccessDataRequest;
import cn.freemud.entities.vo.order.PayConfigVo;
import cn.freemud.entities.vo.order.PaySuccessDataVo;
import cn.freemud.enums.AggregationTypeEnum;
import cn.freemud.enums.OrderTackCodeFactory;
import cn.freemud.enums.TakeCodeOrderType;
import cn.freemud.manager.OrderTackCodeManager;
import cn.freemud.service.business.impl.OrderBusinessServiceImpl;
import cn.freemud.service.impl.PayServiceImpl;
import com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformIappWxappStore;
import com.freemud.application.sdk.api.ordercenter.adapter.OrderCenterSdkAdapter;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
......@@ -52,4 +55,21 @@ public class ExposureOrderService {
vo.setTimeout(timeout);
return vo;
}
/**
* 新商城支付门店配置
*/
public PayConfigVo getMallPayConfig(GetMallPayConfigVo req) {
PayConfigVo vo = new PayConfigVo();
vo.setPrincipalName(payService.getPaymentPrincipalName(req.getPartnerId(), req.getAppId()));
vo.setPayTimeOut(payService.getPartnerPayOvertime(req.getPartnerId()));
AssortmentOpenPlatformIappWxappStore wxAppStore = payService.getIappWxappStoreInfo(req.getAppId(), AggregationTypeEnum.TYPE_7.getCode());
if (wxAppStore == null) {
wxAppStore = new AssortmentOpenPlatformIappWxappStore();
}
vo.setPayCode(wxAppStore.getClientCode());
vo.setStoreId(wxAppStore.getStoreId());
return vo;
}
}
......@@ -3,6 +3,7 @@ package cn.freemud.service;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.dto.delivery.CallbackUrlRequestDto;
import cn.freemud.entities.dto.delivery.MacCafeCallbackUrlRequestDto;
import cn.freemud.entities.dto.delivery.MallCallbackRequestDto;
import cn.freemud.entities.dto.delivery.WeixinDeliveryAddressDto;
import cn.freemud.entities.vo.delivery.DeliveryAmountVo;
......@@ -25,7 +26,7 @@ public interface ThirdDeliveryService {
/**
* 商城配送回调
*/
BaseResponse mallCallbackUrl(CallbackUrlRequestDto request);
BaseResponse mallCallbackUrl(MallCallbackRequestDto request);
/**
* 查询微信配送地址配送费
......
......@@ -3,10 +3,15 @@ package cn.freemud.service.delivery;
import cn.freemud.adapter.MessageNoticeAdapter;
import cn.freemud.amp.service.ProduceMQService;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.base.util.DateUtil;
import cn.freemud.entities.dto.delivery.*;
import cn.freemud.entities.dto.ecology.*;
import cn.freemud.entities.dto.pos.PosBaseRequestDto;
import cn.freemud.entities.vo.order.EditLogisticsReq;
import cn.freemud.entities.vo.delivery.DeliveryAmountVo;
import cn.freemud.entities.vo.order.DirectDeliveryReq;
import cn.freemud.entities.vo.order.LogisticsList;
import cn.freemud.entities.vo.order.OrderPack;
import cn.freemud.enums.*;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.management.entities.dto.request.order.OrderManagerRequest;
......@@ -16,6 +21,7 @@ import cn.freemud.management.service.adapter.OrderManagerAdapter;
import cn.freemud.service.ThirdDeliveryService;
import cn.freemud.service.thirdparty.DeliveryFeiginClient;
import cn.freemud.service.thirdparty.EcologyAdminApplicationClient;
import cn.freemud.service.thirdparty.OrderServiceClient;
import cn.freemud.service.thirdparty.PosClient;
import cn.freemud.utils.AppLogUtil;
import cn.freemud.utils.DateTimeUtil;
......@@ -36,6 +42,9 @@ import com.freemud.application.sdk.api.ordercenter.enums.OrderType;
import com.freemud.application.sdk.api.ordercenter.request.OrderCollectReq;
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.orderInfo.OrderInfoReqs;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderItemResp;
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.storecenter.request.StoreInfoRequest;
import com.freemud.application.sdk.api.storecenter.response.StoreResponse;
......@@ -57,9 +66,8 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
......@@ -92,6 +100,8 @@ public class ThirdDeliveryServiceImpl implements ThirdDeliveryService {
@Autowired
private OrderSdkService orderSdkService;
@Autowired
private OrderServiceClient orderServiceClient;
@Autowired
private MessageNoticeAdapter messageNoticeAdapter;
@Autowired
private MessageCenterClient messageNoticeClient;
......@@ -307,7 +317,55 @@ public class ThirdDeliveryServiceImpl implements ThirdDeliveryService {
}
@Override
public BaseResponse mallCallbackUrl(CallbackUrlRequestDto request) {
public BaseResponse mallCallbackUrl(MallCallbackRequestDto request) {
QueryByCodeResponse responseDto = orderSdkService.getOrderInfo(null, request.getTid(), null, null, null);
if (responseDto == null || !Objects.equals(SUCCESS_RESPONSE_CODE.toString(), responseDto.getCode())|| responseDto.getResult().getOrderCode() == null) {
return ResponseUtil.error(ResponseResult.ORDER_NOT_EXIST);
}
OrderInfoReqs orderInfoReqs = responseDto.getResult();
if (NewOrderStatus.ACCEPTED.getIndex() == orderInfoReqs.getOrderState()){
DirectDeliveryReq directDeliveryReq = new DirectDeliveryReq();
directDeliveryReq.setOrderCode(request.getTid());
directDeliveryReq.setPartnerId(request.getPartnerId());
directDeliveryReq.setOperator("");
directDeliveryReq.setTaskTime(DateUtil.addDays(new Date(),15).getTime());
BaseResponse response = orderServiceClient.directDelivery(directDeliveryReq);
if (response == null || !Objects.equals(SUCCESS_RESPONSE_CODE.toString(), response.getCode())) {
return ResponseUtil.error(ResponseResult.SYSTEM_BUSINESS_ERROR);
}
}
EditLogisticsReq editLogisticsReq = new EditLogisticsReq();
editLogisticsReq.setOrderCode(orderInfoReqs.getOrderCode());
editLogisticsReq.setLogisticsAccessChannel(2);
editLogisticsReq.setPartnerId(orderInfoReqs.getPartnerId());
editLogisticsReq.setOperator("");
List<LogisticsList> logisticsList = new ArrayList<>();
LogisticsList logistics = new LogisticsList();
logistics.setExpressNo(request.getLogisticsNo());
logistics.setLogisticsCompanyName(request.getLogisticsName());
logistics.setLogisticsCompanyCode("");
logistics.setState(1);
if (CollectionUtils.isNotEmpty(request.getGoodsList())){
Map<Long, OrderItemResp> maps = orderInfoReqs.getOrderItemList().stream().collect(Collectors.toMap(OrderItemResp::getId, orderItemResp -> orderItemResp, (key1, key2) -> key2));
List<OrderPack> orderPackList = new ArrayList<>();
for(MallCallbackRequestDto.LogisticsDetail logisticsDetail: request.getGoodsList()){
OrderPack orderPack = new OrderPack();
orderPack.setOrderItemId(Long.valueOf(logisticsDetail.getOid()));
orderPack.setProductId(logisticsDetail.getSpuId());
OrderItemResp orderItemResp = maps.get(Long.valueOf(logisticsDetail.getOid()));
orderPack.setProductSeq(orderItemResp == null ? 0 : orderItemResp.getProductSeq());
orderPackList.add(orderPack);
}
logistics.setOrderPackList(orderPackList);
}
logisticsList.add(logistics);
editLogisticsReq.setLogisticsList(logisticsList);
BaseResponse editLogistics = orderServiceClient.editLogistics(editLogisticsReq);
if (editLogistics == null || !Objects.equals(SUCCESS_RESPONSE_CODE.toString(), editLogistics.getCode())) {
return ResponseUtil.error(ResponseResult.SYSTEM_BUSINESS_ERROR);
}
return ResponseUtil.success();
}
......
......@@ -9,6 +9,7 @@ import cn.freemud.constant.RedisKeyConstant;
import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.entities.bo.CreateOrderBONew;
import cn.freemud.entities.dto.*;
import cn.freemud.entities.dto.blacklist.BlacklistDto;
import cn.freemud.entities.dto.ecology.VirtualBindStoreResponse;
import cn.freemud.entities.dto.ecology.VirtualStoreRequest;
import cn.freemud.entities.dto.order.CreateOrderOperateDto;
......@@ -24,6 +25,7 @@ import cn.freemud.entities.dto.wechat.GetAuthorizerRequestDto;
import cn.freemud.entities.dto.wechat.GetTokenResponseDto;
import cn.freemud.entities.vo.*;
import cn.freemud.enums.*;
import cn.freemud.handler.MemberBlacklistHandler;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.management.entities.dto.request.pay.PayRefundRequestDto;
import cn.freemud.management.entities.dto.response.pay.OrderRefundResponse;
......@@ -63,6 +65,7 @@ import com.freemud.application.sdk.api.ordercenter.response.orderInfo.AfterSales
import com.freemud.application.sdk.api.ordercenter.service.OrderSdkService;
import com.freemud.application.sdk.api.storecenter.response.StoreResponse;
import com.freemud.sdk.api.assortment.order.adapter.OrderSdkAdapter;
import com.freemud.sdk.api.assortment.order.enums.QueryOrderAccountType;
import com.freemud.sdk.api.assortment.order.request.order.*;
import com.freemud.sdk.api.assortment.order.response.order.BaseOrderResponse;
import com.freemud.sdk.api.assortment.order.response.order.CreateOrderResponse;
......@@ -149,6 +152,9 @@ public class MallOrderServiceImpl implements MallOrderService {
@Autowired
private SpellGroupOrderDataManager spellGroupOrderDataManager;
@Autowired
private MemberBlacklistHandler memberBlacklistHandler;
/**
* 创建订单
*/
......@@ -169,7 +175,9 @@ public class MallOrderServiceImpl implements MallOrderService {
checkMallOrder.checkOrderByDelivery(createOrderVo, userLoginInfoDto, storeResponseDto, shoppingCartGoodsDto.getTotalAmount(), trackingNo);
OrderExtInfoDto extInfo = this.getExtInfo(userLoginInfoDto, storeResponseDto, createOrderVo);
BaseResponse response = this.createOrderFlow(createOrderVo, storeResponseDto, shoppingCartGoodsDto, userLoginInfoDto, extInfo);
if (!Objects.equals(response.getCode(), ResponseResult.SUCCESS.getCode())) {
return response;
}
//组装支付公共方法参数
CreateOrderOperateDto createOrderOperateDto = (CreateOrderOperateDto) response.getResult();
createOrderBO.setExtInfo(extInfo);
......@@ -287,6 +295,31 @@ public class MallOrderServiceImpl implements MallOrderService {
createOrderRequest.setBaseCreateOrderRequest(baseCreateOrderRequest);
createOrderRequest.getBaseCreateOrderRequest().setUserName(userLoginInfoDto.getNickName());
createOrderRequest.setTrackingNo(LogThreadLocal.getTrackingNo());
// fisherman -> 微商城消费黑名单限制
BlacklistDto blacklistDto = new BlacklistDto();
blacklistDto.setAmount(baseCreateOrderRequest.getAmount());
blacklistDto.setPartnerId(createOrderVo.getPartnerId());
blacklistDto.setMemberId(createOrderVo.getUserId());
if (CollectionUtils.isNotEmpty(baseCreateOrderRequest.getAccounts())) {
// 过滤出券, 黑名单有用户不能用券
List<CreateOrderAccountRequest> useAccount = baseCreateOrderRequest.getAccounts()
.stream()
.filter(a -> QueryOrderAccountType.useCouponList.contains(a.getAccountType()))
.collect(Collectors.toList());
blacklistDto.setUseCoupon(CollectionUtils.isNotEmpty(useAccount));
}
blacklistDto.setUseCustomerScore(createOrderVo.getUseCustomerScore());
String touchStr = memberBlacklistHandler.checkisTrueBlacklist(blacklistDto);
if (StringUtils.isNotEmpty(touchStr)) {
CreateOrderResponse baseOrderResponse = new CreateOrderResponse();
baseOrderResponse.setErrcode(Integer.valueOf(ResponseResult.TOUCH_SHOPPING_BLACK_LIST.getCode()));
baseOrderResponse.setErrmsg(touchStr);
baseOrderResponse.setData(null);
return baseOrderResponse;
}
return orderBusinessService.createOrderFlow(createOrderRequest);
});
......
......@@ -12,6 +12,7 @@ import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.entities.Active;
import cn.freemud.entities.bo.CreateOrderBONew;
import cn.freemud.entities.dto.*;
import cn.freemud.entities.dto.blacklist.BlacklistDto;
import cn.freemud.entities.dto.coupon.CouponResponseDTO;
import cn.freemud.entities.dto.coupon.FastBatchQueryTemplateInfoRequest;
import cn.freemud.entities.dto.coupon.FastTemplateInfoResponseVO;
......@@ -29,6 +30,7 @@ import cn.freemud.entities.dto.store.StoreMixResponseDto;
import cn.freemud.entities.live.WeChatReportVO;
import cn.freemud.entities.vo.*;
import cn.freemud.enums.*;
import cn.freemud.handler.MemberBlacklistHandler;
import cn.freemud.handler.WeChatLiveMsgHandle;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.manager.BuyProductOnceManager;
......@@ -180,6 +182,10 @@ public class SellCouponOrderServiceImpl implements OrderFactoryService {
@Autowired
private CouponOnlineClient couponOnlineClient;
@Autowired
private MemberBlacklistHandler memberBlacklistHandler;
/**
* 抖音卖券
*/
......@@ -380,6 +386,18 @@ public class SellCouponOrderServiceImpl implements OrderFactoryService {
//标准化平台虚拟商品特价活动计算,不包含蜜雪APP买虚拟商品
List<SubtractStockVO> stockBeanDtos = calculationDiscount(partnerId, storeId, userLoginInfoDto.getMemberId(), productInfosDto.getData().getProducts().get(0), createOrderRequest);
// fisherman --> 校验是否存在用户消费黑名单 需要校验 !=null && >0
Long amount = createOrderRequest.getActualPayAmount();
if (Objects.nonNull(amount) && amount.compareTo(0L) > 0) {
BlacklistDto blacklistDto = new BlacklistDto();
blacklistDto.setAmount(amount);
blacklistDto.setPartnerId(createOrderRequest.getPartnerId());
blacklistDto.setMemberId(createOrderRequest.getUserId());
String touchStr = memberBlacklistHandler.checkisTrueBlacklist(blacklistDto);
if (StringUtils.isNotEmpty(touchStr)) {
return ResponseUtil.error(ResponseResult.TOUCH_SHOPPING_BLACK_LIST.getCode(), touchStr);
}
}
OrderBaseResp<OrderInfoReqs> orderInfoReqsBaseResponse = orderSdkService.createOrder(createOrderRequest, trackingNo);
CreateOrderResponse createOrderResponse = orderSdkAdapter.convent2NEWOrderInfoReqs(orderInfoReqsBaseResponse);
if (createOrderResponse == null || createOrderResponse.getErrcode() != 100) {
......
package cn.freemud.service.thirdparty;
import cn.freemud.entities.dto.blacklist.Result;
import cn.freemud.entities.dto.blacklist.req.BlackListQueryByClient;
import cn.freemud.entities.dto.blacklist.resp.MemberBlacklistVO;
import com.freemud.application.sdk.api.ordercenter.annotation.LogIgnoreFeign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/5/27 14:17
* @description :
*/
@FeignClient(name = "data-center")
@RequestMapping(produces = {MediaType.APPLICATION_JSON_UTF8_VALUE})
public interface DataCenterClient {
/**
* 查询用户是否在黑名单中
*/
@LogIgnoreFeign(logMessage="queryByMemberId")
@PostMapping("/blacklist/query-by-memberId")
Result<MemberBlacklistVO> queryByMemberId(@RequestBody BlackListQueryByClient req);
}
package cn.freemud.service.thirdparty;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.dto.ecology.ReportActivityBehaviorsRequest;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
* 生态服务
* @author: hujx
* @date:
*/
@FeignClient(name = "ecology-program-application", url = "${saas.ecology.program.application.feign.url:}")
public interface EcologyProgramApplicationClient {
/**
* 支付成功上报的低碳行为
*
* @return
*/
// @LogIgnoreFeign(logMessage="sendLowCarbonAction")
@PostMapping("/ecology/micro-program/low-carbon-action/activities/behaviors-report")
BaseResponse reportActivityBehaviors(@RequestBody ReportActivityBehaviorsRequest request);
}
package cn.freemud.service.thirdparty;
import cn.freemud.entities.vo.order.EditLogisticsReq;
import cn.freemud.entities.vo.order.DirectDeliveryReq;
import com.freemud.application.sdk.api.ordercenter.annotation.LogIgnoreFeign;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.dto.QueryInvoiceRepDto;
......@@ -65,4 +67,18 @@ public interface OrderServiceClient {
@PostMapping(value = "/order/v2/refundFailures/successful")
BaseResponse refundFailuresSuccessful(@RequestBody RefundFailuresSuccessfulReq refundFailuresSuccessfulReq);
/**
* 订单物流推送订单
*/
@LogIgnoreFeign(logMessage="editLogistics")
@PostMapping(value = "/order/v2/editLogistics")
BaseResponse editLogistics(@RequestBody EditLogisticsReq editLogisticsReq);
/**
* 订单发货
*/
@LogIgnoreFeign(logMessage="directDelivery")
@PostMapping(value = "/order/v2/directDelivery")
BaseResponse directDelivery(@RequestBody DirectDeliveryReq DeditLogisticsReq);
}
package cn.freemud.management.adapter;
import cn.freemud.management.entities.dto.request.pay.AgentPayRefundReq;
import cn.freemud.management.entities.dto.request.pay.PayRefundRequestDto;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto;
......@@ -76,6 +78,21 @@ public class PaymentSdkAdapter {
return multiQueryRequest;
}
@SneakyThrows
public AgentPayRefundReq getAgentPayefundReq(OrderBeanV1 orderBean, BigDecimal refundAmount) {
OrderExtInfoDto ext = JSON.parseObject(orderBean.getExtInfo(), OrderExtInfoDto.class);
AgentPayRefundReq req = new AgentPayRefundReq();
req.setPartnerId(orderBean.getCompanyId());
req.setStoreId(orderBean.getShopId());
req.setFmTradeNo(ext.getPayTransId());
req.setOutOrderNo(orderBean.getOid());
req.setRefundTradeNo(this.getRefundSerialNo().toString());
req.setRefundAmount(refundAmount.longValue());
req.setNotifyUrl(refundNotifyCallback);
req.setVer("V1");
return req;
}
public Long getRefundSerialNo() {
return System.currentTimeMillis() + (int) (Math.random() * 9000) + 1000;
}
......
......@@ -3,6 +3,7 @@ package cn.freemud.management.controller;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.management.entities.dto.request.order.McCafeOrderManagerRequest;
import cn.freemud.management.entities.dto.request.order.OrderManagerRequest;
import cn.freemud.management.entities.dto.request.order.RefundSuccessCallbackVo;
import cn.freemud.management.enums.McCafeOperateType;
import cn.freemud.management.enums.OperateType;
import cn.freemud.management.enums.ResponseResult;
......@@ -72,6 +73,17 @@ public class OrderManagerController {
}
}
/**
* 同意退款, 支付服务退款失败的补偿接口
*
* 退款成功会回调该接口进行后续流程补偿
*/
@ApiAnnotation(logMessage = "/order/refund/callback")
@PostMapping("/refund/callback")
public BaseResponse refundSuccessCallback(@Validated @LogParams @RequestBody RefundSuccessCallbackVo req) {
return orderManagerAdapter.refundSuccessCallback(req);
}
@ApiAnnotation(logMessage = "mcCafeDeliveryCreate")
@ApiOperation(value = "麦咖啡订单入机", notes = "麦咖啡订单入机", produces = "application/json")
@PostMapping("/mcCafe/statusOperate")
......
package cn.freemud.management.entities.dto.request.order;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/6/8 17:38
* @description :
*/
@Data
public class RefundSuccessCallbackVo {
@ApiModelProperty(value = "总金额", position = 10)
private Integer totalAmount;
@ApiModelProperty(value = "退款金额", position = 11)
private Integer refundAmount;
@ApiModelProperty(value = "应结总金额", position = 12)
private Integer settlementTotalAmount;
@ApiModelProperty(value = "应结退款金额", position = 13)
private Integer settlementRefundAmount;
@ApiModelProperty(value = "交易流水号", position = 14)
private String tradeNo;
/**
* 订单编号
*/
private String orderCode;
/**
* 退款描述
*/
private String msg;
@ApiModelProperty(value = "第三方交易流水", position = 15)
private String thirdPartTradeNo;
@ApiModelProperty(value = "退款交易流水号", position = 16)
private String refundTradeNo;
@ApiModelProperty(value = "第三方退款交易流水", position = 17)
private String thirdPartRefundTradeNo;
@ApiModelProperty(value = "格式:yyyyMMddHHmmss", position = 18)
private String refundTime;
@ApiModelProperty(value = "货币类型", position = 19)
private String transCurrency;
@ApiModelProperty(value = "退款状态: 100 退款成功 8200305 处理中, 其他都是失败", position = 20)
private String refundStatus;
@ApiModelProperty(value = "商户号", position = 21)
private String partnerId;
@ApiModelProperty(value = "业务方退款单号", position = 22)
private String refundId;
@ApiModelProperty(value = "业务方支付单号", position = 22)
private String transId;
@ApiModelProperty(value = "间联退款单号")
private String refundEndTransId;
}
package cn.freemud.management.entities.dto.response.pay;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -20,6 +21,7 @@ public class AgentPayRefundResp {
@NoArgsConstructor
@Data
public static class DataDTO {
private String fmTradeNo;
private String endTransTradeNo;
private String platformTradeNo;
......@@ -35,6 +37,12 @@ public class AgentPayRefundResp {
private String refundTime;
private String transId;
private String ebcode;
@ApiModelProperty(value = "业务返回码")
private Integer resultCode;
@ApiModelProperty(value = "业务返回消息")
private String resultMsg;
}
public boolean isOk() {
......
package cn.freemud.management.entities.dto.response.pay;
import cn.freemud.management.enums.ResponseResult;
import com.freemud.sdk.api.assortment.order.enums.PayRefundStatus;
import lombok.Data;
......@@ -28,4 +29,9 @@ public class PayRefundResponse {
* 退款序列号
*/
private String refundId;
/**
* 兼容爱马哥退款报错的字段 ,其他场景不会有值
*/
private ResponseResult result;
}
......@@ -181,6 +181,8 @@ public enum ResponseResult {
REFUND_EXCEPTION("58004", "支付退款异常"),
REFUND_FAIL("58005", "支付退款失败"),
NOT_SUFFICIENT_FUNDS("8200201", "商户余额不足"),
CHECK_PARAM_ERROR("58006", "支付退款请求参数校验异常"),
REFUND_FAIL_WAIT_CALLBACK("58007", "支付退款失败,等待回调补偿中"),
/**
* 优惠券活动
*/
......
......@@ -2,6 +2,7 @@ package cn.freemud.management.service;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.management.entities.dto.request.order.OrderManagerRequest;
import cn.freemud.management.entities.dto.request.order.RefundSuccessCallbackVo;
import cn.freemud.management.entities.dto.response.order.OrderManagerResponse;
import cn.freemud.management.util.ResponseUtil;
import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1;
......@@ -110,4 +111,14 @@ public interface OrderManagerService {
default BaseResponse<OrderManagerResponse> orderCancelDelivery(OrderManagerRequest request, OrderBeanV1 orderBean){
return ResponseUtil.success();
};
/**
* 支付退款成功的售后状态回调
* @param request
* @param orderBean
* @return
*/
default BaseResponse refundSuccessCallback(RefundSuccessCallbackVo request, OrderBeanV1 orderBean){
return ResponseUtil.success();
};
}
package cn.freemud.management.service.adapter;
import cn.freemud.management.service.OrderManagerService;
import cn.freemud.management.service.impl.MallOrderMangerServiceImpl;
import cn.freemud.management.service.impl.McCafeMangerServiceImpl;
import cn.freemud.management.service.impl.SaasOrderMangerServiceImpl;
import cn.freemud.management.service.impl.WaimaiOrderMangerServiceImpl;
import cn.freemud.management.service.impl.*;
import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1;
import com.freemud.application.sdk.api.ordercenter.enums.BizTypeEnum;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -54,6 +51,11 @@ public class OrderBeanFactory {
return applicationContext.getBean(MallOrderMangerServiceImpl.class);
}
//商城不能根据渠道,根据业务类型
if(Objects.equals(BizTypeEnum.FM_MALL.getBizType(),orderBean.getBizType())){
return applicationContext.getBean(NewMallOrderMangerServiceImpl.class);
}
return applicationContext.getBean(SaasOrderMangerServiceImpl.class);
}
}
package cn.freemud.management.service.handle;
import cn.freemud.management.entities.dto.response.pay.OrderRefundResponse;
import cn.freemud.management.entities.dto.response.pay.PayRefundData;
import cn.freemud.management.enums.PaymentRefundStatus;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.freemud.application.sdk.api.base.BaseResponse;
import com.freemud.application.sdk.api.util.ResponseUtils;
import com.freemud.sdk.api.assortment.order.enums.PayRefundStatus;
import org.apache.commons.lang.ObjectUtils;
import java.util.Objects;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/6/13 10:56
* @description :
*/
public class DemoMain {
public static void main(String[] args) {
String str = "{\n" +
" \"code\": \"100\",\n" +
" \"data\": {\n" +
" \"resultCode\": 82004005,\n" +
" \"resultMsg\": \"当前订单有退款记录没有完成\"\n" +
" },\n" +
" \"message\": \"success\"\n" +
"}";
BaseResponse<PayRefundData> refundNewResponse = JSON.parseObject(str, new TypeReference<BaseResponse<PayRefundData>>() {
});
if (Objects.equals(refundNewResponse.getCode(), "100") && refundNewResponse.getData() != null) {
refundNewResponse.setCode(refundNewResponse.getData().getResultCode().toString());
refundNewResponse.setMessage(refundNewResponse.getData().getResultMsg());
}
if (Objects.equals(refundNewResponse.getCode(), "100")) {
PayRefundData refundData = refundNewResponse.getData();
if (null != refundData) {
OrderRefundResponse refundResponse = new OrderRefundResponse();
refundResponse.setStatusCode(refundData.getResultCode());
refundResponse.setMsg(refundData.getResultMsg());
refundResponse.setRefundAmount(refundData.getRefundAmount());
refundResponse.setTotalAmount(refundData.getTotalAmount());
refundResponse.setRefundStatus(getRefundStatus(refundData.getResultCode()));
refundResponse.setRefundTradeNo(refundData.getRefundTradeNo());
refundResponse.setTradeNo(refundData.getRefundTradeNo());
refundResponse.setThirdPartRefundTradeNo(refundData.getThirdPartRefundTradeNo());
refundResponse.setThirdPartTradeNo(refundData.getThirdPartTradeNo());
refundResponse.setTotalAmount(refundData.getTotalAmount());
// return ResponseUtils.success(refundResponse);
}
}
BaseResponse<OrderRefundResponse> orderRefundResponse = ResponseUtils.error(refundNewResponse.getCode(), refundNewResponse.getMessage());
// Integer refundStatus = PayRefundStatus.SUCCESS;
Integer refundStatus = 1;
if (orderRefundResponse == null) {
// refundStatus = PayRefundStatus.RUNNING;
refundStatus = 4;
} else {
refundStatus = getFinalRefundStatus(Integer.valueOf(orderRefundResponse.getCode()));
}
System.out.println(refundStatus);
}
private static Integer getFinalRefundStatus(Integer resultCode) {
switch (resultCode) {
// 退款中状态码需要单独处理
case 8200305:
// return PayRefundStatus.RUNNING;
return 4;
// 退款成功
case 100:
// return PayRefundStatus.SUCCESS;
return 1;
default:
// return PayRefundStatus.FAIL;
return 2;
}
}
private static final String SUCCESS = "100";
public static final Integer SUCCESS_RESPONSE_CODE_INT = 100;
public static final Integer SUCCESS_RESPONSE_101_CODE_INT = 101;
public static final Integer REFUND_RESPONSE_CODE = 8200305;
public static Integer getRefundStatus(Integer resultCode) {
if (Objects.equals(resultCode, SUCCESS_RESPONSE_CODE_INT)) {
return PaymentRefundStatus.PAYMENT_REFUND_STATUS_1.getCode();
} else if (Objects.equals(resultCode, SUCCESS_RESPONSE_101_CODE_INT)) {
return PaymentRefundStatus.PAYMENT_REFUND_STATUS_1.getCode();
} else {
return Objects.equals(resultCode, REFUND_RESPONSE_CODE) ? PaymentRefundStatus.PAYMENT_REFUND_STATUS_4.getCode() : PaymentRefundStatus.PAYMENT_REFUND_STATUS_2.getCode();
}
}
}
......@@ -685,4 +685,39 @@ public class OrderVerifyHandle {
return false;
}
}
/**
* 新版saas商城同意退款校验
*
* @param orderBean
* @param request
* @return
*/
public BaseResponse fmMallOrderAgreeRefund(OrderBeanV1 orderBean, OrderManagerRequest request) {
//已取消的订单不能操作
if (ObjectUtils.equals(OrderStatusV1.CANCEL.getV2Code(), orderBean.getStatusV2())) {
return ResponseUtil.error(ResponseResult.ORDER_HAS_CANCELED);
}
//判断订单是否有申请退款
if (orderBean.getHasRefund() == null || !orderBean.getHasRefund()) {
return ResponseUtil.error(ResponseResult.ORDER_REFUND_NOT_APPLY);
}
// //订单是否支持退款
// boolean isCanRefund = false;
// //订单
// boolean isRefundDeliveryFee=false;
// //saas渠道订单,已完成的订单不能操作, 商户配置已完成订单可退款可退款
// if (ObjectUtils.equals(orderBean.getBizType(), BizTypeEnum.MALL.getBizType())) {
// isCanRefund = getRefundConfig(orderBean);
// if (!isCanRefund) {
// return ResponseUtil.error(ResponseResult.ORDER_HAD_AFFIRM_CAN_NOT_REFUND);
// }
// }
// if (isCanRefund) {
// orderBean.setAmount(getRefundAmount(orderBean,isRefundDeliveryFee).longValue());
// }
return ResponseUtil.success();
}
}
\ No newline at end of file
......@@ -221,6 +221,7 @@ public class SaasOrderHandle {
if (PayRefundStatus.SUCCESS.equals(refundResponse.getPayRefundStatus())) {
baseOrderResponse = orderCenterSdkService.refundComplete(refundAgreeRequest);
} else {
// fisherman 这里有缺陷 退款失败也是最终状态, 基础服务售后状态不能为 4 不然用户无法重新发起售后单
baseOrderResponse = orderCenterSdkService.refundReturn(refundAgreeRequest);
}
if (baseOrderResponse == null || ObjectUtils.notEqual(ResponseResult.SUCCESS.getCode(), baseOrderResponse.getErrcode().toString())) {
......
package cn.freemud.management.service.impl;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.management.entities.dto.request.order.OrderManagerRequest;
import cn.freemud.management.entities.dto.response.order.OrderManagerResponse;
import cn.freemud.management.entities.dto.response.pay.PayRefundResponse;
import cn.freemud.management.service.OrderManagerService;
import cn.freemud.management.service.handle.ActivityHandle;
import cn.freemud.management.service.handle.MallOrderHandle;
import cn.freemud.management.service.handle.PaymentHandle;
import cn.freemud.management.service.handle.StockHandle;
import cn.freemud.management.util.ResponseUtil;
import com.alibaba.fastjson.JSONObject;
import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1;
import com.freemud.application.sdk.api.ordercenter.enums.AfterSalesStatus;
import com.freemud.application.sdk.api.ordercenter.enums.PayChannelType;
import com.freemud.application.sdk.api.ordercenter.enums.RefundModeEnum;
import com.freemud.application.sdk.api.ordercenter.request.AfterOrderExtInfoDto;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderPayItemResp;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Objects;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Title: rrr
* @Package cn.freemud.management.service.impl
* @Description: 新版商城订单履单操作
* @author:
* @Copyright: 2020 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Service
public class NewMallOrderMangerServiceImpl implements OrderManagerService {
@Autowired
private MallOrderHandle mallOrderHandle;
@Autowired
private PaymentHandle paymentHandle;
@Autowired
private StockHandle stockHandle;
@Autowired
private ActivityHandle activityHandle;
/**
* 同意退款
*
* @param request
* @param orderBean
* @return
*/
@Override
public BaseResponse<OrderManagerResponse> orderAgreeRefund(OrderManagerRequest request, OrderBeanV1 orderBean) {
Byte refundMode = RefundModeEnum.UN_REFUND_GOODS.getIndex();
if(null != orderBean.getAfterSalesOrderResp() && StringUtils.isNotEmpty(orderBean.getAfterSalesOrderResp().getExtInfo())){
AfterOrderExtInfoDto afterOrderExtInfoDto = JSONObject.parseObject(orderBean.getAfterSalesOrderResp().getExtInfo(),AfterOrderExtInfoDto.class);
if(null !=afterOrderExtInfoDto) {
refundMode = afterOrderExtInfoDto.getRefundMode();
}
}
if (Objects.equals(RefundModeEnum.REFUND_ALL.getIndex(), refundMode) && Objects.nonNull(orderBean.getAfterSalesOrderResp()) && Objects.equals(AfterSalesStatus.PENDING.getIndex(), orderBean.getAfterSalesOrderResp().getAfterSalesStatus())) {
// 修改售后单状态为退货中
mallOrderHandle.mallOrderAgreeApply(request, orderBean);
} else {
//支付退款
PayRefundResponse refundResponse;
boolean cashPay = false;
boolean svcPay = false;
if(CollectionUtils.isNotEmpty(orderBean.getOrderPayItem())){
for (OrderPayItemResp payItemResp : orderBean.getOrderPayItem()){
if(Objects.equals(payItemResp.getPayChannelType(),(int)PayChannelType.SVC.getIndex())){
svcPay = true;
}
if(Objects.equals(payItemResp.getPayChannelType(),(int)PayChannelType.WECHAT.getIndex())){
cashPay = true;
}
if(Objects.equals(payItemResp.getPayChannelType(),(int)PayChannelType.ALIPAY.getIndex())){
cashPay = true;
}
}
}
if (cashPay && svcPay) {
refundResponse = paymentHandle.multiRefund(orderBean);
} else {
// OrderExtendedReq ext = orderBean.getOrderExtended();
// if (StringUtils.isNotBlank(ext.getAgentPayerId()) && !Objects.equals(ext.getAgentPayerId(), orderBean.getUserId())) {
// //代付人信息不为空 并且和订单创建人不一样,表示代付单
// refundResponse = paymentHandle.agentPayRefund(orderBean);
// }
refundResponse = paymentHandle.refund(request, orderBean);
}
//订单同意退款
mallOrderHandle.refundAgree(request, refundResponse, orderBean);
//冲正库存
stockHandle.revert(request, orderBean);
}
return ResponseUtil.success();
}
/**
* 拒绝退款
*
* @param request
* @param orderBean
* @return
*/
@Override
public BaseResponse<OrderManagerResponse> orderRejectRefund(OrderManagerRequest request, OrderBeanV1 orderBean) {
//拒绝退款
mallOrderHandle.mallRefundReject(request,orderBean);
return ResponseUtil.success();
}
/**
* 拒单
*
* @param request
* @param orderBean
* @return
*/
@Override
public BaseResponse<OrderManagerResponse> orderReject(OrderManagerRequest request, OrderBeanV1 orderBean) {
return ResponseUtil.error("501","暂无");
}
}
......@@ -22,6 +22,8 @@ public enum BizTypeEnum {
ADVANCE_ORDER(7, "预定业务"),
MALL(8, "微商城业务"),
FM_MALL(12, "商城业务"),
// CASHIER(10, "收款业务"),
LGS_SELF_HELP_PARKING(97, "农工商停车自助积分订单"),
LGS_MANUAL_RECORD_PARKING(98, "农工商停车手工录单"),
......
......@@ -29,6 +29,7 @@ public class Finals {
public static final String CHANNEL_ID_LIST = "channelIds";
public static final String CHANNEL_CODE_LIST = "channelCodes";
public static final String IS_QUERY_STORE = "isQueryStore";
public static final String SHOPPINGCARD_PRODUCTS = "shoppingCardProducts";
public static final Integer PRODUCT_COUPON = 0;
public static final Integer CASH_COUPON = 1;
public static final Integer ELSE_COUPON = 2;
......
......@@ -21,4 +21,9 @@ public class GetMemberCouponRequestVo {
//是否 校验券门店是否可用
private Boolean checkStoreId = false;
/**
* 购物车中的开个店商品id列表,多个用逗号分隔
*/
private String shoppingCardProducts;
}
......@@ -27,6 +27,7 @@ import com.freemud.application.sdk.api.storecenter.service.StoreCenterService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
......@@ -50,9 +51,13 @@ public class FixDeliveryServiceImpl extends AbstractDeliveryServiceImpl implemen
.build();
ConsoleResponseDTO<BizDTO> responseDto = consoleApiClient.getStoreMix(query);
DeliveryInfoDTO deliveryInfo = responseDto.getBizVO().getDeliveryInfo();
long amount = 0L;
List<ExtraDeliveryDto> deliveryAmountList = new ArrayList<>();
if (Objects.nonNull(deliveryInfo)) {
amount = Objects.isNull(deliveryInfo.getFinalDeliveryAmount()) ? 0L : deliveryInfo.getFinalDeliveryAmount();
deliveryAmountList = super.nightDeliveryAmountHandle(amount, deliveryInfo.getExpandFields());
}
// fisherman 处理 额外配送费
long amount = Objects.isNull(deliveryInfo) || Objects.isNull(deliveryInfo.getFinalDeliveryAmount()) ? 0L : deliveryInfo.getFinalDeliveryAmount();
List<ExtraDeliveryDto> deliveryAmountList = super.nightDeliveryAmountHandle(amount, deliveryInfo.getExpandFields());
if (Objects.nonNull(shoppingCartGoodsResponseVo)) {
shoppingCartGoodsResponseVo.setDeliveryFeeZeroReason(0);
shoppingCartGoodsResponseVo.setDeliveryAmountList(deliveryAmountList);
......
......@@ -150,6 +150,9 @@ public class CouponServiceImpl implements CouponService {
// 由于门店服务老是慢,这个参数可以控制不查门店服务, 返回的数据也不需要门店数据
map.put(Finals.IS_QUERY_STORE, false);
map.put(Finals.SIGN, "adapterV4Skip" + requestVo.getPartnerId());
if (StringUtils.isNotEmpty(requestVo.getShoppingCardProducts())) {
map.put(Finals.SHOPPINGCARD_PRODUCTS, requestVo.getShoppingCardProducts());
}
GetCouponDetailResponseDto responseDto = couponOnlineClient.getCouponDetails(map);
if (ResponseCodeConstant.RESPONSE_SUCCESS_1.equals(responseDto.getResult())) {
return responseDto;
......@@ -356,7 +359,7 @@ public class CouponServiceImpl implements CouponService {
if (Objects.equals(couponStateVo.getType(), CouponTypeEnum.TYPE_1.getCode())) {
activityCouponBean.setDiscountAmount(couponStateVo.getOriginalPrice() + "");
} else if (Objects.equals(couponStateVo.getType(), CouponTypeEnum.TYPE_3.getCode())) {
// TODO 折扣券 百分值10 乘以10 前端统一除以100作为操作依据
// TODO 折扣券 百分值10 乘以10 前端统一除以100作为操作依据 _> 废弃, 现在默认 不乘10
activityCouponBean.setDiscountAmount(couponStateVo.getDiscount() != null ? couponStateVo.getDiscount() * 10 + "" : "0");
}else if (Objects.equals(couponStateVo.getType(), CouponTypeEnum.TYPE_5.getCode())) {
// 这里需要加入 配送券逻辑 如果为null 表示 配送券金额 全免, 否则就是部分减免
......@@ -740,6 +743,7 @@ public class CouponServiceImpl implements CouponService {
requestVo.setCouponCode(couponCode);
requestVo.setStoreId(requestDto.getStoreId());
requestVo.setCheckStoreId(true);
requestVo.setShoppingCardProducts(goodsId);
GetCouponDetailResponseDto couponDetailResponseDto = this.getMemberCoupon(requestVo);
if (couponDetailResponseDto == null || !couponDetailResponseDto.getResult().equals(ResponseCodeConstant.RESPONSE_SUCCESS_1) || CollectionUtils.isEmpty(couponDetailResponseDto.getDetails())) {
return null;
......
......@@ -25,6 +25,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
......@@ -86,16 +87,31 @@ public class ProductServiceImpl implements ProductService {
return CartResponseUtil.error(valiadResponse.getErrmsg(),checkCartRequest);
}
ValiadShopProductResponse valiadResult = valiadResponse.getData();
if (CollectionUtils.isEmpty(valiadResult.getSuccessList())) {
checkCartRequest.getCartGoodsList().clear();
checkCartRequest.getShoppingCartGoodsResponseVo().setChanged(true);
checkCartRequest.getShoppingCartGoodsResponseVo().setToastMsg(ShoppingCartConstant.SHOPPING_CART_INVALIAD_GOODS);
return CartResponseUtil.success(checkCartRequest);
}
Map<String, ValiadShopProductResult> successMap = valiadResult.getSuccessList().stream().collect(Collectors.toMap(ValiadShopProductResult::getUuid, Function.identity(), (k1, k2) -> k1));
//非法商品(商品是否存在、商品是否处于上架状态)自动移除,返回前端提示
if (CollectionUtils.isNotEmpty(valiadResult.getFailureList())){
setToastMsgIfNotExist(checkCartRequest.getShoppingCartGoodsResponseVo(), ShoppingCartConstant.SHOPPING_CART_GOODS_CHANGE);
for (CartGoods cartGoods :checkCartRequest.getCartGoodsList()) {
if (valiadResult.getFailureList().stream().anyMatch(f->cartGoods.getCartGoodsUid().equals(f.getUuid()))){
cartGoods.setCartGoodsUid(null);
checkCartRequest.getShoppingCartGoodsResponseVo().setChanged(true);
checkCartRequest.getShoppingCartGoodsResponseVo().setToastMsg(ShoppingCartConstant.SHOPPING_CART_INVALIAD_GOODS);
}
boolean hasChange = false;
for (CartGoods cartGoods :checkCartRequest.getCartGoodsList()) {
// 当goodsId为空或商品是商品券时直接跳过
if (StringUtils.isEmpty(cartGoods.getGoodsId()) || Objects.equals(cartGoods.getGoodsType(), GoodsTypeEnum.COUPON_GOODS.getGoodsType())
|| Objects.equals(cartGoods.getGoodsType(), GoodsTypeEnum.HG_COUPON_GOODS.getGoodsType())
|| Objects.equals(cartGoods.getGoodsType(), GoodsTypeEnum.BUY_M_SEND_N_COUPON.getGoodsType())) {
continue;
}
if (!successMap.containsKey(cartGoods.getCartGoodsUid())){
hasChange = true;
cartGoods.setCartGoodsUid(null);
checkCartRequest.getShoppingCartGoodsResponseVo().setChanged(true);
checkCartRequest.getShoppingCartGoodsResponseVo().setToastMsg(ShoppingCartConstant.SHOPPING_CART_INVALIAD_GOODS);
}
}
if (hasChange){
setToastMsgIfNotExist(checkCartRequest.getShoppingCartGoodsResponseVo(), ShoppingCartConstant.SHOPPING_CART_GOODS_CHANGE);
checkCartRequest.getCartGoodsList().removeIf(k -> StringUtils.isEmpty(k.getCartGoodsUid()));
}
// Todo : 验证的商品信息
......
......@@ -1062,12 +1062,13 @@ public class ShoppingCartNewServiceImpl implements ShoppingCartNewService {
ShoppingCartGoodsResponseVo shoppingCartGoodsResponseVo = goodsList.getResult();
// fisherman -> 储值卡互斥需求 发现bug 导致返回购物车数据不对 当前时间节点无法修复 重新请求一次
if (Objects.nonNull(shoppingCartInfoRequestVo.getEnableSharing()) && shoppingCartInfoRequestVo.getEnableSharing().compareTo(0) == 0) {
logUtil.info("fisherman -> 当前请求了2次计算操作", JSON.toJSONString(shoppingCartInfoRequestVo), JSON.toJSONString(shoppingCartGoodsResponseVo));
goodsList = getGoodsList(shoppingCartInfoRequestVo);
if (goodsList == null || !ResponseResult.SUCCESS.getCode().equals(goodsList.getCode())) {
return goodsList;
if (shoppingCartGoodsResponseVo.getChanged() != null && shoppingCartGoodsResponseVo.getChanged() ==true) {
goodsList = getGoodsList(shoppingCartInfoRequestVo);
if (goodsList == null || !ResponseResult.SUCCESS.getCode().equals(goodsList.getCode())) {
return goodsList;
}
shoppingCartGoodsResponseVo = goodsList.getResult();
}
shoppingCartGoodsResponseVo = goodsList.getResult();
}
//SVC卡支付
SVCCardPay(cardCodes, shoppingCartInfoRequestVo.getReceiveId(), partnerId, storeId, shoppingCartGoodsResponseVo);
......@@ -2447,7 +2448,15 @@ public class ShoppingCartNewServiceImpl implements ShoppingCartNewService {
toastMsg = shoppingCartInfoRequestVo != null && ObjectUtils.equals(SubmitPageEnum.YES.getCode(), shoppingCartInfoRequestVo.getFlag()) ? SHOPPING_CART_EMPTY_GOODS_LIST : SHOPPING_CART_INVALIAD_GOODS;
setToastMsgIfNotExist(shoppingCartGoodsResponseVo, toastMsg);
//结算页,只有商品全部非法(即products为空)时,才提示changed为true toastMsg 不为空
if (shoppingCartInfoRequestVo != null && ObjectUtils.equals(SubmitPageEnum.YES.getCode(), shoppingCartInfoRequestVo.getFlag())) {
boolean changed = shoppingCartInfoRequestVo != null
&&shoppingCartInfoRequestVo.getEnableSharing() != null
&& shoppingCartInfoRequestVo.getEnableSharing().compareTo(0) == 0
&& Objects.nonNull(shoppingCartGoodsResponseVo.getChanged())
&& shoppingCartGoodsResponseVo.getChanged().compareTo(true) == 0;
if (changed) {
shoppingCartGoodsResponseVo.setChanged(true);
shoppingCartGoodsResponseVo.setToastMsg("购物车数据异常,需要重新请求购物车list接口");
} else {
shoppingCartGoodsResponseVo.setChanged(CollectionUtils.isEmpty(cartGoodsList));
shoppingCartGoodsResponseVo.setToastMsg(CollectionUtils.isEmpty(cartGoodsList) ? toastMsg : "");
}
......
......@@ -121,7 +121,7 @@ public class CalculationSharingEquallyService {
Goods find = null;
for (CartGoods product : shoppingCartGoodsResponseVo.getProducts()) {
if (goods!=null) {
find = goods.stream().filter((k) -> k.getCartGoodsUid().equals(product.getCartGoodsUid())).findFirst().get();
find = goods.stream().filter((k) -> k.getCartGoodsUid().equals(product.getCartGoodsUid())).findFirst().orElseGet(null);
}
ShoppingCartGoodsDto.CartGoodsDetailDto cartGoodsDetailDto = calculationCommonService.convertCartGoods2DetailGoodsList(find, product,shoppingCartInfoRequestVo.getPartnerId());
cartGoodsDetailDtoList.add(cartGoodsDetailDto);
......
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