Commit c8ca553e by 徐康

Merge branch 'feature/xukang_20211201_虚拟订单退款'

parents 0c84b2f7 95450764
......@@ -91,4 +91,10 @@ public class OrderRefundConfigEntity {
* 1-允许
*/
private String cashierOrderRefund;
/**
* 卖券订单是否可以申请退款
* null <=0 都不可以申请退款
*/
private Integer couponOrderRefundDayLimit;
}
......@@ -15,7 +15,11 @@ package com.freemud.sdk.api.assortment.order.enums;
public enum PayRefundStatus {
SUCCESS(1,"退款成功"),
FAIL(2,"退款失败"),
RUNNING(4,"退款中");
RUNNING(4,"退款中"),
/**
* 额外状态码 用于判断逻辑,
*/
NOT_SUFFICIENT_FUNDS(8200201,"余额不足");
private Integer code;
private String desc;
......
......@@ -5,7 +5,7 @@ import com.freemud.application.sdk.api.ordercenter.request.OrderModifyRelatingCo
import com.freemud.application.sdk.api.ordercenter.request.QueryAfterSalesOrderConditionsReq;
import com.freemud.application.sdk.api.ordercenter.request.QueryLineUpOrderReq;
import com.freemud.application.sdk.api.ordercenter.response.AfterSalesListResp;
//import com.freemud.application.sdk.api.ordercenter.response.OrderStateInfoResp;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.QueryByCodeResponse;
import com.freemud.sdk.api.assortment.order.request.order.*;
import com.freemud.sdk.api.assortment.order.response.order.*;
......@@ -420,4 +420,11 @@ public interface OrderCenterSdkService {
* 小助手日结统计订单信息查询(分页,从库查询)
*/
QueryOrdersResponse getOrderListByDb(QueryOrdersByConditionsRequest queryOrdersByConditionsRequest);
/**
* 查询订单信息 基于基础服务
* @param baseQueryOrderRequest
* @return
*/
QueryByCodeResponse queryOrderByIdV2(BaseQueryOrderRequest baseQueryOrderRequest);
}
......@@ -2358,4 +2358,16 @@ public class OrderCenterSdkServiceImpl implements OrderCenterSdkService {
return orderSdkAdapter.convent2OrdersResponseByES(baseDownLoadResponse);
}
/**
* 查询订单信息 基于基础服务
* @param request
* @return
*/
@Override
public QueryByCodeResponse queryOrderByIdV2(BaseQueryOrderRequest request) {
QueryByCodeResponse orderInfo = orderSdkService.getOrderInfo(request.getOrderClient(), request.getOrderId(),
request.getThirdOrderCode(), request.getWithOperationHistory(), request.getTrackingNo());
return orderInfo;
}
}
......@@ -13,6 +13,7 @@
package cn.freemud;
import cn.freemud.core.db.DataSourcesConfig;
import cn.freemud.core.db.Db2DataSourcesConfig;
import com.alibaba.fastjson.parser.ParserConfig;
import com.freemud.application.sdk.api.couponcenter.config.CouponRestTemplateConfig;
import com.freemud.application.sdk.api.log.LogThreadLocal;
......@@ -34,20 +35,17 @@ import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import tk.mybatis.spring.annotation.MapperScan;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
@ServletComponentScan
@ImportAutoConfiguration(classes = {DataSourcesConfig.class})
@ImportAutoConfiguration(classes = {DataSourcesConfig.class, Db2DataSourcesConfig.class})
@EnableSwagger2
@EnableCircuitBreaker
@SpringBootApplication @EnableDiscoveryClient
@EnableAspectJAutoProxy
@ComponentScan(value = {"cn.freemud", "com.freemud"},excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,
classes ={ CouponRestTemplateConfig.RestTemplateConfig.class})})
@MapperScan({"cn.freemud.*.dao","com.freemud.sdk.api.assortment.orderdistributor.mapper","com.freemud.api.assortment.datamanager.manager",
"com.freemud.api.assortment.datamanager.queue.dao","com.freemud.api.assortment.datamanager.rbac.dao","com.freemud.api.assortment.datamanager.queue.entity"})
@EnableFeignClients({"cn.freemud.service.thirdparty",
"com.freemud.sdk.api.assortment.message",
"cn.freemud.service.mccafe.thirdparty",
......
......@@ -895,6 +895,7 @@ public class OrderAdapter {
responseVo.setMcCafeOrderTag(maCafePickTag);
}
responseVo.setTableNumber(ordersBean.getBarCounter());
// fisherman 支付状态描述
responseVo.setPayStatus(ordersBean.getPayStatus());
responseVo.setPayStatusDesc(Optional.ofNullable(PayStatus.getByCode(ordersBean.getPayStatus()))
.map(PayStatus::getDesc).orElse(""));
......@@ -1143,10 +1144,6 @@ public class OrderAdapter {
responseVo.setEnableRefund(true);
}
responseVo.setBizType(ordersBean.getBizType());
//6:卖券虚拟商品 暂不能申请退款
if (ordersBean.getBizType() == 6) {
responseVo.setButtonRefund(false);
}
List<Integer> enableRefundCodes = Lists.newArrayList(Arrays.asList(
OrderStatus.RECEIPT.getCode(), OrderStatus.COMPLETE_MAKE.getCode()));
if (enableRefundCodes.contains(ordersBean.getStatus()) && PayStatus.HAVE_PAID.getCode().equals(ordersBean.getPayStatus())) {
......@@ -1366,7 +1363,6 @@ public class OrderAdapter {
public OrderViewStatusDto getOrderViewStatusDesc(OrderBeanV1 orderBean, String wxAppId) {
OrderViewStatusDto orderViewStatusDto = new OrderViewStatusDto();
AppLogUtil.infoLog("getOrderStatusDesc start ", JSON.toJSONString(orderBean), "");
RefundBeanV1 refundBean = null;
if (CollectionUtils.isNotEmpty(orderBean.getRefundList())) {
refundBean = orderBean.getRefundList().get(0);
......@@ -1748,6 +1744,7 @@ public class OrderAdapter {
/**
* 是否支持退款
* fisherman 虚拟券是否可退款 在这里进行操作判断 【ID1039143】 1.已完成状态,2.配置的属性值>0&&时间范围内
*
* @param orderBean 订单详情
* @param wxAppId wxappId
......@@ -1768,7 +1765,13 @@ public class OrderAdapter {
return this.checkAdvanceOrder(orderBean.getGmtExpect());
}
// 加价购选择虚拟商品券包,订单完成前可申请退款,完成之后不能申请退款
// fisherman 虚拟券商品是否可退款配置校验
if (orderBean.getBizType().compareTo(BizTypeEnum.SALE_COUPON.getBizType()) == 0) {
return this.checkRefundButtionBizTypeIs6(orderBean.getCompanyId(), orderBean.getBizType(),
orderBean.getStatus(),wxAppId, new Date(orderBean.getGmtCreate()), orderBean.getOrderType());
}
// 加价购选择虚拟商品券包,订单完成前可申请退款,完成之后不能申请退款 --> 这里的 bizType应该是 = 1的
if (OrderStatus.COMPLETE.equals(status) && CollectionUtils.isNotEmpty(orderBean.getProductList())) {
for (ProductBeanV1 productBeanV1 : orderBean.getProductList()){
if(StringUtils.isNotEmpty(productBeanV1.getExtInfo())){
......@@ -1852,6 +1855,40 @@ public class OrderAdapter {
}
/**
* 校验是否配置了 虚拟券 bizTYpe=6 可以退款
*
* @param partnerId
* @param bizType
* @param orderState
* @param wxAppId
* @param createTime
* @return
*/
public boolean checkRefundButtionBizTypeIs6(String partnerId, Integer bizType, Integer orderState, String wxAppId, Date createTime, Integer orderType) {
if (bizType.compareTo(BizTypeEnum.SALE_COUPON.getBizType()) != 0 || orderState.compareTo(OrderStatusV1.COMPLETE.getV1Code()) != 0) {
return false;
}
String redisKey = MessageFormat.format(OrderRedisKeyConstant.ORDER_REFUND_CONFIG, partnerId, wxAppId);
String hashKey = OrderType.TAKE_OUT.getCode().equals(orderType)
? OrderRedisKeyConstant.HashKeyForOrderRefundConfig.TAKE_OUT
: OrderRedisKeyConstant.HashKeyForOrderRefundConfig.EAT_IN;;
String configStr = redisCache.hashGet(redisKey, hashKey);
if (StringUtils.isNotEmpty(configStr)) {
OrderRefundConfigEntity config = JSON.parseObject(configStr, OrderRefundConfigEntity.class);
Integer couponOrderRefundDayLimit = config.getCouponOrderRefundDayLimit();
// 必须配置了, 而且创建时间 不大于 这个时间
if (couponOrderRefundDayLimit != null && couponOrderRefundDayLimit.compareTo(0) > 0) {
Date date = DateUtil.addDays(createTime, couponOrderRefundDayLimit);
// 当前时间在 配置时间前面 才可以申请退款
if (new Date().before(date)) {
return true;
}
}
}
return false;
}
/**
* 预约时间
* @param gmtExpect
* @return true 可退 false不可操作
......
......@@ -7,6 +7,8 @@ public class ResponseCodeConstant {
public final static Integer RESPONSE_SUCCESS = 100;
public final static Integer RESPONSE_SUCCESS_200 = 200;
public final static String RESPONSE_SUCCESS_STR = "100";
public final static String RESPONSE_ERROR_STR = "101";
......
......@@ -20,14 +20,8 @@ import cn.freemud.entities.dto.order.OrderInvoiceConfigVo;
import cn.freemud.entities.vo.*;
import cn.freemud.entities.vo.encircle.CreateReserveOrderVo;
import cn.freemud.entities.vo.encircle.EncircleReserveBaseVo;
import cn.freemud.entities.vo.order.CreateCashierOrderVo;
import cn.freemud.entities.vo.order.CreateOrderInvoiceRequest;
import cn.freemud.entities.vo.order.GetInvoiceConfigRequest;
import cn.freemud.entities.vo.order.OrderAppealVo;
import cn.freemud.entities.vo.order.PaymentConfigVo;
import cn.freemud.entities.vo.order.*;
import cn.freemud.handler.OrderReportJobHandler;
import cn.freemud.handler.WeChatLiveMsgHandle;
import cn.freemud.monitorcenter.tools.HealthUtil;
import cn.freemud.service.EncircleOrderService;
import cn.freemud.service.Orderservice;
import cn.freemud.service.PointsMallOrderService;
......@@ -35,15 +29,10 @@ import cn.freemud.service.impl.MallOrderServiceImpl;
import cn.freemud.service.impl.OrderAdapterServiceImpl;
import cn.freemud.utils.AppLogUtil;
import cn.freemud.utils.ResponseUtil;
import cn.freemud.handler.CouponOrderAutoRefundHandler;
import cn.freemud.xxljob.OrderCountJobHandler;
import com.freemud.application.sdk.api.log.ApiAnnotation;
import com.freemud.application.sdk.api.log.LogParams;
import com.freemud.thirdparty.wechat.WeChatClient;
import com.freemud.thirdparty.wechat.constant.WeChatConstant;
import com.freemud.thirdparty.wechat.entities.WeChatBaseResponse;
import com.freemud.thirdparty.wechat.entities.vo.NullFieldVo;
import com.freemud.thirdparty.wechat.entities.vo.request.OrderDeliverySendRequestVO;
import com.freemud.thirdparty.wechat.entities.vo.request.OrderSycnPayRequestVO;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -72,6 +61,8 @@ public class OrderController {
@Autowired
private OrderCountJobHandler orderCountJobHandler;
@Autowired
private CouponOrderAutoRefundHandler couponOrderAutoRefundHandler;
@Autowired
private PointsMallOrderService pointsMallOrderService;
/**
......@@ -253,6 +244,7 @@ public class OrderController {
return orderservice.orderRefund(orderRefundVo);
}
/**
* 获取订单排队号
*/
......@@ -511,5 +503,38 @@ public class OrderController {
return orderAdapterService.getPaymentConfig(createOrderVo);
}
/**
* 卖券订单申请退款
*/
@ApiAnnotation(logMessage = "couponOrderRefund")
@PostMapping("/couponOrderRefund")
public BaseResponse couponOrderRefund(@Validated @LogParams @RequestBody OrderRefundVo orderRefundVo) {
return orderservice.couponOrderRefund(orderRefundVo,0);
}
/**
* 卖券订单申请退款
*/
@ApiAnnotation(logMessage = "couponOrderRefundRetry")
@PostMapping("/couponOrderRefundRetry")
public BaseResponse couponOrderRefundRetry(@Validated @LogParams @RequestBody OrderRefundRetryVo orderRefundRetryVo) {
return orderservice.couponOrderRefundRetry(orderRefundRetryVo);
}
/**
* 卖券订单券过期自动退款
* @param
* @return
*/
@ApiAnnotation(logMessage = "couponOrderAutoRefund")
@GetMapping("/couponOrderAutoRefund")
public BaseResponse couponOrderAutoRefund() throws Exception {
AppLogUtil.infoLog("卖券订单券过期自动退款 ",null,null);
couponOrderAutoRefundHandler.execute(null);
return ResponseUtil.success();
}
}
package cn.freemud.core.db;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import tk.mybatis.spring.annotation.MapperScan;
import javax.sql.DataSource;
......@@ -21,6 +29,9 @@ import javax.sql.DataSource;
*/
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
@EnableConfigurationProperties({DataSourcesProperties.class})
@MapperScan(basePackages = {"cn.freemud.manager.dao","com.freemud.sdk.api.assortment.orderdistributor.mapper","com.freemud.api.assortment.datamanager.manager",
"com.freemud.api.assortment.datamanager.queue.dao","com.freemud.api.assortment.datamanager.rbac.dao","com.freemud.api.assortment.datamanager.queue.entity"}
, sqlSessionFactoryRef = "sqlSessionFactory")
public class DataSourcesConfig {
/**
......@@ -29,8 +40,33 @@ public class DataSourcesConfig {
* @return
*/
@Bean("dataSource")
@Primary
public DataSource dataSource(DataSourcesProperties dataSourcesProperties) {
return DataSourceBuildUtil.init(dataSourcesProperties);
}
// 创建session工厂
@Bean("sqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*.xml"));
return sessionFactoryBean.getObject();
}
// 创建事务管理(按需添加)
@Bean("dataSourceTransactionManager")
@Primary
public DataSourceTransactionManager dataSourceTransactionManager(@Qualifier("dataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
// 会话管理
@Bean("sqlSessionTemplate")
@Primary
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
package cn.freemud.core.db;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import tk.mybatis.spring.annotation.MapperScan;
import javax.sql.DataSource;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Title: CouponDataSourcesConfig
* @Package com.freemud.data.source.config
* @Description:
* @author: chaopeng.lv
* @date: 2018/5/16 17:08
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
@EnableConfigurationProperties({Db2DataSourcesProperties.class})
@MapperScan(basePackages = {"cn.freemud.manager.db2.dao"}
, sqlSessionFactoryRef = "db2SqlSessionFactory")
public class Db2DataSourcesConfig {
/**
* 配置数据源
*
* @return
*/
@Bean("db2DataSource")
public DataSource dataSource(Db2DataSourcesProperties db2DataSourcesProperties) {
return DataSourceBuildUtil.init(db2DataSourcesProperties);
}
// 创建session工厂
@Bean("db2SqlSessionFactory")
public SqlSessionFactory db2SqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db2/*.xml"));
return sessionFactoryBean.getObject();
}
// 创建事务管理(按需添加)
@Bean("db2DataSourceTransactionManager")
public DataSourceTransactionManager db2DataSourceTransactionManager(@Qualifier("db2DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
// 会话管理
@Bean("db2SqlSessionTemplate")
public SqlSessionTemplate db2SqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
package cn.freemud.core.db;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Primary;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Title: DataSourcesProperties
* @Package com.freemud.data.source.config
* @Description:
* @author: chaopeng.lv
* @date: 2018/5/16 15:14
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@ConfigurationProperties(prefix = "db2")
public class Db2DataSourcesProperties extends DruidProperties {
}
package cn.freemud.entities.db.db2;
import cn.freemud.comm.entity.BaseEntity;
import lombok.Data;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import javax.persistence.*;
import java.util.Date;
/**
* 商户
*
* @author liming.guo
* @date 2018/05/10
*/
@Data
@Table(name = "refund_over_order")
public class RefundOverOrder extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "refund_id")
private Long refundId;
@Column(name = "refund_order_code")
private String refundOrderCode;
@Column(name = "refund_coupon_code")
private String refundCouponCode;
@Column(name = "refund_time")
private Date refundTime;
@Column(name = "refund_status")
private Integer refundStatus;
@Column(name = "refund_fail")
private Integer refundFail;
@Column(name = "refund_desc")
private String refundDesc;
@Column(name = "refund_create_time")
private Date refundCreateTime;
@Column(name = "refund_update_time")
private Date refundUpdateTime;
}
package cn.freemud.entities.dto;
import cn.freemud.entities.vo.QueryInvoiceItemRep;
import lombok.Data;
@Data
public class QueryRefundFailuresListDto {
private Long id;
private String partnerId;
private String orderCode;
private Integer lastFailureType;
private String lastReason;
private Integer compensationNum;
private String updateTime;
}
package cn.freemud.entities.dto.coupon;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/12/3 下午4:14
* @description :
*/
@Data
public class CheckAndCancelRequest {
@ApiModelProperty(value = "商户号", required = true)
private Integer partnerId;
@ApiModelProperty(value = "会员id", required = true)
private String memberId;
@ApiModelProperty(value = "券号列表", required = true)
private List<String> couponCodeList;
@ApiModelProperty(value = "作废原因", required = true)
private String cancelReason = "用户申请退款,订单作废券请求";
}
package cn.freemud.entities.dto.coupon;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/12/3 下午4:15
* @description :
*/
@Data
public class CheckAndCancelResponseDTO {
public static int SUCCESS = 1;
public static int PROTION_FAIL = 2;
public static int FAIL = 3;
@ApiModelProperty(value = "作废结果,1:已全部作废,2:部分作废失败,3:不可作废", required = true)
private Integer resultCode;
@ApiModelProperty(value = "作废结果说明,如resultCode为3时,代表不可作废的原因(如:xx券已核销)", required = true)
private String memo;
@ApiModelProperty(value = "每个券对应的处理结果", required = true)
private List<CouponCancelMsg> resultList;
}
package cn.freemud.entities.dto.coupon;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/12/3 下午4:17
* @description :
*/
@Data
public class CouponCancelMsg {
@ApiModelProperty(value = "券号", required = true)
private String code;
@ApiModelProperty(value = "券名称", required = true)
private String name;
@ApiModelProperty(value = "作废结果,0:未处理,1:作废成功,2:已核销不能作废,3:已锁定不能作废,4:作废失败,5:券不存在", required = true)
private Integer result;
@ApiModelProperty(value = "作废结果result对应的说明文字", required = true)
private String memo;
}
package cn.freemud.entities.dto.order;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/12/3 上午10:36
* @description :
*/
@Data
@Builder
@AllArgsConstructor
public class RefundFailureRequestDTO {
/**
* 0:其他
*/
public static int FAILURETYPE_OTHER = 0;
/**
* 1:账户无余额
*/
public static int FAILURETYPE_NOT_SUFFICIENT_FUNDS = 1;
/**
* 2:系统异常
*/
public static int FAILURETYPE_SYSTEM_ERROR = 2;
/**
*
*/
private String orderCode;
/**
* 失败类型 0:其他 1:账户无余额2:系统异常
*/
private int failureType;
/**
* 失败原因
*/
private String reason;
/**
*
*/
private String partnerId;
/**
*
*/
private String operator;
private int ver = 0;
}
package cn.freemud.entities.dto.user;
import lombok.Data;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/12/6 上午11:36
* @description :
*/
@Data
public class UserBaseResponsDTO<T> {
private String code;
private String message;
private T data;
}
package cn.freemud.entities.dto.user;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/12/6 上午11:35
* @description :
*/
@Data
public class UserCouponCheckRequest {
@ApiModelProperty(value = "商户号", required = true)
private String partnerId;
@ApiModelProperty(value = "会员id", required = true)
private String memberId;
@ApiModelProperty(value = "券号列表", required = true)
private List<String> couponCodes;
}
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: GetProductVo
* @Package cn.freemud.entities.vo
* @Description:
* @author: liming.guo
* @date: 2018/5/16 17:35
* @version V1.0
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
package cn.freemud.entities.vo;
import com.freemud.application.sdk.api.ordercenter.enums.RefundModeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* 用户退款申请
*
* @author haibo.jiang 2019/11/20
* @author shichang.wang 2021/4/15
*/
@ApiModel("退款重试")
@Data
public class OrderRefundRetryVo {
@NotNull(message = "重试记录id不能为空")
private Long id;
}
......@@ -18,6 +18,8 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.NotEmpty;
import javax.validation.constraints.NotBlank;
/**
* 用户退款申请
*
......@@ -28,10 +30,10 @@ import org.hibernate.validator.constraints.NotEmpty;
@Data
public class OrderRefundVo {
@NotEmpty(message = "sessionId 不能为空")
@NotBlank(message = "sessionId 不能为空")
private String sessionId;
@NotEmpty(message = "订单编号不能为空")
@NotBlank(message = "订单编号不能为空")
private String oid;
private String reason;
......
/**
* 2021年9月15日-开票历史列表接口+详情接口+发票所含订单接口-黄兆良
* 查询开票历史列表
*/
package cn.freemud.entities.vo;
import lombok.Data;
import java.util.Date;
@Data
public class QueryRefundFailuresListReq {
private Long id;
private String orderCode;
private Integer afterId;
private Integer failureType;
private Integer size;
//开始时间戳(单位:秒)
private Integer startTimestamp;
}
/**
* 2021年9月15日-开票历史列表接口+详情接口+发票所含订单接口-黄兆良
* 查询开票历史列表
*/
package cn.freemud.entities.vo;
import lombok.Data;
@Data
public class RefundFailuresSuccessfulReq {
private Long id;
private String partnerId;
private String orderCode;
private String operator;
}
package cn.freemud.enums;
public enum CouponOrderRefundFailTypeEnum {
SUCCESS(0, "成功"),
ORDER_VERIFY_FAIL(1, "订单校验失败"),
COUPON_PROCESS_FAIL(2, "优惠券处理失败"),
OTHER(7, "其他"),
;
private Integer code;
private String desc;
CouponOrderRefundFailTypeEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
public static CouponOrderRefundFailTypeEnum getByCode(Integer code) {
for (CouponOrderRefundFailTypeEnum type : values()) {
if (type.getCode().equals(code)) {
return type;
}
}
return null;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
package cn.freemud.enums;
public enum CouponOrderRefundStatusEnum {
WAIT(1, "待退款"),
REFUNDED(2, "已退款"),
REFUND_FAILED(3, "退款失败"),
NOT_NEED_REFUND(4, "无需退款"),
;
private Integer code;
private String desc;
CouponOrderRefundStatusEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
public static CouponOrderRefundStatusEnum getByCode(Integer code) {
for (CouponOrderRefundStatusEnum type : values()) {
if (type.getCode().equals(code)) {
return type;
}
}
return null;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
......@@ -12,6 +12,19 @@
*/
package cn.freemud.enums;
import com.freemud.application.sdk.api.ordercenter.enums.orderv1.OrderStatusV1;
/**
* @warning !!!
* 这里的订单状态依据的是 老订单的转换操作, 基础服务给出的订单状态如下:
* 1待支付
* 2下单
* 3已接单
* 4制作完成 5配送中 4/5的状态根据订单类型(自提/外卖)二选一不会同时出现
* 6已完成
* 7已关闭(退款完成)
* @see OrderStatusV1
*/
public enum OrderStatus {
TAKE_ORDER(1, "下单","place an order"),
......
......@@ -12,19 +12,31 @@
*/
package cn.freemud.enums;
import com.freemud.sdk.api.assortment.order.adapter.OrderSdkAdapter;
import com.google.common.collect.Lists;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
/**
* 基础服务订单类型如下:
* 1=常规堂食,
* 2=预约堂食,
* 3=常规外送,
* 4=预约外送,
* 5=常规自取,
* 6=预约自取
*
* @see OrderSdkAdapter#getOldOrderType(java.lang.Integer)
* 该类为老订单类型:
*/
public enum OrderType {
TAKE_OUT(1, "外卖","takeOut"),
PRE_ORDER(2, "预订单","preOrder"),
MALL(3, "商城","mall"),
COLLECT_GOODS(4, "打包带走","collectGoods"),
EAT_IN(5, "店内就餐","eatIn")
;
TAKE_OUT(1, "外卖", "takeOut"),
PRE_ORDER(2, "预订单", "preOrder"),
MALL(3, "商城", "mall"),
COLLECT_GOODS(4, "打包带走", "collectGoods"),
EAT_IN(5, "店内就餐", "eatIn");
private Integer code;
private String desc;
......@@ -33,7 +45,7 @@ public enum OrderType {
*/
private String tackDesc;
OrderType(Integer code, String desc,String tackDesc) {
OrderType(Integer code, String desc, String tackDesc) {
this.code = code;
this.desc = desc;
this.tackDesc = tackDesc;
......@@ -66,7 +78,7 @@ public enum OrderType {
return returnList;
}
for (OrderType orderType : values()) {
for (Integer code: list) {
for (Integer code : list) {
if (orderType.getCode().equals(code)) {
returnList.add(code);
}
......
......@@ -15,7 +15,11 @@ package cn.freemud.enums;
public enum PayRefundStatus {
SUCCESS(1,"退款成功"),
FAIL(2,"退款失败"),
RUNNING(4,"退款中");
RUNNING(4,"退款中"),
/**
* 额外状态码 用于判断逻辑,
*/
NOT_SUFFICIENT_FUNDS(8200201,"余额不足");
private Integer code;
private String desc;
......
......@@ -192,6 +192,9 @@ public enum ResponseResult {
ORDER_INVOICE_IS_OPENED("45083", "存在选中的订单已开过发票,请重新选择订单",""),
ORDER_CODES_REPEAT("45084", "同一次开票,选中的订单不能重复,请重新选择订单",""),
ORDER_INVOICE_CONFIG_IS_NULL("45085", "发票配置信息为空,不可开票",""),
ORDER_BIZ_TYPE_ERROR("45086", "订单业务类型异常",""),
COUPON_ORDER_VERIFY_FAIL("45087","买券订单校验异常",""),
COUPON_ORDER_COMMON_VERIFY_FAIL("45088","卖券订单基础校验失败",""),
/**
* 售后单
......@@ -225,6 +228,7 @@ public enum ResponseResult {
PAY_ERROR("46016","支付类型错误",""),
COUPON_DATETIME_INVAILD("46017", "优惠券在当前时间不可用",""),
COUPON_ORDER_ORIGINAL_AMOUNT_NOT_ENOUGH("46018","优惠券不满足可用金额门槛",""),
COUPON_CANCEL_FAIL("46019","您购买的优惠券已锁定,请先进行解锁操作再退款",""),
SHOPPING_CART_USER_HAVE_NO_COUPON("46019", "使用的商品券已失效,请重新下单",""),
/**
......
package cn.freemud.handler;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.base.util.DateUtil;
import cn.freemud.entities.db.db2.RefundOverOrder;
import cn.freemud.entities.dto.delivery.GetFilterPartnerResponse;
import cn.freemud.entities.dto.delivery.PartnerFilterResponse;
import cn.freemud.entities.dto.openplatform.OrderGetPartnerRequest;
import cn.freemud.entities.vo.OrderCountRequestVo;
import cn.freemud.entities.vo.OrderRefundVo;
import cn.freemud.entities.vo.SendOrderCountsMsg;
import cn.freemud.enums.CouponOrderRefundFailTypeEnum;
import cn.freemud.enums.CouponOrderRefundStatusEnum;
import cn.freemud.enums.ResponseResult;
import cn.freemud.manager.RefundOverOrderManager;
import cn.freemud.manager.db2.dao.RefundOverOrderDao;
import cn.freemud.service.Orderservice;
import cn.freemud.service.thirdparty.EcologyAdminApplicationClient;
import cn.freemud.utils.AppLogUtil;
import cn.freemud.utils.ExceptionUtils;
import com.alibaba.fastjson.JSON;
import com.freemud.application.sdk.api.constant.ResponseResultEnum;
import com.freemud.application.sdk.api.log.ApiLog;
import com.freemud.application.sdk.api.log.LogThreadLocal;
import com.freemud.application.sdk.api.ordercenter.response.OrderCountResp;
import com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/4/26 下午8:27
* @description :
*/
@Component
public class CouponOrderAutoRefundHandler {
@Autowired
private Orderservice orderservice;
@Autowired
private RefundOverOrderManager refundOverOrderManager;
private ExecutorService executor = Executors.newFixedThreadPool(5);
public ReturnT<String> execute(String param) throws Exception {
long now = System.currentTimeMillis();
Date nowDate = new Date(now);
String nowDay = DateUtil.convert2String(nowDate, "yyyy-MM-dd");
Date todayStart = DateUtil.convert2Date(nowDay+" 00:00:00", "yyyy-MM-dd HH:mm:ss");
Date today1 = DateUtil.addHours(todayStart, 1);
Date today6 = DateUtil.addHours(todayStart, 6);
Date today23 = DateUtil.addHours(todayStart, 23);
if(nowDate.after(today23) || nowDate.before(today1)) {
ApiLog.infoMessage("23点到1点不执行: "+now);
return ReturnT.SUCCESS;
}
int num = 200;
boolean isBeforeDawn = nowDate.after(today1) && nowDate.before(today6);
if(isBeforeDawn) {
num = 500;
}
List<RefundOverOrder> refundOverOrderList = refundOverOrderManager.selectBatch(num);
if(CollectionUtils.isEmpty(refundOverOrderList)) {
ApiLog.infoMessage("未查询到需要退款的买券订单");
return ReturnT.SUCCESS;
}
executor.execute(() -> {
ApiLog.infoMessage("开始自动给买券订单过期券退款 : " + JSON.toJSONString(refundOverOrderList));
for(RefundOverOrder refundOverOrder : refundOverOrderList) {
RefundOverOrder refundOverOrderUpdate = new RefundOverOrder();
refundOverOrderUpdate.setRefundId(refundOverOrder.getRefundId());
try {
OrderRefundVo orderRefundVo = new OrderRefundVo();
orderRefundVo.setOid(refundOverOrder.getRefundOrderCode());
orderRefundVo.setReason("券过期自动退款");
orderRefundVo.setRemarks("券过期自动退款");
BaseResponse baseResponse = orderservice.couponOrderRefund(orderRefundVo, 1);
if(ResponseResult.SUCCESS.getCode().equals(baseResponse.getCode())) {
refundOverOrderUpdate.setRefundStatus(CouponOrderRefundStatusEnum.REFUNDED.getCode());
refundOverOrderUpdate.setRefundFail(CouponOrderRefundFailTypeEnum.SUCCESS.getCode());
refundOverOrderUpdate.setRefundDesc("成功");
} else if(ResponseResult.COUPON_CANCEL_FAIL.getCode().equals(baseResponse.getCode())) {
refundOverOrderUpdate.setRefundStatus(CouponOrderRefundStatusEnum.NOT_NEED_REFUND.getCode());
refundOverOrderUpdate.setRefundFail(CouponOrderRefundFailTypeEnum.COUPON_PROCESS_FAIL.getCode());
refundOverOrderUpdate.setRefundDesc(JSON.toJSONString(baseResponse));
} else if(ResponseResult.COUPON_ORDER_VERIFY_FAIL.getCode().equals(baseResponse.getCode())) {
refundOverOrderUpdate.setRefundStatus(CouponOrderRefundStatusEnum.REFUND_FAILED.getCode());
refundOverOrderUpdate.setRefundFail(CouponOrderRefundFailTypeEnum.ORDER_VERIFY_FAIL.getCode());
refundOverOrderUpdate.setRefundDesc(JSON.toJSONString(baseResponse));
} else if(ResponseResult.ORDER__ERRORREFUND.getCode().equals(baseResponse.getCode())) {
refundOverOrderUpdate.setRefundStatus(CouponOrderRefundStatusEnum.REFUND_FAILED.getCode());
refundOverOrderUpdate.setRefundFail(CouponOrderRefundFailTypeEnum.ORDER_VERIFY_FAIL.getCode());
refundOverOrderUpdate.setRefundDesc(JSON.toJSONString(baseResponse));
} else {
refundOverOrderUpdate.setRefundStatus(CouponOrderRefundStatusEnum.REFUND_FAILED.getCode());
refundOverOrderUpdate.setRefundFail(CouponOrderRefundFailTypeEnum.OTHER.getCode());
refundOverOrderUpdate.setRefundDesc(JSON.toJSONString(baseResponse));
}
refundOverOrderManager.update(refundOverOrderUpdate);
if(isBeforeDawn) {
Thread.sleep(1000);
}
} catch (Exception e) {
refundOverOrderUpdate.setRefundStatus(CouponOrderRefundStatusEnum.REFUND_FAILED.getCode());
refundOverOrderUpdate.setRefundFail(CouponOrderRefundFailTypeEnum.OTHER.getCode());
refundOverOrderUpdate.setRefundDesc(cutStr500(ExceptionUtils.getExceptionInfo(e)));
refundOverOrderManager.update(refundOverOrderUpdate);
}
}
});
return ReturnT.SUCCESS;
}
private String cutStr500(String s) {
if(StringUtils.isNotBlank(s) && s.length() > 500) {
return s.substring(0, 500);
}
return s;
}
}
package cn.freemud.manager;
import cn.freemud.entities.db.Partner;
import cn.freemud.entities.db.db2.RefundOverOrder;
import cn.freemud.manager.dao.PartnerDao;
import cn.freemud.manager.db2.dao.RefundOverOrderDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 商户小程序manager
*
* @author liming.guo
* @date 2018/05/10
*/
@Component
public class RefundOverOrderManager {
@Autowired
private RefundOverOrderDao refundOverOrderDao;
public List<RefundOverOrder> selectBatch(Integer num) {
return refundOverOrderDao.selectBatch(num);
}
public void insert(RefundOverOrder refundOverOrder) {
refundOverOrderDao.insert(refundOverOrder);
}
public void update(RefundOverOrder refundOverOrder) {
refundOverOrderDao.update(refundOverOrder);
}
}
package cn.freemud.manager.db2.dao;
import cn.freemud.comm.druid.MyMapper;
import cn.freemud.entities.db.OpenPlatformIappWxappConfigDelivery;
import cn.freemud.entities.db.Partner;
import cn.freemud.entities.db.db2.RefundOverOrder;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface RefundOverOrderDao extends MyMapper<RefundOverOrder> {
List<RefundOverOrder> selectBatch(@Param("num") Integer num);
Integer update(@Param("refundOverOrder") RefundOverOrder refundOverOrder);
}
......@@ -84,6 +84,7 @@ public interface Orderservice extends OrderFactoryService{
*/
BaseResponse orderRefund(OrderRefundVo orderRefundVo);
/**
* 获取订单排队号
*/
......@@ -204,4 +205,18 @@ public interface Orderservice extends OrderFactoryService{
BaseResponse<OrderInvoiceConfigVo> queryInvoiceConfig(GetInvoiceConfigRequest request);
/**
* 卖券订单 申请退款
* @param orderRefundVo
* @param flag 0 用户调用 1系统调用
* @return
*/
BaseResponse couponOrderRefund(OrderRefundVo orderRefundVo, int flag);
/**
* 卖券订单 申请退款 重试
* @param orderRefundRetryVo
* @return
*/
BaseResponse couponOrderRefundRetry(OrderRefundRetryVo orderRefundRetryVo);
}
......@@ -50,4 +50,15 @@ public interface CouponOnlineClient {
statusCodeFieldName=ResponseCodeKeyConstant.STATUS_CODE)
@PostMapping(value = "/fastBatchQueryTemplateInfo")
CouponResponseDTO<List<FastTemplateInfoResponseVO>> fastBatchQueryTemplateInfo(@RequestBody FastBatchQueryTemplateInfoRequest request);
/**
* 调用券码,作废券
* @param request
* @return
*/
@LogIgnoreFeign(logMessage="checkandcancel",messageFieldName= ResponseCodeKeyConstant.MSG,
statusCodeFieldName=ResponseCodeKeyConstant.STATUS_CODE)
@PostMapping(value = "/coupon/standard/checkandcancel" , produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
CouponResponseDTO<CheckAndCancelResponseDTO> checkandcancel(@RequestBody CheckAndCancelRequest request);
}
......@@ -22,6 +22,8 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@FeignClient(name = "customer-extend-service", url = "${saas.customerextendclient.feign.url}")
@RequestMapping(produces = {"application/json;charset=UTF-8"})
public interface CustomerExtendClient {
......@@ -39,4 +41,15 @@ public interface CustomerExtendClient {
@LogIgnoreFeign(logMessage="b2bReceiveCard")
@PostMapping(value = "/customerextendservice/qujia/b2breceiveCard")
B2bReceiveCardResponseDto b2bReceiveCard(@RequestBody B2bReceiveCardRequestDto request);
/**
* 校验request里面的券 是否正常
* @param request
* @return 如果和request 返回券一致 表示正常
* 这个接口 无力吐槽
*/
@LogIgnoreFeign(logMessage="getMemberCouponCodes")
@PostMapping(value = "/customerextendservice/coupon/getMemberCouponCodes")
UserBaseResponsDTO<List<String>> getMemberCouponCodes(@RequestBody UserCouponCheckRequest request);
}
......@@ -3,16 +3,22 @@ package cn.freemud.service.thirdparty;
import cn.freemud.annotations.LogIgnoreFeign;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.dto.QueryInvoiceRepDto;
import cn.freemud.entities.dto.QueryRefundFailuresListDto;
import cn.freemud.entities.dto.order.QueryInvoiceByCodesResponse;
import cn.freemud.entities.dto.order.RefundFailureRequestDTO;
import cn.freemud.entities.dto.pay.OrderInvoiceRequest;
import cn.freemud.entities.dto.pay.QueryInvoiceByCodesRequest;
import cn.freemud.entities.vo.QueryInvoiceReq;
import cn.freemud.entities.vo.QueryRefundFailuresListReq;
import cn.freemud.entities.vo.RefundFailuresSuccessfulReq;
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;
import java.util.List;
@FeignClient(name = "order-service",url = "${order.service.url:}")
@RequestMapping(consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public interface OrderServiceClient {
......@@ -38,4 +44,25 @@ public interface OrderServiceClient {
@PostMapping(value = "/order/v2/invoice/list/forUser")
QueryInvoiceRepDto queryInvoiceList(@RequestBody QueryInvoiceReq queryInvoiceReq);
/**
* 虚拟券退款操作失败记录,用于后期补偿
*/
@LogIgnoreFeign(logMessage="refundFailures")
@PostMapping("/order/v2/refundFailures")
BaseResponse refundFailures(@RequestBody RefundFailureRequestDTO requestDTO);
/**
* 退款失败信息列表查询
*/
@LogIgnoreFeign(logMessage="refundFailuresList")
@PostMapping(value = "/order/v2/refundFailures/list")
BaseResponse<List<QueryRefundFailuresListDto>> refundFailuresList(@RequestBody QueryRefundFailuresListReq queryRefundFailuresListReq);
/**
* 退款失败信息列表查询
*/
@LogIgnoreFeign(logMessage="refundFailuresSuccessful")
@PostMapping(value = "/order/v2/refundFailures/successful")
BaseResponse refundFailuresSuccessful(@RequestBody RefundFailuresSuccessfulReq refundFailuresSuccessfulReq);
}
......@@ -12,7 +12,7 @@
gmt_modified as gmtModified
</sql>
<select id="selectByPartnerId" resultType="Partner">
<select id="selectByPartnerId" resultType="cn.freemud.entities.db.Partner">
SELECT
<include refid="all_column"/>
FROM partner WHERE partner_id=#{partnerId}
......
......@@ -18,13 +18,13 @@
gmt_modified as gmtModified
</sql>
<select id="selectByPartnerIdAndAppid" resultType="PartnerWxapp">
<select id="selectByPartnerIdAndAppid" resultType="cn.freemud.entities.db.PartnerWxapp">
SELECT
<include refid="all_column"/>
FROM partner_wxapp WHERE appid=#{appid} and partner_id= #{partnerId}
</select>
<select id="selectByPartnerIdAndWxAppid" resultType="PartnerWxapp">
<select id="selectByPartnerIdAndWxAppid" resultType="cn.freemud.entities.db.PartnerWxapp">
SELECT
<include refid="all_column"/>
FROM partner_wxapp WHERE wx_appid=#{wxAppid} and partner_id= #{partnerId}
......
......@@ -4,7 +4,7 @@
<sql id="all_column">
id,
order_code as orderCode
order_code as orderCode,
partner_id as partnerId,
store_id as storeId,
status as status,
......
......@@ -17,7 +17,7 @@
</sql>
<select id="selectByAppid" resultType="WxappMessageTemplate" >
<select id="selectByAppid" resultType="cn.freemud.entities.db.WxappMessageTemplate" >
SELECT
<include refid="all_column"/>
FROM
......@@ -27,7 +27,7 @@
AND status = 1
</select>
<select id="selectParentIdAndAppid" resultType="WxappMessageTemplate" >
<select id="selectParentIdAndAppid" resultType="cn.freemud.entities.db.WxappMessageTemplate" >
SELECT
<include refid="all_column"/>
FROM
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.freemud.manager.db2.dao.RefundOverOrderDao">
<resultMap id="BaseResultMap" type="cn.freemud.entities.db.db2.RefundOverOrder" >
<!--
WARNING - @mbg.generated
-->
<id column="refund_id" property="refundId" jdbcType="INTEGER" />
<result column="refund_order_code" property="refundOrderCode" jdbcType="VARCHAR" />
<result column="refund_coupon_code" property="refundCouponCode" jdbcType="VARCHAR" />
<result column="refund_time" property="refundTime" jdbcType="TIMESTAMP" />
<result column="refund_status" property="refundStatus" jdbcType="INTEGER" />
<result column="refund_fail" property="refundFail" jdbcType="INTEGER" />
<result column="refund_desc" property="refundDesc" jdbcType="VARCHAR" />
<result column="refund_create_time" property="refundCreateTime" jdbcType="TIMESTAMP" />
<result column="refund_update_time" property="refundUpdateTime" jdbcType="TIMESTAMP" />
</resultMap>
<sql id="all_column">
refund_id as refundId,
refund_order_code as refundOrderCode,
refund_coupon_code as refundCouponCode,
refund_time as refundTime,
refund_status as refundStatus,
refund_fail as refundFail,
refund_desc as refundDesc,
refund_create_time as refundCreateTime,
refund_update_time as refundUpdateTime
</sql>
<select id="selectBatch" resultType="cn.freemud.entities.db.db2.RefundOverOrder">
SELECT
<include refid="all_column"/>
FROM refund_over_order
WHERE refund_status = 1
order by refund_id
limit #{num}
</select>
<update id="update" parameterType="cn.freemud.entities.db.db2.RefundOverOrder">
update refund_over_order
set refund_status = #{refundOverOrder.refundStatus},
refund_fail = #{refundOverOrder.refundFail},
refund_desc = #{refundOverOrder.refundDesc}
where refund_id = #{refundOverOrder.refundId}
</update>
</mapper>
\ No newline at end of file
......@@ -23,16 +23,20 @@ import com.freemud.application.sdk.api.storecenter.response.StoreResponse;
import com.freemud.sdk.api.assortment.order.request.order.MultiOrderRefundRequest;
import com.freemud.sdk.api.assortment.order.response.order.MultiOrderRefundResponse;
import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.hibernate.validator.HibernateValidator;
import org.hibernate.validator.HibernateValidatorConfiguration;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.SpringBootVersion;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.ApplicationContext;
import org.springframework.core.SpringVersion;
import org.springframework.test.context.junit4.SpringRunner;
import springfox.documentation.spring.web.json.Json;
......@@ -40,6 +44,7 @@ import springfox.documentation.spring.web.json.Json;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.ValidatorFactory;
import java.sql.SQLException;
import java.util.Set;
@RunWith(SpringRunner.class)
......@@ -72,6 +77,9 @@ public class MallOrderServiceImplTest {
// public void after() throws Exception {
// }
@Autowired
private ApplicationContext applicationContext;
@Test
public void f1() {
mcCafeOrderService.createOrder(JSON.parseObject("{\"buyType\":0,\"cardKeyCode\":\"509835\",\"channelType\":\"saas\",\"couponCode\":\"\",\"menuType\":\"saas\",\"needInvoice\":1,\"orderRemark\":\"\",\"orderType\":1,\"partnerId\":\"1628\",\"payChannelType\":1,\"receiveId\":\"\",\"sessionId\":\"18459edce0b4c5a5794e855b988d45e0b54ba705\",\"shopId\":\"1950512\",\"takeMealFlag\":\"0\"}", CreateOrderVo.class),
......@@ -90,6 +98,13 @@ public class MallOrderServiceImplTest {
Set<ConstraintViolation<CreateOrderVo>> set = validatorFactory.getValidator().validate(new CreateOrderVo());
}
@Test
public void f3() throws SQLException {
SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) applicationContext.getBean("sqlSessionFactory");
SqlSessionFactory db2SqlSessionFactory = (SqlSessionFactory) applicationContext.getBean("db2SqlSessionFactory");
return;
}
//
// @Test
// public void testPaySuccess() {
......
......@@ -7,6 +7,7 @@ public enum SettlementTypeEnum {
CASH_COUPON(10, "代金券"),
DISCOUNT_COUPON(208, "折扣券"),
PRODUCT_COUPON(118, "商品券"),
SEND_COUPON(216, "购买券包发的优惠券"),
;
private int settlementType;
......
......@@ -629,7 +629,7 @@ public class OrderVerifyHandle {
/**
* 获取已完成订单退款金额
*/
private BigDecimal getRefundAmount(OrderBeanV1 data,boolean isRefundDeliveryFee) {
public BigDecimal getRefundAmount(OrderBeanV1 data,boolean isRefundDeliveryFee) {
//是否配置已完成订单可退款
BigDecimal refundAmount = new BigDecimal(data.getAmount());
if (isRefundDeliveryFee || isPayBySVC(data)){
......
......@@ -118,6 +118,38 @@ public class PaymentHandle {
}
/**
* 卖券调用退款
* @param reason
* @param orderBean
* @return -2正常 -1 不需要退款 0其他异常 1账户余额不足 2 系统异常
*/
public PayRefundResponse refund(String reason, OrderBeanV1 orderBean) {
PayRefundStatus refundStatus = PayRefundStatus.SUCCESS;
PayRefundRequestDto orderRefundRequest = paymentSdkAdapter.getOrderRefundRequest(orderBean, getRefundAmount(orderBean));
//抖音支付必传
orderRefundRequest.setRefundDesc(reason);
if (ObjectUtils.equals(orderBean.getAmount(), 0L)) {
return handlePayRefundResponse(refundStatus, orderRefundRequest.getRefundId());
}
BaseResponse<OrderRefundResponse> orderRefundResponse;
orderRefundResponse = this.orderPayRefund(orderRefundRequest);
if (orderRefundResponse == null) {
// 退款失败
refundStatus = PayRefundStatus.FAIL;
return handlePayRefundResponse(refundStatus, orderRefundRequest.getRefundId());
}
if (ObjectUtils.notEqual(orderRefundResponse.getCode(), SUCCESS)) {
//商户余额不足的情况下,返回异常特殊处理.
refundStatus = PayRefundStatus.FAIL;
if (ResponseResult.NOT_SUFFICIENT_FUNDS.getCode().equals(orderRefundResponse.getCode())) {
refundStatus = PayRefundStatus.NOT_SUFFICIENT_FUNDS;
}
}
return handlePayRefundResponse(refundStatus, orderRefundRequest.getRefundId());
}
/**
* 退款
*
* @param orderBean
......
......@@ -1677,6 +1677,10 @@ public class ShoppingCartNewServiceImpl implements ShoppingCartNewService {
shoppingCartClearRequestVo.setUserId(userId);
shoppingCartClearRequestVo.setShopId(storeId);
shoppingCartClearRequestVo.setOperationType(OperationTypeEnum.PAY_SUCCESS.getOperationType());
// 因为数量限制的问题,不清空购物车缓存
if (activityCalculationDiscountResponseDto != null && StringUtils.equals(activityCalculationDiscountResponseDto.getStatusCode(), "80000")) {
throw new ServiceException(ResponseResult.SHOPPING_CART_LIMIT_ADD);
}
clear(shoppingCartClearRequestVo);
if (activityCalculationDiscountResponseDto != null && StringUtils.equals(activityCalculationDiscountResponseDto.getStatusCode(), "103")) {
throw new ServiceException(ResponseResult.SHOPPING_CART_COUPON_CAN_NOT_USE_THIS_SHOP);
......
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