Commit c40355cb by 陈斌

发票校验逻辑

parent 7d04bff1
......@@ -3,17 +3,23 @@ package cn.freemud.adapter;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.constant.CommonsConstant;
import cn.freemud.entities.dto.order.InvoiceCreateResponse;
import cn.freemud.entities.dto.order.QueryInvoiceByCodesResponse;
import cn.freemud.entities.dto.pay.InvoiceCreateRequest;
import cn.freemud.entities.dto.pay.InvoiceProductDetailRequest;
import cn.freemud.entities.dto.pay.OrderInvoiceRequest;
import cn.freemud.entities.dto.pay.QueryInvoiceByCodesRequest;
import cn.freemud.entities.vo.order.CreateOrderInvoiceRequest;
import cn.freemud.enums.InvoiceTypeCodeEnum;
import cn.freemud.enums.OrderStatus;
import cn.freemud.enums.ResponseResult;
import cn.freemud.service.thirdparty.OrderServiceClient;
import cn.freemud.utils.ResponseUtil;
import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo;
import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.ArrayList;
......@@ -22,12 +28,17 @@ import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
@Component
public class OrderInvoiceAdapter {
@Autowired
OrderServiceClient orderServiceClient;
// 开票参数
public static final String INVOICE_PRODUCTCODE = "3070401000000000000";
public static final String INVOICE_PRODUCTNAME = "餐饮类商品";
public static final String INVOICE_TAXRATE = "0.06";
public static final String INVOICE_CONTENT = "非码订单开票";
// 单张发票订单数量限制
public static final Integer ORDER_INVOICE_NUM_LIMIT = 30;
......@@ -41,7 +52,7 @@ public class OrderInvoiceAdapter {
* 校验订单开票数据
* @return
*/
public static BaseResponse checkOrderOpenInvoiceData(List<OrderBeanV1> orders, CreateOrderInvoiceRequest request){
public BaseResponse checkOrderOpenInvoiceData(List<OrderBeanV1> orders, CreateOrderInvoiceRequest request, AssortmentCustomerInfoVo userLoginInfoDto){
// 【1】 前端传的订单有误,部分订单查不到详情
if(orders.size() != request.getOrderCodes().size()){
return ResponseUtil.error(ResponseResult.ORDER_QUERY_ANY_ERR);
......@@ -51,7 +62,8 @@ public class OrderInvoiceAdapter {
return ResponseUtil.error(ResponseResult.ORDER_INVOINVE_LIMIT_30);
}
// 【3】 过滤订单状态&&实付金额是否符合开票原则
List<OrderBeanV1> orderBeanV1List = orders.stream().filter(x -> canOpenOrderInvoiceStatus.contains(x.getStatus()))
List<OrderBeanV1> orderBeanV1List = orders.stream()
.filter(x -> canOpenOrderInvoiceStatus.contains(x.getStatus()))
.filter(x -> x.getActualPayAmount() != null).collect(Collectors.toList());
if(CollectionUtils.isEmpty(orderBeanV1List)){
return ResponseUtil.error(ResponseResult.ORDER_INVOICE_OPEN_ERR);
......@@ -71,13 +83,28 @@ public class OrderInvoiceAdapter {
if(actualPayAmount2yuan > CommonsConstant.CONSTANTS_ONE_THOUSAND){
return ResponseUtil.error(ResponseResult.ACTUALPAYAMOUNT_OUT_OF_ONE_THOUSAND);
}
// 【7】 单张发票金额最小限制???元,低于最小限制不能开票
// 【7】 查询请求订单号是否开过发票,如果存在订单已开过发票,不予处理
QueryInvoiceByCodesRequest queryInvoiceByCodesRequest = new QueryInvoiceByCodesRequest();
queryInvoiceByCodesRequest.setPartnerId(request.getPartnerId());
queryInvoiceByCodesRequest.setOrderCodes(request.getOrderCodes());
queryInvoiceByCodesRequest.setUserId(userLoginInfoDto.getMemberId());
BaseResponse<QueryInvoiceByCodesResponse> queryInvoiceResponse = orderServiceClient.queryInvoiceByCodes(queryInvoiceByCodesRequest);
if(!ResponseResult.SUCCESS.getCode().equals(queryInvoiceResponse.getCode())){
return ResponseUtil.error(queryInvoiceResponse.getCode(), queryInvoiceResponse.getMessage());
}
if(null == queryInvoiceResponse.getResult()){
return ResponseUtil.error(ResponseResult.ORDER_INVOICE_QUERY_ERROR);
}
QueryInvoiceByCodesResponse orderInvoice = queryInvoiceResponse.getResult();
if(!orderInvoice.getCheckPass() || CollectionUtils.isNotEmpty(orderInvoice.getInvoicedList())){
return ResponseUtil.error(ResponseResult.ORDER_INVOICE_IS_OPENED);
}
return ResponseUtil.success();
}
public static InvoiceCreateRequest convert2InvoiceCreateRequest(List<OrderBeanV1> orders, CreateOrderInvoiceRequest createRequest){
public InvoiceCreateRequest convert2InvoiceCreateRequest(List<OrderBeanV1> orders, CreateOrderInvoiceRequest createRequest){
InvoiceCreateRequest request = new InvoiceCreateRequest();
request.setPartnerId(createRequest.getPartnerId());
request.setInvoiceTerminalCode(CommonsConstant.CONSTANTS_TWO_STRING);
......@@ -116,12 +143,12 @@ public class OrderInvoiceAdapter {
return request;
}
public static OrderInvoiceRequest convert2OrderInvoiceRequest(InvoiceCreateRequest invoiceCreateRequest
public OrderInvoiceRequest convert2OrderInvoiceRequest(InvoiceCreateRequest invoiceCreateRequest
, List<String> orderCodes, String scanUrl, String memberId){
OrderInvoiceRequest request = new OrderInvoiceRequest();
request.setPartnerId(invoiceCreateRequest.getPartnerId());
request.setInvoiceType(CommonsConstant.CONSTANTS_TWO_INTEGER);
request.setContent("test"); // todo
request.setContent(INVOICE_CONTENT);
request.setAmount(invoiceCreateRequest.getProductDetailList().get(0).getGoodsTotalPrice().multiply(new BigDecimal(100)).intValue());
request.setInvoiceUrl(scanUrl);
request.setUserId(memberId);
......@@ -130,7 +157,11 @@ public class OrderInvoiceAdapter {
return request;
}
public static void handleInvoiceData(InvoiceCreateResponse response){
/**
* 发票格式处理
* @param response
*/
public void handleInvoiceData(InvoiceCreateResponse response){
if(null == response || StringUtils.isEmpty(response.getScanUrl())){
return ;
}
......
package cn.freemud.entities.dto.order;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class QueryInvoiceByCodesResponse {
@ApiModelProperty("true全都未开票,false有开票订单号,默认值false")
private Boolean checkPass = false;
@ApiModelProperty("未开票订单号")
private List<String> unInvoicedList;
@ApiModelProperty("开过票订单号")
private List<String> invoicedList;
}
package cn.freemud.entities.dto.pay;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
public class QueryInvoiceByCodesRequest {
@ApiModelProperty("用户Id")
@NotBlank(message = "用户Id不能为空")
private String userId;
@ApiModelProperty("商户号")
@NotBlank(message = "商户号不能为空")
private String partnerId;
@ApiModelProperty("订单号集合")
@NotNull(message = "订单号集合不能为空")
private List<String> orderCodes;
}
......@@ -186,6 +186,8 @@ public enum ResponseResult {
ACTUALPAYAMOUNT_IS_ERROR("45079", "实际支付金额有误,不予开票",""),
ORDER_QUERY_ANY_ERR("45080", "部分订单查询失败",""),
ORDER_INVOICE_OPEN_ERR("45081", "订单状态不符合开票原则",""),
ORDER_INVOICE_QUERY_ERROR("45082", "订单发票查询失败",""),
ORDER_INVOICE_IS_OPENED("45083", "存在选中的订单已开过发票,请重新选择",""),
/**
* 售后单
......
......@@ -331,6 +331,9 @@ public class OrderServiceImpl implements Orderservice {
@Autowired
private OrderServiceClient orderServiceClient;
@Autowired
OrderInvoiceAdapter orderInvoiceAdapter;
@Override
public BaseResponse checkBeforeCreateOrder(CheckBeforeCreateOrderRequestVo requestVo) {
......@@ -4390,23 +4393,23 @@ public class OrderServiceImpl implements Orderservice {
}
// 【2】. 校验订单开票数据
BaseResponse checkResponse = OrderInvoiceAdapter.checkOrderOpenInvoiceData(dataBean.getOrders(), request);
BaseResponse checkResponse = orderInvoiceAdapter.checkOrderOpenInvoiceData(dataBean.getOrders(), request, userLoginInfoDto);
if (!Objects.equals(ResponseCodeConstant.RESPONSE_SUCCESS_STR, checkResponse.getCode())) {
return checkResponse;
}
// 【3】. 调用支付接口开订单发票,非码支付系统内部再调用三方-百望系统开票
InvoiceCreateRequest invoiceCreateRequest = OrderInvoiceAdapter.convert2InvoiceCreateRequest(dataBean.getOrders(), request);
InvoiceCreateRequest invoiceCreateRequest = orderInvoiceAdapter.convert2InvoiceCreateRequest(dataBean.getOrders(), request);
com.freemud.application.sdk.api.base.BaseResponse<InvoiceCreateResponse> invoiceResponse = paymentNewClient.createInvoice(invoiceCreateRequest);
if (!Objects.equals(ResponseCodeConstant.RESPONSE_SUCCESS_STR, invoiceResponse.getCode()) || null == invoiceResponse.getData()) {
return ResponseUtil.error(invoiceResponse.getCode(), invoiceResponse.getMessage());
}
// 【3.1】.发票格式处理
OrderInvoiceAdapter.handleInvoiceData(invoiceResponse.getData());
orderInvoiceAdapter.handleInvoiceData(invoiceResponse.getData());
// 【4】. 录入发票记录,修改订单发票状态
OrderInvoiceRequest orderInvoiceRequest = OrderInvoiceAdapter.convert2OrderInvoiceRequest(invoiceCreateRequest, request.getOrderCodes()
OrderInvoiceRequest orderInvoiceRequest = orderInvoiceAdapter.convert2OrderInvoiceRequest(invoiceCreateRequest, request.getOrderCodes()
, invoiceResponse.getData().getScanUrl() , userLoginInfoDto.getMemberId());
BaseResponse orderInvoiceResponse = orderServiceClient.createInvoice(orderInvoiceRequest);
if (!Objects.equals(ResponseCodeConstant.RESPONSE_SUCCESS_STR, orderInvoiceResponse.getCode())) {
......
......@@ -2,7 +2,9 @@ package cn.freemud.service.thirdparty;
import cn.freemud.annotations.LogIgnoreFeign;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.dto.order.QueryInvoiceByCodesResponse;
import cn.freemud.entities.dto.pay.OrderInvoiceRequest;
import cn.freemud.entities.dto.pay.QueryInvoiceByCodesRequest;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
......@@ -18,4 +20,11 @@ public interface OrderServiceClient {
@LogIgnoreFeign(logMessage="createInvoice")
@PostMapping("/order/v2/invoice/create")
BaseResponse createInvoice(@RequestBody OrderInvoiceRequest orderCounts);
/**
* 查询用户订单号是否已开票
*/
@LogIgnoreFeign(logMessage="queryByCodes")
@PostMapping("/order/v2/invoice/queryByCodes")
BaseResponse<QueryInvoiceByCodesResponse> queryInvoiceByCodes(@RequestBody QueryInvoiceByCodesRequest request);
}
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