|
@@ -279,7 +279,8 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
|
|
|
private FsStoreOrderDfMapper fsStoreOrderDfMapper;
|
|
private FsStoreOrderDfMapper fsStoreOrderDfMapper;
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private FsUserWxMapper fsUserWxMapper;
|
|
private FsUserWxMapper fsUserWxMapper;
|
|
|
-
|
|
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private FsUserMapper fsUserMapper;
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private IFsUserWxService userWxService;
|
|
private IFsUserWxService userWxService;
|
|
|
|
|
|
|
@@ -289,6 +290,19 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private com.fs.gtPush.service.uniPush2Service uniPush2Service;
|
|
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
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 查询订单
|
|
* 查询订单
|
|
|
*
|
|
*
|
|
@@ -332,8 +346,151 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
|
|
|
@Override
|
|
@Override
|
|
|
public int updateFsStoreOrder(FsStoreOrder fsStoreOrder) {
|
|
public int updateFsStoreOrder(FsStoreOrder fsStoreOrder) {
|
|
|
fsStoreOrder.setUpdateTime(DateUtils.getNowDate());
|
|
fsStoreOrder.setUpdateTime(DateUtils.getNowDate());
|
|
|
|
|
+ //推送修改的互联网医院订单地址到聚水潭ERP
|
|
|
|
|
+ try {
|
|
|
|
|
+ pushOrderAddressToErp(fsStoreOrder);
|
|
|
|
|
+ }catch (Exception e){
|
|
|
|
|
+ log.error("修改互联网医院订单地址推送到聚水潭ERP失败,orderId: {}", fsStoreOrder.getOrderId(), e);
|
|
|
|
|
+ }
|
|
|
return fsStoreOrderMapper.updateFsStoreOrder(fsStoreOrder);
|
|
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;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 修改订单状态-收货信息
|
|
* 修改订单状态-收货信息
|
|
@@ -963,6 +1120,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
|
|
|
StringBuilder failureMsg = new StringBuilder();
|
|
StringBuilder failureMsg = new StringBuilder();
|
|
|
for (FsStoreProductDeliverExcelVO vo : list) {
|
|
for (FsStoreProductDeliverExcelVO vo : list) {
|
|
|
try {
|
|
try {
|
|
|
|
|
+ log.info("原始数据:{}",JSON.toJSONString(vo));
|
|
|
FsStoreOrder o = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(vo.getOrderCode());
|
|
FsStoreOrder o = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(vo.getOrderCode());
|
|
|
if (storeId != null) {
|
|
if (storeId != null) {
|
|
|
if (o.getStoreId() != storeId) {
|
|
if (o.getStoreId() != storeId) {
|
|
@@ -1005,6 +1163,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
|
|
|
}
|
|
}
|
|
|
FsStore store = fsStoreMapper.selectFsStoreByStoreId(o.getStoreId());
|
|
FsStore store = fsStoreMapper.selectFsStoreByStoreId(o.getStoreId());
|
|
|
int i = fsStoreOrderMapper.updateFsStoreOrderByOrderCode(fsStoreOrder);
|
|
int i = fsStoreOrderMapper.updateFsStoreOrderByOrderCode(fsStoreOrder);
|
|
|
|
|
+ log.info("手动发货导入订单号:订单号为"+fsStoreOrder.getOrderCode() + "快递单号为:" + fsStoreOrder.getDeliverySn());
|
|
|
String lastFourNumber = "";
|
|
String lastFourNumber = "";
|
|
|
if (fsStoreOrder.getDeliveryCode().equals(ShipperCodeEnum.SF.getValue())) {
|
|
if (fsStoreOrder.getDeliveryCode().equals(ShipperCodeEnum.SF.getValue())) {
|
|
|
if (store.getSendPhone() != null) {
|
|
if (store.getSendPhone() != null) {
|
|
@@ -1492,6 +1651,21 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
|
|
|
}
|
|
}
|
|
|
storeOrder.setPayTime(new Date());
|
|
storeOrder.setPayTime(new Date());
|
|
|
fsStoreOrderMapper.updateFsStoreOrder(storeOrder);
|
|
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());
|
|
|
|
|
+ //处理 orderCount 为 null 的情况:null 视为 0
|
|
|
|
|
+ long currentCount = user.getOrderCount() != null ? user.getOrderCount() : 0;
|
|
|
|
|
+ user.setOrderCount(currentCount + 1);
|
|
|
|
|
+ fsUserMapper.updateFsUser(user);
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (Exception ex) {
|
|
|
|
|
+ // 仅记录日志,这个更新逻辑如果异常不回滚其他逻辑代码
|
|
|
|
|
+ log.error("更新用户下单次数失败,订单: {}, 用户: {}", order.getOrderCode(), order.getUserId(), ex);
|
|
|
|
|
+ }
|
|
|
//更新优惠券状态
|
|
//更新优惠券状态
|
|
|
if (order.getUserCouponId() != null && order.getUserCouponId() > 0) {
|
|
if (order.getUserCouponId() != null && order.getUserCouponId() > 0) {
|
|
|
FsUserCoupon userCoupon = userCouponService.selectFsUserCouponById(order.getUserCouponId());
|
|
FsUserCoupon userCoupon = userCouponService.selectFsUserCouponById(order.getUserCouponId());
|
|
@@ -1517,7 +1691,27 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
|
|
|
return R.error();
|
|
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
|
|
@Override
|
|
|
public Long selectFsStoreOrderTotalCount(int type, Long companyId) {
|
|
public Long selectFsStoreOrderTotalCount(int type, Long companyId) {
|
|
|
return fsStoreOrderMapper.selectFsStoreOrderTotalCount(type, companyId);
|
|
return fsStoreOrderMapper.selectFsStoreOrderTotalCount(type, companyId);
|
|
@@ -3708,6 +3902,18 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
|
|
|
failureMsg.append(msg).append("该状态不支持修改为待推送");
|
|
failureMsg.append(msg).append("该状态不支持修改为待推送");
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
|
|
+ if ("-1".equals(vo.getStatus())) {
|
|
|
|
|
+ failureNum++;
|
|
|
|
|
+ String msg = "<br/>" + failureNum + "、订单编号 " + vo.getOrderCode() + " 导入失败:";
|
|
|
|
|
+ failureMsg.append(msg).append("该状态不支持修改为退款中,需要手动申请退款");
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ if ("-2".equals(vo.getStatus())) {
|
|
|
|
|
+ failureNum++;
|
|
|
|
|
+ String msg = "<br/>" + failureNum + "、订单编号 " + vo.getOrderCode() + " 导入失败:";
|
|
|
|
|
+ failureMsg.append(msg).append("该状态不支持修改为退款中,需要审核完成退款");
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
Integer status = o.getStatus();
|
|
Integer status = o.getStatus();
|
|
|
|
|
|
|
@@ -3908,4 +4114,302 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
|
|
|
return 1;
|
|
return 1;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public FsStoreOrderAmountStatsVo selectFsStoreOrderAmountStats(FsStoreOrderAmountStatsQueryDto queryDto) {
|
|
|
|
|
+ return fsStoreOrderMapper.selectFsStoreOrderAmountStats(queryDto);
|
|
|
|
|
+ }
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ FsStoreOrderScrmMapper storeOrderScrmMapper;
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ IFsStoreOrderLogsScrmService iFsStoreOrderLogsScrmService;
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void deliveryOrderScrm(String orderCode, String deliveryId, String deliverCode, String deliverName) {
|
|
|
|
|
+ FsStoreOrderScrm order = fsStoreOrderMapper.selectFsStoreOrderScrmByOrderCode(orderCode);
|
|
|
|
|
+ if (order != null && order.getStatus() == 1) {
|
|
|
|
|
+ FsExpress express = expressService.selectFsExpressByOmsCode(deliverCode);
|
|
|
|
|
+ if (express != null) {
|
|
|
|
|
+ order.setDeliveryName(deliverName);
|
|
|
|
|
+ order.setDeliveryCode(express.getCode());
|
|
|
|
|
+ }
|
|
|
|
|
+ order.setStatus(2);
|
|
|
|
|
+ order.setDeliverySn(deliveryId);
|
|
|
|
|
+ order.setDeliverySendTime(DateUtils.getNowDate());
|
|
|
|
|
+ storeOrderScrmMapper.updateFsStoreOrder(order);
|
|
|
|
|
+ iFsStoreOrderLogsScrmService.create(order.getId(), FsStoreOrderLogEnum.DELIVERY_GOODS.getValue(), FsStoreOrderLogEnum.DELIVERY_GOODS.getDesc());
|
|
|
|
|
+ if (order.getCompanyId() != null && order.getCompanyId() > 0) {
|
|
|
|
|
+ companyService.subtractCompanyMoneyScrm(order);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ FsStore store = fsStoreMapper.selectFsStoreByStoreId(order.getStoreId());
|
|
|
|
|
+ //订阅物流回调
|
|
|
|
|
+ String lastFourNumber = "";
|
|
|
|
|
+ if (order.getDeliveryCode().equals(ShipperCodeEnum.SF.getValue())) {
|
|
|
|
|
+ if (store != null && store.getSendPhone() != null) {
|
|
|
|
|
+ lastFourNumber = store.getSendPhone();
|
|
|
|
|
+ } else {
|
|
|
|
|
+ lastFourNumber = order.getUserPhone();
|
|
|
|
|
+ }
|
|
|
|
|
+ if (lastFourNumber.length() == 11) {
|
|
|
|
|
+ lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ expressService.subscribeEspress(order.getOrderCode(), order.getDeliveryCode(), order.getDeliverySn(), lastFourNumber);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public FsStoreOrderScrm selectFsStoreOrderScrmByOrderCode(String soId) {
|
|
|
|
|
+ return fsStoreOrderMapper.selectFsStoreOrderScrmByOrderCode(soId);
|
|
|
|
|
+ }
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public FsStoreOrder confirmOrder(FsPackageOrder packageOrder, Long doctorId) {
|
|
|
|
|
+
|
|
|
|
|
+ FsPackage fsPackage = fsPackageMapper.selectFsPackageByPackageId(packageOrder.getPackageId());
|
|
|
|
|
+ JSONArray objects = JSONUtil.parseArray(fsPackage.getProductJson());
|
|
|
|
|
+ List<FsPackagePruductDTO> products = JSONUtil.toList(objects, FsPackagePruductDTO.class);
|
|
|
|
|
+ Map<String, Object> packageJson = (Map) JSON.parse(packageOrder.getPackageJson());
|
|
|
|
|
+ Integer packageSubType = (Integer) packageJson.get("packageSubType");
|
|
|
|
|
+ Integer productType = (Integer) packageJson.get("productType");
|
|
|
|
|
+ FsStoreOrder order = new FsStoreOrder();
|
|
|
|
|
+ Long prescribeId =null;
|
|
|
|
|
+ if (productType==1 || packageSubType==2){
|
|
|
|
|
+ if (packageOrder.getDoctorId() == null) {
|
|
|
|
|
+ Long doctorID = iFsDoctorService.selectFsDoctorDoctorByPackage();
|
|
|
|
|
+ packageOrder.setDoctorId(doctorID);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (packageSubType == 3 ) {
|
|
|
|
|
+ inquiryOrderService.createOrderByPackageOrderStatus4(packageOrder);
|
|
|
|
|
+ }
|
|
|
|
|
+ prescribeId = fsPrescribeService.insertFsPrescribeByPackageOrder(packageOrder);
|
|
|
|
|
+ order.setPrescribeId(prescribeId);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ List<FsStoreOrderItem> items = new ArrayList<>();
|
|
|
|
|
+ log.info("套餐包生成药品订单:{}", packageOrder.getOrderSn());
|
|
|
|
|
+ order.setOrderCode(packageOrder.getOrderSn());
|
|
|
|
|
+ order.setUserId(packageOrder.getUserId());
|
|
|
|
|
+ order.setStoreId(fsPackage.getStoreId());
|
|
|
|
|
+
|
|
|
|
|
+ order.setStatus(1);
|
|
|
|
|
+ order.setPayDelivery(packageOrder.getPayDelivery());
|
|
|
|
|
+ order.setPayRemain(packageOrder.getPayRemain());
|
|
|
|
|
+ order.setPayType(packageOrder.getPayType());
|
|
|
|
|
+ order.setPackageSecondName(packageOrder.getPackageSecondName());
|
|
|
|
|
+ order.setDoctorId(packageOrder.getDoctorId());
|
|
|
|
|
+
|
|
|
|
|
+ order.setPackageId(packageOrder.getPackageId());
|
|
|
|
|
+ order.setPackageName(packageOrder.getPackageName());
|
|
|
|
|
+ order.setPrescribePrice(packageOrder.getTotalPrice());
|
|
|
|
|
+ order.setDiscountMoney(packageOrder.getDiscountMoney());
|
|
|
|
|
+ order.setDeptId(packageOrder.getDeptId());
|
|
|
|
|
+ order.setCompanyId(packageOrder.getCompanyId());
|
|
|
|
|
+ order.setCompanyUserId(packageOrder.getCompanyUserId());
|
|
|
|
|
+ order.setPackageOrderId(packageOrder.getOrderId());
|
|
|
|
|
+ order.setCreateTime(new Date());
|
|
|
|
|
+ if (packageOrder.getSource() != null) {
|
|
|
|
|
+ order.setSource(packageOrder.getSource());
|
|
|
|
|
+ }
|
|
|
|
|
+ String addressJson = packageOrder.getAddressJson();
|
|
|
|
|
+ if (addressJson != null && addressJson != "") {
|
|
|
|
|
+ Map<String, String> parse = (Map) JSON.parse(addressJson);
|
|
|
|
|
+ order.setUserName(parse.get("userName"));
|
|
|
|
|
+ order.setUserPhone(parse.get("userPhone"));
|
|
|
|
|
+ order.setUserAddress(parse.get("userAddress"));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ Long totalNum = 0L;
|
|
|
|
|
+ BigDecimal totalPrice = new BigDecimal(0);
|
|
|
|
|
+ boolean noTui = false;
|
|
|
|
|
+ for (FsPackagePruductDTO product : products) {
|
|
|
|
|
+ if (product.getBarCode().equals("106013")) {
|
|
|
|
|
+ noTui = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ totalPrice = totalPrice.add(product.getPrice().multiply(BigDecimal.valueOf(product.getCount())));
|
|
|
|
|
+ totalNum = totalNum + product.getCount();
|
|
|
|
|
+ FsStoreOrderItem item = new FsStoreOrderItem();
|
|
|
|
|
+ item.setProductId(product.getProductId());
|
|
|
|
|
+ item.setStoreId(fsPackage.getStoreId());
|
|
|
|
|
+ item.setProductAttrValueId(product.getId());
|
|
|
|
|
+ item.setNum(Long.parseLong(product.getCount().toString()));
|
|
|
|
|
+ item.setIsDrug(product.getIsDrug());
|
|
|
|
|
+ FsStoreOrderItemDTO dto = new FsStoreOrderItemDTO();
|
|
|
|
|
+ dto.setImage(product.getImage());
|
|
|
|
|
+ dto.setNum(Long.parseLong(product.getCount().toString()));
|
|
|
|
|
+ dto.setProductName(product.getProductName());
|
|
|
|
|
+ dto.setProductId(product.getProductId());
|
|
|
|
|
+ dto.setSku(product.getSku());
|
|
|
|
|
+ dto.setBarCode(product.getBarCode());
|
|
|
|
|
+ dto.setPrice(product.getPrice());
|
|
|
|
|
+ dto.setNum(Long.parseLong(product.getCount().toString()));
|
|
|
|
|
+ dto.setImage(product.getImage());
|
|
|
|
|
+ item.setIsPrescribe(0);
|
|
|
|
|
+ item.setJsonInfo(JSON.toJSONString(dto));
|
|
|
|
|
+ item.setIsGift(0);
|
|
|
|
|
+ items.add(item);
|
|
|
|
|
+ }
|
|
|
|
|
+ String json = configService.selectConfigByKey("his.package");
|
|
|
|
|
+ PackageConfigDTO configDTO = JSONUtil.toBean(json, PackageConfigDTO.class);
|
|
|
|
|
+ FsPackageOrder fsPackageOrder = new FsPackageOrder();
|
|
|
|
|
+ //赠品处理
|
|
|
|
|
+ if (configDTO.getGiftStoreId() != null && configDTO.getGiftStoreId() == packageOrder.getStoreId() && packageOrder.getCompanyId() != null && packageOrder.getCompanyId() > 0 && packageOrder.getPayType().equals(1) && packageOrder.getPayMoney().compareTo(configDTO.getGiftPrice()) >= 0) {
|
|
|
|
|
+ if (configDTO.getGift() != null && !configDTO.getGift().isEmpty()) {
|
|
|
|
|
+ for (StoreOrderProductDTO product : configDTO.getGift()) {
|
|
|
|
|
+ totalNum = totalNum + product.getCount();
|
|
|
|
|
+ FsStoreOrderItem item = new FsStoreOrderItem();
|
|
|
|
|
+ item.setProductId(product.getProductId());
|
|
|
|
|
+ item.setStoreId(fsPackage.getStoreId());
|
|
|
|
|
+ item.setProductAttrValueId(product.getId());
|
|
|
|
|
+ item.setNum(Long.parseLong(product.getCount().toString()));
|
|
|
|
|
+ FsStoreOrderItemDTO dto = new FsStoreOrderItemDTO();
|
|
|
|
|
+ dto.setImage(product.getImage());
|
|
|
|
|
+ dto.setNum(Long.parseLong(product.getCount().toString()));
|
|
|
|
|
+ dto.setProductName(product.getProductName());
|
|
|
|
|
+ dto.setProductId(product.getProductId());
|
|
|
|
|
+ dto.setSku(product.getSku());
|
|
|
|
|
+ dto.setBarCode(product.getBarCode());
|
|
|
|
|
+ dto.setPrice(product.getPrice());
|
|
|
|
|
+ if (product.getCount() != null) {
|
|
|
|
|
+ dto.setNum(Long.parseLong(product.getCount().toString()));
|
|
|
|
|
+ }
|
|
|
|
|
+ dto.setImage(product.getImage());
|
|
|
|
|
+ item.setIsPrescribe(0);
|
|
|
|
|
+ item.setJsonInfo(JSON.toJSONString(dto));
|
|
|
|
|
+ item.setIsGift(1);
|
|
|
|
|
+ items.add(item);
|
|
|
|
|
+ fsPackageOrder.setProductCostPrice(packageOrder.getProductCostPrice().add(product.getCostPrice()));
|
|
|
|
|
+ fsPackageOrder.setTotalCostPrice(packageOrder.getTotalCostPrice().add(product.getCostPrice()));
|
|
|
|
|
+ fsPackageOrder.setCostDiscountMoney(packageOrder.getCostDiscountMoney().subtract(product.getCostPrice()));
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ //物流代收赠品
|
|
|
|
|
+ if (configDTO.getGiftStoreId() != null && configDTO.getGiftStoreId() == packageOrder.getStoreId() && packageOrder.getCompanyId() != null && packageOrder.getCompanyId() > 0 && packageOrder.getPayType().equals(2) && packageOrder.getPayPrice().compareTo(configDTO.getGiftPrice()) >= 0) {
|
|
|
|
|
+ if (configDTO.getDeliveryGift() != null && !configDTO.getDeliveryGift().isEmpty()) {
|
|
|
|
|
+ for (StoreOrderProductDTO product : configDTO.getDeliveryGift()) {
|
|
|
|
|
+ totalNum = totalNum + product.getCount();
|
|
|
|
|
+ FsStoreOrderItem item = new FsStoreOrderItem();
|
|
|
|
|
+ item.setProductId(product.getProductId());
|
|
|
|
|
+ item.setStoreId(fsPackage.getStoreId());
|
|
|
|
|
+ item.setProductAttrValueId(product.getId());
|
|
|
|
|
+ item.setNum(Long.parseLong(product.getCount().toString()));
|
|
|
|
|
+ FsStoreOrderItemDTO dto = new FsStoreOrderItemDTO();
|
|
|
|
|
+ dto.setImage(product.getImage());
|
|
|
|
|
+ dto.setNum(Long.parseLong(product.getCount().toString()));
|
|
|
|
|
+ dto.setProductName(product.getProductName());
|
|
|
|
|
+ dto.setProductId(product.getProductId());
|
|
|
|
|
+ dto.setSku(product.getSku());
|
|
|
|
|
+ dto.setBarCode(product.getBarCode());
|
|
|
|
|
+ dto.setPrice(product.getPrice());
|
|
|
|
|
+ if (product.getCount() != null) {
|
|
|
|
|
+ dto.setNum(Long.parseLong(product.getCount().toString()));
|
|
|
|
|
+ }
|
|
|
|
|
+ dto.setImage(product.getImage());
|
|
|
|
|
+ item.setIsPrescribe(0);
|
|
|
|
|
+ item.setJsonInfo(JSON.toJSONString(dto));
|
|
|
|
|
+ item.setIsGift(1);
|
|
|
|
|
+ items.add(item);
|
|
|
|
|
+ fsPackageOrder.setProductCostPrice(packageOrder.getProductCostPrice().add(product.getCostPrice()));
|
|
|
|
|
+ fsPackageOrder.setTotalCostPrice(packageOrder.getTotalCostPrice().add(product.getCostPrice()));
|
|
|
|
|
+ fsPackageOrder.setCostDiscountMoney(packageOrder.getCostDiscountMoney().subtract(product.getCostPrice()));
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey("his.store");
|
|
|
|
|
+ Map<String, Object> config = (Map<String, Object>) JSON.parse(sysConfig.getConfigValue());
|
|
|
|
|
+ Integer followRate = (Integer) config.get("followRate");
|
|
|
|
|
+ Long followDoctorId = fsPackageOrderMapper.selectFsPackageOrderByUserId(order.getUserId());
|
|
|
|
|
+ if (followDoctorId != null && followDoctorId > 0) {
|
|
|
|
|
+ order.setFollowDoctorId(followDoctorId);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ if (packageOrder.getCompanyId() != null) {
|
|
|
|
|
+ Company company = companyService.selectCompanyById(packageOrder.getCompanyId());
|
|
|
|
|
+ if (company != null) {
|
|
|
|
|
+ String followDoctorIdsJson = company.getFollowDoctorIds();
|
|
|
|
|
+ if (followDoctorIdsJson != null && followDoctorIdsJson != "") {
|
|
|
|
|
+ long[] ids = JSON.parseObject(followDoctorIdsJson, long[].class);
|
|
|
|
|
+ if (ids.length > 0) {
|
|
|
|
|
+ Random random = new Random();
|
|
|
|
|
+ // 从数组中随机选择一个数字
|
|
|
|
|
+ int randomIndex = random.nextInt(ids.length);
|
|
|
|
|
+ long randomId = ids[randomIndex];
|
|
|
|
|
+ order.setFollowDoctorId(randomId);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (order.getFollowDoctorId() == null) {
|
|
|
|
|
+ order.setFollowDoctorId(iFsDoctorService.selectFollowDoctorDoctorByPackage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ order.setOrderType(fsPackage.getProductType());
|
|
|
|
|
+ order.setTotalNum(totalNum);
|
|
|
|
|
+ order.setTotalPrice(totalPrice);
|
|
|
|
|
+ order.setPayPrice(packageOrder.getPayPrice());
|
|
|
|
|
+ order.setPayMoney(packageOrder.getPayMoney());
|
|
|
|
|
+ order.setIsPay(0);
|
|
|
|
|
+ order.setItemJson(JSONUtil.toJsonStr(items));
|
|
|
|
|
+
|
|
|
|
|
+ if (packageOrder.getCycle() >= followRate) {
|
|
|
|
|
+ Calendar calendar = Calendar.getInstance();
|
|
|
|
|
+ calendar.setTime(new Date());
|
|
|
|
|
+ calendar.add(Calendar.DAY_OF_MONTH, followRate);
|
|
|
|
|
+ order.setFollowTime(calendar.getTime());
|
|
|
|
|
+ order.setCycle(packageOrder.getCycle());
|
|
|
|
|
+ Calendar calendar2 = Calendar.getInstance();
|
|
|
|
|
+ calendar2.setTime(new Date());
|
|
|
|
|
+ calendar2.add(Calendar.DAY_OF_MONTH, 30 + packageOrder.getCycle());
|
|
|
|
|
+ order.setFollowEndTime(calendar2.getTime());
|
|
|
|
|
+ order.setFollowStatus(0);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (fsStoreOrderMapper.insertFsStoreOrder(order) > 0) {
|
|
|
|
|
+
|
|
|
|
|
+ if (order.getOrderId() == null) {
|
|
|
|
|
+ throw new CustomException("订单id为空" + order);
|
|
|
|
|
+ }
|
|
|
|
|
+ fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.CREATE_ORDER.getValue(),
|
|
|
|
|
+ FsStoreOrderLogEnum.CREATE_ORDER.getDesc());
|
|
|
|
|
+ fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.UN_PAY_ORDER.getValue(),
|
|
|
|
|
+ FsStoreOrderLogEnum.UN_PAY_ORDER.getDesc());
|
|
|
|
|
+
|
|
|
|
|
+ if (prescribeId != null) {
|
|
|
|
|
+ FsPrescribe fsPrescribe = new FsPrescribe();
|
|
|
|
|
+ fsPrescribe.setPrescribeId(prescribeId);
|
|
|
|
|
+ fsPrescribe.setStoreOrderId(order.getOrderId());
|
|
|
|
|
+ fsPrescribeService.updateFsPrescribe(fsPrescribe);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ for (FsStoreOrderItem item : items) {
|
|
|
|
|
+ item.setOrderId(order.getOrderId());
|
|
|
|
|
+ fsStoreOrderItemMapper.insertFsStoreOrderItem(item);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (noTui) {
|
|
|
|
|
+ FsStoreOrder fsStoreOrder = new FsStoreOrder();
|
|
|
|
|
+ fsStoreOrder.setOrderId(order.getOrderId());
|
|
|
|
|
+ fsStoreOrder.setExtendOrderId("XN");
|
|
|
|
|
+ fsStoreOrderMapper.updateFsStoreOrder(fsStoreOrder);
|
|
|
|
|
+ }
|
|
|
|
|
+ FsUser fsUser = fsUserService.selectFsUserByUserId(order.getUserId());
|
|
|
|
|
+ if (fsUser.getIsBuy() == null || fsUser.getIsBuy() == 0) {
|
|
|
|
|
+ FsUser u = new FsUser();
|
|
|
|
|
+ u.setUserId(order.getUserId());
|
|
|
|
|
+ u.setIsBuy(1);
|
|
|
|
|
+ fsUserService.updateFsUser(u);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return order;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public List<FsStoreOrder> selectOutTimeOrderList(Integer unPayTime) {
|
|
|
|
|
+ return fsStoreOrderMapper.selectOutTimeOrderList(unPayTime);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|