|
@@ -102,6 +102,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
+import javax.annotation.PostConstruct;
|
|
|
import java.io.IOException;
|
|
|
import java.lang.reflect.Field;
|
|
|
import java.math.BigDecimal;
|
|
@@ -277,7 +278,8 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
|
|
|
private FsStoreOrderDfMapper fsStoreOrderDfMapper;
|
|
|
@Autowired
|
|
|
private FsUserWxMapper fsUserWxMapper;
|
|
|
-
|
|
|
+ @Autowired
|
|
|
+ private FsUserMapper fsUserMapper;
|
|
|
@Autowired
|
|
|
private IFsUserWxService userWxService;
|
|
|
|
|
@@ -287,6 +289,19 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
|
|
|
@Autowired
|
|
|
private com.fs.gtPush.service.uniPush2Service uniPush2Service;
|
|
|
|
|
|
+ //ERP 类型到服务的映射
|
|
|
+ private Map<Integer, IErpOrderService> erpServiceMap;
|
|
|
+ @PostConstruct
|
|
|
+ public void initErpServiceMap() {
|
|
|
+ erpServiceMap = new HashMap<>();
|
|
|
+ erpServiceMap.put(1, gyOrderService); // 管易
|
|
|
+ erpServiceMap.put(2, wdtOrderService); // 旺店通
|
|
|
+ erpServiceMap.put(3, hzOMSOrderService); // 瀚智OMS
|
|
|
+ erpServiceMap.put(4, dfOrderService); // 代服
|
|
|
+ erpServiceMap.put(5, jSTOrderService); // 聚水潭
|
|
|
+ erpServiceMap.put(6, k9OrderService); // K9
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 查询订单
|
|
|
*
|
|
@@ -330,8 +345,151 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
|
|
|
@Override
|
|
|
public int updateFsStoreOrder(FsStoreOrder fsStoreOrder) {
|
|
|
fsStoreOrder.setUpdateTime(DateUtils.getNowDate());
|
|
|
+ //推送修改的互联网医院订单地址到聚水潭ERP
|
|
|
+ try {
|
|
|
+ pushOrderAddressToErp(fsStoreOrder);
|
|
|
+ }catch (Exception e){
|
|
|
+ log.error("修改互联网医院订单地址推送到聚水潭ERP失败,orderId: {}", fsStoreOrder.getOrderId(), e);
|
|
|
+ }
|
|
|
return fsStoreOrderMapper.updateFsStoreOrder(fsStoreOrder);
|
|
|
}
|
|
|
+ /**
|
|
|
+ * 推送修改订单的最新地址到 ERP
|
|
|
+ *
|
|
|
+ * @param partialOrder 前端传入的部分订单对象,必须包含 id、userAddress
|
|
|
+ */
|
|
|
+ public void pushOrderAddressToErp(FsStoreOrder partialOrder){
|
|
|
+ if (partialOrder == null || partialOrder.getOrderId() == null) {
|
|
|
+ log.info("传入订单为空或ID缺失,跳过ERP同步");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 1. 检查 ERP 是否开启
|
|
|
+ FsSysConfig sysConfig = configUtil.getSysConfig();
|
|
|
+ Integer erpOpen = sysConfig.getErpOpen();
|
|
|
+ if (erpOpen == null || erpOpen == 0) {
|
|
|
+ log.info("ERP未开启,跳过同步");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ Integer erpType = sysConfig.getErpType();
|
|
|
+ if (erpType == null || !erpServiceMap.containsKey(erpType)) {
|
|
|
+ log.info("ERP类型配置无效: {}", erpType);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ //目前只针对聚水潭ERP推送最新的修改地址
|
|
|
+ if (erpType != 5){
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 2. 从数据库获取完整订单(用于补全必要字段;当前是修改商城订单接口,查询fs_store_order_scrm表)
|
|
|
+ FsStoreOrder dbOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderId(partialOrder.getOrderId());
|
|
|
+ if (dbOrder == null) {
|
|
|
+ log.error("数据库表fs_store_order中订单不存在,orderId: {}", partialOrder.getOrderId());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ //判断当前是否满足推送条件(erp订单号不为空且订单状态为待发货时可推送)
|
|
|
+ if (StringUtils.isBlank(dbOrder.getExtendOrderId()) || dbOrder.getStatus() != 1) {
|
|
|
+ log.info("修改订单地址不满足推送到ERP条件: extendOrderId={}, status={}", dbOrder.getExtendOrderId(), dbOrder.getStatus());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 3. 构造用于ERP推送的订单对象:订单地址用传入的新值
|
|
|
+ if (StrUtil.isBlank(partialOrder.getUserAddress())){
|
|
|
+ log.error("修改互联网医院订单地址为空,orderId: {}", partialOrder.getOrderId());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ dbOrder.setUserAddress(partialOrder.getUserAddress());
|
|
|
+ // 4. 构建 ERP 订单对象
|
|
|
+ try {
|
|
|
+ ErpOrder erpOrder = buildErpOrder(dbOrder,sysConfig);
|
|
|
+
|
|
|
+ // 5. 调用对应 ERP 服务(当前是聚水潭ERP)
|
|
|
+ IErpOrderService erpService = erpServiceMap.get(erpType);
|
|
|
+
|
|
|
+ //执行互联网医院订单推送逻辑
|
|
|
+ ErpOrderResponse response = erpService.addOrder(erpOrder);
|
|
|
+ log.info("ERP地址推送结果 - 互联网医院订单: {}, ERP类型: {}, 成功: {}, 外部单号: {}",
|
|
|
+ dbOrder.getOrderCode(), erpType, response.getSuccess(), response.getCode());
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("推送修改互联网医院订单地址到ERP失败,orderId: {}", partialOrder.getOrderId(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建 ErpOrder 对象(仅用于修改互联网医院订单地址推送到聚水潭ERP)
|
|
|
+ */
|
|
|
+ private ErpOrder buildErpOrder(FsStoreOrder order, FsSysConfig sysConfig) {
|
|
|
+ ErpOrder erpOrder = new ErpOrder();
|
|
|
+
|
|
|
+ //订单号
|
|
|
+ erpOrder.setPlatform_code(order.getOrderCode());
|
|
|
+
|
|
|
+ // 店铺编码
|
|
|
+ erpOrder.setShop_code(sysConfig.getErpJstShopCode());
|
|
|
+ erpOrder.setBuyer_account(order.getUserName());
|
|
|
+ //成交时间
|
|
|
+ erpOrder.setDeal_datetime(order.getBeginTime());
|
|
|
+ //支付信息
|
|
|
+ List<ErpOrderPayment> payments = new ArrayList<>();
|
|
|
+ ErpOrderPayment payment = new ErpOrderPayment();
|
|
|
+ payment.setPay_type_code("weixin");
|
|
|
+ erpOrder.setPayments(payments);
|
|
|
+ //卖家留言
|
|
|
+ erpOrder.setBuyer_memo("");
|
|
|
+ //推送聚水潭erp不需要推送处方图片,这里就注释代码
|
|
|
+ //String s = fsPrescribeService.PrescribeImg(order.getPrescribeId());
|
|
|
+ //erpOrder.setSeller_memo(erpOrder.getSeller_memo() + "||" + s + "||");
|
|
|
+ // 收货人姓名(过滤非法字符)
|
|
|
+ erpOrder.setReceiver_name(order.getUserName().replaceAll("[^\\u4e00-\\u9fa5a-zA-Z0-9]", ""));
|
|
|
+ // 电话处理
|
|
|
+ String phone = null;
|
|
|
+ if (StrUtil.isNotBlank(order.getErpPhone())) {
|
|
|
+ phone = order.getErpPhone();
|
|
|
+ } else if (StrUtil.isNotBlank(order.getUserPhone())) {
|
|
|
+ // 如果手机号被加密(长度>11),需解密
|
|
|
+ phone = order.getUserPhone().length() > 11 ? decryptPhone(order.getUserPhone()) : order.getUserPhone();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (StrUtil.isNotBlank(phone)) {
|
|
|
+ if (phone.length() > 11) {
|
|
|
+ erpOrder.setReceiver_phone(phone); // 固话
|
|
|
+ } else {
|
|
|
+ erpOrder.setReceiver_mobile(phone); // 手机
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 地址解析
|
|
|
+ String userAddress = order.getUserAddress();
|
|
|
+ try {
|
|
|
+ String[] parts = userAddress.split(" ");
|
|
|
+ if (parts.length < 3) {
|
|
|
+ // 调用地址解析服务(如快递鸟)
|
|
|
+ String kdnResult = fsUserAddressService.getKdnAddress(userAddress);
|
|
|
+ Map<String, Object> result = JSON.parseObject(kdnResult);
|
|
|
+ Map<String, String> addr = (Map<String, String>) ((Map) result.get("Data")).get("result");
|
|
|
+ erpOrder.setReceiver_province(addr.get("ProvinceName"));
|
|
|
+ erpOrder.setReceiver_city(addr.get("CityName"));
|
|
|
+ erpOrder.setReceiver_district(addr.get("ExpAreaName"));
|
|
|
+ erpOrder.setReceiver_address(addr.get("StreetName") + addr.get("Address"));
|
|
|
+ } else {
|
|
|
+ erpOrder.setReceiver_province(parts[0]);
|
|
|
+ erpOrder.setReceiver_city(parts[1]);
|
|
|
+ erpOrder.setReceiver_district(parts[2]);
|
|
|
+ erpOrder.setReceiver_address(parts.length > 3 ? String.join("", Arrays.copyOfRange(parts, 3, parts.length)) : parts[2]);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 清理地址中的特殊字符
|
|
|
+ if (erpOrder.getReceiver_address() != null) {
|
|
|
+ erpOrder.setReceiver_address(
|
|
|
+ erpOrder.getReceiver_address()
|
|
|
+ .replace("+", "加")
|
|
|
+ .replace("\n", "")
|
|
|
+ .replace("\r", "")
|
|
|
+ );
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("修改订单地址解析异常,订单: {}", order.getOrderCode(), e);
|
|
|
+ }
|
|
|
+ return erpOrder;
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
* 修改订单状态-收货信息
|
|
@@ -1490,6 +1648,19 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
|
|
|
}
|
|
|
storeOrder.setPayTime(new Date());
|
|
|
fsStoreOrderMapper.updateFsStoreOrder(storeOrder);
|
|
|
+ try {
|
|
|
+ //更新用户下单次数(获取阈值,当订单总价大于等于阈值,则下单次数+1)
|
|
|
+ BigDecimal minThreshold = toBigDecimal(config.get("minimumThreshold"), BigDecimal.ZERO);
|
|
|
+ if (order.getTotalPrice().compareTo(minThreshold) >= 0) {
|
|
|
+ //根据用户id获取fs_user表对应的下单次数并更新
|
|
|
+ FsUser user = fsUserMapper.selectFsUserById(order.getUserId());
|
|
|
+ user.setOrderCount(user.getOrderCount() + 1);
|
|
|
+ fsUserMapper.updateFsUser(user);
|
|
|
+ }
|
|
|
+ } catch (Exception ex) {
|
|
|
+ // 仅记录日志,这个更新逻辑如果异常不回滚其他逻辑代码
|
|
|
+ log.error("更新用户下单次数失败,订单: {}, 用户: {}", order.getOrderCode(), order.getUserId(), ex);
|
|
|
+ }
|
|
|
//更新优惠券状态
|
|
|
if (order.getUserCouponId() != null && order.getUserCouponId() > 0) {
|
|
|
FsUserCoupon userCoupon = userCouponService.selectFsUserCouponById(order.getUserCouponId());
|
|
@@ -1515,7 +1686,27 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
|
|
|
return R.error();
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+ public BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) {
|
|
|
+ if (value == null) {
|
|
|
+ return defaultValue;
|
|
|
+ }
|
|
|
+ if (value instanceof BigDecimal) {
|
|
|
+ return (BigDecimal) value;
|
|
|
+ }
|
|
|
+ if (value instanceof String) {
|
|
|
+ String str = ((String) value).trim();
|
|
|
+ return str.isEmpty() ? defaultValue : new BigDecimal(str);
|
|
|
+ }
|
|
|
+ if (value instanceof Number) {
|
|
|
+ return new BigDecimal(((Number) value).toString());
|
|
|
+ }
|
|
|
+ // 兜底:toString 转换
|
|
|
+ try {
|
|
|
+ return new BigDecimal(value.toString().trim());
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
+ return defaultValue;
|
|
|
+ }
|
|
|
+ }
|
|
|
@Override
|
|
|
public Long selectFsStoreOrderTotalCount(int type, Long companyId) {
|
|
|
return fsStoreOrderMapper.selectFsStoreOrderTotalCount(type, companyId);
|
|
@@ -3906,4 +4097,9 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public FsStoreOrderAmountStatsVo selectFsStoreOrderAmountStats(FsStoreOrderAmountStatsQueryDto queryDto) {
|
|
|
+ return fsStoreOrderMapper.selectFsStoreOrderAmountStats(queryDto);
|
|
|
+ }
|
|
|
+
|
|
|
}
|