|
@@ -26,6 +26,12 @@ import com.fs.his.service.IFsStoreOrderService;
|
|
|
import com.fs.his.service.IFsStoreProductService;
|
|
|
import com.fs.his.utils.ConfigUtil;
|
|
|
import com.fs.his.vo.FsStoreOrderItemVO;
|
|
|
+import com.fs.hisStore.domain.FsStoreOrderItemScrm;
|
|
|
+import com.fs.hisStore.domain.FsStoreOrderScrm;
|
|
|
+import com.fs.hisStore.domain.FsStoreProductScrm;
|
|
|
+import com.fs.hisStore.service.IFsStoreOrderItemScrmService;
|
|
|
+import com.fs.hisStore.service.IFsStoreOrderScrmService;
|
|
|
+import com.fs.hisStore.service.IFsStoreProductScrmService;
|
|
|
import com.hc.openapi.tool.util.StringUtils;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
@@ -55,6 +61,15 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
|
|
|
@Autowired
|
|
|
private IFsStoreProductService fsStoreProductService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private IFsStoreOrderScrmService fsStoreOrderScrmService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IFsStoreOrderItemScrmService fsStoreOrderItemScrmService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IFsStoreProductScrmService fsStoreProductScrmService;
|
|
|
+
|
|
|
// @Value("${fsConfig.erpWdShopCode}")
|
|
|
// private String shopCode;
|
|
|
|
|
@@ -83,6 +98,11 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
|
|
|
return getErpOrderResponse(order);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public ErpOrderResponse addOrderScrm(ErpOrder order) {
|
|
|
+ return getErpOrderResponseScrm(order);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 获取erp推送参数
|
|
|
* @param order 订单参数
|
|
@@ -263,6 +283,181 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
|
|
|
return new ErpOrderResponse();
|
|
|
}
|
|
|
|
|
|
+ private ErpOrderResponse getErpOrderResponseScrm(ErpOrder order) {
|
|
|
+ FsSysConfig sysConfig = configUtil.getSysConfig();
|
|
|
+ String shopCode = sysConfig.getErpWdShopCode();
|
|
|
+
|
|
|
+ //测试环境sid、appkey、密钥请到旺店通开放平台-自助对接-申请测试环境内查看,测试环境url=https://sandbox.wangdian.cn/openapi2/
|
|
|
+ //调用正式环境时请将sid、appkey、appsecret切换为实际参数,参数在旺店通开放平台-自助对接-应用管理内应用状态为已上线的应用中查看,调用正式环境注意切换正式环境url=https://api.wangdian.cn/openapi2/
|
|
|
+
|
|
|
+ ErpWdtBusinessRequestParams erpWdtBusinessRequestParams = new ErpWdtBusinessRequestParams();
|
|
|
+ erpWdtBusinessRequestParams.setShopNo(shopCode);
|
|
|
+ erpWdtBusinessRequestParams.setSwitchMode(0);
|
|
|
+ ErpWdtTrade erpWdtTrade = new ErpWdtTrade();
|
|
|
+ FsStoreOrderScrm fsStoreOrder = fsStoreOrderScrmService.selectFsStoreOrderByOrderCode(order.getPlatform_code());
|
|
|
+ BigDecimal couponPrice = fsStoreOrder.getCouponPrice();
|
|
|
+ if (couponPrice == null) {
|
|
|
+ couponPrice = BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 平台状态
|
|
|
+ erpWdtTrade.setTradeStatus(TradeStatus.PAID_WAITING_FOR_SHIPMENT.getValue());
|
|
|
+
|
|
|
+ // 订单id
|
|
|
+ erpWdtTrade.setTid(order.getPlatform_code());
|
|
|
+
|
|
|
+
|
|
|
+ // 如果是货到付款
|
|
|
+ if("2".equals(fsStoreOrder.getPayType())){
|
|
|
+ // 支付状态
|
|
|
+ erpWdtTrade.setPayStatus(PaymentStatus.PARTIALLY_PAID.getValue());
|
|
|
+ // 发货条件
|
|
|
+ erpWdtTrade.setDeliveryTerm(DeliveryTerm.CASH_ON_DELIVERY.getValue());
|
|
|
+ // 货到付款金额 = 物流代收金额-优惠金额
|
|
|
+ erpWdtTrade.setCodAmount(fsStoreOrder.getPayDelivery().subtract(couponPrice));
|
|
|
+
|
|
|
+ } else if("3".equals(fsStoreOrder.getPayType())){
|
|
|
+ // 支付状态
|
|
|
+ erpWdtTrade.setPayStatus(PaymentStatus.UNPAID.getValue());
|
|
|
+ // 发货条件
|
|
|
+ erpWdtTrade.setDeliveryTerm(DeliveryTerm.CASH_ON_DELIVERY.getValue());
|
|
|
+ // 货到付款金额 = 物流代收金额-优惠金额
|
|
|
+ erpWdtTrade.setCodAmount(fsStoreOrder.getPayDelivery().subtract(couponPrice));
|
|
|
+ } else { // 如果是线上付款
|
|
|
+ // 支付状态
|
|
|
+ erpWdtTrade.setPayStatus(PaymentStatus.FULLY_PAID.getValue());
|
|
|
+ // 发货条件
|
|
|
+ erpWdtTrade.setDeliveryTerm(DeliveryTerm.PAYMENT_BEFORE_DELIVERY.getValue());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 下单时间
|
|
|
+ erpWdtTrade.setTradeTime(order.getDeal_datetime());
|
|
|
+ // 支付时间
|
|
|
+ erpWdtTrade.setPayTime(order.getDeal_datetime());
|
|
|
+ // 分销类别
|
|
|
+ erpWdtTrade.setFenxiaoType(FenxiaoType.JINGXIAO.getValue());
|
|
|
+ // 客户网名
|
|
|
+ erpWdtTrade.setBuyerNick(order.getReceiver_name());
|
|
|
+ // 收件人姓名
|
|
|
+ erpWdtTrade.setReceiverName(order.getReceiver_name());
|
|
|
+ // 省份
|
|
|
+ erpWdtTrade.setReceiverProvince(order.getReceiver_province());
|
|
|
+ // 市
|
|
|
+ erpWdtTrade.setReceiverCity(order.getReceiver_city());
|
|
|
+ // 区
|
|
|
+ erpWdtTrade.setReceiverDistrict(order.getReceiver_district());
|
|
|
+ // 详细地址
|
|
|
+ erpWdtTrade.setReceiverAddress(order.getReceiver_address());
|
|
|
+ // 手机
|
|
|
+ erpWdtTrade.setReceiverMobile(order.getReceiver_mobile());
|
|
|
+ // 固定电话
|
|
|
+ erpWdtTrade.setReceiverTelno(order.getReceiver_mobile());
|
|
|
+ // 买家备注
|
|
|
+ erpWdtTrade.setBuyerMessage(order.getBuyer_memo());
|
|
|
+ // 卖家备注
|
|
|
+ erpWdtTrade.setSellerMemo(order.getSeller_memo());
|
|
|
+ erpWdtTrade.setWarehouseNo(order.getWarehouse_code());
|
|
|
+
|
|
|
+ // 运费金额
|
|
|
+ erpWdtTrade.setPostAmount(fsStoreOrder.getFreightPrice());
|
|
|
+ // 已付金额
|
|
|
+ if(ObjectUtils.isNotNull(fsStoreOrder)){
|
|
|
+ erpWdtTrade.setPaid(fsStoreOrder.getPayMoney());
|
|
|
+ }
|
|
|
+
|
|
|
+ List<com.fs.hisStore.vo.FsStoreOrderItemVO> fsStoreOrderItemVOS = fsStoreOrderItemScrmService.selectFsStoreOrderItemListByOrderId(fsStoreOrder.getId());
|
|
|
+ List<ErpWdtOrder> erpWdtOrderList = new ArrayList<>();
|
|
|
+ // 商品总价
|
|
|
+ BigDecimal totalPrice = fsStoreOrder.getTotalPrice();
|
|
|
+
|
|
|
+ // 总折扣金额 = 优惠券金额 + 折扣金额
|
|
|
+ BigDecimal totalDiscountPrice = BigDecimal.ZERO;
|
|
|
+ // 折扣金额
|
|
|
+ BigDecimal discountPrice = totalPrice.subtract(fsStoreOrder.getPayPrice());
|
|
|
+ totalDiscountPrice = couponPrice.add(discountPrice);
|
|
|
+
|
|
|
+ // 防止除零错误
|
|
|
+ if (totalPrice.compareTo(BigDecimal.ZERO) == 0) {
|
|
|
+ totalPrice = BigDecimal.ONE;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (com.fs.hisStore.vo.FsStoreOrderItemVO fsStoreOrderItem : fsStoreOrderItemVOS) {
|
|
|
+ ErpWdtOrder erpWdtOrder = new ErpWdtOrder();
|
|
|
+ //平台订单货品表主键
|
|
|
+ erpWdtOrder.setOid(String.format("%s%s",fsStoreOrder.getOrderCode(),fsStoreOrderItem.getItemId()));
|
|
|
+ erpWdtOrder.setNum(BigDecimal.valueOf(fsStoreOrderItem.getNum()));
|
|
|
+ FsStoreProductScrm fsStoreProduct = fsStoreProductScrmService.selectFsStoreProductById(fsStoreOrderItem.getProductId());
|
|
|
+ Asserts.check(ObjectUtils.isNotNull(fsStoreProduct),"该产品不存在! 产品id: {} ",fsStoreOrderItem.getProductId());
|
|
|
+ // 单价
|
|
|
+ erpWdtOrder.setPrice(fsStoreProduct.getPrice());
|
|
|
+ // 状态
|
|
|
+ erpWdtOrder.setStatus(TradeStatus.PAID_WAITING_FOR_SHIPMENT.getValue());
|
|
|
+ // 退款状态
|
|
|
+ erpWdtOrder.setRefundStatus(RefundStatus.NO_REFUND.getValue());
|
|
|
+
|
|
|
+ // 平台货品ID
|
|
|
+ erpWdtOrder.setGoodsId(String.valueOf(fsStoreProduct.getProductId()));
|
|
|
+ JSONObject jsonObject = JSON.parseObject(fsStoreOrderItem.getJsonInfo());
|
|
|
+ erpWdtOrder.setSpecId(jsonObject.getString("sku"));
|
|
|
+ erpWdtOrder.setGoodsNo(jsonObject.getString("barCode"));
|
|
|
+ erpWdtOrder.setSpecNo(jsonObject.getString("sku"));
|
|
|
+ // 货品名称
|
|
|
+ erpWdtOrder.setGoodsName(fsStoreProduct.getProductName());
|
|
|
+ // 调整
|
|
|
+ erpWdtOrder.setAdjustAmount(BigDecimal.ZERO);
|
|
|
+ // 优惠
|
|
|
+ erpWdtOrder.setDiscount(BigDecimal.ZERO);
|
|
|
+ // 分摊优惠
|
|
|
+ // 分摊比例
|
|
|
+ BigDecimal price = fsStoreProduct.getPrice().multiply(BigDecimal.valueOf(fsStoreOrderItem.getNum()));
|
|
|
+ BigDecimal divide = price.divide(totalPrice, RoundingMode.HALF_UP);
|
|
|
+ erpWdtOrder.setShareDiscount(divide.multiply(totalDiscountPrice));
|
|
|
+
|
|
|
+ erpWdtOrderList.add(erpWdtOrder);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 最后一个商品的分摊优惠等于总优惠减去前面分摊优惠之和
|
|
|
+ Asserts.check(CollectionUtils.isNotEmpty(erpWdtOrderList),"订单 {} 商品不能为空!", order.getPlatform_code());
|
|
|
+ long size = erpWdtOrderList.size();
|
|
|
+ if(size > 1) {
|
|
|
+ ErpWdtOrder erpWdtOrder = erpWdtOrderList.get(erpWdtOrderList.size() - 1);
|
|
|
+ erpWdtOrder.setShareDiscount(totalDiscountPrice.subtract(erpWdtOrderList.stream()
|
|
|
+ .limit(size - 1L)
|
|
|
+ .map(item -> Optional.ofNullable(item.getShareDiscount()).orElse(BigDecimal.ZERO))
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add)));
|
|
|
+ }
|
|
|
+
|
|
|
+ erpWdtTrade.setOrderList(erpWdtOrderList);
|
|
|
+ erpWdtBusinessRequestParams.setTradeList(new ArrayList<>(Arrays.asList(erpWdtTrade)));
|
|
|
+
|
|
|
+ Map<String,String> map = new HashMap<>();
|
|
|
+ map.put("shop_no",erpWdtBusinessRequestParams.getShopNo());
|
|
|
+ map.put("switch_mode", String.valueOf(erpWdtBusinessRequestParams.getSwitchMode()));
|
|
|
+ map.put("trade_list", convertToSnakeCase(erpWdtBusinessRequestParams.getTradeList()));
|
|
|
+
|
|
|
+
|
|
|
+ try {
|
|
|
+ String response = client.execute("trade_push.php", map);
|
|
|
+ ParserConfig config = new ParserConfig();
|
|
|
+ config.propertyNamingStrategy = PropertyNamingStrategy.CamelCase;
|
|
|
+ ErpWdtApiResponse erpWdtApiResponse = JSON.parseObject(response, ErpWdtApiResponse.class,config);
|
|
|
+ if(ObjectUtil.equal(0,erpWdtApiResponse.getCode())){
|
|
|
+ log.info("订单推送成功: {}", response);
|
|
|
+ ErpOrderResponse erpOrderResponse = new ErpOrderResponse();
|
|
|
+ erpOrderResponse.setCode(order.getPlatform_code());
|
|
|
+ erpOrderResponse.setSuccess(true);
|
|
|
+ erpOrderResponse.setRequestRawData(JSON.toJSONString(map));
|
|
|
+ erpOrderResponse.setResponseRawData(response);
|
|
|
+ return erpOrderResponse;
|
|
|
+ } else {
|
|
|
+ throw new RuntimeException(String.format("订单推送失败,原因: %s",erpWdtApiResponse.getMessage()));
|
|
|
+ }
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return new ErpOrderResponse();
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 获取erp推送参数
|
|
|
* @param order 订单参数
|