浏览代码

Merge remote-tracking branch 'origin/master'

yfh 3 天之前
父节点
当前提交
acfafa7c31
共有 19 个文件被更改,包括 1441 次插入210 次删除
  1. 502 0
      fs-admin/src/main/java/com/fs/hisStore/task/LiveTask.java
  2. 1 3
      fs-admin/src/main/java/com/fs/live/controller/LiveController.java
  3. 2 9
      fs-admin/src/main/java/com/fs/live/controller/LiveOrderController.java
  4. 0 183
      fs-admin/src/main/java/com/fs/task/LiveTask.java
  5. 435 5
      fs-service/src/main/java/com/fs/erp/service/impl/DfOrderServiceImpl.java
  6. 4 1
      fs-service/src/main/java/com/fs/erp/service/impl/ErpOrderServiceImpl.java
  7. 137 0
      fs-service/src/main/java/com/fs/erp/service/impl/HzOMSErpOrderServiceImpl.java
  8. 151 1
      fs-service/src/main/java/com/fs/erp/service/impl/K9OrderScrmServiceImpl.java
  9. 181 1
      fs-service/src/main/java/com/fs/erp/service/impl/WdtErpOrderServiceImpl.java
  10. 3 0
      fs-service/src/main/java/com/fs/his/service/impl/FsPrescribeServiceImpl.java
  11. 1 1
      fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java
  12. 9 0
      fs-service/src/main/java/com/fs/live/mapper/LiveOrderMapper.java
  13. 2 0
      fs-service/src/main/java/com/fs/live/service/ILiveOrderService.java
  14. 5 0
      fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java
  15. 1 0
      fs-service/src/main/java/com/fs/live/vo/LiveDataListVo.java
  16. 1 0
      fs-service/src/main/java/com/fs/live/vo/LiveDataStatisticsVo.java
  17. 2 2
      fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java
  18. 2 2
      fs-service/src/main/resources/application-druid-bjzm-test.yml
  19. 2 2
      fs-service/src/main/resources/application-druid-bjzm.yml

+ 502 - 0
fs-admin/src/main/java/com/fs/hisStore/task/LiveTask.java

