@@ -0,0 +1,145 @@
package com.peanut.modules.common.service.impl ;
import com.alibaba.fastjson.JSONObject ;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl ;
import com.peanut.common.utils.HttpClientUtils ;
import com.peanut.common.utils.KdUtils ;
import com.peanut.config.Constants ;
import com.peanut.modules.common.dao.ExpressOrderDao ;
import com.peanut.modules.common.entity.ExpressCommodity ;
import com.peanut.modules.common.entity.ExpressOrder ;
import com.peanut.modules.common.entity.ExpressQueryResponse ;
import com.peanut.modules.common.service.ExpressOrderService ;
import com.peanut.modules.common.vo.* ;
import lombok.extern.slf4j.Slf4j ;
import org.springframework.beans.factory.annotation.Value ;
import org.springframework.stereotype.Service ;
import java.math.BigDecimal ;
import java.util.HashMap ;
import java.util.Map ;
@Slf4j
@Service ( " commonExpressOrderService " )
public class ExpressOrderServiceImpl extends ServiceImpl < ExpressOrderDao , ExpressOrder > implements ExpressOrderService {
@Value ( " ${express.sender.senderName} " )
private String senderName ;
@Value ( " ${express.sender.mobile} " )
private String senderMobile ;
@Value ( " ${express.sender.provinceName} " )
private String senderProvinceName ;
@Value ( " ${express.sender.cityName} " )
private String senderCityName ;
@Value ( " ${express.sender.expAreaName} " )
private String senderExpAreaName ;
@Value ( " ${express.sender.address} " )
private String senderAddress ;
@Override
public ExpressOrderResponseVo placeExpressOrder ( ExpressOrder expressOrder ) {
ExpressOrderRequestVo orderRequestVo = new ExpressOrderRequestVo ( ) ;
// 订单号
orderRequestVo . setOrderCode ( expressOrder . getOrderSn ( ) ) ;
orderRequestVo . setIsReturnPrintTemplate ( 1 ) ;
orderRequestVo . setShipperCode ( expressOrder . getExpressCompanyCode ( ) ) ;
orderRequestVo . setPayType ( 3 ) ;
if ( expressOrder . getExpressCompanyCode ( ) . equals ( Constants . EXPRESS_COMPANY_CODE_SF ) ) {
orderRequestVo . setMonthCode ( Constants . EXPRESS_SF_MONTH_CODE ) ;
//如果是顺丰港澳台, 参数多两个必填CurrencyCode、Dutiable.DeclaredValue
if ( " 台湾省 " . equals ( expressOrder . getProvince ( ) ) | |
" 香港特别行政区 " . equals ( expressOrder . getProvince ( ) ) | |
" 澳门特别行政区 " . equals ( expressOrder . getProvince ( ) ) ) {
orderRequestVo . setCurrencyCode ( " CNY " ) ;
BigDecimal declaredValue = new BigDecimal ( 0 ) ;
if ( expressOrder . getCommodity ( ) . size ( ) > 0 ) {
for ( ExpressCommodity commodity : expressOrder . getCommodity ( ) ) {
BigDecimal quantity = BigDecimal . valueOf ( commodity . getGoodsquantity ( ) ) ;
BigDecimal price = BigDecimal . valueOf ( commodity . getGoodsPrice ( ) ) ;
BigDecimal total = quantity . multiply ( price ) ;
declaredValue = declaredValue . add ( total ) ;
}
}
DutiableVo dutiable = new DutiableVo ( ) ;
dutiable . setDeclaredValue ( declaredValue . setScale ( 3 ) ) ;
orderRequestVo . setDutiable ( dutiable ) ;
}
}
if ( expressOrder . getExpressCompanyCode ( ) . equals ( Constants . EXPRESS_COMPANY_CODE_YD ) ) {
orderRequestVo . setCustomerName ( Constants . EXPRESS_YD_CUSTOMER_NAME ) ;
orderRequestVo . setCustomerPwd ( Constants . EXPRESS_YD_CUSTOMER_PWD ) ;
}
orderRequestVo . setExpType ( 231 ) ; //1特快2标快
orderRequestVo . setCost ( expressOrder . getExpressFee ( ) . doubleValue ( ) ) ;
// 发货人
ExpressUserInfoVo sender = new ExpressUserInfoVo ( ) ;
sender . setName ( senderName ) ;
sender . setMobile ( senderMobile ) ;
sender . setProvinceName ( senderProvinceName ) ;
sender . setCityName ( senderCityName ) ;
sender . setExpAreaName ( senderExpAreaName ) ;
sender . setAddress ( senderAddress ) ;
// 收货人
ExpressUserInfoVo receiver = new ExpressUserInfoVo ( ) ;
receiver . setName ( expressOrder . getConsigneeName ( ) ) ;
receiver . setMobile ( expressOrder . getConsigneeMobile ( ) ) ;
receiver . setProvinceName ( expressOrder . getProvince ( ) ) ;
receiver . setCityName ( expressOrder . getCity ( ) ) ;
receiver . setExpAreaName ( expressOrder . getCounty ( ) ) ;
receiver . setAddress ( expressOrder . getAddress ( ) ) ;
orderRequestVo . setSender ( sender ) ;
orderRequestVo . setReceiver ( receiver ) ;
orderRequestVo . setCommodity ( expressOrder . getCommodity ( ) ) ;
orderRequestVo . setWeight ( expressOrder . getTotalWeight ( ) . doubleValue ( ) ) ;
orderRequestVo . setRemark ( expressOrder . getRemark ( ) ) ;
orderRequestVo . setTemplateSize ( " 150 " ) ;
String requestData = JSONObject . toJSONString ( orderRequestVo ) ;
//如果是顺丰港澳台, 参数多两个必填CurrencyCode、Dutiable.DeclaredValue, 需要大写
String requestDataUpperCase = requestData ;
if ( requestData . contains ( " currencyCode " ) ) {
requestDataUpperCase = requestData . replace ( " currencyCode " , " CurrencyCode " )
. replace ( " dutiable " , " Dutiable " )
. replace ( " declaredValue " , " DeclaredValue " ) ;
}
Map < String , String > params = new HashMap < > ( ) ;
params . put ( " RequestData " , requestDataUpperCase ) ;
params . put ( " EBusinessID " , Constants . EXPRESS_BUSINESS_ID ) ;
params . put ( " RequestType " , Constants . EXPRESS_REQUEST_TYPE_PLACE_ORDER ) ;
try {
String dataSign = KdUtils . encrypt ( requestDataUpperCase , Constants . EXPRESS_API_KEY , " UTF-8 " ) ;
params . put ( " DataSign " , KdUtils . urlEncoder ( dataSign , " UTF-8 " ) ) ;
} catch ( Exception e ) {
e . printStackTrace ( ) ;
log . error ( e . getMessage ( ) ) ;
}
params . put ( " DataType " , " 2 " ) ;
String response = HttpClientUtils . kdSendPost ( Constants . EXPRESS_PLACE_ORDER_URL , params ) ;
return JSONObject . parseObject ( response , ExpressOrderResponseVo . class ) ;
}
@Override
public ExpressQueryResponse queryExpressOrder ( String shipperCode , String logisticCode , String customerName ) {
ExpressQueryRequestVo requestVo = new ExpressQueryRequestVo ( ) ;
requestVo . setLogisticCode ( logisticCode ) ;
requestVo . setCustomerName ( customerName ) ;
requestVo . setShipperCode ( shipperCode ) ;
String requestData = JSONObject . toJSONString ( requestVo ) ;
Map < String , String > params = new HashMap < > ( ) ;
params . put ( " RequestData " , requestData ) ;
params . put ( " EBusinessID " , Constants . EXPRESS_BUSINESS_ID ) ;
params . put ( " RequestType " , Constants . EXPRESS_REQUEST_TYPE_QUERY ) ;
try {
String dataSign = KdUtils . encrypt ( requestData , Constants . EXPRESS_API_KEY , " UTF-8 " ) ;
params . put ( " DataSign " , KdUtils . urlEncoder ( dataSign , " UTF-8 " ) ) ;
} catch ( Exception e ) {
e . printStackTrace ( ) ;
log . error ( e . getMessage ( ) ) ;
}
params . put ( " DateType " , " 2 " ) ;
String response = HttpClientUtils . kdSendPost ( Constants . EXPRESS_QUERY_URL , params ) ;
return JSONObject . parseObject ( response , ExpressQueryResponse . class ) ;
}
}