flow finished need to test

This commit is contained in:
Cauchy
2023-10-17 13:23:21 +08:00
parent c268fb185d
commit 99484c90e0
14 changed files with 120 additions and 70 deletions

View File

@@ -43,8 +43,7 @@ public class KdUtils {
} }
public static String urlEncoder(String str, String charset) throws UnsupportedEncodingException{ public static String urlEncoder(String str, String charset) throws UnsupportedEncodingException{
String result = URLEncoder.encode(str, charset); return URLEncoder.encode(str, charset);
return result;
} }
/** /**
@@ -55,7 +54,7 @@ public class KdUtils {
* @throws UnsupportedEncodingException ,Exception * @throws UnsupportedEncodingException ,Exception
* @return DataSign签名 * @return DataSign签名
*/ */
public static String encrypt (String content, String keyValue, String charset) throws UnsupportedEncodingException, Exception public static String encrypt (String content, String keyValue, String charset) throws Exception
{ {
if (keyValue != null) if (keyValue != null)
{ {

View File

@@ -56,4 +56,33 @@ public class Constants {
* 购买方式 - 购物车 * 购买方式 - 购物车
*/ */
public static final String BUY_TYPE_CART = "1"; public static final String BUY_TYPE_CART = "1";
/**
* 快递鸟 API key
*/
public static final String EXPRESS_API_KEY = "f4342e6c-5cfa-458f-997b-f973eb29eb1d";
/**
* business ID
*/
public static final String EXPRESS_BUSINESS_ID = "1788532";
/**
* 顺丰月付码
*/
public static final String EXPRESS_SF_MONTH_CODE = "0226032007";
/**
* 快递接口指令-下单
*/
public static final String EXPRESS_REQUEST_TYPE_PLACE_ORDER = "1007";
/**
* 快递接口指令-下单
*/
public static final String EXPRESS_REQUEST_TYPE_QUERY = "1002";
/**
* 快递接口 - 下单 URL
*/
public static final String EXPRESS_PLACE_ORDER_URL = "https://api.kdniao.com/api/EOrderService";
/**
* 快递接口 - 查询 URL
*/
public static final String EXPRESS_QUERY_URL = "https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx";
} }

View File

@@ -56,7 +56,7 @@ public class BuyOrderDetailEntity implements Serializable {
/** /**
* 商品重量 * 商品重量
*/ */
private Float weight; private Double weight;
/** /**
* 商品类型 * 商品类型
*/ */

View File

@@ -1,4 +1,4 @@
package com.peanut.modules.book.vo; package com.peanut.modules.book.entity;
import lombok.Data; import lombok.Data;
@@ -8,7 +8,7 @@ import lombok.Data;
* @CreateTime: 2023/10/16 * @CreateTime: 2023/10/16
*/ */
@Data @Data
public class ExpressCommodityVo { public class ExpressCommodity {
/** /**
* 商品名称 * 商品名称
*/ */

View File

@@ -5,6 +5,7 @@ import lombok.Data;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
import java.util.List;
/** /**
* @Description: 快递订单 * @Description: 快递订单
@@ -45,7 +46,7 @@ public class ExpressOrder {
/** /**
* 总重量 * 总重量
*/ */
private int totalWeight; private BigDecimal totalWeight;
/** /**
* 创建时间 * 创建时间
*/ */
@@ -54,4 +55,8 @@ public class ExpressOrder {
* 删除标识 * 删除标识
*/ */
private int delFlag; private int delFlag;
/**
* 物品信息
*/
private List<ExpressCommodity> Commodity;
} }

View File

@@ -28,5 +28,5 @@ public interface BuyOrderService extends IService<BuyOrderEntity> {
// 查询所有订单是否有可合并 // 查询所有订单是否有可合并
Page checkOrder(Map<String, Object> params); Page checkOrder(Map<String, Object> params);
void createSplitPackageOrder(String expressCompanyCode, Integer userAddressId, List<Integer> shopProductIdList); void createSplitPackageOrder(String expressCompanyCode, Integer userAddressId, List<Integer> shopProductIdList) throws Exception;
} }

View File

@@ -16,5 +16,5 @@ public interface ExpressFeeService extends IService<ExpressFee> {
* @param regionCode 地区代码 * @param regionCode 地区代码
* @return BigDecimal 费用 * @return BigDecimal 费用
*/ */
BigDecimal calculateExpressFee(String expressCompanyCode, int weight, String regionCode); BigDecimal calculateExpressFee(String expressCompanyCode, BigDecimal weight, String regionCode);
} }

View File

@@ -2,23 +2,19 @@ package com.peanut.modules.book.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.peanut.modules.book.entity.ExpressOrder; import com.peanut.modules.book.entity.ExpressOrder;
import com.peanut.modules.book.entity.UserAddress;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@Service @Service
public interface ExpressOrderService extends IService<ExpressOrder> { public interface ExpressOrderService extends IService<ExpressOrder> {
/** /**
* 新增快递订单信息 * 下单生成面单
* *
* @param expressOrder 快递订单 * @param userAddress
* @return object - id * @param expressOrder
* @throws Exception
*/ */
int insertNewExpressOrder(ExpressOrder expressOrder); void placeExpressOrder(UserAddress userAddress, ExpressOrder expressOrder) throws Exception;
void placeExpressOrder(Integer userAddressId, ExpressOrder expressOrder);
// void printDeliveryBill();
//
// void expressRealTimeQuery();
} }

View File

@@ -31,14 +31,6 @@ public class BuyOrderDetailServiceImpl extends ServiceImpl<BuyOrderDetailDao, Bu
return new PageUtils(page); return new PageUtils(page);
} }
/** /**
* 去重查询未打印的面单信息 * 去重查询未打印的面单信息
* @param params * @param params
@@ -70,7 +62,7 @@ public class BuyOrderDetailServiceImpl extends ServiceImpl<BuyOrderDetailDao, Bu
@Override @Override
public void batchUpdateByShippingSns(String[] shippingSnList) { public void batchUpdateByShippingSns(String[] shippingSnList) {
List<BuyOrderDetailEntity> buyOrderDetailEntityList = this.list(new QueryWrapper<BuyOrderDetailEntity>()); List<BuyOrderDetailEntity> buyOrderDetailEntityList = this.list(new QueryWrapper<>());
for(String sn : shippingSnList){ for(String sn : shippingSnList){
for(BuyOrderDetailEntity buyOrderDetailEntity : buyOrderDetailEntityList){ for(BuyOrderDetailEntity buyOrderDetailEntity : buyOrderDetailEntityList){
if(StringUtil.isNotEmpty(buyOrderDetailEntity.getShippingSn()) && buyOrderDetailEntity.getShippingSn().equals(sn)){ if(StringUtil.isNotEmpty(buyOrderDetailEntity.getShippingSn()) && buyOrderDetailEntity.getShippingSn().equals(sn)){

View File

@@ -1,6 +1,5 @@
package com.peanut.modules.book.service.impl; package com.peanut.modules.book.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
@@ -13,6 +12,7 @@ import com.peanut.modules.book.dao.BuyOrderDao;
import com.peanut.modules.book.dao.ShopProductDao; import com.peanut.modules.book.dao.ShopProductDao;
import com.peanut.modules.book.entity.*; import com.peanut.modules.book.entity.*;
import com.peanut.modules.book.service.*; import com.peanut.modules.book.service.*;
import com.peanut.modules.book.entity.ExpressCommodity;
import com.peanut.modules.book.vo.UserOrderVo; import com.peanut.modules.book.vo.UserOrderVo;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -55,7 +55,7 @@ public class BuyOrderServiceImpl extends ServiceImpl<BuyOrderDao, BuyOrderEntity
@Override @Override
public PageUtils queryPage(Map<String, Object> params) throws Exception { public PageUtils queryPage(Map<String, Object> params) throws Exception {
IPage<BuyOrderEntity> page = null; IPage<BuyOrderEntity> page;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String startTime = null; String startTime = null;
String endTime = null; String endTime = null;
@@ -248,9 +248,24 @@ public class BuyOrderServiceImpl extends ServiceImpl<BuyOrderDao, BuyOrderEntity
} }
@Override @Override
public void createSplitPackageOrder(String expressCompanyCode, Integer userAddressId, List<Integer> shopProductIdList) { public void createSplitPackageOrder(String expressCompanyCode, Integer userAddressId, List<Integer> buyOrderDetailId) throws Exception {
// 根据商品 id 获取总重量 QueryWrapper<BuyOrderDetailEntity> queryWrapper = new QueryWrapper<>();
int totalWeight = shopProductDao.getTotalWeight(shopProductIdList); queryWrapper.in("id", buyOrderDetailId);
List<BuyOrderDetailEntity> buyOrderDetailList = buyOrderDetailService.list(queryWrapper);
BigDecimal totalWeight = new BigDecimal(0);
List<ExpressCommodity> commodityList = new ArrayList<>();
for (BuyOrderDetailEntity buyOrderDetail : buyOrderDetailList) {
ExpressCommodity commodity = new ExpressCommodity();
commodity.setGoodsName(buyOrderDetail.getProductName());
commodity.setGoodsquantity(buyOrderDetail.getQuantity());
commodity.setGoodsWeight(buyOrderDetail.getWeight());
totalWeight = totalWeight.add(
BigDecimal.valueOf(buyOrderDetail.getWeight()).multiply(new BigDecimal(buyOrderDetail.getQuantity()))
);
commodityList.add(commodity);
}
// 获取用户地址 // 获取用户地址
UserAddress address = userAddressService.getById(userAddressId); UserAddress address = userAddressService.getById(userAddressId);
// 计算快递费用 // 计算快递费用
@@ -259,9 +274,9 @@ public class BuyOrderServiceImpl extends ServiceImpl<BuyOrderDao, BuyOrderEntity
expressOrder.setExpressFee(expressFee); expressOrder.setExpressFee(expressFee);
expressOrder.setCreateTime(new Date()); expressOrder.setCreateTime(new Date());
expressOrder.setTotalWeight(totalWeight); expressOrder.setTotalWeight(totalWeight);
expressOrder.setCommodity(commodityList);
// 生成快递面单 // 生成快递面单
expressOrderService.placeExpressOrder(address, expressOrder);
int expressOrderId = expressOrderService.insertNewExpressOrder(expressOrder);
} }
} }

View File

@@ -17,20 +17,14 @@ import java.math.RoundingMode;
*/ */
public class ExpressFeeServiceImpl extends ServiceImpl<ExpressFeeDao, ExpressFee> implements ExpressFeeService { public class ExpressFeeServiceImpl extends ServiceImpl<ExpressFeeDao, ExpressFee> implements ExpressFeeService {
@Override @Override
public BigDecimal calculateExpressFee(String expressCompanyCode, int weight, String regionCode) { public BigDecimal calculateExpressFee(String expressCompanyCode, BigDecimal weight, String regionCode) {
int integerPart = weight / 100;
int decimalPart = weight % 100;
// 将重量转换为公斤
BigDecimal realWeight = BigDecimal.valueOf(integerPart).add(BigDecimal.valueOf(decimalPart)
.divide(new BigDecimal(100), MathContext.DECIMAL64));
realWeight = realWeight.setScale(0, RoundingMode.UP);
BigDecimal fee = null; BigDecimal fee = null;
switch (expressCompanyCode) { switch (expressCompanyCode) {
case "SF": case "SF":
fee = calculateSFExpressFee(realWeight, regionCode); fee = calculateSFExpressFee(weight, regionCode);
break; break;
case "YD": case "YD":
fee = calculateYDExpressFee(realWeight, regionCode); fee = calculateYDExpressFee(weight, regionCode);
break; break;
} }
return fee; return fee;

View File

@@ -1,19 +1,22 @@
package com.peanut.modules.book.service.impl; package com.peanut.modules.book.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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.book.dao.ExpressOrderDao; import com.peanut.modules.book.dao.ExpressOrderDao;
import com.peanut.modules.book.entity.*; import com.peanut.modules.book.entity.*;
import com.peanut.modules.book.service.*; import com.peanut.modules.book.service.*;
import com.peanut.modules.book.vo.ExpressCommodityVo;
import com.peanut.modules.book.vo.ExpressOrderRequestVo; import com.peanut.modules.book.vo.ExpressOrderRequestVo;
import com.peanut.modules.book.vo.ExpressUserInfoVo; import com.peanut.modules.book.vo.ExpressUserInfoVo;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.HashMap;
import java.util.List; import java.util.Map;
/** /**
* @Description: 快递订单 Service 实现 * @Description: 快递订单 Service 实现
@@ -36,12 +39,6 @@ public class ExpressOrderServiceImpl extends ServiceImpl<ExpressOrderDao, Expres
@Value("${express.sender.address}") @Value("${express.sender.address}")
private String senderAddress; private String senderAddress;
@Autowired
private ExpressOrderDao expressOrderDao;
@Autowired
private UserAddressService userAddressService;
@Autowired @Autowired
private CountyService countyService; private CountyService countyService;
@@ -51,45 +48,47 @@ public class ExpressOrderServiceImpl extends ServiceImpl<ExpressOrderDao, Expres
@Autowired @Autowired
private ProvinceService provinceService; private ProvinceService provinceService;
@Override
public int insertNewExpressOrder(ExpressOrder expressOrder) {
expressOrderDao.insertNewExpressOrder(expressOrder);
return expressOrder.getId();
}
@Override @Override
public void placeExpressOrder(Integer userAddressId, ExpressOrder expressOrder) { public void placeExpressOrder(UserAddress userAddress, ExpressOrder expressOrder) throws Exception {
ExpressOrderRequestVo orderRequestVo = new ExpressOrderRequestVo(); ExpressOrderRequestVo orderRequestVo = new ExpressOrderRequestVo();
// 订单号 // 订单号
orderRequestVo.setOrderCode(expressOrder.getOrderId()); orderRequestVo.setOrderCode(expressOrder.getOrderId());
orderRequestVo.setShipperCode(expressOrder.getExpressCompanyCode()); orderRequestVo.setShipperCode(expressOrder.getExpressCompanyCode());
orderRequestVo.setPayType(3); orderRequestVo.setPayType(3);
orderRequestVo.setExpType(1); orderRequestVo.setExpType(1);
orderRequestVo.setCost(expressOrder.getExpressFee().doubleValue());
// 发货人 // 发货人
ExpressUserInfoVo sender = new ExpressUserInfoVo(); ExpressUserInfoVo sender = new ExpressUserInfoVo();
sender.setName(senderName); sender.setCompany(senderName);
sender.setMobile(senderMobile); sender.setMobile(senderMobile);
sender.setProvinceName(senderProvinceName); sender.setProvinceName(senderProvinceName);
sender.setCityName(senderCityName); sender.setCityName(senderCityName);
sender.setExpAreaName(senderExpAreaName); sender.setExpAreaName(senderExpAreaName);
sender.setAddress(senderAddress); sender.setAddress(senderAddress);
// 收货人 // 收货人
UserAddress userAddress = userAddressService.getById(userAddressId);
ExpressUserInfoVo receiver = buildReceiverBasedOnUserAddress(userAddress); ExpressUserInfoVo receiver = buildReceiverBasedOnUserAddress(userAddress);
orderRequestVo.setSender(sender); orderRequestVo.setSender(sender);
orderRequestVo.setReceiver(receiver); orderRequestVo.setReceiver(receiver);
ExpressCommodityVo commodityVo = new ExpressCommodityVo(); orderRequestVo.setCommodity(expressOrder.getCommodity());
commodityVo.setGoodsName("书籍"); orderRequestVo.setWeight(expressOrder.getTotalWeight().doubleValue());
List<ExpressCommodityVo> commodityVoList = new ArrayList<>();
orderRequestVo.setCommodity(commodityVoList);
//orderRequestVo.setWeight(expressOrder.getTotalWeight());
orderRequestVo.setRemark(expressOrder.getRemark()); orderRequestVo.setRemark(expressOrder.getRemark());
String RequestData = JSONObject.toJSONString(orderRequestVo);
Map<String, String> params = new HashMap<>();
params.put("RequestData", RequestData);
params.put("EBusinessID", Constants.EXPRESS_BUSINESS_ID);
params.put("RequestType", Constants.EXPRESS_REQUEST_TYPE_PLACE_ORDER);
String dataSign = KdUtils.encrypt(RequestData, Constants.EXPRESS_API_KEY, "UTF-8");
params.put("DataSign", KdUtils.urlEncoder(dataSign, "UTF-8"));
params.put("DataType", "2");
String response = HttpClientUtils.kdSendPost(Constants.EXPRESS_PLACE_ORDER_URL, params);
System.out.println(response);
} }
private ExpressUserInfoVo buildReceiverBasedOnUserAddress(UserAddress userAddress) { private ExpressUserInfoVo buildReceiverBasedOnUserAddress(UserAddress userAddress) {
ExpressUserInfoVo vo = new ExpressUserInfoVo(); ExpressUserInfoVo vo = new ExpressUserInfoVo();
vo.setName(userAddress.getConsigneeName()); vo.setCompany(userAddress.getConsigneeName());
vo.setMobile(userAddress.getConsigneePhone()); vo.setMobile(userAddress.getConsigneePhone());
vo.setAddress(userAddress.getDetailAddress()); vo.setAddress(userAddress.getDetailAddress());
String regionCode = userAddress.getRegionCode(); String regionCode = userAddress.getRegionCode();

View File

@@ -1,8 +1,9 @@
package com.peanut.modules.book.vo; package com.peanut.modules.book.vo;
import com.peanut.modules.book.entity.ExpressCommodity;
import lombok.Data; import lombok.Data;
import java.util.List ; import java.util.List;
/** /**
* @Description: 快递请求 Value Object * @Description: 快递请求 Value Object
@@ -28,6 +29,18 @@ public class ExpressOrderRequestVo {
* 快递公司业务类型 * 快递公司业务类型
*/ */
private int ExpType; private int ExpType;
/**
* 月付款账号
*/
private String MonthCode;
/**
* 快递运费
*/
private Double Cost;
/**
* 其他费用
*/
private Double OtherCost;
/** /**
* 发货人 * 发货人
*/ */
@@ -39,11 +52,19 @@ public class ExpressOrderRequestVo {
/** /**
* 货物信息 * 货物信息
*/ */
private List<ExpressCommodityVo> Commodity; private List<ExpressCommodity> Commodity;
/** /**
* 重量 * 重量
*/ */
private Double Weight; private Double Weight;
/**
* 包裹数量
*/
private Integer Quantity;
/**
* 包裹体积
*/
private Double Volume;
/** /**
* 备注 * 备注
*/ */

View File

@@ -12,7 +12,7 @@ public class ExpressUserInfoVo {
/** /**
* 姓名 * 姓名
*/ */
private String Name; private String Company;
/** /**
* 电话 * 电话
*/ */