Commit c40355cb by 陈斌

发票校验逻辑

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