Commit 75cb8aeb by 查志伟

Merge branch 'feature/退款支持优化' into develop

# Conflicts:
#	order-application-service/src/main/java/cn/freemud/service/impl/OrderServiceImpl.java
parents 09574429 f1fef8a7
package cn.freemud.adapter;
import com.freemud.application.sdk.api.log.LogThreadLocal;
import com.freemud.application.sdk.api.ordercenter.enums.AfterSalesType;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs;
import com.freemud.sdk.api.assortment.order.enums.AfterSalesRefunStateEnum;
import com.freemud.sdk.api.assortment.order.enums.OperationClientEnum;
import com.freemud.sdk.api.assortment.order.request.order.CancelOrderRequest;
import org.apache.commons.lang.StringUtils;
/**
* @author Clover.z
* @version 1.0.0
* @since 1.0.0
*/
public class CancelOrderRequestAdapter {
public static CancelOrderRequest convert(OrderInfoReqs order, String refundId, AfterSalesType afterSalesType, String reason, Boolean refundDeliveryFee, Byte refundMode) {
CancelOrderRequest req = new CancelOrderRequest();
req.setOrderId(order.getOrderCode());
req.setPartnerId(order.getPartnerId());
req.setAfterSalesType(afterSalesType);
req.setOrderClient(order.getOrderClient());
if (StringUtils.isNotBlank(reason) && reason.length() > 50) {
reason = reason.substring(0, 50);
}
req.setReason(reason);
req.setTrackingNo(LogThreadLocal.getTrackingNo());
req.setRefundSerialNo(refundId);
//操作来源客户端 1:POS插件 2:小助手 3:开放平台 4:自动任务 5:用户端 6:系统 7:万象 8:太一
req.setOperationClient(OperationClientEnum.STATE_5.getIndex());
req.setOperator(order.getUserName());
if (AfterSalesType.SYSTEM_CANCEL.getIndex().equals(afterSalesType.getIndex())) {
req.setOperator("admin");
req.setOperationClient(OperationClientEnum.STATE_6.getIndex());
}
//若为4,默认做【创建】+【同意并退款完成】,售后单状态为【完成】
req.setCreateEvent(4);
// 这里给默认值,外面调用者 自己的根据业务判断退款 状态
req.setRefundState(AfterSalesRefunStateEnum.STATE_1.getIndex());
req.setReqRemark(reason);
req.setRefundDeliveryAmount(refundDeliveryFee);
// 商城订单 增加拓展信息
CancelOrderRequest.AfterSalesOrderExtInfoReq ext = new CancelOrderRequest.AfterSalesOrderExtInfoReq();
ext.setRefundMode(refundMode);
req.setExtInfoReq(ext);
return req;
}
}
......@@ -13,7 +13,6 @@
package cn.freemud.adapter;
import cn.freemud.entities.dto.PushMessageTokenDto;
import cn.freemud.entities.dto.QueryOrdersResponseDto;
import com.alibaba.fastjson.JSONObject;
import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto;
......@@ -37,7 +36,7 @@ public class MessageNoticeAdapter {
return pushMessageTokenDto;
}
public PushMessageNoticeDto convent2PushMessageNoticeDto(Integer targetType, String partnerId,
public static PushMessageNoticeDto convent2PushMessageNoticeDto(Integer targetType, String partnerId,
String storeId, String userId, String oid, String takeCode, String queueIndex) {
PushMessageNoticeDto pushMessageNoticeDto = new PushMessageNoticeDto();
pushMessageNoticeDto.setPartnerId(partnerId);
......
package cn.freemud.adapter;
import cn.freemud.base.util.DateUtil;
import cn.freemud.entities.dto.OrderPrintDto;
import cn.freemud.enums.CostTypeEnum;
import com.alibaba.fastjson.JSON;
import com.freemud.application.sdk.api.ordercenter.enums.ProductTypeEnum;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderCostResp;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderItemResp;
import com.freemud.sdk.api.assortment.order.enums.StoreDeliveryMethod;
import com.google.common.collect.Lists;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author Clover.z
* @version 1.0.0
* @since 1.0.0
*/
public class OrderPrintDtoAdapter {
public static OrderPrintDto convert(OrderInfoReqs order, String reason) {
OrderPrintDto orderPrintDto = new OrderPrintDto();
orderPrintDto.setPartnerId(order.getPartnerId());
orderPrintDto.setStoreId(order.getStoreId());
//确定日订单序号
orderPrintDto.setType(order.getOrderType());
orderPrintDto.setOid(order.getOrderCode());
orderPrintDto.setUserName(order.getUserName());
orderPrintDto.setDaySeq(order.getDaySeq() == null ? "" : order.getDaySeq().toString());
orderPrintDto.setPhone(order.getUserMobile());
if (CollectionUtils.isNotEmpty(order.getDeliveryContactInfoList())) {
order.getDeliveryContactInfoList().stream().filter(c -> Objects.equals(c.getRelateObjectType(), 1))
.findFirst().ifPresent(c -> orderPrintDto.setAddress(c.getAddressDetail()));
order.getDeliveryContactInfoList().stream().filter(c -> Objects.equals(c.getRelateObjectType(), 3))
.findFirst().ifPresent(c -> {
if (Objects.equals(c.getAddressDetail(), StoreDeliveryMethod.THIRD.getCode())) {
orderPrintDto.setDeliveryTypeDesc("第三方配送");
if (StringUtils.isNotBlank(order.getExpressChannelName())) {
orderPrintDto.setDeliveryTypeDesc(order.getExpressChannelName());
}
} else {
orderPrintDto.setDeliveryTypeDesc("自配送");
}
});
}
orderPrintDto.setGmtExpect(order.getExpectTime() == null
? "立即送出"
: (DateUtil.convert2String(new Date(Long.parseLong(order.getExpectTime())), DateUtil.FORMAT_YYYY_MM_DD_HHMMSS)));
orderPrintDto.setRemark(order.getNote());
Integer count = order.getOrderItemList().stream().map(OrderItemResp::getProductQuantity).reduce(Integer::sum).get();
orderPrintDto.setProductTotalAmount(count);
Long packageFee = 0L;
long sendFee = 0L;
if (CollectionUtils.isNotEmpty(order.getOrderCostDetailList())) {
for (OrderCostResp cost : order.getOrderCostDetailList()) {
if (CostTypeEnum.PACK_AMOUNT.getCode().equals(cost.getCostType())) {
packageFee = cost.getActualCostAmount().longValue();
} else if (CostTypeEnum.DELIVERY_AMOUNT.getCode().equals(cost.getCostType())) {
sendFee = cost.getActualCostAmount().longValue();
}
}
}
orderPrintDto.setPackageFee(packageFee);
orderPrintDto.setProductAmount(order.getSettlementAmount().longValue() - sendFee);
orderPrintDto.setSendFee(sendFee);
orderPrintDto.setDiscountFee(order.getOriginalAmount().longValue() - order.getSettlementAmount().longValue());
orderPrintDto.setUserFee(order.getActualPayAmount().longValue());
orderPrintDto.setGmtCreate(DateUtil.convert2String(new Date(Long.parseLong(order.getCreateTime())), DateUtil.FORMAT_YYYY_MM_DD_HHMMSS));
orderPrintDto.setShopName(order.getStoreName());
orderPrintDto.setOtherCode(order.getPickUpGoodsNo());
List<OrderPrintDto.ProductsBean> productsBeans = getProducts(order.getOrderItemList());
orderPrintDto.setProducts(productsBeans);
orderPrintDto.setBarCounter(order.getBarCounter());
orderPrintDto.setRemark(reason);
return orderPrintDto;
}
public static List<OrderPrintDto.ProductsBean> getProducts(List<OrderItemResp> itemList) {
if (CollectionUtils.isEmpty(itemList)) {
return Collections.emptyList();
}
List<OrderPrintDto.ProductsBean> products = Lists.newArrayList();
// 将订单里同一商品下的所有子商品放到一个集合中 key:父商品id, value为子商品集合
Map<String, List<OrderItemResp>> sItemMap = itemList
.stream()
.filter(item -> !item.getParentProductId().equals("0"))
.collect(Collectors.groupingBy(OrderItemResp::getParentProductId));
for (OrderItemResp item : itemList) {
//非主商品跳过
if (!item.getParentProductId().equals("0")) continue;
OrderPrintDto.ProductsBean productVO = getProductBean(item);
//匹配子商品
List<OrderItemResp> sList = sItemMap.get(item.getProductId() + "_" + item.getProductSeq());
List<OrderPrintDto.ProductsBean> comboProductVOs = new ArrayList<>();
List<OrderPrintDto.ProductsBean> materialProductVOs = new ArrayList<>();
if (CollectionUtils.isNotEmpty(sList)) {
sList.forEach(sItem -> {
OrderPrintDto.ProductsBean son = getProductBean(sItem);
if (ProductTypeEnum.MATERIAL_PRODUCT.getCode().equals(sItem.getProductType())) {
materialProductVOs.add(son);
} else {
comboProductVOs.add(son);
}
});
}
productVO.setSonProducts(comboProductVOs);
productVO.setMaterialProducts(materialProductVOs);
products.add(productVO);
}
return products;
}
private static OrderPrintDto.ProductsBean getProductBean(OrderItemResp item) {
OrderPrintDto.ProductsBean productBean1 = new OrderPrintDto.ProductsBean();
productBean1.setParentProductId(item.getParentProductId());
productBean1.setSequence(item.getProductSeq());
productBean1.setProductId(item.getProductSpec());
productBean1.setProductName(item.getProductSpecName());
productBean1.setNumber(item.getProductQuantity());
String extraName = "";
if (StringUtils.isNotBlank(item.getExtInfo())) {
OrderItemResp.ExtInfo itemExt = JSON.parseObject(item.getExtInfo(), OrderItemResp.ExtInfo.class);
if (CollectionUtils.isNotEmpty(itemExt.getSpecialAttrs())) {
extraName = StringUtils.join(itemExt.getSpecialAttrs().stream()
.map(OrderItemResp.ExtAttr::getExtraName)
.collect(Collectors.toList()), "/");
}
}
productBean1.setPrice(item.getProductPrice().longValue());
productBean1.setProductOtherInfo(extraName);
productBean1.setParentType(item.getProductType());
productBean1.setSonProducts(new ArrayList<>());
productBean1.setUnit(item.getProductUnit());
productBean1.setProductSpuQuantity(item.getProductSpuQuantity());
return productBean1;
}
}
//package cn.freemud.config;
//
//import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
//import lombok.extern.log4j.Log4j2;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//
///**
// * @author : xh.Z
// * @email : fisherman0510@163.com
// * @Date : 2021/4/26 下午6:21
// * @description : xxl-job 配置
// */
//@Configuration
//@Log4j2
//public class XxlJobConfig {
//
// @Value("${xxl.job.admin.addresses}")
// private String adminAddresses;
//
// @Value("${xxl.job.executor.appname}")
// private String appName;
//
// //@Value("${xxl.job.executor.ip}")
// private String ip;
//
// //@Value("${xxl.job.executor.port}")
// private int port;
//
// //@Value("${xxl.job.accessToken}")
// private String accessToken;
//
// @Value("${xxl.job.executor.logpath:/data/applogs/xxl-job/jobhandler}")
// private String logPath;
//
// @Value("${xxl.job.executor.logretentiondays:-1}")
// private int logRetentionDays;
//
//
// @Bean(initMethod = "start", destroyMethod = "destroy")
// public XxlJobSpringExecutor xxlJobExecutor() {
// XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
// xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
// xxlJobSpringExecutor.setAppName(appName);
// xxlJobSpringExecutor.setIp(ip);
// xxlJobSpringExecutor.setPort(port);
// xxlJobSpringExecutor.setAccessToken(accessToken);
// xxlJobSpringExecutor.setLogPath(logPath);
// xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
//
// return xxlJobSpringExecutor;
// }
//}
package cn.freemud.constant;
public class ExtJsonConstant {
private String FOODJSON= "{\n" +
"\"extEnable\": true,\n" +
"\"extAppid\": \"wxaf1b67249de514a3\",\n" +
"\"directCommit\": false,\n" +
"\"ext\": {\n" +
"\"appid\": \"{{appid}}\",\n" +
"\"partnerId\": \"{{partnerId}}\",\n" +
"\"name\": \"wechat\",\n" +
"\"attr\": {\n" +
"\"host\": \"\",\n" +
"\"users\": [\n" +
"\"user_1\",\n" +
"\"user_2\"\n" +
"]\n" +
"}";
private String GROUPON="";
}
......@@ -5,13 +5,14 @@ import cn.freemud.entities.vo.*;
import cn.freemud.entities.vo.order.PayConfigVo;
import cn.freemud.entities.vo.order.PaySuccessDataVo;
import cn.freemud.service.ExposureOrderService;
import cn.freemud.service.RefundService;
import cn.freemud.service.impl.OrderQueueService;
import cn.freemud.service.impl.OrderServiceImpl;
import cn.freemud.service.impl.PayServiceImpl;
import cn.freemud.utils.ResponseUtil;
import com.freemud.application.sdk.api.log.ApiAnnotation;
import com.freemud.application.sdk.api.log.LogParams;
import org.springframework.beans.factory.annotation.Autowired;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
......@@ -23,18 +24,14 @@ import org.springframework.web.bind.annotation.RestController;
*/
@RestController
@RequestMapping("/order/exposure")
@RequiredArgsConstructor
public class ExposureOrderController {
@Autowired
private PayServiceImpl payService;
@Autowired
private ExposureOrderService exposureOrderService;
@Autowired
private OrderServiceImpl orderService;
@Autowired
private OrderQueueService orderQueueService;
private final PayServiceImpl payService;
private final ExposureOrderService exposureOrderService;
private final OrderServiceImpl orderService;
private final OrderQueueService orderQueueService;
private final RefundService refundService;
/**
* 创建支付单,查询支付配置
......@@ -50,6 +47,7 @@ public class ExposureOrderController {
*/
@ApiAnnotation(logMessage = "创建订单,死信队列")
@PostMapping("/deadLetterQueue")
@Deprecated
public BaseResponse deadLetterQueue(@Validated @LogParams @RequestBody PutDeadLetterVo putDeadLetterVo) {
payService.putDelMq(putDeadLetterVo.getPartnerId(), putDeadLetterVo.getStoreId(), putDeadLetterVo.getFmId(), putDeadLetterVo.getOrderId(), putDeadLetterVo.getPayChanelType());
return ResponseUtil.success();
......@@ -131,4 +129,14 @@ public class ExposureOrderController {
return ResponseUtil.success(exposureOrderService.getPayCode(req));
}
/**
* 退订单金额(仅退款,不会处理订单状态)
* 返回退款状态, 1-成功 {@link cn.freemud.enums.PayRefundStatus}
*/
@PostMapping("/refundOrderAmt")
@ApiAnnotation(logMessage = "退订单金额(仅退款,不会处理订单状态)")
public BaseResponse<Integer> refundOrderAmt(@Validated @LogParams @RequestBody RefundOrderAmtRequest request) {
return ResponseUtil.success(refundService.refundOrderAmt(request.getPartnerId(), request.getOrderCode(), request.getReason()));
}
}
......@@ -26,6 +26,7 @@ import cn.freemud.handler.OrderReportJobHandler;
import cn.freemud.service.EncircleOrderService;
import cn.freemud.service.Orderservice;
import cn.freemud.service.PointsMallOrderService;
import cn.freemud.service.RefundService;
import cn.freemud.service.impl.MallOrderServiceImpl;
import cn.freemud.service.impl.OrderAdapterServiceImpl;
import cn.freemud.utils.AppLogUtil;
......@@ -34,6 +35,7 @@ import cn.freemud.xxljob.OrderCountJobHandler;
import com.freemud.application.sdk.api.log.ApiAnnotation;
import com.freemud.application.sdk.api.log.LogParams;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
......@@ -64,6 +66,8 @@ public class OrderController {
private CouponOrderAutoRefundHandler couponOrderAutoRefundHandler;
@Autowired
private PointsMallOrderService pointsMallOrderService;
@Autowired
private RefundService refundService;
/**
......@@ -243,8 +247,12 @@ public class OrderController {
*/
@ApiAnnotation(logMessage = "refund")
@PostMapping("/refund")
public BaseResponse refund(@Validated @LogParams @RequestBody OrderRefundVo orderRefundVo) {
return orderservice.orderRefund(orderRefundVo);
public BaseResponse<Void> refund(@Validated @LogParams @RequestBody OrderRefundVo reqVo) {
// 微商城因为没有退款原因选项 所以将用户退款说明用户作为退款原因
String reason = StringUtils.isBlank(reqVo.getReason())
? reqVo.getRemarks() : reqVo.getReason();
refundService.refundOrder(reqVo.getPartnerId(), reqVo.getOid(), reason, reqVo.getRefundMode());
return ResponseUtil.success();
}
......
......@@ -2,8 +2,8 @@ package cn.freemud.controller;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.vo.OrderDevelopRefundVo;
import cn.freemud.entities.vo.OrderRefundVo;
import cn.freemud.service.Orderservice;
import cn.freemud.service.RefundService;
import cn.freemud.utils.ResponseUtil;
import com.freemud.application.sdk.api.log.ApiAnnotation;
import com.freemud.application.sdk.api.log.LogParams;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -13,6 +13,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
......@@ -24,7 +26,7 @@ import org.springframework.web.bind.annotation.RestController;
public class OrderDeveloperController {
@Autowired
private Orderservice orderservice;
private RefundService refundService;
/**
* 订单内部人员操作 给订单退款, 使用该接口需要报备
......@@ -33,8 +35,8 @@ public class OrderDeveloperController {
*/
@ApiAnnotation(logMessage = "/order/develop/refund")
@PostMapping("/refund")
public BaseResponse developRefund(@Validated @LogParams @RequestBody OrderDevelopRefundVo orderRefundVo) {
return orderservice.developRefund(orderRefundVo);
public BaseResponse<Map<String, String>> developRefund(@Validated @LogParams @RequestBody OrderDevelopRefundVo orderRefundVo) {
return ResponseUtil.success(refundService.batchDevelopRefund(orderRefundVo));
}
}
package cn.freemud.controller.test;
import lombok.Data;
/**
* All rights Reserved, Designed By www.freemud.com
*
* @version V1.0
* @Title:
* @Package: cn.freemud.controller.test
* @Descripttion:
* @author: shuhu.hou
* @date: 2019/7/9
* @Copyright: 2017 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目.
*/
@Data
public class PlatformBaseRequest {
/**
* 版本号
*/
private String ver;
/**
* 由非码颁发商户唯一标识
*/
private String partnerId;
/**
* 由非码颁发平台唯一标识
*/
private String appId;
/**
* 业务请求参数json格式字符串
*/
private String requestBody;
/**
* SHA256WithRSA 加密签名
*/
private String sign;
}
package cn.freemud.controller.test;
import lombok.Data;
/**
* All rights Reserved, Designed By www.freemud.com
*
* @version V1.0
* @Title:
* @Package: cn.freemud.controller.test
* @Descripttion:
* @author: shuhu.hou
* @date: 2019/7/9
* @Copyright: 2017 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目.
*/
@Data
public class PlatformBaseResponse {
/**
* 版本号
*/
private String ver;
/**
* 返回状态码
*/
private String statusCode;
/**
* 返回信息
*/
private String message;
/**
* 业务响应参数
*/
private String responseBody;
/**
* 返回签名
*/
private String sign;
}
package cn.freemud.controller.test;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.dto.wechat.GetAuthorizerRequestDto;
import cn.freemud.entities.dto.wechat.GetTokenResponseDto;
import cn.freemud.service.thirdparty.EcologyAdminApplicationClient;
import cn.freemud.service.thirdparty.WeChatClient;
import cn.freemud.utils.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.freemud.sdk.api.assortment.order.request.order.GroupBuyRequest;
import org.apache.commons.beanutils.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* All rights Reserved, Designed By www.freemud.com
*
* @version V1.0
* @Title:
* @Package: cn.freemud.controller
* @Descripttion:
* @author: shuhu.hou
* @date: 2019/7/8
* @Copyright: 2017 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目.
*/
@RestController
@Validated
public class TestController {
@Autowired
private EcologyAdminApplicationClient ecologyAdminApplicationClient;
@Autowired
private WeChatClient weChatClient;
// @ApiAnnotation(logMessage = "orderStatusChange")
// @PostMapping("/orderStatusChange")
// public PlatformBaseResponse orderStatusChange(@Validated @LogParams @RequestBody PlatformBaseRequest checkBeforeCreateOrderRequestVo) {
// PlatformBaseResponse platformBaseResponse = new PlatformBaseResponse();
// platformBaseResponse.setStatusCode("100");
// return platformBaseResponse;
// }
//
// @ApiAnnotation(logMessage = "refundStatusChange")
// @PostMapping("/refundStatusChange")
// public PlatformBaseResponse refundStatusChange(@Validated @LogParams @RequestBody PlatformBaseRequest checkBeforeCreateOrderRequestVo) {
// PlatformBaseResponse platformBaseResponse = new PlatformBaseResponse();
// platformBaseResponse.setStatusCode("100");
// return platformBaseResponse;
// }
//
// @ApiAnnotation(logMessage = "testOrderDelivery")
// @PostMapping("/testOrderDelivery")
// public PlatformBaseResponse testOrderDelivery(@Validated @LogParams @RequestBody PlatformBaseRequest platformBaseRequest) {
// PlatformBaseResponse platformBaseResponse = new PlatformBaseResponse();
// platformBaseResponse.setStatusCode("100");
// return platformBaseResponse;
// }
}
package cn.freemud.entities.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* @author Clover.z
* @version 1.0.0
* @since 1.0.0
*/
@Data
public class RefundOrderAmtRequest {
@ApiModelProperty(value = "商户号", required = true)
@NotBlank
private String partnerId;
@ApiModelProperty(value = "订单号", required = true)
@NotBlank
private String orderCode;
@ApiModelProperty(value = "退款说明", required = true)
@NotBlank
private String reason;
}
......@@ -18,6 +18,7 @@ public enum PayStatus {
HAVE_PAID(2, "已支付","Paid"),
HAVE_REFUND(3, "已退款","Refunded"),
HAVE_PART_REFUND(4, "已经部分退款","Partial refund"),
@Deprecated
COMPLETE(5, "完成","Complete");
......
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: MemberClientFallbackFactory
* @Package cn.freemud.hystrix
* @Description:
* @author: liming.guo
* @date: 2018/6/25 16:39
* @version V1.0
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
package cn.freemud.hystrix;
import org.springframework.stereotype.Component;
@Component
public class MemberClientFallbackFactory {
// @Override
// public GetMemberInfoResponseDto getUserInfo(GetMemberInfoDto memberInfoDto) {
// return getDefaultFallbackBean(GetMemberInfoResponseDto::new,"getUserInfo");
// }
//
// @Override
// public GetMemberInfoResponseDto getUserInfoByMemberId(GetMemberInfoByMemberIdDto getMemberInfoByMemberIdDto) {
// return getDefaultFallbackBean(GetMemberInfoResponseDto::new,"getUserInfoByMemberId");
// }
//
// @Override
// public UserRegisterResponse registerbychannel(MemberRegisterDto memberRegisterDto) {
// return getDefaultFallbackBean(UserRegisterResponse::new,"registerbychannel");
// }
//
// @Override
// public JSONObject editUserInfo(EditMemberInfo editMemberInfo) {
//// return getDefaultFallbackBean(UserRegisterResponse::new,"registerbychannel");
// return null;
// }
//
// private static <T> T getDefaultFallbackBean(Supplier<T> supplier,String methodName) {
// T target = supplier.get();
// Class clazz = target.getClass();
// Map<String, String> map = Maps.newTreeMap();
// map.put("code", ResponseResult.SYSTEM_BUSINESS_ERROR.getCode());
// map.put("message",methodName+ "请求服务异常");
// return new Gson().fromJson(new Gson().toJson(map), (Class<T>) clazz);
// }
}
package cn.freemud.request.wechat.dto;
import lombok.Getter;
import java.net.MalformedURLException;
import java.net.URL;
public class SignMessageBuilder {
private String canonicalUrl;
@Getter
private String nonceStr;
@Getter
private long timestamp = 0;
private String httpBody;
private String httpMethod;
public SignMessageBuilder url(URL url) {
this.canonicalUrl = url.getPath();
if (url.getQuery() != null) {
this.canonicalUrl += url.getQuery();
}
return this;
}
public SignMessageBuilder requestUrl(String requestUrl) throws MalformedURLException {
this.url(new URL(requestUrl));
return this;
}
public SignMessageBuilder canonicalUrl(String canonicalUrl) {
this.canonicalUrl = canonicalUrl;
return this;
}
public SignMessageBuilder nonceStr(String nonceStr) {
this.nonceStr = nonceStr;
return this;
}
public SignMessageBuilder timestamp(long timestamp) {
this.timestamp = timestamp;
return this;
}
public SignMessageBuilder httpBody(String httpBody) {
this.httpBody = httpBody;
return this;
}
public SignMessageBuilder httpMethod(String httpMethod) {
this.httpMethod = httpMethod;
return this;
}
public String buildMchSignMessage() {
if (timestamp == 0) {
throw new IllegalStateException("timestamp cannot be empty");
}
if (nonceStr == null) {
throw new IllegalStateException("nonceStr cannot be empty");
}
if (canonicalUrl == null) {
throw new IllegalStateException("canonicalUrl cannot be empty");
}
if (httpMethod == null) {
throw new IllegalStateException("httpMethod cannot be empty");
}
if (httpMethod.equals("GET") && httpBody == null) {
httpBody = "";
}
return httpMethod + "\n"
+ canonicalUrl + "\n"
+ timestamp + "\n"
+ nonceStr + "\n"
+ httpBody + "\n";
}
public String buildWechatpaySignMessage() {
if (timestamp == 0) {
throw new IllegalStateException("timestamp cannot be empty");
}
if (nonceStr == null) {
throw new IllegalStateException("nonceStr cannot be empty");
}
if (httpBody == null) {
httpBody = "";
}
return "" + timestamp + "\n"
+ nonceStr + "\n"
+ httpBody + "\n";
}
}
package cn.freemud.request.wechat.dto;
import lombok.Data;
import java.util.List;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.6.0
* @Title: SyncStatusDto
* @Package cn.freemud.entities.dto
* @Description: 订单微信上送DTO
* @author: lox
* @date: 2019/3/12 15:00
* @Copyright: 2019 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Data
public class SyncStatusDto {
/**
* 服务商商户号
*/
private String sp_mchid;
/**
* 子商户号
*/
private String sub_mchid;
/**
* 服务商APPID
*/
private String sp_appid;
/**
* 子商户APPID,非必填
*/
private String sub_appid;
/**
* 门店编号
*/
private String out_shop_no;
/**
* 用户标识,非必填
*/
private String openid;
/**
* 用户子标识 ,非必填
*/
private String sub_openid;
/**
* 登录票据(微信用户登录接口返回的登 录票据 公众号,填写access_token; 小程序,填写session_key;)
*/
private String login_token;
/**
* 点餐入口(公众号:点餐页面完整URL 小程序:点餐页面path路径 )
*/
private String order_entry;
/**
* 总价,单位为分
*/
private int total_amount;
/**
* 优惠金额,单位为分
*/
private int discount_amount;
/**
* 实际支付,单位为分
*/
private int user_amount;
/**
* 订单状态 (CREATE_DEAL—用户下单;PAY_SUCCESS—支付完成)
*/
private String status;
/**
* 状态发生变化的 时间
*/
private String action_time;
/**
* 支付时间 (status为PAY_SUCCESS时 必填)
*/
private String pay_time;
/**
* 微信支付订单号(status 为 PAY_SUCCESS时必填)
*/
private String transaction_id;
/**
* 服务商支付订单号(status为PAY_SUCCESS时 必填)
*/
private String out_trade_no;
/**
* 服务商订单号
*/
private String out_order_no;
/**
* 菜品列表
*/
private List<DishInfo> dish_list;
/**
* 桌位号,非必填
*/
private String out_table_no;
/**
* 消费人数
*/
private int people_count;
@Data
public static class DishInfo{
/**
* 商户菜品ID
*/
private String out_dish_no;
/**
* 菜品名称
*/
private String name;
/**
* 菜品单价,单位为分
*/
private int price;
/**
* 菜品单位 (BY_SHARE-按份,BY_WEIGHT-按重量)
*/
private String unit;
/**
* 菜品数量
*/
private float count;
/**
* 菜品折扣,百分值,8折填80,非必填
*/
private int discount;
/**
* 菜品分类 非必填
*/
private String type;
/**
* 菜品优先级(当前菜品在服务商平台的顺序, 值越小越靠前,取值(1~100)),非必填
*/
private int priority;
}
}
package cn.freemud.service;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.vo.*;
import cn.freemud.entities.vo.GetMallPayConfigVo;
import cn.freemud.entities.vo.GetPayCodeVo;
import cn.freemud.entities.vo.GetPayConfigVo;
import cn.freemud.entities.vo.GetPaySuccessDataV2Request;
import cn.freemud.entities.vo.order.PayConfigVo;
import cn.freemud.entities.vo.order.PaySuccessDataVo;
import cn.freemud.entities.vo.order.QueryByKeysReq;
......@@ -10,7 +13,6 @@ 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 cn.freemud.service.thirdparty.OrderServiceClient;
import com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformIappWxappStore;
......@@ -36,7 +38,6 @@ public class ExposureOrderService {
private final PayServiceImpl payService;
private final OrderTackCodeManager orderTackCodeManager;
private final OrderBusinessServiceImpl orderBusinessService;
private final OrderCenterSdkAdapter orderCenterSdkAdapter;
private final OrderServiceClient orderServiceClient;
......
//package cn.freemud.service;
//
//import cn.freemud.base.entity.BaseResponse;
//import cn.freemud.entities.vo.AppCreateOrderVo;
//import cn.freemud.entities.vo.CreateOrderVo;
//import cn.freemud.entities.vo.CreatePrepayVo;
//import cn.freemud.entities.vo.PaysuccessNoticeMessage;
//
//import java.util.Map;
//
///**
// * All rights Reserved, Designed By www.freemud.cn
// *
// * @version V1.6.0
// * @Title: OrderAdapterService
// * @Description: 订单业务适配
// * @author: qin.zhou
// * @date: 2019/9/818:20
// * @Copyright: ${DATE.YARE} www.freemud.cn Inc. All rights reserved.
// * 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
// */
//public interface OrderAdapterService {
//
// /**
// * 创建订单
// * @param createOrderVo
// * @return
// */
// BaseResponse createOrderNew(CreateOrderVo createOrderVo);
//
// /**
// * 创建订单
// * @param param
// * @return
// */
// BaseResponse createOrderUniversal(Map<String, Object> param);
//
// /**
// * 麦咖啡创建订单
// * @param createOrderVo
// * @return
// */
// BaseResponse createMCCafeOrder(CreateOrderVo createOrderVo);
//
// /**
// * 创建预支付
// */
// BaseResponse createPrepay(CreatePrepayVo createPrepayVo);
//
// /**
// * APP下单,下单带商品信息,不经过购物车服务
// */
// @Deprecated
// BaseResponse appCreateOrder(AppCreateOrderVo createOrderVo);
//
// /**
// * 支付回调处理
// */
// String paySuccessCallback(PaysuccessNoticeMessage message);
//
// /**
// * 支付回调处理
// */
// String mcCafePaySuccessCallback(PaysuccessNoticeMessage message);
//
//}
//package cn.freemud.service;
//
//
//import com.freemud.sdk.api.assortment.orderdistributor.request.DisRequest;
//
///**
// * All rights Reserved, Designed By www.freemud.cn
// *
// * @version V1.0
// * @Title: ${FILE_NAME}
// * @Package com.freemud.mail.core
// * @Description: $MQ分发器服务接口
// * @author: aiqi.gong
// * @date: 2019/3/21 18:37
// * @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
// * 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
// */
//public interface OrderDistributeMQService {
//
// /**
// * 消息分发
// * @param disRequest 消息体
// */
// void messageDistribute(DisRequest disRequest);
//
//}
......@@ -75,47 +75,11 @@ public interface Orderservice extends OrderFactoryService{
BaseResponse cancelPayOrder(DeleteOrderVo deleteOrderVo);
/**
* 支付取消删除订单
*/
// BaseResponse deleteOrderById(DeleteOrderVo deleteOrderVo);
/**
* 订单申请退款
*/
BaseResponse orderRefund(OrderRefundVo orderRefundVo);
/**
* 获取订单排队号
*/
BaseResponse queryOrderQueueIndex(QueryOrderQueueIndexVo queryOrderQueueIndexVo);
/**
* 用户评价
*/
//BaseResponse userOrderEvaluation(AddUserOrderEvaluationRequestVo requestVo);
/**
* 用户评价(新接口)
*/
//BaseResponse userOrderEvaluationNew(AddUserOrderEvaluationNewRequestVo requestVo);
/**
* 根据订单查询对应的订单详情
*/
//BaseResponse getEvaluationByOrderId(GetEvaluationDetailByOrderIdRequestVo requestVo);
/**
* 判断订单是否已经评价
*/
//BaseResponse getEvaluationStatus(GetEvaluationDetailByOrderIdRequestVo requestVo);
/**
* 判断订单是否已经评价(新接口)
*/
//BaseResponse getEvaluationStatusNew(GetEvaluationStatusNewRequestVo requestVo);
/**
* 获取退款理由
*/
@Deprecated
......@@ -220,10 +184,5 @@ public interface Orderservice extends OrderFactoryService{
*/
BaseResponse couponOrderRefundRetry(OrderRefundRetryVo orderRefundRetryVo);
/**
* 开发人员 操作退款订单 该接口 生产使用请通知SE
* @param orderRefundVo
* @return
*/
BaseResponse developRefund(OrderDevelopRefundVo orderRefundVo);
}
......@@ -201,7 +201,7 @@ public class OrderCommonService {
* 发送pos端消息
*/
public void sendPosMessage(String partnerId, String storeId,String orderId) {
PushMessageNoticeDto pushMessageNoticeDto = messageNoticeAdapter.convent2PushMessageNoticeDto(1, partnerId, storeId,
PushMessageNoticeDto pushMessageNoticeDto = MessageNoticeAdapter.convent2PushMessageNoticeDto(1, partnerId, storeId,
null, orderId, null, null);
messageNoticeClient.createMessage(pushMessageNoticeDto,LogThreadLocal.getTrackingNo());
}
......
package cn.freemud.service.thirdparty;
import com.freemud.application.sdk.api.ordercenter.annotation.LogIgnoreFeign;
import cn.freemud.entities.dto.QueryInvoiceRepDto;
import cn.freemud.entities.vo.QueryInvoiceReq;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient(name = "ORDER-SERVICE")
@RequestMapping(produces = {"application/json;charset=UTF-8"})
public interface OrderClient {
/**
* 2021年9月15日-开票历史列表接口+详情接口+发票所含订单接口-黄兆良
* 开票历史列表接口
*/
@PostMapping(value = "/order/v2/invoice/list/forUser")
@LogIgnoreFeign(logMessage="queryInvoiceList")
QueryInvoiceRepDto queryInvoiceList(@RequestBody QueryInvoiceReq queryInvoiceReq);
}
package cn.freemud.xxljob;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import org.springframework.stereotype.Component;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/4/26 下午8:27
* @description : 测试 xxl-job 能否跑成功
*/
@Component
//@JobHandler("orderCountJobHandlerTest")
//@Log4j2
public class OrderCountJobHandlerTest extends IJobHandler {
@Override
public ReturnT<String> execute(String param) throws Exception {
return ReturnT.SUCCESS;
}
}
......@@ -2,7 +2,6 @@ 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;
......@@ -32,16 +31,17 @@ public class PaymentSdkAdapter {
@Value("${saas.refund.notify.callback}")
private String refundNotifyCallback;
public PayRefundRequestDto getOrderRefundRequest(OrderBeanV1 orderBean, BigDecimal refundAmount) {
public PayRefundRequestDto getOrderRefundRequest(String partnerId, String storeCode, String orderCode,
BigDecimal refundAmount, String payNo, String extInfoStr) {
PayRefundRequestDto refundRequestDTO = new PayRefundRequestDto();
refundRequestDTO.setPartnerId(orderBean.getCompanyId());
refundRequestDTO.setStoreId(orderBean.getShopId());
refundRequestDTO.setOrgTransId(orderBean.getOid());
refundRequestDTO.setPartnerId(partnerId);
refundRequestDTO.setStoreId(storeCode);
refundRequestDTO.setOrgTransId(orderCode);
refundRequestDTO.setRefundAmount(refundAmount.longValue());
refundRequestDTO.setNotifyUrl(refundNotifyCallback);
OrderExtInfoDto orderExtInfoDto = JSONObject.parseObject(orderBean.getExtInfo(), OrderExtInfoDto.class);
OrderExtInfoDto orderExtInfoDto = JSONObject.parseObject(extInfoStr, OrderExtInfoDto.class);
refundRequestDTO.setAppId(orderExtInfoDto.getAppid());
refundRequestDTO.setOrgPayFmId(orderBean.getPayVoucher());
refundRequestDTO.setOrgPayFmId(payNo);
refundRequestDTO.setOpenid(orderExtInfoDto.getOpenid());
refundRequestDTO.setRefundId(getRefundSerialNo().toString());
return refundRequestDTO;
......@@ -62,30 +62,28 @@ public class PaymentSdkAdapter {
}
@SneakyThrows
public MultiOrderRefundRequest getMultiOrderPayRefundRequest(OrderBeanV1 orderBean, BigDecimal refundAmount) {
public MultiOrderRefundRequest getMultiOrderPayRefundRequest(String partnerId, String storeCode, String orderCode, BigDecimal refundAmount) {
MultiOrderRefundRequest multiQueryRequest = new MultiOrderRefundRequest();
multiQueryRequest.setStationId("1");
multiQueryRequest.setPartnerId(orderBean.getCompanyId());
multiQueryRequest.setStoreId(orderBean.getShopId());
multiQueryRequest.setPartnerId(partnerId);
multiQueryRequest.setStoreId(storeCode);
multiQueryRequest.setFmId("");
multiQueryRequest.setRefundAmount(Long.valueOf(String.valueOf(refundAmount)));
multiQueryRequest.setRefundTradeNo(String.valueOf(getRefundSerialNo()));
multiQueryRequest.setStoreId(orderBean.getShopId());
multiQueryRequest.setNotifyUrl(refundNotifyCallback);
multiQueryRequest.setVer("V1");
multiQueryRequest.setVer3(false);
multiQueryRequest.setOutOrderNo(orderBean.getOid());
multiQueryRequest.setOutOrderNo(orderCode);
return multiQueryRequest;
}
@SneakyThrows
public AgentPayRefundReq getAgentPayefundReq(OrderBeanV1 orderBean, BigDecimal refundAmount) {
OrderExtInfoDto ext = JSON.parseObject(orderBean.getExtInfo(), OrderExtInfoDto.class);
public AgentPayRefundReq getAgentPayRefundReq(String partnerId, String storeCode, String orderCode, BigDecimal refundAmount, String fmTradeNo) {
AgentPayRefundReq req = new AgentPayRefundReq();
req.setPartnerId(orderBean.getCompanyId());
req.setStoreId(orderBean.getShopId());
req.setFmTradeNo(ext.getPayTransId());
req.setOutOrderNo(orderBean.getOid());
req.setPartnerId(partnerId);
req.setStoreId(storeCode);
req.setFmTradeNo(fmTradeNo);
req.setOutOrderNo(orderCode);
req.setRefundTradeNo(this.getRefundSerialNo().toString());
req.setRefundAmount(refundAmount.longValue());
req.setNotifyUrl(refundNotifyCallback);
......
......@@ -15,6 +15,7 @@ package com.freemud.application.sdk.api.ordercenter.response.orderInfo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class OrderItemResp {
......@@ -135,4 +136,117 @@ public class OrderItemResp {
*/
private Integer productSpuQuantity;
@Data
public static class ExtInfo {
/**
* 是否是赠品
*/
private Boolean isSendGoods;
/**
* 购物车行id
*/
private String cartGoodsUid;
/**
* 积分商品活动使用总积分
*/
private Long score;
/**
* 是否是固定搭配
*/
private Boolean isFixedProduct;
/**
* spu商品货号
*/
private String spuProductCode;
/**
* 属性三方id, 多个用,拼接(推送pos需要)
*/
private String thirdProductPropertyId;
/**
* 三方规格值id, 多个用,拼接(推送pos需要)
*/
private String thirdProductSpecId;
/**
* 凌顶pos 商品编码id
*/
private String linkedId;
/**
* 买一赠一时, 赠品商品的该属性表示原商品购物车id
* 其他赠送活动, 这里设置为活动号
*/
private String originalId;
/**
* 商品组信息
*/
private List<ExtGroup> productGroupList;
/**
* 商品属性信息
*/
private List<ExtAttr> specialAttrs;
/**
* 虚拟商品绑定的券信息
*/
private List<CouponInfo> productBindingCoupons;
/**
* 参与会员价活动时,用户所生效的会员卡或者会员等级名称
*/
private String currentMembershipLevel;
/**
* 是否限制库存
* 用于创建订单时,是否扣减库存
*/
private boolean stockLimit;
/**
* 套餐库存模式
*/
private Integer stockMode;
}
@Data
public static class ExtAttr {
/**
* 属性id
*/
private String extraId;
/**
* 属性名称
*/
private String extraName;
}
@Data
public static class ExtGroup {
/**
* 商品组id
*/
private String groupId;
/**
* 商品组名称
*/
private String groupName;
/**
* 第三方商品组编码
*/
private String thirdGroupId;
}
@Data
public static class CouponInfo {
/**
* 券模板(券活动号)
*/
private String activityCode;
/**
* 券模板名称(活动名称)
*/
private String activityName;
/**
* 券商品数量
*/
private Integer num;
}
}
......@@ -3,6 +3,7 @@ package com.freemud.application.sdk.api.ordercenter.service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.freemud.application.sdk.api.base.BaseRequest;
import com.freemud.application.sdk.api.log.LogThreadLocal;
import com.freemud.application.sdk.api.ordercenter.config.OrderCenterProperties;
import com.freemud.application.sdk.api.ordercenter.constant.InterfaceAddressConstant;
import com.freemud.application.sdk.api.ordercenter.constant.ResponseConstant;
......@@ -115,6 +116,17 @@ public class OrderSdkService {
return responseDTO;
}
/**
* 查询单个订单详情
*
* @param partnerId 商户号
* @param orderCode 订单号
* @return
*/
public QueryByCodeResponse getOrderInfo(String partnerId, String orderCode) {
return getOrderInfo(null, orderCode, null, null, LogThreadLocal.getTrackingNo(), partnerId);
}
/**
* 查询单个订单详情
......
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