@@ -0,0 +1,502 @@
+package com.fs.hisStore.task;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
+import com.fs.common.core.redis.RedisCache;
+import com.fs.company.service.ICompanyService;
+import com.fs.company.vo.RedPacketMoneyVO;
+import com.fs.course.mapper.FsCourseRedPacketLogMapper;
+import com.fs.erp.domain.ErpDeliverys;
+import com.fs.erp.domain.ErpOrderQuery;
+import com.fs.erp.dto.ErpOrderQueryRequert;
+import com.fs.erp.dto.ErpOrderQueryResponse;
+import com.fs.erp.service.IErpOrderService;
+import com.fs.his.config.FsSysConfig;
+import com.fs.his.dto.ExpressInfoDTO;
+import com.fs.his.service.IFsExpressService;
+import com.fs.his.service.IFsUserService;
+import com.fs.his.utils.ConfigUtil;
+import com.fs.hisStore.domain.FsStoreProductAttrValueScrm;
+import com.fs.hisStore.dto.DateComparisonConfigDTO;
+import com.fs.hisStore.enums.ShipperCodeEnum;
+import com.fs.hisStore.mapper.FsStoreProductAttrValueScrmMapper;
+import com.fs.hisStore.param.FsStoreOrderAddTuiMoneyParam;
+import com.fs.hisStore.service.IFsStoreProductScrmService;
+import com.fs.live.domain.LiveAfterSales;
+import com.fs.live.domain.LiveOrder;
+import com.fs.live.domain.LiveOrderItem;
+import com.fs.live.domain.LiveOrderPayment;
+import com.fs.live.mapper.LiveOrderItemMapper;
+import com.fs.live.mapper.LiveOrderMapper;
+import com.fs.live.mapper.LiveOrderPaymentMapper;
+import com.fs.live.param.LiveAfterSalesAudit1Param;
+import com.fs.live.param.LiveAfterSalesParam;
+import com.fs.live.param.LiveAfterSalesProductParam;
+import com.fs.live.service.*;
+import com.fs.pay.pay.dto.OrderQueryDTO;
+import com.fs.pay.service.IPayService;
+import com.fs.store.config.StoreConfig;
+import com.fs.system.service.ISysConfigService;
+import com.fs.ybPay.domain.OrderResult;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.time.LocalTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+
+import static com.fs.hisStore.constants.StoreConstants.DELIVERY;
+
+/**
+ * 定时任务调度测试
+ *
+ * @author fs
+ */
+@Slf4j
+@Component("liveTask")
+public class LiveTask {
+    @Autowired
+    private RedisTemplate redisTemplate;
+    @Autowired
+    private RedisCache redisCache;
+    @Autowired
+    private ILiveOrderService liveOrderService;
+
+    @Autowired
+    private ILiveCouponService liveCouponService;
+
+    @Autowired
+    private ILiveCouponIssueService liveCouponIssueService;
+    @Autowired
+    private IFsStoreProductScrmService fsStoreProductScrmService;
+
+    @Autowired
+    private ILiveAfterSalesService liveAfterSalesService;
+
+    @Autowired
+    private ILiveOrderItemService liveOrderItemService;
+
+    @Autowired
+    private ILiveOrderPaymentService liveOrderPaymentService;
+
+    @Autowired
+    private IFsUserService userService;
+
+    @Autowired
+    private ICompanyService companyService;
+
+    @Autowired
+    @Qualifier("erpOrderServiceImpl")
+    private IErpOrderService gyOrderService;
+
+    @Autowired
+    @Qualifier("wdtErpOrderServiceImpl")
+    private IErpOrderService wdtOrderService;
+
+    @Autowired
+    @Qualifier("hzOMSErpOrderServiceImpl")
+    private IErpOrderService hzOMSOrderService;
+
+    @Autowired
+    @Qualifier("dfOrderServiceImpl")
+    private IErpOrderService dfOrderService;
+
+    @Autowired
+    @Qualifier("JSTErpOrderServiceImpl")
+    private IErpOrderService jSTOrderService;
+
+    @Autowired
+    @Qualifier("k9OrderScrmServiceImpl")
+    private IErpOrderService k9OrderService;
+
+    @Autowired
+    private ConfigUtil configUtil;
+
+    @Autowired
+    IErpOrderService erpOrderService;
+
+    @Autowired
+    private LiveOrderMapper liveOrderMapper;
+
+    @Autowired
+    private LiveOrderItemMapper liveOrderItemMapper;
+
+    @Autowired
+    private LiveOrderPaymentMapper liveOrderPaymentMapper;
+
+    @Autowired
+    private IPayService ybPayService;
+
+    @Autowired
+    private ISysConfigService configService;
+
+    @Autowired
+    private IFsExpressService expressService;
+
+    @Autowired
+    private FsCourseRedPacketLogMapper fsCourseRedPacketLogMapper;
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    public void PushErp() throws ParseException {
+        List<Long> ids = liveOrderMapper.selectOrderIdByNoErp();
+        for (Long id : ids) {
+            liveOrderService.createOmsOrder(id);
+        }
+    }
+
+    public void redPacketSubMoney() throws Exception {
+        List<RedPacketMoneyVO> redPacketMoneyVOS = fsCourseRedPacketLogMapper.selectFsCourseRedPacketLogByCompany();
+        for (RedPacketMoneyVO redPacketMoneyVO : redPacketMoneyVOS) {
+            companyService.subtractCompanyMoney(redPacketMoneyVO.getMoney(), redPacketMoneyVO.getCompanyId());
+        }
+    }
+
+    public void redPacketAddMoney() throws Exception {
+        List<RedPacketMoneyVO> redPacketMoneyVOS = fsCourseRedPacketLogMapper.selectFsCourseAddRedPacketLogByCompany();
+        for (RedPacketMoneyVO redPacketMoneyVO : redPacketMoneyVOS) {
+            companyService.addRedPacketCompanyMoney(redPacketMoneyVO.getMoney(), redPacketMoneyVO.getCompanyId());
+        }
+    }
+
+    //每5分钟执行一次
+    public void deliveryOp() {
+        List<LiveOrder> list = liveOrderService.selectUpdateExpress();
+        for (LiveOrder order : list) {
+            ErpOrderQueryRequert request = new ErpOrderQueryRequert();
+            request.setCode(order.getExtendOrderId());
+            IErpOrderService erpOrderService = getErpOrderService();
+            ErpOrderQueryResponse response = erpOrderService.getLiveOrder(request);
+            if (erpOrderService != dfOrderService) {
+                if (response.getOrders() != null && !response.getOrders().isEmpty()) {
+                    for (ErpOrderQuery orderQuery : response.getOrders()) {
+                        if (orderQuery.getDeliverys() != null && orderQuery.getDeliverys().size() > 0) {
+                            for (ErpDeliverys delivery : orderQuery.getDeliverys()) {
+                                if (delivery.getDelivery() && StringUtils.isNotEmpty(delivery.getMail_no())) {
+                                    //更新商订单状态 删除REDIS
+                                    liveOrderService.deliveryOrder(order.getOrderCode(), delivery.getMail_no(), delivery.getExpress_code(), delivery.getExpress_name());
+                                    redisCache.deleteObject(DELIVERY + ":" + order.getExtendOrderId());
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void couponOp() {
+        // 直播优惠券过期处理,如果有对应方法则调用
+        // liveCouponService.updateFsCouponByExpire();
+    }
+
+    //退款自动处理 24小时未审核自动审核通过 每小时执行一次
+    public void refundOp() {
+        //获取所有退款申请
+        List<LiveAfterSales> list = liveAfterSalesService.selectLiveAfterSalesByDoAudit();
+        if (list != null) {
+            for (LiveAfterSales afterSales : list) {
+                //仅退款
+                if (afterSales.getRefundType().equals(0)) {
+                    LiveAfterSalesAudit1Param audit1Param = new LiveAfterSalesAudit1Param();
+                    audit1Param.setSalesId(afterSales.getId());
+                    audit1Param.setOperator("平台");
+                    liveAfterSalesService.audit1(audit1Param);
+                }
+            }
+        }
+    }
+
+    //每天执行一次
+    public void userMoneyOp() {
+        // 直播订单完成7天后给用户返现,如果有对应方法则调用
+        // List<LiveOrder> list = liveOrderService.selectLiveOrderListByFinish7Day();
+        // if (list != null) {
+        //     for (LiveOrder order : list) {
+        //         userService.addMoney(order);
+        //     }
+        // }
+    }
+
+    //每30秒执行一次
+    public void orderItemSyncOp() {
+//         同步订单项JSON,如果有对应方法则调用
+         List<LiveOrder> list = liveOrderService.selectLiveOrderItemJson();
+         for (LiveOrder storeOrder : list) {
+             LiveOrderItem parmOrderItem = new LiveOrderItem();
+             parmOrderItem.setOrderId(storeOrder.getOrderId());
+             List<LiveOrderItem> listOrderItem = liveOrderItemService.selectLiveOrderItemList(parmOrderItem);
+             if (listOrderItem.size() > 0) {
+                 String itemJson = JSONUtil.toJsonStr(listOrderItem);
+                 storeOrder.setItemJson(itemJson);
+                 liveOrderMapper.updateLiveOrderItemJson(storeOrder);
+             }
+         }
+    }
+
+    public void returnDeliveryId() {
+        IErpOrderService erpOrderService = getErpOrderService();
+        // 获取ERP订单号列表,如果有对应方法则调用
+        // List<String> list = liveOrderMapper.selectErpCode();
+        // for (String s : list) {
+        //     ErpOrderQueryRequert request = new ErpOrderQueryRequert();
+        //     request.setCode(s);
+        //     ErpOrderQueryResponse response = erpOrderService.getOrder(request);
+        //     if (response.getOrders() != null && response.getOrders().size() > 0) {
+        //         for (ErpOrderQuery orderQuery : response.getOrders()) {
+        //             if (orderQuery.getDeliverys() != null && orderQuery.getDeliverys().size() > 0) {
+        //                 for (ErpDeliverys delivery : orderQuery.getDeliverys()) {
+        //                     if (delivery.getDelivery() && StringUtils.isNotEmpty(delivery.getMail_no())) {
+        //                         LiveOrder order = new LiveOrder();
+        //                         order.setExtendOrderId(s);
+        //                         order.setDeliverySn(delivery.getMail_no());
+        //                         order.setStatus(2);
+        //                         liveOrderMapper.updateDelivery(order);
+        //                     }
+        //                 }
+        //             }
+        //         }
+        //     }
+        // }
+    }
+
+    public void changeStatus() {
+//         获取需要更新物流状态的订单ID列表,如果有对应方法则调用
+//         List<Long> list = liveOrderMapper.selectOrderId();
+//         for (Long orderId : list) {
+//             LiveOrder order = liveOrderMapper.selectLiveOrderByOrderId(String.valueOf(orderId));
+//             String lastFourNumber = "";
+//             if (order.getDeliverySn() != null && order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {
+//                 lastFourNumber = order.getUserPhone();
+//                 if (lastFourNumber != null && lastFourNumber.length() == 11) {
+//                     lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
+//                 }
+//             }
+//             ExpressInfoDTO dto = expressService.getExpressInfo(order.getOrderCode(), order.getDeliverySn(), order.getDeliverySn(), lastFourNumber);
+//             LiveOrder map = new LiveOrder();
+//             map.setDeliveryStatus(Integer.parseInt(dto.getState()));
+//             map.setOrderId(orderId);
+//             map.setDeliveryType(dto.getStateEx());
+//             liveOrderMapper.updateLiveOrder(map);
+//         }
+    }
+
+    public void subCompanyMoney() {
+        // 获取需要扣减公司金额的支付ID列表,如果有对应方法则调用
+        // List<Long> list = liveOrderPaymentMapper.selectPaymentIds();
+        // for (Long paymentId : list) {
+        //     LiveOrderPayment payment = liveOrderPaymentService.selectLiveOrderPaymentByPaymentId(paymentId);
+        //     if (payment.getCompanyId() != null && payment.getCompanyId() > 0) {
+        //         companyService.subCompanyPaymentMoney(payment);
+        //     }
+        // }
+    }
+
+    public void updateOrderItem() throws ParseException {
+        List<Long> ids = liveOrderService.selectOrderIdByNoErp();
+        for (Long id : ids) {
+            liveOrderService.createOmsOrder(id);
+        }
+    }
+
+    //每天执行一次
+    public void syncExpress() {
+        List<Long> ids = liveOrderService.selectSyncExpressIds();
+        for (Long id : ids) {
+            liveOrderService.syncExpress(id);
+        }
+    }
+
+    public void returnPayStatus() {
+        // 获取需要查询支付状态的支付ID列表,如果有对应方法则调用
+        // List<String> ids = liveOrderPaymentMapper.selectPayStatusIds();
+        // for (String id : ids) {
+        //     OrderQueryDTO o = new OrderQueryDTO();
+        //     o.setUpOrderId(id);
+        //     OrderResult orderResult = ybPayService.getOrder(o);
+        //     if ("0".equals(orderResult.getState())) {
+        //         String[] order = orderResult.getLowOrderId().split("-");
+        //         if (orderResult.getStatus().equals("100")) {
+        //             switch (order[0]) {
+        //                 case "live":
+        //                     liveOrderService.payConfirm(1, null, order[1], o.getUpOrderId(), orderResult.getBankTrxId(), orderResult.getBankOrderId());
+        //                 case "live_remain":
+        //                     liveOrderService.payConfirm(1, null, order[1], o.getUpOrderId(), orderResult.getBankTrxId(), orderResult.getBankOrderId());
+        //                 case "payment":
+        //                     liveOrderPaymentService.payConfirm(order[1], o.getUpOrderId(), orderResult.getBankTrxId(), orderResult.getBankOrderId());
+        //             }
+        //         }
+        //     }
+        // }
+    }
+
+    public void AddTuiMoney() {
+        // 获取需要添加推荐金额的订单ID列表,如果有对应方法则调用
+        // List<Long> ids = liveOrderMapper.selectAddTuiMoney();
+        // for (Long id : ids) {
+        //     FsStoreOrderAddTuiMoneyParam param = new FsStoreOrderAddTuiMoneyParam();
+        //     param.setOrderId(id);
+        //     liveOrderService.addTuiMoney(param);
+        // }
+    }
+
+    public void selectPayMoneyLessOne() {
+        // 获取支付金额小于1的订单列表,如果有对应方法则调用
+        // List<LiveOrder> list = liveOrderMapper.selectPayMoneyLessOne();
+        // for (LiveOrder order : list) {
+        //     LiveAfterSalesParam param = new LiveAfterSalesParam();
+        //     param.setOrderCode(order.getOrderCode());
+        //     param.setServiceType(0);
+        //     param.setRefundAmount(order.getPayMoney());
+        //     param.setReasons("超时未处理,自动申请退款");
+        //     List<LiveAfterSalesProductParam> productParams = new ArrayList<>();
+        //     List<LiveOrderItem> items = liveOrderItemMapper.selectLiveOrderItemByOrderId(order.getOrderId());
+        //     for (LiveOrderItem item : items) {
+        //         LiveAfterSalesProductParam param1 = new LiveAfterSalesProductParam();
+        //         param1.setProductId(item.getProductId());
+        //         param1.setNum(item.getNum());
+        //         productParams.add(param1);
+        //     }
+        //     param.setProductList(productParams);
+        //     liveAfterSalesService.applyForAfterSales(order.getUserId(), param);
+        // }
+    }
+
+    public void deleteCustomer() {
+        // 删除客户逻辑
+    }
+
+    private IErpOrderService getErpOrderService() {
+        //判断是否开启erp
+        IErpOrderService erpOrderService = null;
+        FsSysConfig erpConfig = configUtil.getSysConfig();
+        Integer erpOpen = erpConfig.getErpOpen();
+        if (erpOpen != null && erpOpen == 1) {
+            //判断erp类型
+            Integer erpType = erpConfig.getErpType();
+            if (erpType != null) {
+                if (erpType == 1) {
+                    //管易
+                    erpOrderService = gyOrderService;
+                } else if (erpType == 2) {
+                    //旺店通
+                    erpOrderService = wdtOrderService;
+                } else if (erpType == 3) {
+                    //代服
+                    erpOrderService = hzOMSOrderService;
+                } else if (erpType == 4) {
+                    //瀚智
+                    erpOrderService = dfOrderService;
+                } else if (erpType == 5) {
+                    erpOrderService = jSTOrderService;
+                } else if (erpType == 6) {
+                    erpOrderService = k9OrderService;
+                }
+            }
+        }
+        return erpOrderService;
+    }
+
+    /**
+     * 提醒证件到期任务
+     */
+    public void remindCertValidation() {
+        log.info("提醒店铺证件到期任务执行... 当前时间: {}", LocalTime.now());
+
+        // 从配置表获取需要比较的表和字段
+        List<DateComparisonConfigDTO> tablesToCheck = jdbcTemplate.query(
+                "SELECT table_name, date_column,in_advance,user_column,phone_column,remind_words,platform,cert_type" +
+                        " FROM date_comparison_config", (rs, rowNum) -> {
+                    return DateComparisonConfigDTO.builder()
+                            .tableName(rs.getString("table_name"))//表名
+                            .certType(rs.getString("cert_type"))//证件类型
+                            .dateColumn(rs.getString("date_column"))//日期字段
+                            .userColumn(rs.getString("user_column"))//用户字段
+                            .remindWords(rs.getString("remindWords"))//提醒内容
+                            .phoneColumn(rs.getString("phone_column"))//提醒手机
+                            .inAdvance(rs.getInt("inAdvance"))//提前天数
+                            .platform(rs.getString("platform")).build();//平台
+                });
+
+        tablesToCheck.forEach(dto -> {
+            //获取证件失效日期字段小于当前时间加提前天数的用户和电话号码
+            String sql = String.format("SELECT %s , %s " +
+                            "FROM %s " +
+                            "WHERE %s >= DATE_SUB(CURDATE(), INTERVAL %d DAY)",
+                    dto.getUserColumn(),
+                    dto.getPhoneColumn(),
+                    dto.getTableName(),
+                    dto.getDateColumn(),
+                    dto.getInAdvance()
+            );
+            List<Map<String, Object>> users = jdbcTemplate.queryForList(sql);
+            users.forEach(user -> {
+                String userName = (String) user.get(dto.getUserColumn());
+                String phone = (String) user.get(dto.getPhoneColumn());
+                String remindWords = String.format("【%s平台提示】尊敬的%s用户,店铺%s证件即将到期,请及时处理!",
+                        dto.getPlatform(),
+                        userName,
+                        dto.getCertType());
+                // 使用phone发送remindWords短信
+                // TODO 发送通知
+            });
+        });
+    }
+
+    /**
+     * 禁用店铺
+     */
+    public void disable() {
+        log.info("禁用店铺任务执行... 当前时间: {}", LocalTime.now());
+        // 从配置表获取需要禁用的表和字段
+        List<DateComparisonConfigDTO> toDisable = jdbcTemplate.query(
+                "SELECT table_name, date_column,invalid_expression,status_column" +
+                        " FROM date_comparison_config " +
+                        " WHERE is_do_invalid = '1'", (rs, rowNum) -> DateComparisonConfigDTO.builder()
+                        .tableName(rs.getString("table_name"))//表名
+                        .dateColumn(rs.getString("date_column"))//日期字段
+                        .invalidExpression(rs.getString("invalid_expression"))//失效表达式
+                        .statusColumn(rs.getString("status_column"))//状态字段
+                        .build());
+
+        toDisable.forEach(dto -> {
+            //更新证件失效日期字段小于当前时间的数据
+            String sql = String.format("UPDATE %s " +
+                            "SET %s = %s " +
+                            "WHERE %s < CURDATE()",
+                    dto.getTableName(),
+                    dto.getStatusColumn(),
+                    dto.getInvalidExpression(),
+                    dto.getDateColumn());
+            jdbcTemplate.update(sql);
+        });
+    }
+
+    public void getOrderDeliveryStatus() {
+        IErpOrderService erpOrderService = getErpOrderService();
+        List<LiveOrder> orders = null;
+        if (erpOrderService != null && erpOrderService == dfOrderService) {
+            // 获取已发货订单列表,如果有对应方法则调用
+             orders = liveOrderMapper.selectShippedOrder();
+             if (orders != null && !orders.isEmpty()) {
+                 List<CompletableFuture<Void>> futures = new ArrayList<>();
+                 for (LiveOrder order : orders) {
+                     CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
+                         erpOrderService.getOrderLiveDeliveryStatus(order);
+                     });
+                     futures.add(future);
+                 }
+                 CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
+             }
+        }
+    }
+}

+ 1 - 3
fs-admin/src/main/java/com/fs/live/controller/LiveController.java

@@ -10,7 +10,6 @@ import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.live.domain.Live;
 import com.fs.live.service.ILiveService;
 import com.fs.live.vo.LiveListVo;
-import com.fs.task.LiveTask;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -29,8 +28,7 @@ import java.util.Map;
 public class LiveController extends BaseController {
     @Autowired
     private ILiveService liveService;
-    @Autowired
-    private LiveTask liveTask;
+
 
     /**
      * 查询直播列表

+ 2 - 9
fs-admin/src/main/java/com/fs/live/controller/LiveOrderController.java

@@ -43,7 +43,6 @@ import com.fs.live.vo.*;
 import com.fs.store.domain.FsStoreDelivers;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
-import com.fs.task.LiveTask;
 import io.swagger.annotations.ApiOperation;
 import org.apache.http.util.Asserts;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -93,8 +92,7 @@ public class LiveOrderController extends BaseController
 //    private FsWarehousesMapper fsWarehousesMapper;
     @Autowired
     IErpOrderService erpOrderService;
-    @Autowired
-    private LiveTask liveTask;
+
 
 
     @Autowired
@@ -253,12 +251,7 @@ public class LiveOrderController extends BaseController
         return getDataTable(list);
     }
 
-    @GetMapping("/test")
-    public R test()
-    {
-        liveTask.updateExpress();
-        return R.ok();
-    }
+
     @PreAuthorize("@ss.hasPermi('live:liveOrder:refundOrderMoney')")
     @Log(title = "退款", businessType = BusinessType.UPDATE)
 //    @PreAuthorize("@ss.hasPermi('live:liveOrder:refundOrderMoney')")

+ 0 - 183
fs-admin/src/main/java/com/fs/task/LiveTask.java

@@ -1,183 +0,0 @@
-package com.fs.task;
-
-
-import com.fs.erp.domain.ErpDeliverys;
-import com.fs.erp.domain.ErpOrderQuery;
-import com.fs.erp.dto.ErpOrderQueryRequert;
-import com.fs.erp.dto.ErpOrderQueryResponse;
-import com.fs.erp.service.FsJstAftersalePushService;
-import com.fs.erp.service.IErpOrderService;
-import com.fs.his.service.IFsExpressService;
-import com.fs.live.domain.LiveAfterSales;
-import com.fs.live.domain.LiveOrder;
-import com.fs.live.param.LiveAfterSalesAudit1Param;
-import com.fs.live.service.ILiveAfterSalesService;
-import com.fs.live.service.ILiveOrderLogsService;
-import com.fs.live.service.ILiveOrderService;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.ObjectUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.text.ParseException;
-import java.util.List;
-
-/**
- * 定时任务调度
- * @author fs
- */
-@Component("liveTask")
-public class LiveTask {
-    Logger logger = LoggerFactory.getLogger(LiveTask.class);
-
-
-    @Autowired
-    private ILiveOrderService liveOrderService;
-
-    @Autowired
-    private ILiveAfterSalesService afterSalesService;
-
-
-    @Autowired
-    private IErpOrderService erpOrderService;
-
-
-    @Autowired
-    private IFsExpressService expressService;
-
-
-    @Autowired
-    private ILiveOrderLogsService orderLogsService;
-
-
-//    @Autowired
-//    private FsWarehousesMapper fsWarehousesMapper;
-
-    @Autowired
-    public FsJstAftersalePushService fsJstAftersalePushService;
-
-    /**
-     * 超时订单自动取消
-     */
-    public void orderCancel(){
-        liveOrderService.orderCancel();
-    }
-
-
-    /**
-     * 发货任务
-     */
-    public void deliveryOp() {
-//        List<LiveOrder> list = liveOrderService.selectDeliverPenddingData();
-//
-//        for (LiveOrder order : list) {
-//            String orderCode = order.getOrderCode();
-//            ErpOrderQueryRequert request = new ErpOrderQueryRequert();
-//            request.setCode(order.getExtendOrderId());
-//
-//            try {
-//                // 根据仓库code找erp
-//                if (com.fs.common.utils.StringUtils.isNotBlank(order.getStoreHouseCode())) {
-//                    String erp = fsWarehousesMapper.selectErpByCode(order.getStoreHouseCode());
-//                    ErpContextHolder.setErpType(erp);
-//                }
-//                ErpOrderQueryResponse response = erpOrderService.getOrderLive(request);
-//                if (CollectionUtils.isNotEmpty(response.getOrders())) {
-//                    for (ErpOrderQuery orderQuery : response.getOrders()) {
-//                        if (CollectionUtils.isNotEmpty(orderQuery.getDeliverys())) {
-//                            // 部分发货或者全部发货
-//                            if (ObjectUtils.equals(orderQuery.getDelivery_state(), 1) || ObjectUtils.equals(orderQuery.getDelivery_state(), 2)) {
-//
-//                                orderLogsService.create(order.getOrderId(), OrderLogEnum.DELIVERY_GOODS.getValue(),
-//                                        OrderLogEnum.DELIVERY_GOODS.getDesc());
-//
-//                                for (ErpDeliverys delivery : orderQuery.getDeliverys()) {
-//
-//                                    FsExpress express = expressService.selectFsExpressByOmsCode(delivery.getExpress_code());
-//                                    if (express == null) {
-//                                        logger.warn("当前express_code: {} 不存在!", delivery.getExpress_code());
-//                                        continue;
-//                                    }
-//
-//                                    if (delivery.getDelivery()) {
-//                                        liveOrderService.deliveryOrder(orderCode, delivery.getMail_no(),
-//                                                delivery.getExpress_code(), delivery.getExpress_name());
-//                                    }
-//                                }
-//
-//                                logger.info("订单 {} 发货信息同步成功", order.getOrderCode());
-//                            }
-//                        }
-//                    }
-//                }
-//            } catch (Exception e) {
-//                logger.error(String.format("[发货任务]调用erp查询接口失败!原因: %s", e));
-//            }
-//
-//        }
-    }
-
-
-        /**
-         * 退款自动处理 24小时未审核自动审核通过 每小时执行一次
-         */
-    public void refundOp() {
-        //获取所有退款申请
-        List<LiveAfterSales> list = afterSalesService.selectLiveAfterSalesByDoAudit();
-        if (list != null) {
-            for (LiveAfterSales afterSales : list) {
-                //仅退款
-//                if (afterSales.getServiceType().equals(0)) {
-                LiveAfterSalesAudit1Param audit1Param = new LiveAfterSalesAudit1Param();
-                audit1Param.setSalesId(afterSales.getId());
-                audit1Param.setOperator("平台");
-                afterSalesService.audit1(audit1Param);
-//                }
-            }
-        }
-    }
-
-    /**
-     * 批量推管易
-     * @throws ParseException 解析异常
-     */
-    public void updateOrderItem() throws ParseException {
-        List<Long> ids = liveOrderService.selectOrderIdByNoErp();
-        for (Long id : ids) {
-            try{
-                liveOrderService.createOmsOrder(id);
-            }catch (Exception e){
-                logger.error("推送管易失败 {}",id,e);
-            }
-        }
-    }
-
-
-    /**
-     * 同步物流状态
-     */
-    public void syncExpress() {
-        List<Long> ids = liveOrderService.selectSyncExpressIds();
-        for (Long id : ids) {
-            liveOrderService.syncExpress(id);
-        }
-    }
-
-    /**
-     * 更新发货状态
-     */
-    public void updateExpress() {
-        List<LiveOrder> list = liveOrderService.selectUpdateExpress();
-
-        for (LiveOrder order : list) {
-            try{
-                liveOrderService.syncDeliveryOrder(order);
-            }catch (Exception e) {
-                logger.error("获取订单是否发货失败!原因: ",e);
-            }
-        }
-
-    }
-}

+ 435 - 5
fs-service/src/main/java/com/fs/erp/service/impl/DfOrderServiceImpl.java

@@ -52,6 +52,9 @@ import com.fs.hisStore.service.IFsExpressScrmService;
 import com.fs.hisStore.service.IFsStoreOrderScrmService;
 import com.fs.hisStore.vo.FsStoreOrderItemVO;
 import com.fs.live.domain.LiveOrder;
+import com.fs.live.domain.LiveOrderItem;
+import com.fs.live.mapper.LiveOrderItemMapper;
+import com.fs.live.mapper.LiveOrderMapper;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.domain.QwUser;
 import com.fs.qw.mapper.QwUserMapper;
@@ -156,10 +159,15 @@ public class DfOrderServiceImpl implements IErpOrderService {
     @Autowired
     private FsIntegralOrderMapper fsIntegralOrderMapper;
 
+    @Autowired
+    private LiveOrderMapper liveOrderMapper;
+
+    @Autowired
+    private LiveOrderItemMapper liveOrderItemMapper;
 
     @Override
     public ErpOrderResponse addOrder(ErpOrder order) {
-        if (order.getIsIntegralOrder())
+        if (!Objects.isNull(order.getIsIntegralOrder()) && order.getIsIntegralOrder())
             return getErpIntegralOrderResponse(order);
         return getErpOrderResponse(order);
     }
@@ -171,7 +179,51 @@ public class DfOrderServiceImpl implements IErpOrderService {
 
     @Override
     public ErpOrderResponse addLiveOrder(ErpOrder order) {
-        return null;
+        return getLiveErpOrderResponse(order);
+    }
+
+    private ErpOrderResponse getLiveErpOrderResponse(ErpOrder order) {
+        LiveOrder liveOrder = liveOrderMapper.selectLiveOrderByOrderCode(order.getPlatform_code());
+        if (liveOrder == null) {
+            return null;
+        }
+        Long dfAccountId = getSFAccountIndex(liveOrder.getOrderId());
+        //1.获取请求参数
+        ExternalOrderRequestVo vo = getCreateLiveOrderRequestParam(order, liveOrder, dfAccountId);
+        if (vo == null) {
+            return null;
+        }
+        try {
+            Map<String, Object> map = JSON.parseObject(JSON.toJSONString(vo), Map.class);
+            //2.请求
+            log.info("开始推送订单,参数: {}", JSON.toJSONString(map));
+            String response = client.execute(RequestUrlEnum.CREAT_ORDER, map, dfAccountId);
+            DFApiResponse dfApiResponse = JSON.parseObject(response, DFApiResponse.class);
+            //3.处理请求结果
+            if (dfApiResponse != null && "ok".equals(dfApiResponse.getCode())) {
+                //存储订单推送用的哪个账户
+                FsStoreOrderDf df = addDfOrderLive(liveOrder, dfAccountId);
+                log.info("订单推送成功: {}", response);
+                //可以回调 也可以查询订单
+                Map<String, Object> orderResultQueryParam = new HashMap<>();
+                orderResultQueryParam.put("orderNumber", order.getPlatform_code());
+                orderResultQueryParam.put("exInterfaceType", df.getStatus());
+                try {
+                    getOrderLiveResult(orderResultQueryParam, dfAccountId);
+                } catch (Exception e) {
+                    log.info("推送订单完成,查询订单问题{}", e.getMessage());
+                }
+                ErpOrderResponse erpOrderResponse = new ErpOrderResponse();
+                erpOrderResponse.setCode(order.getPlatform_code());
+                erpOrderResponse.setSuccess(true);
+                return erpOrderResponse;
+            } else {
+                throw new RuntimeException(String.format("订单推送失败,原因: %s", dfApiResponse.getMsg()));
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return new ErpOrderResponse();
     }
 
     /**
@@ -286,7 +338,50 @@ public class DfOrderServiceImpl implements IErpOrderService {
 
     @Override
     public ErpOrderResponse refundLiveOrder(ErpRefundOrder order) {
-        return null;
+        //获取代服账户
+        String orderCode = order.getOrderCode();
+        LiveOrder liveOrder = liveOrderMapper.selectLiveOrderByOrderCode(orderCode);
+        FsStoreOrderDf df = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(liveOrder.getOrderId());
+        if (df == null) {
+            return null;
+        }
+        Long dfAccountId = getSFAccountIndex(liveOrder.getOrderId());
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("loginAccount", df.getLoginAccount());
+        FsDfAccount dfAccount = fsDfAccountMapper.selectFsDfAccountById(dfAccountId);
+        if (dfAccount != null && StringUtils.isNotBlank(dfAccount.getCallBackUrl())) {
+            map.put("callBackUrl", dfAccount.getCallBackUrl());
+        }
+        map.put("orderNumber", orderCode);
+        map.put("mailNumber", liveOrder.getDeliverySn());
+        try {
+            //2.请求
+            log.info("开始取消订单,参数: {}", JSON.toJSONString(map));
+            String response = client.execute(RequestUrlEnum.ORDER_CANCEL, map, dfAccountId);
+            DFApiResponse dfApiResponse = JSON.parseObject(response, DFApiResponse.class);
+            //3.处理请求结果
+            if (dfApiResponse != null && "ok".equals(dfApiResponse.getCode())) {
+                //存储订单推送用的哪个账户
+                log.info("订单取消成功: {}", response);
+                //修改df表
+                df.setStatus(2);
+                df.setUpdateTime(DateUtils.getNowDate());
+                fsStoreOrderDfMapper.updateFsStoreOrderDf(df);
+                //可以回调 也可以查询订单
+                Map<String, Object> orderResultQueryParam = new HashMap<>();
+                orderResultQueryParam.put("orderNumber", orderCode);
+                orderResultQueryParam.put("exInterfaceType", 2); //2为查询取消订单结果
+                ErpOrderResponse erpOrderResponse = new ErpOrderResponse();
+                erpOrderResponse.setCode(orderCode);
+                erpOrderResponse.setSuccess(true);
+                return erpOrderResponse;
+            } else {
+                throw new RuntimeException(String.format("订单取消失败,原因: %s", dfApiResponse.getMsg()));
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return new ErpOrderResponse();
     }
 
     @Override
@@ -441,7 +536,30 @@ public class DfOrderServiceImpl implements IErpOrderService {
 
     @Override
     public ErpOrderQueryResponse getLiveOrder(ErpOrderQueryRequert param) {
-        return null;
+        ErpOrderQueryResponse response = new ErpOrderQueryResponse();
+        String orderNumber = param.getCode();
+        if (StrUtil.isNotBlank(orderNumber)) {
+            LiveOrder order = liveOrderMapper.selectLiveOrderByOrderCode(orderNumber);
+            if (order != null) {
+                //获取下单账户
+                FsStoreOrderDf df = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(order.getOrderId());
+                if (df == null) {
+                    return null;
+                }
+                Long dfAccountId = getSFAccountIndex(order.getOrderId());
+                if (dfAccountId != null) {
+                    Map<String, Object> orderResultQueryParam = new HashMap<>();
+                    orderResultQueryParam.put("orderNumber", orderNumber);
+                    orderResultQueryParam.put("exInterfaceType", df.getStatus());
+                    getOrderLiveResult(orderResultQueryParam, dfAccountId);
+                    return response;
+                }
+            }
+            response.setErrorDesc("该订单不存在/顺丰账户不存在");
+        } else {
+            response.setErrorDesc("未获取到原始订单号");
+        }
+        return response;
     }
 
     @Override
@@ -460,7 +578,9 @@ public class DfOrderServiceImpl implements IErpOrderService {
 
     @Override
     public BaseResponse refundUpdateLive(ErpRefundUpdateRequest param) {
-        return null;
+        ErpRefundOrder erpRefundOrder = new ErpRefundOrder();
+        erpRefundOrder.setOrderCode(param.getTid());
+        return refundLiveOrder(erpRefundOrder);
     }
 
     @Override
@@ -790,7 +910,97 @@ public class DfOrderServiceImpl implements IErpOrderService {
 
     @Override
     public void getOrderLiveDeliveryStatus(LiveOrder order) {
+        Map<String, Object> map = new HashMap<>();
+        Long dfAccountId = getSFAccountIndex(order.getOrderId());
+        map.put("orderNumber", order.getOrderCode());
+        map.put("mailNumber", order.getDeliverySn());
+        try {
+            String response = client.execute(RequestUrlEnum.ORDER_DELIVERY_STATUS, map, dfAccountId);
+            DFApiResponse dfApiResponse = JSON.parseObject(response, DFApiResponse.class);
+            if ("运单不存在".equals(dfApiResponse.getMsg())) {
+                //查看原来物流状态
+                cancelOrderLive(order);
+                log.info("代服管家 getOrderDeliveryStatus: {}", response);
+                return;
+            }
+            //3.处理请求结果
+            if (dfApiResponse != null && "ok".equals(dfApiResponse.getCode())) {
+                String jsonString = JSON.toJSONString(dfApiResponse.getResult());
+                DFOrderStatusResultRequest temp = JSON.parseObject(jsonString, DFOrderStatusResultRequest.class);
+                //0待揽收 1已揽收 2运输中 3派送中 4异常件 5退回件 6退回签收 7转寄件 8作废件 9已签收 10 已取消
+                Integer deliveryStatus = 0;
+                String stateEx = "0";
+                LiveOrder liveOrderMap = new LiveOrder();
+                liveOrderMap.setOrderId(order.getOrderId());
+                Integer status = temp.getStatus();
+                switch (status) {
+                    case 0:
+                    case 1:
+                    case 2:
+                        deliveryStatus = status;
+                        stateEx = status.toString();
+                        break;
+                    case 3:
+                        deliveryStatus = 2;
+                        stateEx = "202";
+                        break;
+                    case 4:
+                        deliveryStatus = status;
+                        stateEx = status.toString();
+                        break;
+                    case 5:
+                        deliveryStatus = 4;
+                        stateEx = "407";
+                        break;
+                    case 6:
+                        deliveryStatus = status;
+                        stateEx = "406";
+                        break;
+                    case 9:
+                        deliveryStatus = 3;
+                        stateEx = "301";
+                        break;
+                    case 10:
+                        String mailNumber = temp.getMailNumber();
+                        List<LiveOrder> liveOrders = liveOrderMapper.selectLiveOrderList(new LiveOrder() {{
+                            setDeliverySn(mailNumber);
+                        }});
+                        if (liveOrders != null && !liveOrders.isEmpty()) {
+                            liveOrders.forEach(tempOrder -> {
+                                cancelOrderLive(tempOrder);
+                                log.info("代服管家 订单取消成功: {}", response);
+                            });
+                        }
+                        break;
+                }
+                liveOrderMap.setDeliveryStatus(deliveryStatus);
+                liveOrderMap.setDeliveryType(stateEx);
+                liveOrderMapper.updateLiveOrder(liveOrderMap);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
 
+    private void cancelOrderLive(LiveOrder order) {
+        Integer deliveryStatus = order.getDeliveryStatus();
+        if (deliveryStatus == null || deliveryStatus == 0) {
+            //没有物流信息
+            //修改订单状态 方便后续重新发货
+            order.setStatus(1);
+            order.setExtendOrderId("");
+            order.setDeliverySn("");
+            liveOrderMapper.updateLiveOrder(order);
+        } else {
+            //有物流信息->售后处理
+            //取消订单
+            // TODO: 实现直播订单退款逻辑
+        }
+        FsStoreOrderDf df = new FsStoreOrderDf();
+        df.setOrderId(order.getOrderId());
+        df.setStatus(2);
+        df.setUpdateTime(new Date());
+        fsStoreOrderDfMapper.updateFsStoreOrderDf(df);
     }
 
     private void cancelOrder(FsStoreOrder order) {
@@ -1865,4 +2075,224 @@ public class DfOrderServiceImpl implements IErpOrderService {
         }
     }
 
+    private ExternalOrderRequestVo getCreateLiveOrderRequestParam(ErpOrder order, LiveOrder liveOrder, Long dfAccountId) {
+        ExternalOrderRequestVo vo = new ExternalOrderRequestVo();
+        FsDfAccount dfAccount = fsDfAccountMapper.selectFsDfAccountById(dfAccountId);
+        if (dfAccount == null) {
+            return null;
+        }
+        String loginAccount = dfAccount.getLoginAccount();
+        vo.setMonthlyCard(dfAccount.getMonthlyCard());
+        vo.setExpressProductCode(dfAccount.getExpressProductCode());
+        vo.setLoginAccount(loginAccount);
+        String callBackUrl = dfAccount.getCallBackUrl();
+        if (StringUtils.isNotBlank(callBackUrl)) {
+            vo.setCallBackUrl(callBackUrl);
+        }
+        FsStoreOrderDf temp = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(liveOrder.getOrderId());
+        if (temp != null) {
+            vo.setParcelQuantity(temp.getParcelQuantity());
+        }
+        vo.setOrderNumber(order.getPlatform_code());
+        int orderPayMethod = 0;
+        BigDecimal couponPrice = liveOrder.getCouponPrice();
+        if (couponPrice == null) {
+            couponPrice = BigDecimal.ZERO;
+        }
+        if ("1".equals(liveOrder.getPayType())) {
+            orderPayMethod = 1;
+        } else {
+            orderPayMethod = 2;
+            vo.setCollectingMoney(liveOrder.getDeliveryPayMoney().doubleValue());
+            vo.setCollectionCardNumber(dfAccount.getMonthlyCard());
+        }
+        vo.setOrderPayMethod(orderPayMethod);
+        vo.setConsignmentNumber(Integer.valueOf(liveOrder.getTotalNum()));
+        vo.setBuyerMessage(liveOrder.getRemark());
+        vo.setSenderName(dfAccount.getSenderName());
+        vo.setSenderPhone(dfAccount.getSenderPhone());
+        vo.setSenderProvince(dfAccount.getSenderProvince());
+        vo.setSenderCity(dfAccount.getSenderCity());
+        vo.setSenderDistrict(dfAccount.getSenderDistrict());
+        vo.setSenderAddress(dfAccount.getSenderAddress());
+        vo.setReceiverName(order.getReceiver_name());
+        vo.setReceiverPhone(order.getReceiver_mobile());
+        vo.setReceiverTelephone(order.getReceiver_phone());
+        vo.setReceiverProvince(order.getReceiver_province());
+        vo.setReceiverCity(order.getReceiver_city());
+        vo.setReceiverDistrict(order.getReceiver_district());
+        vo.setReceiverAddress(order.getReceiver_address());
+        vo.setExpressPayMethod(1);
+        StringBuilder consignmentStr = new StringBuilder();
+        List<LiveOrderItem> items = liveOrderItemMapper.selectLiveOrderItemByOrderId(liveOrder.getOrderId());
+        if (items != null && !items.isEmpty()) {
+            ArrayList<ExteriorOrderSkuVo> orderSkus = new ArrayList<>();
+            items.forEach(item -> {
+                ExteriorOrderSkuVo skuVo = new ExteriorOrderSkuVo();
+                FsStoreProductScrm product = fsStoreProductScrmMapper.selectFsStoreProductById(item.getProductId());
+                Asserts.check(ObjectUtils.isNotNull(product), "该产品不存在! 产品id: {} ", item.getProductId());
+                skuVo.setProductName(product.getProductName());
+                com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(item.getJsonInfo());
+                skuVo.setSkuCode(jsonObject.getString("sku"));
+                String barCode = jsonObject.getString("barCode");
+                if (StringUtils.isNotBlank(barCode)) {
+                    skuVo.setProductCode(barCode);
+                } else {
+                    skuVo.setProductCode(item.getProductId().toString());
+                }
+                skuVo.setAttributeNames(jsonObject.getString("sku"));
+                skuVo.setProductNumber(Math.toIntExact(item.getNum()));
+                skuVo.setPrice(product.getPrice().doubleValue());
+                skuVo.setSubAmount(product.getPrice().doubleValue() * item.getNum());
+                consignmentStr.append(product.getProductName()).append("*").append(item.getNum()).append(",");
+                orderSkus.add(skuVo);
+            });
+            if (consignmentStr.length() > 0) {
+                consignmentStr.deleteCharAt(consignmentStr.length() - 1);
+            }
+            if (consignmentStr.length() > 100) {
+                consignmentStr.delete(consignmentStr.length() - 4, consignmentStr.length());
+                consignmentStr.append("...");
+            }
+            vo.setOrderSkus(orderSkus);
+            vo.setConsignment(consignmentStr.toString());
+        }
+        return vo;
+    }
+
+    private FsStoreOrderDf addDfOrderLive(LiveOrder liveOrder, Long dfAccountId) {
+        FsStoreOrderDf df = new FsStoreOrderDf();
+        df.setOrderId(liveOrder.getOrderId());
+        df.setOrderCode(liveOrder.getOrderCode());
+        FsDfAccount dfAccount = fsDfAccountMapper.selectFsDfAccountById(dfAccountId);
+        df.setAppKey(dfAccount.getDfAppKey());
+        df.setAppSecret(dfAccount.getDfAppsecret());
+        df.setLoginAccount(dfAccount.getLoginAccount());
+        df.setMonthlyCard(dfAccount.getMonthlyCard());
+        df.setExpressProductCode(dfAccount.getExpressProductCode());
+        df.setTotalPrice(liveOrder.getPayMoney());
+        df.setPlatformPrice(liveOrder.getPayPrice());
+        df.setStatus(1);
+        FsStoreOrderDf temp = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(df.getOrderId());
+        if (temp != null) {
+            df.setUpdateTime(DateUtils.getNowDate());
+            fsStoreOrderDfMapper.updateFsStoreOrderDf(df);
+        } else {
+            df.setCreateTime(DateUtils.getNowDate());
+            fsStoreOrderDfMapper.insertFsStoreOrderDf(df);
+        }
+        return df;
+    }
+
+    private void getOrderLiveResult(Map<String, Object> map, Long dfAccountId) {
+        try {
+            String status = map.get("exInterfaceType").toString();
+            log.info("开始查询订单结果,参数为: {}", JSON.toJSONString(map));
+            String response = client.execute(RequestUrlEnum.ORDER_RESULT, map, dfAccountId);
+            DFApiResponse dfApiResponse = JSON.parseObject(response, DFApiResponse.class);
+            if (dfApiResponse != null && "ok".equals(dfApiResponse.getCode())) {
+                log.info("查询订单结果,结果: {}", JSON.toJSONString(dfApiResponse));
+                Object result = dfApiResponse.getResult();
+                if (result != null) {
+                    String jsonString = JSON.toJSONString(result);
+                    if ("1".equals(status)) {
+                        BspOrderResponseWrapper bspOrderResponse = JSONUtil.toBean(jsonString, BspOrderResponseWrapper.class);
+                        if (bspOrderResponse != null) {
+                            String failMsg = bspOrderResponse.getFailMsg();
+                            if (StringUtils.isNotBlank(failMsg)) {
+                                if (failMsg.equals("暂未结果, 请稍后再查")) {
+                                    return;
+                                }
+                                String orderNumber = bspOrderResponse.getOrderNumber();
+                                try {
+                                    rollBackOrderLive(orderNumber, failMsg);
+                                } catch (Exception e) {
+                                    log.info("{}订单获取运单失败,订单状态回滚失败,失败原因:{},失败信息为:{}", orderNumber,e.getMessage(),failMsg);
+                                }
+                            } else {
+                                setExpressLive(bspOrderResponse);
+                            }
+                        }
+                    } else if ("2".equals(status)) {
+                        DFCancelOrderResultResponse cancelResponse = JSONUtil.toBean(jsonString, DFCancelOrderResultResponse.class);
+                        if (cancelResponse != null) {
+                            if (cancelResponse.getIsCancelSuss() == 1) {
+                                log.info("查询订单取消成功,返回结果{}", JSON.toJSONString(cancelResponse));
+                            } else {
+                                log.info("查询订单取消失败,返回结果{}", JSON.toJSONString(cancelResponse));
+                            }
+                        }
+                    }
+                }
+            } else {
+                log.info(String.format("查询订单失败,原因: %s", dfApiResponse.getMsg()));
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void rollBackOrderLive(String orderNumber, String failMsg) {
+        LiveOrder liveOrder = liveOrderMapper.selectLiveOrderByOrderCode(orderNumber);
+        LiveOrder tempOrder = new LiveOrder();
+        tempOrder.setOrderId(liveOrder.getOrderId());
+        tempOrder.setExtendOrderId("");
+        liveOrderMapper.updateLiveOrder(tempOrder);
+        FsStoreOrderDf df = new FsStoreOrderDf();
+        df.setOrderId(liveOrder.getOrderId());
+        df.setStatus(0);
+        df.setFailMsg(failMsg);
+        df.setUpdateTime(new Date());
+        fsStoreOrderDfMapper.updateFsStoreOrderDf(df);
+        log.info("{}订单获取运单失败,失败信息为:{}", orderNumber,failMsg);
+    }
+
+    private void setExpressLive(BspOrderResponseWrapper bspResponse) {
+        String orderNumber = bspResponse.getOrderNumber();
+        String mailNumber = bspResponse.getMailNumber();
+        BspOrderResponse bspOrderResponse = bspResponse.getBspResponse();
+        if (bspOrderResponse != null) {
+            AtomicBoolean flag = new AtomicBoolean(false);
+            List<OrderResponse> list = bspOrderResponse.getBody();
+            if (list != null && !list.isEmpty()) {
+                for (OrderResponse orderResponse : list) {
+                    List<RlsInfo> rlsInfo = orderResponse.getRlsInfo();
+                    if (rlsInfo != null && !rlsInfo.isEmpty()) {
+                        for (RlsInfo info : rlsInfo) {
+                            List<RlsDetail> rlsDetails = info.getRlsDetail();
+                            if (rlsDetails != null && !rlsDetails.isEmpty()) {
+                                for (RlsDetail rlsDetail : rlsDetails) {
+                                    String proCode = rlsDetail.getProCode();
+                                    if (StringUtils.isNotBlank(proCode)) {
+                                        LiveOrder order = liveOrderMapper.selectLiveOrderByOrderCode(orderNumber);
+                                        if (order != null && order.getStatus() == 1) {
+                                            FsExpressScrm express = expressScrmService.selectFsExpressByOmsCode(order.getDeliveryCode());
+                                            if (express != null) {
+                                                order.setDeliveryName(proCode);
+                                                order.setDeliverySn(express.getOmsCode());
+                                            }
+                                            order.setStatus(2);
+                                            order.setDeliverySn(mailNumber);
+                                            order.setDeliverySendTime(new Date());
+                                            liveOrderMapper.updateLiveOrder(order);
+                                            redisCache.deleteObject(DELIVERY+":"+order.getExtendOrderId());
+                                            flag.set(true);
+                                        }
+                                        break;
+                                    }
+                                }
+                            }
+                            if (flag.get()) {
+                                break;
+                            }
+                        }
+                    }
+                    if (flag.get()) {
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
 }

+ 4 - 1
fs-service/src/main/java/com/fs/erp/service/impl/ErpOrderServiceImpl.java

@@ -13,6 +13,7 @@ import com.fs.his.domain.FsStoreOrder;
 import com.fs.his.utils.ConfigUtil;
 import com.fs.hisStore.domain.FsStoreOrderScrm;
 import com.fs.live.domain.LiveOrder;
+import com.fs.live.mapper.LiveOrderMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,6 +25,8 @@ public class ErpOrderServiceImpl implements IErpOrderService
     public final static Logger LOGGER = LoggerFactory.getLogger(ErpOrderServiceImpl.class);
     @Autowired
     ConfigUtil configUtil;
+    @Autowired
+    private LiveOrderMapper liveOrderMapper;
     @Override
     public ErpOrderResponse addOrder(ErpOrder order) {
         FsSysConfig sysConfig = configUtil.getSysConfig();
@@ -68,7 +71,7 @@ public class ErpOrderServiceImpl implements IErpOrderService
 
     @Override
     public ErpOrderResponse addLiveOrder(ErpOrder order) {
-        return null;
+        return addOrder(order);
     }
 
     @Override

+ 137 - 0
fs-service/src/main/java/com/fs/erp/service/impl/HzOMSErpOrderServiceImpl.java

@@ -14,7 +14,14 @@ import com.fs.his.domain.*;
 import com.fs.his.service.*;
 import com.fs.his.utils.PhoneUtil;
 import com.fs.hisStore.domain.FsStoreOrderScrm;
+import com.fs.hisStore.domain.FsStoreProductAttrValueScrm;
+import com.fs.hisStore.domain.FsStoreProductScrm;
+import com.fs.hisStore.service.IFsStoreProductAttrValueScrmService;
+import com.fs.hisStore.service.IFsStoreProductScrmService;
 import com.fs.live.domain.LiveOrder;
+import com.fs.live.domain.LiveOrderItem;
+import com.fs.live.mapper.LiveOrderItemMapper;
+import com.fs.live.mapper.LiveOrderMapper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -50,6 +57,18 @@ public class HzOMSErpOrderServiceImpl implements IErpOrderService {
     @Autowired
     HzOMSClient hzOMSClient;
 
+    @Autowired
+    private LiveOrderMapper liveOrderMapper;
+
+    @Autowired
+    private LiveOrderItemMapper liveOrderItemMapper;
+
+    @Autowired
+    private IFsStoreProductScrmService fsStoreProductScrmService;
+
+    @Autowired
+    private IFsStoreProductAttrValueScrmService fsStoreProductAttrValueScrmService;
+
     @Override
     public ErpOrderResponse addOrder(ErpOrder order) {
         try {
@@ -72,9 +91,127 @@ public class HzOMSErpOrderServiceImpl implements IErpOrderService {
 
     @Override
     public ErpOrderResponse addLiveOrder(ErpOrder order) {
+        try {
+            JSONObject hzOrder = buildHzOMSOrderLive(order.getPlatform_code());
+
+            JSONObject omsOpenPtorderCreate = hzOMSClient.send("oms_open_ptorder_create", hzOrder);
+            ErpOrderResponse res = new ErpOrderResponse();
+            res.setCode("hzomssuccess");
+            return res;
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
         return null;
     }
 
+    private JSONObject buildHzOMSOrderLive(String orderCode) {
+        //通过订单号查询更多订单信息
+        LiveOrder liveOrder = liveOrderMapper.selectLiveOrderByOrderCode(orderCode);
+        FsStore fsStore = fsStoreService.selectFsStoreByStoreId(liveOrder.getStoreId());
+
+        JSONObject obj = new JSONObject();
+        String iordertype = "2"; // 直播订单默认B2C快递配送
+        //订单类型 0 O2O配送订单; 1 O2O 自提订单; 2 B2C 快递配送
+        obj.put("iordertype", iordertype);
+        //订单单号
+        obj.put("cptordercode", liveOrder.getOrderCode());
+        //平台店铺编码 todo 测试环境只能写死 110111 用于联调测试 liveOrder.getStoreId()
+        obj.put("cptshopcode", 110111);
+        //平台店铺名称
+        obj.put("cptshopname", fsStore.getStoreName());
+        Integer iorderstatus = null;
+        //自提且已经支付
+        if ("1".equals(iordertype) && Integer.valueOf(1).equals(liveOrder.getIsPay())) {
+            iorderstatus = 30;
+        } else {
+            if (Integer.valueOf(1).equals(liveOrder.getStatus())) {
+                iorderstatus = 0;
+            } else if (Integer.valueOf(2).equals(liveOrder.getStatus())) {
+                iorderstatus = 5;
+            }
+        }
+        //订单状态 0待接单 5待拣货 10待配送 15配送中 20已完成 25已取消 30待自提
+        obj.put("iorderstatus", iorderstatus);
+
+        String userAddress = liveOrder.getUserAddress();
+        String[] s = null;
+        if (StringUtils.isNotBlank(userAddress)) {
+            s = userAddress.split(" ");
+        } else {
+            throw new RuntimeException("用户收货地址有问题");
+        }
+
+        //收货省
+        obj.put("cprovince", s[0]);
+        //收货市
+        obj.put("ccity", s[1]);
+        //收货区
+        obj.put("carea", s[2]);
+        //收货人密文 无密文填写明文
+        obj.put("creceivers", liveOrder.getRealName());
+        //收货人联系电话密文 无密文填写明文
+        obj.put("creceiversphone", liveOrder.getUserPhone());
+        //收货人详细地址密文 无密文填写明文
+        obj.put("creceiversaddress", userAddress);
+        //收货人脱敏信息
+        obj.put("cdesenreceivers", liveOrder.getRealName());
+        //收货联系电话脱敏信息
+        obj.put("cdesenreceiversphone", PhoneUtil.decryptPhone(liveOrder.getUserPhone()));
+        //收货联系地址脱敏信息
+        obj.put("cdesenreceiversaddress", userAddress);
+        //订单总金额 单位元
+        obj.put("forderamount", liveOrder.getTotalPrice());
+        //支付金额 单位元
+        obj.put("fpayamount", liveOrder.getPayPrice());
+        //订单总优惠 单位元
+        obj.put("fdiscamount", liveOrder.getDiscountMoney());
+        //运费
+        obj.put("ffreight", liveOrder.getPayDelivery());
+        //下单时间 格式 yyyy-MM-dd hh:mm:ss 如:2025-01-01 00:11:22
+        obj.put("dorderstarttime", liveOrder.getCreateTime());
+        //是否处方 0 否 1 是 可选
+        obj.put("iisprescription", 0);
+        //买家备注
+        obj.put("corderremark", liveOrder.getRemark());
+        //支付时间  格式 yyyy-MM-dd hh:mm:ss 如:2025-01-01 00:11:22
+        obj.put("dpurchasetime", liveOrder.getPayTime());
+        List<LiveOrderItem> liveOrderItems = liveOrderItemMapper.selectLiveOrderItemByOrderId(liveOrder.getOrderId());
+        int totalOrderItemCount = liveOrderItems.size();
+        BigDecimal divide = liveOrder.getDiscountMoney().divide(BigDecimal.valueOf(totalOrderItemCount), 2, BigDecimal.ROUND_HALF_UP);
+        JSONArray goodArr = new JSONArray();
+
+        liveOrderItems.forEach(liveOrderItem -> {
+            JSONObject goodItem = new JSONObject();
+            //商品编码
+            goodItem.put("cptgoodsid", liveOrderItem.getProductId());
+            //商品规格编码
+            goodItem.put("cptspeccode", liveOrderItem.getProductAttrValueId());
+
+            FsStoreProductScrm fsStoreProduct = fsStoreProductScrmService.selectFsStoreProductById(liveOrderItem.getProductId());
+            FsStoreProductAttrValueScrm fsStoreProductAttrValue = new FsStoreProductAttrValueScrm();
+            //判断是否含有商品规格信息 有则查询商品规格信息 没有取商品的价格
+            if(null != liveOrderItem.getProductAttrValueId()){
+                fsStoreProductAttrValue = fsStoreProductAttrValueScrmService.selectFsStoreProductAttrValueById(liveOrderItem.getProductAttrValueId());
+            }else{
+                fsStoreProductAttrValue.setPrice(fsStoreProduct.getPrice());
+            }
+            //商品名称
+            goodItem.put("cgoodsname", fsStoreProduct.getProductName());
+            //购买数量
+            goodItem.put("fqty", liveOrderItem.getNum());
+            //原单价
+            goodItem.put("fnormprice", fsStoreProductAttrValue.getPrice());
+
+            //实售单价 优惠后的单价 单位元
+            goodItem.put("fprice", fsStoreProductAttrValue.getPrice().subtract(divide));
+            goodArr.add(goodItem);
+        });
+        //订单商品信息
+        obj.put("ptorder_goods_list", goodArr);
+
+        return obj;
+    }
+
     @Override
     public ErpOrderResponse refundOrder(ErpRefundOrder order) {
         String orderCode = order.getOrderCode();

+ 151 - 1
fs-service/src/main/java/com/fs/erp/service/impl/K9OrderScrmServiceImpl.java

@@ -23,6 +23,9 @@ import com.fs.hisStore.mapper.FsStoreProductScrmMapper;
 import com.fs.hisStore.service.IFsStoreOrderItemScrmService;
 import com.fs.hisStore.vo.FsStoreOrderItemVO;
 import com.fs.live.domain.LiveOrder;
+import com.fs.live.domain.LiveOrderItem;
+import com.fs.live.mapper.LiveOrderItemMapper;
+import com.fs.live.mapper.LiveOrderMapper;
 import lombok.extern.slf4j.Slf4j;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -52,6 +55,13 @@ public class K9OrderScrmServiceImpl implements IErpOrderService {
     private IFsStoreOrderItemScrmService storeOrderItemService;
     @Autowired
     private FsStoreProductScrmMapper productMapper;
+
+    @Autowired
+    private LiveOrderMapper liveOrderMapper;
+
+    @Autowired
+    private LiveOrderItemMapper liveOrderItemMapper;
+
     @Override
     /**
      * 推送erp订单
@@ -67,7 +77,147 @@ public class K9OrderScrmServiceImpl implements IErpOrderService {
 
     @Override
     public ErpOrderResponse addLiveOrder(ErpOrder order) {
-        return null;
+        return addOmsOrderLive(order.getPlatform_code());
+    }
+
+    private ErpOrderResponse addOmsOrderLive(String orderCode) {
+        try {
+            KingbosOrderResponse response = this.createOmsOrderLive(orderCode, NO_DELIVERED.getCode());
+            if (response.getIsSuccess()){
+                log.info("订单推送成功: {}", response);
+                ErpOrderResponse erpOrderResponse = new ErpOrderResponse();
+                erpOrderResponse.setCode(response.getCbilid());
+                return erpOrderResponse;
+            }else {
+                throw new RuntimeException(String.format("订单推送失败,原因: %s",response.getErrmsg()));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return new ErpOrderResponse();
+    }
+
+    private KingbosOrderResponse createOmsOrderLive(String orderCode, String orderStatus){
+        logger.info("【金博网络订单】开始创建订单,订单Code: {}", orderCode);
+        try {
+            LiveOrder order = liveOrderMapper.selectLiveOrderByOrderCode(orderCode);
+            logger.info("【金博网络订单】订单信息获取成功,订单id: {}", order.getOrderId());
+            logger.info("【金博网络订单】订单信息获取成功,订单号: {}", order.getOrderCode());
+
+            KingbosOrderData data = buildKingbosOrderDataLive(order, orderStatus);
+            logger.info("【金博网络订单】订单数据构建完成,金博订单号: {}", data.getCo_id());
+
+            List<KingbosOrderD1Data> d1Datas = buildOrderDetailDataLive(order, data.getCdo_id());
+            logger.info("【金博网络订单】订单明细数据构建完成,明细数量: {}", d1Datas.size());
+
+            KingbosOrderResponse response = sendOrderRequest(data, d1Datas);
+            if (response.getCbilid()==null){
+                response.setCbilid(order.getExtendOrderId());
+            }
+            return response;
+        } catch (Exception e) {
+            logger.error("【金博网络订单】创建订单失败,订单Code: {}, 错误信息: {}", orderCode, e.getMessage(), e);
+            throw e;
+        }
+    }
+
+    private KingbosOrderData buildKingbosOrderDataLive(LiveOrder order, String orderStatus) {
+        FsErpConfig erpConfig = configUtil.getErpConfig();
+        logger.debug("【金博网络订单】开始构建订单数据,订单号: {}", order.getOrderCode());
+        KingbosOrderData data = new KingbosOrderData();
+        data.setCordersource("MALL");
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        data.setDorder_date(sdf.format(order.getCreateTime()));
+        data.setCplatformtype("99");
+        data.setCshop_id("zk2025");
+        data.setCshop_name("自建商城");
+        String orderSn = "";
+        if (orderStatus.equals(NO_DELIVERED.getCode())){
+            orderSn= IdUtil.getSnowflake(0, 0).nextIdStr();
+        }else if (orderStatus.equals(CANCELLED.getCode())){
+            orderSn = order.getExtendOrderId();
+        }
+
+        data.setCso_id(order.getOrderCode());
+        data.setCo_id(orderSn);
+        data.setCdo_id(orderSn);
+        order.setExtendOrderId(orderSn);
+
+        data.setFpay_amount(order.getPayPrice());
+        data.setFpaid_amount(order.getPayMoney());
+        data.setFfreight(order.getTotalPostage());
+        data.setFfree_amount(order.getCouponPrice());
+        data.setFpostcost(BigDecimal.ZERO);
+
+        data.setCstatus(orderStatus);
+        data.setDmodified(sdf.format(order.getUpdateTime()));
+
+        setReceiverInfoLive(data, order);
+
+        data.setCwarehouse_code(erpConfig.getCwarehouseCode());
+        data.setCwarehouse_name(erpConfig.getCwarehouseName());
+
+        if (!order.getPayType().equals("1")) {
+            data.setBis_cod(1);
+            data.setFshouldpaymoney(order.getDeliveryPayMoney());
+        }
+
+        return data;
+    }
+
+    private void setReceiverInfoLive(KingbosOrderData data, LiveOrder order) {
+        logger.debug("【金博网络订单】开始处理收货信息,订单号: {}", order.getOrderCode());
+        String[] address = order.getUserAddress().split(" ");
+        if (address.length < 3) {
+            logger.error("【金博网络订单】收货地址格式不正确,订单号: {}, 地址: {}", order.getOrderCode(), order.getUserAddress());
+            throw new ServiceException("收货地址格式不正确");
+        }
+
+        data.setCreceiver_state(address[0]);
+        data.setCreceiver_city(address[1]);
+        data.setCreceiver_district(address[2]);
+
+        String detailAddress = address.length > 3 ?
+            String.join("", Arrays.copyOfRange(address, 3, address.length)) :
+            address[2];
+
+        detailAddress = detailAddress.replace("+", "加")
+                                   .replace("\n", "");
+
+        data.setCreceiver_address(detailAddress);
+        data.setCreceiver_name(order.getRealName());
+        data.setCreceiver_mobile(order.getUserPhone());
+    }
+
+    private List<KingbosOrderD1Data> buildOrderDetailDataLive(LiveOrder order, String orderId) {
+        logger.debug("【金博网络订单】开始构建订单明细,订单号: {}", order.getOrderCode());
+        List<LiveOrderItem> orderItems = liveOrderItemMapper.selectLiveOrderItemByOrderId(order.getOrderId());
+        List<KingbosOrderD1Data> d1Datas = orderItems.stream()
+                .map(item -> buildOrderDetailItemLive(item, orderId))
+                .collect(Collectors.toList());
+
+        logger.debug("【金博网络订单】订单明细构建完成,订单号: {}, 明细数量: {}", order.getOrderCode(), d1Datas.size());
+        return d1Datas;
+    }
+
+    private KingbosOrderD1Data buildOrderDetailItemLive(LiveOrderItem orderItem, String orderId) {
+        FsStoreCartDTO cartDTO = JSONUtil.toBean(orderItem.getJsonInfo(), FsStoreCartDTO.class);
+        BigDecimal quantity = new BigDecimal(orderItem.getNum());
+
+        KingbosOrderD1Data item = new KingbosOrderD1Data();
+        item.setCdo_id(orderId);
+        item.setCo_id(orderId);
+        item.setCsku_id(cartDTO.getBarCode());
+        item.setCgoodsid(cartDTO.getBarCode());
+        item.setCname(cartDTO.getProductName());
+        item.setCshop_sku_id(cartDTO.getSku());
+        item.setIqty(quantity);
+        item.setFprice(cartDTO.getPrice());
+        item.setFamount(quantity.multiply(cartDTO.getPrice()));
+        item.setCordersource("MALL");
+        item.setFpromoamount(BigDecimal.ZERO);
+
+        return item;
     }
 
 

+ 181 - 1
fs-service/src/main/java/com/fs/erp/service/impl/WdtErpOrderServiceImpl.java

@@ -33,6 +33,9 @@ import com.fs.hisStore.service.IFsStoreOrderItemScrmService;
 import com.fs.hisStore.service.IFsStoreOrderScrmService;
 import com.fs.hisStore.service.IFsStoreProductScrmService;
 import com.fs.live.domain.LiveOrder;
+import com.fs.live.domain.LiveOrderItem;
+import com.fs.live.mapper.LiveOrderItemMapper;
+import com.fs.live.mapper.LiveOrderMapper;
 import com.hc.openapi.tool.util.StringUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
@@ -71,6 +74,12 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
     @Autowired
     private IFsStoreProductScrmService fsStoreProductScrmService;
 
+    @Autowired
+    private LiveOrderMapper liveOrderMapper;
+
+    @Autowired
+    private LiveOrderItemMapper liveOrderItemMapper;
+
 //    @Value("${fsConfig.erpWdShopCode}")
 //    private String shopCode;
 
@@ -106,7 +115,178 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
 
     @Override
     public ErpOrderResponse addLiveOrder(ErpOrder order) {
-        return null;
+        return getErpOrderResponseLive(order);
+    }
+
+    private ErpOrderResponse getErpOrderResponseLive(ErpOrder order) {
+        FsSysConfig sysConfig = configUtil.getSysConfig();
+        String shopCode = sysConfig.getErpWdShopCode();
+
+        ErpWdtBusinessRequestParams erpWdtBusinessRequestParams = new ErpWdtBusinessRequestParams();
+        erpWdtBusinessRequestParams.setShopNo(shopCode);
+        erpWdtBusinessRequestParams.setSwitchMode(0);
+        ErpWdtTrade erpWdtTrade = new ErpWdtTrade();
+        LiveOrder liveOrder = liveOrderMapper.selectLiveOrderByOrderCode(order.getPlatform_code());
+        BigDecimal couponPrice = liveOrder.getCouponPrice();
+        if (couponPrice == null) {
+            couponPrice = BigDecimal.ZERO;
+        }
+
+        // 平台状态
+        erpWdtTrade.setTradeStatus(TradeStatus.PAID_WAITING_FOR_SHIPMENT.getValue());
+
+        // 订单id
+        erpWdtTrade.setTid(order.getPlatform_code());
+
+        // 如果是货到付款
+        if("2".equals(liveOrder.getPayType())){
+            // 支付状态
+            erpWdtTrade.setPayStatus(PaymentStatus.PARTIALLY_PAID.getValue());
+            // 发货条件
+            erpWdtTrade.setDeliveryTerm(DeliveryTerm.CASH_ON_DELIVERY.getValue());
+            // 货到付款金额 = 物流代收金额-优惠金额
+            erpWdtTrade.setCodAmount(liveOrder.getPayDelivery().subtract(couponPrice));
+
+        } else if("3".equals(liveOrder.getPayType())){
+            // 支付状态
+            erpWdtTrade.setPayStatus(PaymentStatus.UNPAID.getValue());
+            // 发货条件
+            erpWdtTrade.setDeliveryTerm(DeliveryTerm.CASH_ON_DELIVERY.getValue());
+            // 货到付款金额 = 物流代收金额-优惠金额
+            erpWdtTrade.setCodAmount(liveOrder.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(liveOrder.getPayDelivery());
+        // 已付金额
+        if(ObjectUtils.isNotNull(liveOrder)){
+            erpWdtTrade.setPaid(liveOrder.getPayMoney());
+        }
+
+        List<LiveOrderItem> liveOrderItems = liveOrderItemMapper.selectLiveOrderItemByOrderId(liveOrder.getOrderId());
+        List<ErpWdtOrder> erpWdtOrderList = new ArrayList<>();
+        // 商品总价
+        BigDecimal totalPrice = liveOrder.getTotalPrice();
+
+        // 总折扣金额 = 优惠券金额 + 折扣金额
+        BigDecimal totalDiscountPrice = BigDecimal.ZERO;
+        // 折扣金额
+        BigDecimal discountPrice = totalPrice.subtract(liveOrder.getPayPrice());
+        totalDiscountPrice = couponPrice.add(discountPrice);
+
+        // 防止除零错误
+        if (totalPrice.compareTo(BigDecimal.ZERO) == 0) {
+            totalPrice = BigDecimal.ONE;
+        }
+
+        for (LiveOrderItem liveOrderItem : liveOrderItems) {
+            ErpWdtOrder erpWdtOrder = new ErpWdtOrder();
+            //平台订单货品表主键
+            erpWdtOrder.setOid(String.format("%s%s",liveOrder.getOrderCode(),liveOrderItem.getItemId()));
+            erpWdtOrder.setNum(BigDecimal.valueOf(liveOrderItem.getNum()));
+            FsStoreProductScrm fsStoreProduct = fsStoreProductScrmService.selectFsStoreProductById(liveOrderItem.getProductId());
+            Asserts.check(ObjectUtils.isNotNull(fsStoreProduct),"该产品不存在! 产品id: {} ",liveOrderItem.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(liveOrderItem.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(liveOrderItem.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();
     }
 
     /**

+ 3 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsPrescribeServiceImpl.java

@@ -513,6 +513,9 @@ public class FsPrescribeServiceImpl implements IFsPrescribeService
         fsPrescribe.setUserId(packageOrder.getUserId());
         fsPrescribe.setPrescribeCode(IdUtil.getSnowflake(0, 0).nextIdStr());
         FsPackagePatientDTO patJson = JSON.parseObject(packageOrder.getPatientJson(),FsPackagePatientDTO.class);
+        if(patJson == null || patJson.getPatientId() == null){
+            return null;
+        }
         long currentTimeMillis = System.currentTimeMillis();
         long ageInMillis = currentTimeMillis - patJson.getBirthday();
         long ageInSeconds = ageInMillis / 1000;

+ 1 - 1
fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java

@@ -4215,7 +4215,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
                 Long doctorID = iFsDoctorService.selectFsDoctorDoctorByPackage();
                 packageOrder.setDoctorId(doctorID);
             }
-            if (packageSubType == 3 ) {
+            if (packageSubType == 3 && !CloudHostUtils.hasCloudHostName("金牛明医")) {
                 inquiryOrderService.createOrderByPackageOrderStatus4(packageOrder);
             }
             prescribeId = fsPrescribeService.insertFsPrescribeByPackageOrder(packageOrder);

+ 9 - 0
fs-service/src/main/java/com/fs/live/mapper/LiveOrderMapper.java

@@ -416,4 +416,13 @@ public interface LiveOrderMapper {
 
 
     List<LiveOrderVoZm> selectLiveOrderListZm(LiveOrder liveOrder);
+
+    @Select(" SELECT * from live_order WHERE item_json is NULL ORDER BY id DESC  LIMIT 30")
+    List<LiveOrder> selectLiveOrderItemJson();
+
+    @Update(" UPDATE live_order SET item_json=#{itemJson} WHERE order_id=#{orderId}")
+    void updateLiveOrderItemJson(LiveOrder storeOrder);
+
+    @Select("select * from live_order where  `status`=2 and (extend_order_id is not null and extend_order_id != '') and (delivery_id is not null and delivery_id != '')")
+    List<LiveOrder> selectShippedOrder();
 }

+ 2 - 0
fs-service/src/main/java/com/fs/live/service/ILiveOrderService.java

@@ -236,4 +236,6 @@ public interface ILiveOrderService {
     List<LiveOrderVoZm> selectLiveOrderListZm(LiveOrder liveOrder);
 
     R handleLiveOrderPay(LiveOrderPayParam param);
+
+    List<LiveOrder> selectLiveOrderItemJson();
 }

+ 5 - 0
fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java

@@ -2891,6 +2891,11 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
 
     }
 
+    @Override
+    public List<LiveOrder> selectLiveOrderItemJson() {
+        return baseMapper.selectLiveOrderItemJson();
+    }
+
 
     @Override
     @Transactional(rollbackFor = Throwable.class,propagation = Propagation.REQUIRED)

+ 1 - 0
fs-service/src/main/java/com/fs/live/vo/LiveDataListVo.java

@@ -76,3 +76,4 @@ public class LiveDataListVo {
 
 
 
+

+ 1 - 0
fs-service/src/main/java/com/fs/live/vo/LiveDataStatisticsVo.java

@@ -57,3 +57,4 @@ public class LiveDataStatisticsVo {
 
 
 
+

+ 2 - 2
fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java

@@ -404,8 +404,8 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
     @Select("SELECT id,external_user_id,name,avatar,remark,description,fs_user_id FROM  qw_external_contact " +
             " WHERE user_id = #{map.userId}   " +
             "AND corp_id =#{map.corpId} " +
-            "AND external_user_id = #{map.externalUserId}" +
-            "AND `status` != 4 " +
+            "AND external_user_id = #{map.externalUserId} " +
+            "AND `status` != 4 AND `status` != 5 " +
             "ORDER BY id desc " +
             "limit 1 ")
     QwExternalContact getQwExternalContactDetails(@Param("map")QwExternalContactHParam param);

+ 2 - 2
fs-service/src/main/resources/application-druid-bjzm-test.yml

@@ -39,7 +39,7 @@ spring:
             druid:
                 # 主库数据源
                 master:
-                  url: jdbc:mysql://gz-cdb-ofgnuz1n.sql.tencentcdb.com:26872/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                  url: jdbc:mysql://gz-cdb-ofgnuz1n.sql.tencentcdb.com:26872/fs_his?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                   username: root
                   password: Ylrz_1q2w3e4r5t6y
                 # 从库数据源
@@ -94,7 +94,7 @@ spring:
             druid:
                 # 主库数据源
                 master:
-                    url: jdbc:mysql://gz-cdb-ofgnuz1n.sql.tencentcdb.com:26872/fs_his_sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    url: jdbc:mysql://gz-cdb-ofgnuz1n.sql.tencentcdb.com:26872/fs_his_sop?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                     username: root
                     password: Ylrz_1q2w3e4r5t6y
                 # 初始连接数

+ 2 - 2
fs-service/src/main/resources/application-druid-bjzm.yml

@@ -39,7 +39,7 @@ spring:
             druid:
                 # 主库数据源
                 master:
-                  url: jdbc:mysql://gz-cdb-ofgnuz1n.sql.tencentcdb.com:26872/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                  url: jdbc:mysql://gz-cdb-ofgnuz1n.sql.tencentcdb.com:26872/fs_his?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                   username: root
                   password: Ylrz_1q2w3e4r5t6y
                 # 从库数据源
@@ -94,7 +94,7 @@ spring:
             druid:
                 # 主库数据源
                 master:
-                    url: jdbc:mysql://gz-cdb-ofgnuz1n.sql.tencentcdb.com:26872/fs_his_sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    url: jdbc:mysql://gz-cdb-ofgnuz1n.sql.tencentcdb.com:26872/fs_his_sop?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                     username: root
                     password: Ylrz_1q2w3e4r5t6y
                 # 初始连接数