Commit f3525021 by 徐康

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

parents eada99cc 0f44790c
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
package cn.freemud; package cn.freemud;
import cn.freemud.core.db.DataSourcesConfig; import cn.freemud.core.db.DataSourcesConfig;
import cn.freemud.core.db.Db2DataSourcesConfig;
import com.alibaba.fastjson.parser.ParserConfig; import com.alibaba.fastjson.parser.ParserConfig;
import com.freemud.application.sdk.api.couponcenter.config.CouponRestTemplateConfig; import com.freemud.application.sdk.api.couponcenter.config.CouponRestTemplateConfig;
import com.freemud.application.sdk.api.log.LogThreadLocal; import com.freemud.application.sdk.api.log.LogThreadLocal;
...@@ -35,20 +36,17 @@ import org.springframework.scheduling.annotation.EnableAsync; ...@@ -35,20 +36,17 @@ import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import springfox.documentation.swagger2.annotations.EnableSwagger2; import springfox.documentation.swagger2.annotations.EnableSwagger2;
import tk.mybatis.spring.annotation.MapperScan;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor;
@ServletComponentScan @ServletComponentScan
@ImportAutoConfiguration(classes = {DataSourcesConfig.class}) @ImportAutoConfiguration(classes = {DataSourcesConfig.class, Db2DataSourcesConfig.class})
@EnableSwagger2 @EnableSwagger2
@EnableCircuitBreaker @EnableCircuitBreaker
@SpringBootApplication(exclude = RedisAutoConfiguration.class) @EnableDiscoveryClient @SpringBootApplication(exclude = RedisAutoConfiguration.class) @EnableDiscoveryClient
@EnableAspectJAutoProxy @EnableAspectJAutoProxy
@ComponentScan(value = {"cn.freemud", "com.freemud"},excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, @ComponentScan(value = {"cn.freemud", "com.freemud"},excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,
classes ={ CouponRestTemplateConfig.RestTemplateConfig.class})}) 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", @EnableFeignClients({"cn.freemud.service.thirdparty",
"com.freemud.sdk.api.assortment.message", "com.freemud.sdk.api.assortment.message",
"cn.freemud.service.mccafe.thirdparty", "cn.freemud.service.mccafe.thirdparty",
......
...@@ -509,5 +509,15 @@ public class OrderController { ...@@ -509,5 +509,15 @@ public class OrderController {
return orderservice.couponOrderRefund(orderRefundVo); return orderservice.couponOrderRefund(orderRefundVo);
} }
/**
* 卖券订单申请退款
*/
@ApiAnnotation(logMessage = "couponOrderRefundRetry")
@PostMapping("/couponOrderRefundRetry")
public BaseResponse couponOrderRefundRetry(@Validated @LogParams @RequestBody OrderRefundRetryVo orderRefundRetryVo) {
return orderservice.couponOrderRefundRetry(orderRefundRetryVo);
}
} }
package cn.freemud.core.db; 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.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean; 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; import javax.sql.DataSource;
...@@ -21,6 +29,9 @@ import javax.sql.DataSource; ...@@ -21,6 +29,9 @@ import javax.sql.DataSource;
*/ */
@AutoConfigureBefore(DataSourceAutoConfiguration.class) @AutoConfigureBefore(DataSourceAutoConfiguration.class)
@EnableConfigurationProperties({DataSourcesProperties.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 { public class DataSourcesConfig {
/** /**
...@@ -29,8 +40,33 @@ public class DataSourcesConfig { ...@@ -29,8 +40,33 @@ public class DataSourcesConfig {
* @return * @return
*/ */
@Bean("dataSource") @Bean("dataSource")
@Primary
public DataSource dataSource(DataSourcesProperties dataSourcesProperties) { public DataSource dataSource(DataSourcesProperties dataSourcesProperties) {
return DataSourceBuildUtil.init(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 Integer id;
private String partnerId;
private String orderCode;
private Integer lastFailureType;
private String lastReason;
private Integer compensationNum;
private String updateTime;
}
/**
* 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 Integer id;
}
/**
* 2021年9月15日-开票历史列表接口+详情接口+发票所含订单接口-黄兆良
* 查询开票历史列表
*/
package cn.freemud.entities.vo;
import lombok.Data;
import java.util.Date;
@Data
public class QueryRefundFailuresListReq {
private Integer 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 Integer id;
private String partnerId;
private String orderCode;
private String operator;
}
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);
}
}
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);
}
...@@ -211,4 +211,11 @@ public interface Orderservice extends OrderFactoryService{ ...@@ -211,4 +211,11 @@ public interface Orderservice extends OrderFactoryService{
* @return * @return
*/ */
BaseResponse couponOrderRefund(OrderRefundVo orderRefundVo); BaseResponse couponOrderRefund(OrderRefundVo orderRefundVo);
/**
* 卖券订单 申请退款 重试
* @param orderRefundRetryVo
* @return
*/
BaseResponse couponOrderRefundRetry(OrderRefundRetryVo orderRefundRetryVo);
} }
...@@ -98,6 +98,7 @@ import com.freemud.application.sdk.api.ordercenter.request.carpark.ParkingOrderC ...@@ -98,6 +98,7 @@ import com.freemud.application.sdk.api.ordercenter.request.carpark.ParkingOrderC
import com.freemud.application.sdk.api.ordercenter.response.BaseDownLoadResponse; import com.freemud.application.sdk.api.ordercenter.response.BaseDownLoadResponse;
import com.freemud.application.sdk.api.ordercenter.response.OrderBaseResp; import com.freemud.application.sdk.api.ordercenter.response.OrderBaseResp;
import com.freemud.application.sdk.api.ordercenter.response.OrderCountResp; import com.freemud.application.sdk.api.ordercenter.response.OrderCountResp;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.*;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs; import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderPayItemResp; import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderPayItemResp;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderSettlementResp; import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderSettlementResp;
...@@ -121,6 +122,7 @@ import com.freemud.sdk.api.assortment.order.enums.QueryDeliveryType; ...@@ -121,6 +122,7 @@ import com.freemud.sdk.api.assortment.order.enums.QueryDeliveryType;
import com.freemud.sdk.api.assortment.order.request.order.*; import com.freemud.sdk.api.assortment.order.request.order.*;
import com.freemud.sdk.api.assortment.order.response.order.*; import com.freemud.sdk.api.assortment.order.response.order.*;
import com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService; import com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService;
import com.freemud.sdk.api.assortment.order.util.LockUtils;
import com.freemud.sdk.api.assortment.order.vo.ProductGroupVo; import com.freemud.sdk.api.assortment.order.vo.ProductGroupVo;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
...@@ -3484,6 +3486,85 @@ public class OrderServiceImpl implements Orderservice { ...@@ -3484,6 +3486,85 @@ public class OrderServiceImpl implements Orderservice {
} }
@Override
public BaseResponse couponOrderRefundRetry(OrderRefundRetryVo orderRefundRetryVo) {
QueryRefundFailuresListReq queryRefundFailuresListReq = new QueryRefundFailuresListReq();
queryRefundFailuresListReq.setId(orderRefundRetryVo.getId());
BaseResponse<List<QueryRefundFailuresListDto>> queryRefundFailuresListDtoBaseResponse = orderServiceClient.refundFailuresList(queryRefundFailuresListReq);
if(!ResponseConstant.SUCCESS_RESPONSE_CODE_STR.equals(queryRefundFailuresListDtoBaseResponse.getCode())
|| CollectionUtils.isEmpty(queryRefundFailuresListDtoBaseResponse.getResult())
|| queryRefundFailuresListDtoBaseResponse.getResult().size() != 1) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "该记录不存在或查询异常");
}
QueryRefundFailuresListDto queryRefundFailuresListDto = queryRefundFailuresListDtoBaseResponse.getResult().get(0);
// 查询订单
BaseResponse<OrderBeanV1> orderResponse = this.checkOrderAndGetOrderBean(queryRefundFailuresListDto.getOrderCode());
if (!Objects.equals(orderResponse.getCode(), ResponseResult.SUCCESS.getCode())) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "订单数据查询失败:"+orderResponse.getMessage());
}
OrderBeanV1 orderBean = orderResponse.getResult();
AfterSalesOrderResp afterSalesOrderResp = orderBean.getAfterSalesOrderResp();
if(afterSalesOrderResp == null) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "不存在售后单信息");
}
String lockKey = "refund_retry_key:" + queryRefundFailuresListDto.getOrderCode();
try {
Long expire = 60l;
if (!LockUtils.lock(redisCache.getRedisTemplate(), lockKey, expire)) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "处理中,请稍等。");
}
if(Integer.valueOf(1).equals(queryRefundFailuresListDto.getLastFailureType())) {
Long refundId = System.currentTimeMillis();
//调用支付退款
com.freemud.sdk.api.assortment.payment.request.OrderRefundRequest orderPayRefundRequest = orderAdapter.getOrderPayRefundRequest(orderBean, refundId, queryRefundFailuresListDto.getOrderCode());
//抖音支付退款必传
orderPayRefundRequest.setRefundDesc("重试退款");
com.freemud.application.sdk.api.base.BaseResponse<OrderRefundResponse> response = payServiceImpl.orderRefund(orderPayRefundRequest);
if (response == null || response.getData() == null || !ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(response.getCode())) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "调用支付退款接口失败:"+JSON.toJSONString(response));
}
if(!ResponseConstant.SUCCESS_RESPONSE_CODE.equals(response.getData().getStatusCode())) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "支付退款失败:"+JSON.toJSONString(response));
}
RefundFailuresSuccessfulReq refundFailuresSuccessfulReq = new RefundFailuresSuccessfulReq();
refundFailuresSuccessfulReq.setId(orderRefundRetryVo.getId());
refundFailuresSuccessfulReq.setOrderCode(orderBean.getOid());
refundFailuresSuccessfulReq.setPartnerId(orderBean.getCompanyId());
BaseResponse baseResponse = orderServiceClient.refundFailuresSuccessful(refundFailuresSuccessfulReq);
if(!ResponseConstant.SUCCESS_RESPONSE_CODE_STR.equals(baseResponse.getCode())) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "处理完成但更新记录失败");
}
AfterSalesOperateReq request = new AfterSalesOperateReq();
request.setOrderCode(orderBean.getOid());
request.setPartnerId(orderBean.getCompanyId());
request.setOrderClient(Integer.parseInt(orderBean.getOrderClient()));
request.setAfterSalesCode(afterSalesOrderResp.getAfterSalesCode());
request.setAfterSerialNo(String.valueOf(orderPayRefundRequest.getRefundId()));
request.setAdultRemark("重试退款");
request.setOperator("技术支持");
OrderBaseResp orderBaseResp = orderSdkService.adultApproveWithRefundComplete(request, LogThreadLocal.getTrackingNo());
if (orderBaseResp == null || !Objects.equals(ResponseCodeConstant.RESPONSE_SUCCESS_STR, orderBaseResp.getCode())) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "基础服务订单退款完成失败");
}
}
} catch (Exception e) {
throw e;
} finally {
LockUtils.unlock(redisCache.getRedisTemplate(),lockKey);
}
return ResponseUtil.success();
}
/** /**
* 订单退款操作 * 订单退款操作
* 1.调用支付 进行退款 * 1.调用支付 进行退款
......
...@@ -3,17 +3,22 @@ package cn.freemud.service.thirdparty; ...@@ -3,17 +3,22 @@ package cn.freemud.service.thirdparty;
import cn.freemud.annotations.LogIgnoreFeign; import cn.freemud.annotations.LogIgnoreFeign;
import cn.freemud.base.entity.BaseResponse; import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.dto.QueryInvoiceRepDto; 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.QueryInvoiceByCodesResponse;
import cn.freemud.entities.dto.order.RefundFailureRequestDTO; import cn.freemud.entities.dto.order.RefundFailureRequestDTO;
import cn.freemud.entities.dto.pay.OrderInvoiceRequest; import cn.freemud.entities.dto.pay.OrderInvoiceRequest;
import cn.freemud.entities.dto.pay.QueryInvoiceByCodesRequest; import cn.freemud.entities.dto.pay.QueryInvoiceByCodesRequest;
import cn.freemud.entities.vo.QueryInvoiceReq; 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.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@FeignClient(name = "order-service",url = "${order.service.url:}") @FeignClient(name = "order-service",url = "${order.service.url:}")
@RequestMapping(consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @RequestMapping(consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public interface OrderServiceClient { public interface OrderServiceClient {
...@@ -46,4 +51,18 @@ public interface OrderServiceClient { ...@@ -46,4 +51,18 @@ public interface OrderServiceClient {
@PostMapping("/order/v2/refundFailures") @PostMapping("/order/v2/refundFailures")
BaseResponse refundFailures(@RequestBody RefundFailureRequestDTO requestDTO); 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);
} }
package cn.freemud.xxljob;
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.SendOrderCountsMsg;
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 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.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.stream.Collectors;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/4/26 下午8:27
* @description :
*/
@Component
public class CouponOrderRefundRetryHandler extends IJobHandler {
@Autowired
private Orderservice orderservice;
@Autowired
private RefundOverOrderManager refundOverOrderManager;
@Override
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;
if(nowDate.after(today1) && nowDate.before(today6)) {
num = 500;
}
List<RefundOverOrder> refundOverOrderList = refundOverOrderManager.selectBatch(num);
if(CollectionUtils.isEmpty(refundOverOrderList)) {
ApiLog.infoMessage("未查询到需要退款的买券订单");
return ReturnT.SUCCESS;
}
return ReturnT.SUCCESS;
}
}
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
gmt_modified as gmtModified gmt_modified as gmtModified
</sql> </sql>
<select id="selectByPartnerId" resultType="Partner"> <select id="selectByPartnerId" resultType="cn.freemud.entities.db.Partner">
SELECT SELECT
<include refid="all_column"/> <include refid="all_column"/>
FROM partner WHERE partner_id=#{partnerId} FROM partner WHERE partner_id=#{partnerId}
......
...@@ -18,13 +18,13 @@ ...@@ -18,13 +18,13 @@
gmt_modified as gmtModified gmt_modified as gmtModified
</sql> </sql>
<select id="selectByPartnerIdAndAppid" resultType="PartnerWxapp"> <select id="selectByPartnerIdAndAppid" resultType="cn.freemud.entities.db.PartnerWxapp">
SELECT SELECT
<include refid="all_column"/> <include refid="all_column"/>
FROM partner_wxapp WHERE appid=#{appid} and partner_id= #{partnerId} FROM partner_wxapp WHERE appid=#{appid} and partner_id= #{partnerId}
</select> </select>
<select id="selectByPartnerIdAndWxAppid" resultType="PartnerWxapp"> <select id="selectByPartnerIdAndWxAppid" resultType="cn.freemud.entities.db.PartnerWxapp">
SELECT SELECT
<include refid="all_column"/> <include refid="all_column"/>
FROM partner_wxapp WHERE wx_appid=#{wxAppid} and partner_id= #{partnerId} FROM partner_wxapp WHERE wx_appid=#{wxAppid} and partner_id= #{partnerId}
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
</sql> </sql>
<select id="selectByAppid" resultType="WxappMessageTemplate" > <select id="selectByAppid" resultType="cn.freemud.entities.db.WxappMessageTemplate" >
SELECT SELECT
<include refid="all_column"/> <include refid="all_column"/>
FROM FROM
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
AND status = 1 AND status = 1
</select> </select>
<select id="selectParentIdAndAppid" resultType="WxappMessageTemplate" > <select id="selectParentIdAndAppid" resultType="cn.freemud.entities.db.WxappMessageTemplate" >
SELECT SELECT
<include refid="all_column"/> <include refid="all_column"/>
FROM 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="DATETIME" />
<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="DATETIME" />
<result column="refund_update_time" property="refundUpdateTime" jdbcType="DATETIME" />
</resultMap>
<select id="selectBatch" resultType="cn.freemud.entities.db.db2.RefundOverOrder">
SELECT
*
FROM refund_over_order
WHERE refund_status = 1
order by refund_id
limit #{num}
</select>
</mapper>
\ No newline at end of file
...@@ -23,16 +23,20 @@ import com.freemud.application.sdk.api.storecenter.response.StoreResponse; ...@@ -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.request.order.MultiOrderRefundRequest;
import com.freemud.sdk.api.assortment.order.response.order.MultiOrderRefundResponse; import com.freemud.sdk.api.assortment.order.response.order.MultiOrderRefundResponse;
import org.apache.commons.lang.StringUtils; 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.HibernateValidator;
import org.hibernate.validator.HibernateValidatorConfiguration; import org.hibernate.validator.HibernateValidatorConfiguration;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.SpringBootVersion; import org.springframework.boot.SpringBootVersion;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.ApplicationContext;
import org.springframework.core.SpringVersion; import org.springframework.core.SpringVersion;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
import springfox.documentation.spring.web.json.Json; import springfox.documentation.spring.web.json.Json;
...@@ -40,6 +44,7 @@ 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.ConstraintViolation;
import javax.validation.Validation; import javax.validation.Validation;
import javax.validation.ValidatorFactory; import javax.validation.ValidatorFactory;
import java.sql.SQLException;
import java.util.Set; import java.util.Set;
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
...@@ -72,6 +77,9 @@ public class MallOrderServiceImplTest { ...@@ -72,6 +77,9 @@ public class MallOrderServiceImplTest {
// public void after() throws Exception { // public void after() throws Exception {
// } // }
@Autowired
private ApplicationContext applicationContext;
@Test @Test
public void f1() { 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), 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 { ...@@ -90,6 +98,13 @@ public class MallOrderServiceImplTest {
Set<ConstraintViolation<CreateOrderVo>> set = validatorFactory.getValidator().validate(new CreateOrderVo()); 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 // @Test
// public void testPaySuccess() { // public void testPaySuccess() {
......
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