From 996b2f16afaa271ce8aad6abf6858aa5db503eb3 Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期六, 25 四月 2026 14:07:34 +0800
Subject: [PATCH] 代码生成
---
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java | 1429 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 1,250 insertions(+), 179 deletions(-)
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
index 3e2c1ce..6198ee9 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
@@ -8,15 +8,18 @@
import com.doumee.biz.system.OperationConfigBiz;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.config.wx.WxMiniConfig;
-import com.doumee.config.wx.WxMiniUtilService;
+import com.doumee.config.wx.WxPayProperties;
+import com.doumee.config.wx.WxPayV3Service;
+import com.wechat.pay.java.service.refund.model.Refund;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.DateUtil;
-import com.doumee.core.utils.Tencent.MapUtil;
+import com.doumee.core.utils.geocode.MapUtil;
import com.doumee.core.utils.Utils;
+import com.doumee.core.utils.aliyun.AliSmsService;
import com.doumee.dao.business.*;
import com.doumee.dao.business.model.*;
import com.doumee.dao.system.SystemUserMapper;
@@ -30,38 +33,35 @@
import com.doumee.dao.dto.MyOrderDTO;
import com.doumee.dao.dto.OrderItemDTO;
import com.doumee.dao.vo.*;
+import com.doumee.service.business.NoticeService;
import com.doumee.service.business.OrderLogService;
import com.doumee.service.business.OrdersService;
+import com.doumee.dao.business.model.Notice;
import com.doumee.service.business.AreasService;
import com.doumee.service.business.PricingRuleService;
-import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
-import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.math.RoundingMode;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
import java.util.*;
import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
/**
* 瀵勫瓨璁㈠崟淇℃伅Service瀹炵幇
* @author rk
* @date 2026/04/10
*/
+@Slf4j
@Service
public class OrdersServiceImpl implements OrdersService {
@@ -104,8 +104,7 @@
@Autowired
private RevenueMapper revenueMapper;
- @Autowired
- private WxMiniUtilService wxMiniUtilService;
+
@Autowired
private SystemUserMapper systemUserMapper;
@@ -127,6 +126,18 @@
@Autowired
private AreasService areasService;
+
+ @Autowired
+ private NoticeService noticeService;
+
+ @Autowired
+ private SmsrecordMapper smsrecordMapper;
+
+ @Autowired
+ private WxPayV3Service wxPayV3Service;
+
+ @Autowired
+ private WxPayProperties wxPayProperties;
@Override
public Integer create(Orders orders) {
@@ -218,6 +229,7 @@
queryWrapper.eq(pageWrap.getModel().getTakeShopId() != null, Orders::getTakeShopId, pageWrap.getModel().getTakeShopId());
queryWrapper.and(pageWrap.getModel().getDriverKeyword() != null, i->i.like(DriverInfo::getName, pageWrap.getModel().getDriverKeyword())
.or().like(DriverInfo::getTelephone, pageWrap.getModel().getDriverKeyword()));
+ queryWrapper.eq(pageWrap.getModel().getSettlementStatus() != null, Orders::getSettlementStatus, pageWrap.getModel().getSettlementStatus());
for (PageWrap.SortData sortData : pageWrap.getSorts()) {
if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
queryWrapper.orderByDesc(sortData.getProperty());
@@ -251,6 +263,7 @@
queryWrapper.eq(pageWrap.getModel().getTakeShopId() != null, Orders::getTakeShopId, pageWrap.getModel().getTakeShopId());
queryWrapper.and(pageWrap.getModel().getDriverKeyword() != null, i->i.like(DriverInfo::getName, pageWrap.getModel().getDriverKeyword())
.or().like(DriverInfo::getTelephone, pageWrap.getModel().getDriverKeyword()));
+ queryWrapper.eq(pageWrap.getModel().getSettlementStatus() != null, Orders::getSettlementStatus, pageWrap.getModel().getSettlementStatus());
queryWrapper.select(
"IFNULL(SUM(t.total_amount), 0) as total_amount_sum",
@@ -289,7 +302,7 @@
return BigDecimal.ZERO;
}
String rateStr = systemDictDataBiz.queryByCode(Constants.OPERATION_CONFIG, Constants.OP_INSURANCE_RATE).getCode();
- BigDecimal rate = new BigDecimal(rateStr);
+ BigDecimal rate = new BigDecimal(rateStr).divide(new BigDecimal("100"), 4, BigDecimal.ROUND_HALF_UP);
return declaredValue.multiply(rate).setScale(2, BigDecimal.ROUND_HALF_UP);
}
@@ -337,9 +350,11 @@
List<Category> categories = categoryMapper.selectBatchIds(categoryIds);
Map<Integer, String> categoryNameMap = new HashMap<>();
Map<Integer, String> categoryDetailMap = new HashMap<>();
+ Map<Integer, String> categoryOtherFieldMap = new HashMap<>();
for (Category c : categories) {
categoryNameMap.put(c.getId(), c.getName());
categoryDetailMap.put(c.getId(), c.getDetail());
+ categoryOtherFieldMap.put(c.getId(),c.getOtherField());
}
// 璁$畻姣忛」鐗╁搧璐圭敤锛氬皬璁� = 鍗曚环 脳 鏁伴噺 脳 澶╂暟
@@ -359,7 +374,7 @@
ItemPriceVO vo = new ItemPriceVO();
vo.setCategoryId(item.getCategoryId());
vo.setCategoryName(categoryNameMap.getOrDefault(item.getCategoryId(), ""));
- vo.setDetail(categoryDetailMap.get(item.getCategoryId()));
+ vo.setDetail(categoryOtherFieldMap.get(item.getCategoryId()));
vo.setQuantity(item.getQuantity());
vo.setUnitPrice(unitPrice);
vo.setLocallyPrice(unitPrice);
@@ -413,10 +428,13 @@
// 1. 璋冪敤鑵捐鍦板浘璺濈鐭╅樀API璁$畻椹捐溅璺濈
String from = dto.getFromLat() + "," + dto.getFromLgt();
String to = dto.getToLat() + "," + dto.getToLgt();
- JSONObject distanceResult = MapUtil.distanceSingle("driving", from, to);
+ JSONObject distanceResult = MapUtil.direction("driving", from, to);
BigDecimal distance = distanceResult.getBigDecimal("distance");
- // distance 鍗曚綅涓虹背锛岃浆涓哄叕閲�
+ // distance 鍗曚綅涓虹背锛岃浆涓哄叕閲岋紙涓嶈冻1鍏噷鎸�1鍏噷璁$畻锛�
BigDecimal distanceKm = distance.divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP);
+ if (distanceKm.compareTo(BigDecimal.ONE) < 0) {
+ distanceKm = BigDecimal.ONE;
+ }
// 鏀堕泦鎵�鏈夌墿鍝佺被鍨婭D
List<Integer> categoryIds = new ArrayList<>();
@@ -454,9 +472,11 @@
List<Category> categories = categoryMapper.selectBatchIds(categoryIds);
Map<Integer, String> categoryNameMap = new HashMap<>();
Map<Integer, String> categoryDetailMap = new HashMap<>();
+ Map<Integer, String> categoryOtherFieldMap = new HashMap<>();
for (Category c : categories) {
categoryNameMap.put(c.getId(), c.getName());
categoryDetailMap.put(c.getId(), c.getDetail());
+ categoryOtherFieldMap.put(c.getId(),c.getOtherField());
}
// 3. 閫愰」璁$畻杩愯垂锛氳捣姝ヤ环 + 瓒呭嚭閮ㄥ垎闃舵浠�
@@ -495,7 +515,7 @@
ItemPriceVO vo = new ItemPriceVO();
vo.setCategoryId(item.getCategoryId());
vo.setCategoryName(categoryNameMap.getOrDefault(item.getCategoryId(), ""));
- vo.setDetail(categoryDetailMap.get(item.getCategoryId()));
+ vo.setDetail(categoryOtherFieldMap.get(item.getCategoryId()));
vo.setQuantity(item.getQuantity());
vo.setUnitPrice(unitPrice);
vo.setLocallyPrice(locallyPrice);
@@ -518,16 +538,17 @@
// 5. 鍔犳�ヨ垂鐢細鐗╁搧浠锋牸 脳 鍔犳�ョ郴鏁�(瀛楀吀 URGENT_COEFFICIENT)
long urgentFeeFen = 0L;
- if (Boolean.TRUE.equals(dto.getUrgent())) {
- String urgentRateStr = systemDictDataBiz.queryByCode(
- Constants.OPERATION_CONFIG, Constants.OP_URGENT_COEFFICIENT).getCode();
- BigDecimal urgentRate = new BigDecimal(urgentRateStr);
- urgentFeeFen = new BigDecimal(itemPriceTotal).multiply(urgentRate)
- .setScale(0, RoundingMode.HALF_UP).longValue();
- }
+ String urgentRateStr = systemDictDataBiz.queryByCode(
+ Constants.OPERATION_CONFIG, Constants.OP_URGENT_COEFFICIENT).getCode();
+ BigDecimal urgentRate = new BigDecimal(urgentRateStr);
+ urgentFeeFen = new BigDecimal(itemPriceTotal).multiply(urgentRate)
+ .setScale(0, RoundingMode.HALF_UP).longValue();
- // 6. 鎬讳环鏍� = 鐗╁搧浠锋牸 + 淇濅环璐圭敤 + 鍔犳�ヨ垂鐢�
- long totalPrice = itemPriceTotal + insuranceFeeFen + urgentFeeFen;
+ // 6. 鎬讳环鏍� = 鐗╁搧浠锋牸 + 淇濅环璐圭敤 + 鍔犳�ヨ垂鐢紙鍔犳�ユ椂鎵嶅寘鍚姞鎬ヨ垂锛�
+ long totalPrice = itemPriceTotal + insuranceFeeFen;
+ if (Boolean.TRUE.equals(dto.getUrgent())) {
+ totalPrice += urgentFeeFen;
+ }
PriceCalculateVO result = new PriceCalculateVO();
result.setItemList(itemList);
@@ -536,6 +557,33 @@
result.setUrgentFee(urgentFeeFen);
result.setTotalPrice(totalPrice);
result.setDistance(distanceKm);
+
+ // 7. 棰勮閫佽揪鏃堕暱锛歱ricing_rule type=2锛坒ieldA=1鏍囬�熻揪锛宖ieldA=2鏋侀�熻揪锛�
+ List<PricingRule> timeRules = pricingRuleMapper.selectList(new QueryWrapper<PricingRule>().lambda()
+ .eq(PricingRule::getDeleted, Constants.ZERO)
+ .eq(PricingRule::getType, Constants.TWO)
+ .eq(PricingRule::getCityId, dto.getCityId())
+ .in(PricingRule::getFieldA, Arrays.asList("1", "2")));
+ for (PricingRule tr : timeRules) {
+ BigDecimal baseKm = new BigDecimal(tr.getFieldB());
+ int baseHours = Integer.parseInt(tr.getFieldC());
+ BigDecimal extraKm = new BigDecimal(tr.getFieldD());
+ int extraHours = Integer.parseInt(tr.getFieldE());
+ int hours;
+ if (distanceKm.compareTo(baseKm) <= 0) {
+ hours = baseHours;
+ } else {
+ BigDecimal overDistance = distanceKm.subtract(baseKm);
+ int extraCount = overDistance.divide(extraKm, 0, RoundingMode.CEILING).intValue();
+ hours = baseHours + extraCount * extraHours;
+ }
+ if ("1".equals(tr.getFieldA())) {
+ result.setStandardHours(hours);
+ } else if ("2".equals(tr.getFieldA())) {
+ result.setUrgentHours(hours);
+ }
+ }
+
return result;
}
@@ -612,8 +660,11 @@
// ========== 3. 鏌ヨ瀵勪欢搴楅摵淇℃伅 ==========
ShopInfo depositShop = shopInfoMapper.selectById(dto.getDepositShopId());
- if (depositShop == null) {
+ if (depositShop == null || Constants.equalsInteger(depositShop.getDeleted(), Constants.ONE)) {
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵勪欢搴楅摵涓嶅瓨鍦�");
+ }
+ if (depositShop.getStatus() == null || !Constants.equalsInteger(depositShop.getStatus(), Constants.ZERO)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵勪欢搴楅摵宸插仠涓氾紝璇烽�夋嫨鍏朵粬闂ㄥ簵");
}
// ========== 4. 璁$畻璐圭敤 ==========
@@ -630,18 +681,24 @@
}
// 鍙栦欢鐐癸細搴楅摵 or 鑷�夌偣锛岃嚦灏戞彁渚涗竴缁�
if (dto.getTakeShopId() != null) {
+ if (dto.getTakeShopId().equals(dto.getDepositShopId())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "寮傚湴瀵勫瓨璁㈠崟瀛樹欢闂ㄥ簵鍜屽彇浠堕棬搴椾笉鑳界浉鍚�");
+ }
takeShop = shopInfoMapper.selectById(dto.getTakeShopId());
- if (takeShop == null) {
+ if (takeShop == null || Constants.equalsInteger(takeShop.getDeleted(), Constants.ONE)) {
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鍙栦欢搴楅摵涓嶅瓨鍦�");
+ }
+ if (takeShop.getStatus() == null || Constants.equalsInteger(takeShop.getStatus(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鍙栦欢搴楅摵宸插仠涓氾紝璇烽�夋嫨鍏朵粬闂ㄥ簵");
}
takeLat = BigDecimal.valueOf(takeShop.getLatitude());
takeLgt = BigDecimal.valueOf(takeShop.getLongitude());
takeLocationValue = takeShop.getAddress();
} else if (dto.getTakeLat() != null && dto.getTakeLgt() != null && StringUtils.isNotBlank(dto.getTakeLocation())) {
// 鏃犲彇浠堕棬搴楋紝鏍¢獙瀛樹欢鐐逛笌鑷�夊彇浠剁偣鏄惁鍦ㄥ悓涓�鍩庡競
- if (MapUtil.isSameCity(depositShop.getLatitude(), depositShop.getLongitude(),
+ if (!MapUtil.isSameCity(depositShop.getLatitude(), depositShop.getLongitude(),
dto.getTakeLat().doubleValue(), dto.getTakeLgt().doubleValue())) {
- throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "寮傚湴瀵勫瓨璁㈠崟瀛樺彇鐐逛笉鑳藉湪鍚屼竴鍩庡競锛屽闇�鍚屽煄瀵勫瓨璇烽�夋嫨灏辫繎闂ㄥ簵");
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "寮傚湴瀵勫瓨璁㈠崟瀛樺彇鐐逛笉鍦ㄥ悓涓�鍩庡競锛屽闇�璇烽�夋嫨鍚屽煄闂ㄥ簵");
}
takeLat = dto.getTakeLat();
takeLgt = dto.getTakeLgt();
@@ -731,6 +788,7 @@
orders.setTakeLat(takeLat);
orders.setTakeLgt(takeLgt);
orders.setIsUrgent(dto.getIsUrgent());
+ orders.setDistance(priceResult.getDistance());
} else {
// 灏卞湴锛氬彇浠剁偣鍚屽瘎浠跺簵閾�
orders.setTakeShopId(dto.getDepositShopId());
@@ -742,6 +800,12 @@
// 鐗╁搧淇℃伅
orders.setGoodType(dto.getGoodType());
+ // 鏌ヨ鐗╁搧绾у埆 type = 3
+ Category levelCategory = categoryMapper.selectById(goodTypeCategory.getRelationId());
+ if(Objects.isNull(levelCategory)){
+ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌鐗╁搧绛夌骇淇℃伅锛歿}"+goodTypeCategory.getName());
+ }
+ orders.setGoodLevel(Integer.valueOf(levelCategory.getDetail()));
// 鎷兼帴鐗╁搧淇℃伅锛氱墿鍝佺被鍨嬪悕绉般�佸昂瀵稿悕绉�*鏁伴噺锛堟暟缁勫瓧绗︿覆锛�
List<String> goodsParts = new ArrayList<>();
for (ItemPriceVO itemVO : priceResult.getItemList()) {
@@ -763,9 +827,12 @@
}
orders.setDeclaredFee(priceResult.getInsuranceFee());
orders.setPrice(priceResult.getItemPrice());
-
// 钖叕璁$畻涓庡崰姣斿瓨鍌�
calculateAndSetFeeAllocation(orders, depositShop, takeShop);
+
+ // 鏃犱汉鎺ュ崟閫氱煡鐩稿叧鍒濆鍖�
+ orders.setPlatformSmsNotified(Constants.ZERO);
+ orders.setPlatformSmsNotifiedTime(now);
ordersMapper.insert(orders);
Integer orderId = orders.getId();
@@ -808,7 +875,8 @@
if (member == null || StringUtils.isBlank(member.getOpenid())) {
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鐢ㄦ埛淇℃伅寮傚父锛屾棤娉曞彂璧锋敮浠�");
}
- PayResponse payResponse = wxPay(orders, member.getOpenid(), Constants.OrdersAttach.STORAGE_ORDER);
+ PayResponse payResponse = wxPayV3(orders.getOutTradeNo(), orders.getTotalAmount(), orders.getId(),
+ member.getOpenid(), Constants.OrdersAttach.STORAGE_ORDER);
payResponse.setLockKey(lockKey);
return payResponse;
}
@@ -836,6 +904,7 @@
// 5. 閲嶆柊鐢熸垚绗笁鏂硅鍗曠紪鍙凤紙閬垮厤閲嶅锛�
String orderTradeNo = generateOrderTradeNo();
orders.setOutTradeNo(orderTradeNo);
+ orders.setPlatformSmsNotifiedTime(new Date());
orders.setUpdateTime(new Date());
ordersMapper.updateById(orders);
// 6. 鍞よ捣寰俊鏀粯
@@ -843,7 +912,8 @@
if (member == null || StringUtils.isBlank(member.getOpenid())) {
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鐢ㄦ埛淇℃伅寮傚父锛屾棤娉曞彂璧锋敮浠�");
}
- return wxPay(orders, member.getOpenid(), Constants.OrdersAttach.STORAGE_ORDER);
+ return wxPayV3(orders.getOutTradeNo(), orders.getTotalAmount(), orders.getId(),
+ member.getOpenid(), Constants.OrdersAttach.STORAGE_ORDER);
}
/**
@@ -878,7 +948,32 @@
}
}
+ /**
+ * 鍞よ捣寰俊鏀粯V3
+ *
+ * @param outTradeNo 鍟嗘埛璁㈠崟鍙�
+ * @param totalCents 鏀粯閲戦锛堝垎锛�
+ * @param orderId 璁㈠崟涓婚敭
+ * @param openid 鐢ㄦ埛寰俊openid
+ * @param ordersAttach 璁㈠崟鏀粯绫诲瀷
+ * @return PayResponse 鍖呭惈寰俊璋冭捣鍙傛暟鍜岃鍗曚富閿�
+ */
+ private PayResponse wxPayV3(String outTradeNo, Long totalCents, Integer orderId,
+ String openid, Constants.OrdersAttach ordersAttach) {
+ Map<String, String> payParams = wxPayV3Service.createOrder(
+ outTradeNo,
+ ordersAttach.getName(),
+ totalCents != null ? totalCents : 0L,
+ openid,
+ wxPayProperties.getV3NotifyUrl(),
+ ordersAttach.getKey()
+ );
+ PayResponse payResponse = new PayResponse();
+ payResponse.setResponse(payParams);
+ payResponse.setOrderId(orderId);
+ return payResponse;
+ }
@@ -952,9 +1047,6 @@
// 鍙栨秷/閫�娆剧姸鎬佹椂鏌ヨ閫�娆捐褰�
Integer status = order.getStatus();
if (status != null && (status == Constants.OrderStatus.overdue.getStatus()
- || status == Constants.OrderStatus.closed.getStatus()
- || status == Constants.OrderStatus.cancelOverdue.getStatus()
- || status == Constants.OrderStatus.cancelling.getStatus()
|| status == Constants.OrderStatus.cancelled.getStatus())) {
OrdersRefund ordersRefund = ordersRefundMapper.selectOne(
new QueryWrapper<OrdersRefund>().lambda()
@@ -1019,13 +1111,12 @@
String optUserName = getCurrentUserName();
- // 鍔犳�ヨ垂鏃ュ織锛堟瘡娆″崟鐙褰曟湰娆″姞鎬ヨ垂锛�
- Constants.OrderLogType urgentLogType = Constants.OrderLogType.urgent;
+ // 鍔犳�ヨ垂鏃ュ織
OrderLog feeLog = new OrderLog();
feeLog.setOrderId(order.getId());
- feeLog.setTitle(urgentLogType.getTitle());
- feeLog.setLogInfo(urgentLogType.getStatusInfo().replace("{param}", dto.getUrgentFee().toPlainString()));
- feeLog.setObjType(urgentLogType.getStatus());
+ feeLog.setTitle(Constants.OrderLogType.urgent.getTitle());
+ feeLog.setLogInfo(Constants.OrderLogType.urgent.format(dto.getUrgentFee().toPlainString()));
+ feeLog.setObjType(Constants.OrderLogType.urgent.getStatus());
feeLog.setOrderStatus(order.getStatus());
feeLog.setOptUserType(3);
feeLog.setOptUserName(optUserName);
@@ -1042,6 +1133,8 @@
.eq(Orders::getId, order.getId())
.set(Orders::getIsUrgent, Constants.ONE)
.set(Orders::getPlatformRewardAmount, urgentFeeFen)
+ .set(Orders::getPlatformSmsNotified, Constants.ZERO) // 閲嶇疆閫氱煡鐘舵�佷负鏈�氱煡
+ .set(Orders::getPlatformSmsNotifiedTime, new Date()) // 閲嶇疆閫氱煡鍩哄噯鏃堕棿涓哄綋鍓�
.set(Orders::getUpdateTime, new Date());
// 寮傚湴瀵勫瓨涓旀湁鍙栦欢闂ㄥ簵鏃讹紝鐢熸垚鍙告満鏍搁攢鐮�
@@ -1062,18 +1155,37 @@
Member driver = memberMapper.selectById(dto.getDriverId());
String driverName = driver != null ? driver.getName() : String.valueOf(dto.getDriverId());
- Constants.OrderLogType dispatchLogType = Constants.OrderLogType.dispatch;
OrderLog driverLog = new OrderLog();
driverLog.setOrderId(order.getId());
- driverLog.setTitle(dispatchLogType.getTitle());
- driverLog.setLogInfo(dispatchLogType.getStatusInfo().replace("{param}", driverName));
- driverLog.setObjType(dispatchLogType.getStatus());
+ driverLog.setTitle(Constants.OrderLogType.assignDriver.getTitle());
+ driverLog.setLogInfo(Constants.OrderLogType.assignDriver.format(driverName, dto.getUrgentFee().toPlainString()));
+ driverLog.setObjType(Constants.OrderLogType.assignDriver.getStatus());
driverLog.setOrderStatus(order.getStatus());
driverLog.setOptUserType(3);
driverLog.setOptUserName(optUserName);
driverLog.setCreateTime(new Date());
driverLog.setDeleted(Constants.ZERO);
orderLogService.create(driverLog);
+
+ // 鐭俊閫氱煡鎸囨淳鍙告満锛堝姞鎬ユ淳鍗曪級
+ DriverInfo driverInfo = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda()
+ .eq(DriverInfo::getMemberId, dto.getDriverId())
+ .eq(DriverInfo::getDeleted, Constants.ZERO)
+ .last("limit 1"));
+ if (driverInfo != null) {
+ String address1 = order.getDepositShopAddress() != null ? order.getDepositShopAddress() : order.getDepositShopName();
+ String address2 = order.getTakeShopAddress() != null ? order.getTakeShopAddress() :
+ (order.getTakeLocation() != null ? order.getTakeLocation() : "");
+ // 閰嶉�佽垂 = 鍙告満閰嶉�佽垂 + 鍔犳�ヨ垂
+ long totalDriverFee = (order.getDriverFee() != null ? order.getDriverFee() : 0L) + urgentFeeFen;
+ sendSmsNotify(driverInfo.getTelephone(),
+ Constants.SmsNotify.DRIVER_URGENT_DISPATCH,
+ "orderNo", order.getCode(),
+ "address1", address1,
+ "address2", address2,
+ "money1", String.valueOf(totalDriverFee / 100.0),
+ "money2", String.valueOf(urgentFeeFen / 100.0));
+ }
}
ordersMapper.update(updateWrapper);
@@ -1111,9 +1223,9 @@
item.setLuggageName(d.getLuggageName());
item.setLuggageDetail(d.getLuggageDetail());
item.setNum(d.getNum());
- double unitPriceYuan = d.getUnitPrice() != null ? Constants.getFormatMoney(d.getUnitPrice()) : 0;
- item.setUnitPriceYuan(unitPriceYuan);
- item.setSubtotal(unitPriceYuan * (d.getNum() != null ? d.getNum() : 0));
+ long unitPriceFen = d.getUnitPrice() != null ? d.getUnitPrice() : 0L;
+ item.setUnitPrice(unitPriceFen);
+ item.setSubtotal(unitPriceFen * (d.getNum() != null ? d.getNum() : 0));
items.add(item);
}
}
@@ -1212,14 +1324,17 @@
// 瀵勪欢闂ㄥ簵鍗犳瘮锛歠ieldA=0(浼佷笟瀵�)/1(涓汉瀵�)
int depositFieldA = Constants.equalsInteger(depositShop.getCompanyType(), Constants.ONE) ? Constants.ZERO : Constants.ONE;
BigDecimal depositShopRata = getRevenueShareRata(cityId, depositFieldA);
- // 鍙栦欢闂ㄥ簵鍗犳瘮锛歠ieldA=2(浼佷笟鍙�)/3(涓汉鍙�)
- int takeFieldA = Constants.equalsInteger(takeShop.getCompanyType(), Constants.ONE) ? Constants.TWO : Constants.THREE;
- BigDecimal takeShopRata = getRevenueShareRata(cityId, takeFieldA);
+ // 鍙栦欢闂ㄥ簵鍗犳瘮锛氭棤鍙栦欢闂ㄥ簵鏃舵瘮渚嬩负0
+ BigDecimal takeShopRata = BigDecimal.ZERO;
+ if (takeShop != null) {
+ int takeFieldA = Constants.equalsInteger(takeShop.getCompanyType(), Constants.ONE) ? Constants.TWO : Constants.THREE;
+ takeShopRata = getRevenueShareRata(cityId, takeFieldA);
+ }
// 璁$畻钖叕锛堝垎锛夛細totalAmount 涓哄垎锛宺ata 涓烘瘮渚嬪�硷紙濡� 0.15 琛ㄧず 15%锛�
long driverFee = new BigDecimal(totalAmount).multiply(driverRata).longValue();
long depositShopFee = new BigDecimal(totalAmount).multiply(depositShopRata).longValue();
- long takeShopFee = totalAmount - driverFee - depositShopFee;
+ long takeShopFee = new BigDecimal(totalAmount).multiply(takeShopRata).longValue();
orders.setDriverFee(driverFee);
orders.setDepositShopFee(depositShopFee);
@@ -1243,8 +1358,9 @@
.eq(PricingRule::getCityId, cityId)
.eq(PricingRule::getFieldA, String.valueOf(fieldA))
.last("limit 1"));
- if (rule != null && StringUtils.isNotBlank(rule.getFieldC())) {
- return new BigDecimal(rule.getFieldC());
+ if (rule != null && StringUtils.isNotBlank(rule.getFieldB())) {
+ // fieldB 瀛樺偍鐨勬槸鐧惧垎姣旀暣鏁帮紙濡�15琛ㄧず15%锛夛紝杞崲涓哄皬鏁版瘮渚嬶紙0.15锛�
+ return new BigDecimal(rule.getFieldB()).divide(new BigDecimal("100"), 4, BigDecimal.ROUND_HALF_UP);
}
return BigDecimal.ZERO;
}
@@ -1275,8 +1391,12 @@
.select("s1.link_phone", Orders::getDepositShopLinkPhone)
.select("s2.name", Orders::getTakeShopName)
.select("s2.address", Orders::getTakeShopAddress)
+ .select("s2.link_phone", Orders::getTakeShopLinkPhone)
+ .select("d.name", Orders::getDriverName)
+ .select("d.telephone", Orders::getDriverPhone)
.leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID")
.leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID")
+ .leftJoin("driver_info d on d.id = t.ACCEPT_DRIVER")
.eq(Orders::getDeleted, Constants.ZERO)
.eq(Orders::getMemberId, memberId)
.eq(status != null, Orders::getStatus, status)
@@ -1293,22 +1413,33 @@
vo.setCode(o.getCode());
vo.setType(o.getType());
vo.setStatus(o.getStatus());
+ vo.setStatusName(Constants.OrderStatus.getDescByKey(o.getStatus(),
+ Constants.equalsInteger(o.getType(), Constants.ZERO)?o.getType():Objects.nonNull(o.getTakeShopId())?Constants.ONE:Constants.TWO)
+ );
vo.setCreateTime(o.getCreateTime());
vo.setExpectedTakeTime(o.getExpectedTakeTime());
+ vo.setMemberVerifyCode(o.getMemberVerifyCode());
// 瀛樹欢闂ㄥ簵锛堝叧鑱旀煡璇㈢洿鎺ュ彇鍊硷級
+ vo.setDepositShopId(o.getDepositShopId());
vo.setDepositShopName(o.getDepositShopName());
vo.setDepositShopLinkName(o.getDepositShopLinkName());
vo.setDepositShopPhone(o.getDepositShopLinkPhone());
// 鍙栦欢淇℃伅锛氭湁鍙栦欢闂ㄥ簵鍙栭棬搴楋紝鏃犲垯鍙栫敤鎴疯嚜閫夊彇浠剁偣
if (o.getTakeShopId() != null) {
+ vo.setTakeShopId(o.getTakeShopId());
vo.setTakeShopName(o.getTakeShopName());
vo.setTakeShopAddress(o.getTakeShopAddress());
+ vo.setTakeShopPhone(o.getTakeShopLinkPhone());
} else {
vo.setTakeLocation(o.getTakeLocation());
vo.setTakeLocationRemark(o.getTakeLocationRemark());
}
+
+ // 鍙告満淇℃伅
+ vo.setDriverName(o.getDriverName());
+ vo.setDriverPhone(o.getDriverPhone());
// 鍙栦欢鑱旂郴浜�
vo.setTakeUser(o.getTakeUser());
@@ -1317,6 +1448,9 @@
// 璐圭敤锛堝垎锛�
vo.setDeclaredFee(o.getDeclaredFee());
vo.setEstimatedAmount(o.getEstimatedAmount());
+
+ // 璇勪环鐘舵��
+ vo.setCommentStatus(o.getCommentStatus());
// 鏌ヨ鐗╁搧鏄庣粏锛堜竴娆℃煡璇紝鍚屾椂鐢ㄤ簬鐗╁搧鍒楄〃鍜岄�炬湡璁$畻锛�
List<OrdersDetail> details = ordersDetailMapper.selectList(
@@ -1327,13 +1461,8 @@
// 鐗╁搧鏄庣粏
vo.setDetailList(buildDetailList(details));
- // 閫炬湡淇℃伅锛堜粎寰呭彇浠剁姸鎬佽绠楋級
- if (Integer.valueOf(Constants.OrderStatus.arrived.getStatus()).equals(o.getStatus())) {
- OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(o, details);
- vo.setOverdue(overdueInfo.getOverdue());
- vo.setOverdueDays(overdueInfo.getOverdueDays());
- vo.setOverdueFee(overdueInfo.getOverdueFee());
- }
+ // 閫炬湡鐘舵��
+ fillOverdueStatus(vo, o, details);
voList.add(vo);
}
}
@@ -1373,13 +1502,31 @@
.select("s1.link_phone", Orders::getDepositShopLinkPhone)
.select("s2.name", Orders::getTakeShopName)
.select("s2.address", Orders::getTakeShopAddress)
+ .select("s2.link_phone", Orders::getTakeShopLinkPhone)
+ .select("d.name", Orders::getDriverName)
+ .select("d.telephone", Orders::getDriverPhone)
.leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID")
.leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID")
- .eq(Orders::getPayStatus, Constants.ONE)
- .and(w -> w.eq(Orders::getDepositShopId, shopId).or().eq(Orders::getTakeShopId, shopId))
- .eq(status != null, Orders::getStatus, status)
- .in(statusList != null, Orders::getStatus, statusList)
- .orderByDesc(Orders::getCreateTime);
+ .leftJoin("driver_info d on d.id = t.ACCEPT_DRIVER")
+ .eq(Orders::getPayStatus, Constants.ONE);
+
+ // 闂ㄥ簵寰呭鐞嗚鍗曪細鎸変笟鍔$幆鑺傚尯鍒嗛棬搴楄鑹�
+ if (combinedStatus != null && Constants.equalsInteger(combinedStatus, Constants.SEVEN)) {
+ wrapper.and(w -> w
+ .and(w1 -> w1.eq(Orders::getDepositShopId, shopId)
+ .in(Orders::getStatus, Constants.OrderStatus.waitDeposit.getStatus(),
+ Constants.OrderStatus.deposited.getStatus()))
+ .or(w2 -> w2.eq(Orders::getTakeShopId, shopId)
+ .in(Orders::getStatus, Constants.OrderStatus.delivering.getStatus(),
+ Constants.OrderStatus.arrived.getStatus()))
+ );
+ } else {
+ wrapper.and(w -> w.eq(Orders::getDepositShopId, shopId).or().eq(Orders::getTakeShopId, shopId));
+ }
+
+ wrapper.eq(status != null, Orders::getStatus, status)
+ .in(statusList != null && !Constants.equalsInteger(combinedStatus, Constants.SEVEN), Orders::getStatus, statusList)
+ .orderByDesc(Orders::getId);
IPage<Orders> orderPage = ordersMapper.selectJoinPage(p, Orders.class, wrapper);
List<MyOrderVO> voList = new ArrayList<>();
@@ -1390,7 +1537,11 @@
vo.setCode(o.getCode());
vo.setType(o.getType());
vo.setStatus(o.getStatus());
+ vo.setStatusName(Constants.OrderStatus.getDescByKey(o.getStatus(),
+ Constants.equalsInteger(o.getType(), Constants.ZERO)?o.getType():Objects.nonNull(o.getTakeShopId())?Constants.ONE:Constants.TWO)
+ );
vo.setCreateTime(o.getCreateTime());
+ vo.setRemark(o.getRemark());
vo.setExpectedTakeTime(o.getExpectedTakeTime());
vo.setDepositShopName(o.getDepositShopName());
@@ -1407,10 +1558,15 @@
if (o.getTakeShopId() != null) {
vo.setTakeShopName(o.getTakeShopName());
vo.setTakeShopAddress(o.getTakeShopAddress());
+ vo.setTakeShopPhone(o.getTakeShopLinkPhone());
} else {
vo.setTakeLocation(o.getTakeLocation());
vo.setTakeLocationRemark(o.getTakeLocationRemark());
}
+
+ // 鍙告満淇℃伅
+ vo.setDriverName(o.getDriverName());
+ vo.setDriverPhone(o.getDriverPhone());
vo.setTakeUser(o.getTakeUser());
vo.setTakePhone(o.getTakePhone());
@@ -1424,12 +1580,16 @@
vo.setDetailList(buildDetailList(details));
- if (Integer.valueOf(Constants.OrderStatus.arrived.getStatus()).equals(o.getStatus())) {
- OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(o, details);
- vo.setOverdue(overdueInfo.getOverdue());
- vo.setOverdueDays(overdueInfo.getOverdueDays());
- vo.setOverdueFee(overdueInfo.getOverdueFee());
- }
+
+ // 閫炬湡鐘舵��
+ fillOverdueStatus(vo, o, details);
+
+// if (Integer.valueOf(Constants.OrderStatus.arrived.getStatus()).equals(o.getStatus())) {
+// OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(o, details);
+// vo.setOverdue(overdueInfo.getOverdue());
+// vo.setOverdueDays(overdueInfo.getOverdueDays());
+// vo.setOverdueFee(overdueInfo.getOverdueFee());
+// }
voList.add(vo);
}
}
@@ -1475,7 +1635,7 @@
}
}
if (order == null) {
- throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "璁㈠崟涓嶅瓨鍦�");
+ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鏍搁攢鐮佹棤鏁�");
}
return buildOrderDetailVO(order, false);
}
@@ -1499,13 +1659,15 @@
vo.setExpectedDepositTime(order.getExpectedDepositTime());
vo.setExpectedTakeTime(order.getExpectedTakeTime());
vo.setArriveTime(order.getArriveTime());
+ vo.setStatusName(Constants.OrderStatus.getDescByKey(order.getStatus(),order.getType()));
// 璐圭敤锛堝垎锛�
vo.setBasicAmount(order.getBasicAmount());
vo.setDeclaredAmount(order.getDeclaredAmount());
vo.setDeclaredFee(order.getDeclaredFee());
vo.setUrgentAmount(order.getUrgentAmount());
- vo.setActualPayAmount(order.getPayAmount());
+ vo.setIsUrgent(order.getIsUrgent());
+ vo.setActualPayAmount(Constants.equalsInteger(order.getPayStatus(), Constants.ONE)?order.getPayAmount():order.getEstimatedAmount());
// 鏍囪
vo.setExceptionStatus(order.getExceptionStatus());
@@ -1532,6 +1694,7 @@
// 鍙栦欢淇℃伅
if (order.getTakeShopId() != null) {
+ vo.setTakeShopId(order.getTakeShopId());
ShopInfo takeShop = shopInfoMapper.selectById(order.getTakeShopId());
if (takeShop != null) {
vo.setTakeShopName(takeShop.getName());
@@ -1545,6 +1708,16 @@
// 鍙栦欢鑱旂郴浜�
vo.setTakeUser(order.getTakeUser());
vo.setTakePhone(order.getTakePhone());
+
+ // 鍙告満淇℃伅
+ if (order.getAcceptDriver() != null) {
+ DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver());
+ if (driver != null) {
+ vo.setDriverId(driver.getId());
+ vo.setDriverName(driver.getName());
+ vo.setDriverPhone(driver.getTelephone());
+ }
+ }
// 鐗╁搧绫诲瀷鍚嶇О
if (order.getGoodType() != null) {
@@ -1565,11 +1738,21 @@
.eq(OrdersDetail::getDeleted, Constants.ZERO));
vo.setDetailList(buildDetailList(details));
- // 閫炬湡淇℃伅
- OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(order, details);
- vo.setOverdue(overdueInfo.getOverdue());
- vo.setOverdueDays(overdueInfo.getOverdueDays());
- vo.setOverdueFee(overdueInfo.getOverdueFee());
+ // 閫炬湡鐘舵�侊細0=鏈埌搴楁湭閫炬湡 1=鏈埌搴楀瓨鍦ㄩ�炬湡 2=宸插埌搴楁湭閫炬湡 3=宸插埌搴楀緟鏀粯閫炬湡 4=閫炬湡宸叉敮浠�
+ fillOverdueStatus(vo, order, details);
+
+ // 閫�娆句俊鎭紙status=99鍙栨秷鏃惰繑鍥烇級
+ if (order.getStatus() != null &&
+ Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.cancelled.getStatus())) {
+ vo.setRefundApplyTime(order.getCancelTime());
+ OrdersRefund ordersRefund = ordersRefundMapper.selectOne(
+ new QueryWrapper<OrdersRefund>().lambda()
+ .eq(OrdersRefund::getOrderId, order.getId())
+ .eq(OrdersRefund::getDeleted, Constants.ZERO)
+ .orderByDesc(OrdersRefund::getCreateTime)
+ .last("limit 1"));
+ vo.setRefundInfo(ordersRefund);
+ }
// 鏍搁攢鐮�
Integer status = order.getStatus();
@@ -1591,6 +1774,68 @@
vo.setMemberVerifyCode(order.getMemberVerifyCode());
}
+ // 寮傚湴瀵勫瓨缁忕含搴︼紙灏卞湴瀵勫瓨涓嶈繑鍥烇級
+ if (Constants.ONE.equals(order.getType())) {
+ // status=3(宸叉帴鍗�)锛氳繑鍥炲瓨浠堕棬搴楃粡绾害 + 鍙告満缁忕含搴�
+ if (Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) {
+ ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
+ if (depositShop != null) {
+ vo.setDepositShopLng(depositShop.getLongitude());
+ vo.setDepositShopLat(depositShop.getLatitude());
+ }
+ if (order.getAcceptDriver() != null) {
+ DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver());
+ if (driver != null) {
+ vo.setDriverLng(driver.getLongitude());
+ vo.setDriverLat(driver.getLatitude());
+ }
+ }
+ }
+ // status=4(閰嶉�佷腑)锛氳繑鍥炲彇浠剁偣缁忕含搴� + 鍙告満缁忕含搴�
+ if (Constants.equalsInteger(status, Constants.OrderStatus.delivering.getStatus())) {
+ // 鍙栦欢鐐圭粡绾害锛堜紭鍏堝彇浠堕棬搴楋紝鍚﹀垯璁㈠崟涓婄殑鍙栦欢鍧愭爣锛�
+ if (order.getTakeShopId() != null) {
+ ShopInfo takeShop = shopInfoMapper.selectById(order.getTakeShopId());
+ if (takeShop != null) {
+ vo.setTakeLng(takeShop.getLongitude());
+ vo.setTakeLat(takeShop.getLatitude());
+ }
+ } else if (order.getTakeLgt() != null && order.getTakeLat() != null) {
+ vo.setTakeLng(order.getTakeLgt().doubleValue());
+ vo.setTakeLat(order.getTakeLat().doubleValue());
+ }
+ if (order.getAcceptDriver() != null) {
+ DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver());
+ if (driver != null) {
+ vo.setDriverLng(driver.getLongitude());
+ vo.setDriverLat(driver.getLatitude());
+ }
+ }
+ }
+ }
+
+ // 璇勪环淇℃伅
+ vo.setCommentStatus(order.getCommentStatus());
+ if (Constants.equalsInteger(order.getCommentStatus(), Constants.ONE)) {
+ vo.setCommentTime(order.getCommentTime());
+ // 鏌ヨ璇勪环璁板綍锛岃幏鍙栧悇瀵硅薄璇勫垎
+ List<OrderComment> comments = orderCommentMapper.selectList(new QueryWrapper<OrderComment>().lambda()
+ .eq(OrderComment::getOrderId, order.getId())
+ .eq(OrderComment::getDeleted, Constants.ZERO));
+ for (OrderComment c : comments) {
+ if (Constants.equalsInteger(c.getTargetType(), Constants.ONE)) {
+ vo.setDepositScore(c.getScore());
+ vo.setCommentContent(c.getContent());
+ } else if (Constants.equalsInteger(c.getTargetType(), Constants.TWO)) {
+ vo.setTakeScore(c.getScore());
+ } else if (Constants.equalsInteger(c.getTargetType(), Constants.THREE)) {
+ vo.setDriverScore(c.getScore());
+ }
+ }
+ // 璇勪环闄勪欢鍥剧墖
+ vo.setCommentImages(getFileUrls(order.getId(), Constants.FileType.COMMENT_ATTACH.getKey(), imgPrefix));
+ }
+
return vo;
}
@@ -1605,11 +1850,6 @@
throw new BusinessException(ResponseStatus.DATA_EMPTY);
}
- // 浠呭紓鍦板瘎瀛樺彲鍙栨秷
- if (!Constants.equalsInteger(order.getType(), Constants.ONE)) {
- throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呭紓鍦板瘎瀛樿鍗曞彲鍙栨秷");
- }
-
Integer status = order.getStatus();
if (status == null) {
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璁㈠崟鐘舵�佸紓甯�");
@@ -1617,17 +1857,48 @@
Date now = new Date();
- // 寰呮敮浠橈細鐩存帴鍙栨秷
+ // 寰呮敮浠橈細鐩存帴鍙栨秷锛堜笉闄愯鍗曠被鍨嬶級
if (Constants.equalsInteger(status, Constants.OrderStatus.waitPay.getStatus())) {
order.setStatus(Constants.OrderStatus.cancelled.getStatus());
order.setCancelTime(now);
ordersMapper.updateById(order);
- saveCancelLog(order, "浼氬憳鍙栨秷璁㈠崟锛堝緟鏀粯锛�", reason, memberId);
+ saveCancelLog(order, Constants.OrderLogType.memberCancel, "浼氬憳鍙栨秷璁㈠崟锛堝緟鏀粯锛�", memberId);
+ // 鐭俊閫氱煡浼氬憳锛氳鍗曞凡鍙栨秷
+ Member cancelMember1 = memberMapper.selectById(memberId);
+ sendSmsNotify(cancelMember1 != null ? cancelMember1.getTelephone() : null,
+ Constants.SmsNotify.MEMBER_CANCELLED, "orderNo", order.getCode());
return;
}
- // 寰呭瘎瀛橈細鐩存帴鍙栨秷锛屽叏棰濋��娆�
+ // 寰呭瘎瀛橈細鐩存帴鍙栨秷锛屽叏棰濋��娆撅紙涓嶉檺璁㈠崟绫诲瀷锛�
if (Constants.equalsInteger(status, Constants.OrderStatus.waitDeposit.getStatus())) {
+ // 鍏堟爣璁拌鍗曞凡鍙栨秷
+ order.setStatus(Constants.OrderStatus.cancelled.getStatus());
+ order.setCancelTime(now);
+ order.setRefundAmount(order.getPayAmount());
+ ordersMapper.updateById(order);
+
+ saveCancelLog(order, Constants.OrderLogType.memberCancel, "浼氬憳鍙栨秷璁㈠崟锛堝緟瀵勫瓨锛屽叏棰濋��娆撅級", memberId);
+ // 閫氱煡浼氬憳锛氬凡鍙栨秷
+ sendOrderNotice(memberId, Constants.MemberOrderNotify.CANCELLED, orderId,
+ "orderNo", order.getCode());
+ // 鐭俊閫氱煡浼氬憳锛氳鍗曞凡鍙栨秷
+ Member cancelMember2 = memberMapper.selectById(memberId);
+ sendSmsNotify(cancelMember2 != null ? cancelMember2.getTelephone() : null,
+ Constants.SmsNotify.MEMBER_CANCELLED, "orderNo", order.getCode());
+
+ // 璋冪敤寰俊閫�娆綱3锛屽叏棰濋��娆�
+ com.wechat.pay.java.service.refund.model.Refund refundResult;
+ try {
+ refundResult = wxPayV3Service.refund(order.getOutTradeNo(), order.getPayAmount(), order.getPayAmount(),
+ "璁㈠崟閫�娆�", wxPayProperties.getV3RefundNotifyUrl());
+ } catch (Exception e) {
+ log.error("寰呭瘎瀛樿鍗曢��娆捐皟鐢ㄥ紓甯�, orderId={}", orderId, e);
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "閫�娆惧け璐ワ紝璇风◢鍚庨噸璇�");
+ }
+
+ com.wechat.pay.java.service.refund.model.Status refundStatus = refundResult.getStatus();
+
// 璁板綍閫�娆句俊鎭�
OrdersRefund refund = new OrdersRefund();
refund.setOrderId(orderId);
@@ -1635,29 +1906,67 @@
refund.setCancelInfo(reason);
refund.setCreateTime(now);
refund.setDeleted(Constants.ZERO);
+ refund.setBeforeStatus(Constants.OrderStatus.waitDeposit.getStatus());
+ refund.setRefundAmount(order.getPayAmount());
+ refund.setRefundCode(refundResult.getOutRefundNo());
- // 璋冪敤寰俊閫�娆撅紝鍏ㄩ閫�娆�
- String refundCode = wxMiniUtilService.wxRefund(order.getOutTradeNo(), order.getPayAmount(), order.getPayAmount());
- refund.setRefundCode(refundCode);
- refund.setRefundTime(new Date());
+ if (com.wechat.pay.java.service.refund.model.Status.SUCCESS.equals(refundStatus)) {
+ // 閫�娆炬垚鍔�
+ refund.setStatus(Constants.ONE);
+ } else if (com.wechat.pay.java.service.refund.model.Status.PROCESSING.equals(refundStatus)) {
+ // 閫�娆句腑锛岀瓑鍥炶皟澶勭悊
+ refund.setStatus(Constants.ZERO);
+ } else {
+ // 閫�娆惧け璐�/寮傚父锛圕LOSED / ABNORMAL / 鍏朵粬锛�
+ log.error("寰呭瘎瀛樿鍗曢��娆惧け璐�, orderId={}, refundStatus={}", orderId, refundStatus);
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "閫�娆惧け璐ワ紝璇疯仈绯诲鏈嶅鐞�");
+ }
ordersRefundMapper.insert(refund);
-
- order.setStatus(Constants.OrderStatus.cancelled.getStatus());
- order.setCancelTime(now);
- order.setRefundAmount(order.getPayAmount());
- ordersMapper.updateById(order);
-
- saveCancelLog(order, "浼氬憳鍙栨秷璁㈠崟锛堝緟瀵勫瓨锛屽叏棰濋��娆撅級", reason, memberId);
return;
}
- // 宸插瘎瀛�/宸叉帴鍗曪細杩涘叆鍙栨秷涓姸鎬�
+ // 宸插瘎瀛�/宸叉帴鍗曪細浠呭紓鍦板瘎瀛樺彲鍙栨秷
+ if (!Constants.equalsInteger(order.getType(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呭紓鍦板瘎瀛樿鍗曞彲鍙栨秷");
+ }
+
+ // 宸插瘎瀛�/宸叉帴鍗曪細鐩存帴灏嗚鍗曠被鍨嬫敼涓哄氨鍦板瘎瀛�
if (Constants.equalsInteger(status, Constants.OrderStatus.deposited.getStatus())
|| Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) {
- order.setStatus(Constants.OrderStatus.cancelling.getStatus());
- order.setCancelTime(now);
- ordersMapper.updateById(order);
- saveCancelLog(order, "浼氬憳鐢宠鍙栨秷璁㈠崟锛堝凡瀵勫瓨/宸叉帴鍗曪級", reason, memberId);
+ // 鍏堜繚瀛樺師鍙告満淇℃伅锛岀敤浜庡悗缁�氱煡
+ Integer originalDriverId = order.getAcceptDriver();
+ DriverInfo originalDriver = originalDriverId != null ? driverInfoMapper.selectById(originalDriverId) : null;
+
+ ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
+ // 鍙栦欢鐐逛俊鎭洿鏂颁负瀛樹欢闂ㄥ簵锛屼娇鐢� UpdateWrapper 纭繚 null 瀛楁涔熻兘鐢熸晥
+ UpdateWrapper<Orders> updateWrapper = new UpdateWrapper<>();
+ updateWrapper.lambda()
+ .eq(Orders::getId, order.getId())
+ .set(Orders::getType, Constants.ZERO)
+ .set(Orders::getTakeShopId, order.getDepositShopId())
+ .set(Orders::getTakeShopName, order.getDepositShopName())
+ .set(Orders::getTakeShopAddress, order.getDepositShopAddress())
+ .set(Orders::getTakeShopLinkPhone, order.getDepositShopLinkPhone())
+ .set(Orders::getTakeLocation, order.getDepositLocation())
+ .set(Orders::getTakeLocationRemark, order.getDepositLocationRemark())
+ .set(Orders::getTakeLat, order.getDepositLat())
+ .set(Orders::getTakeLgt, order.getDepositLgt())
+ .set(Orders::getExpectedTakeTime, new Date());
+ if (Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) {
+ updateWrapper.lambda()
+ .set(Orders::getAcceptDriver, null)
+ .set(Orders::getAcceptType, null)
+ .set(Orders::getAcceptTime, null);
+ }
+ ordersMapper.update(null, updateWrapper);
+ saveCancelLog(order, Constants.OrderLogType.memberCancelToConvert, "浼氬憳鍙栨秷寮傚湴瀵勫瓨璁㈠崟锛岃浆涓哄氨鍦板瘎瀛�", memberId);
+ // 閫氱煡鍙告満锛氳鍗曞凡鍙栨秷锛堝凡鎺ュ崟鎯呭喌涓嬪徃鏈洪渶鍋滄鏈嶅姟锛�
+ if (originalDriverId != null && Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) {
+ sendDriverNotice(originalDriverId, Constants.DriverOrderNotify.REFUNDING, orderId,
+ "orderNo", order.getCode());
+ sendSmsNotify(originalDriver != null ? originalDriver.getTelephone() : null,
+ Constants.SmsNotify.DRIVER_REFUNDING, "orderNo", order.getCode());
+ }
return;
}
@@ -1667,12 +1976,12 @@
/**
* 淇濆瓨鍙栨秷璁㈠崟鎿嶄綔鏃ュ織
*/
- private void saveCancelLog(Orders order, String title, String reason, Integer memberId) {
+ private void saveCancelLog(Orders order, Constants.OrderLogType logType, String reason, Integer memberId) {
OrderLog log = new OrderLog();
log.setOrderId(order.getId());
- log.setTitle(title);
- log.setLogInfo(reason);
- log.setObjType(Constants.ORDER_LOG_CANCEL);
+ log.setTitle(logType.getTitle());
+ log.setLogInfo(logType.format(reason));
+ log.setObjType(logType.getStatus());
log.setOrderStatus(order.getStatus());
log.setOptUserId(memberId);
log.setOptUserType(0); // 0=鐢ㄦ埛
@@ -1684,18 +1993,86 @@
/**
* 淇濆瓨闂ㄥ簵鏍搁攢鏃ュ織
*/
- private void saveShopVerifyLog(Orders order, String title, String logInfo, String remark, Integer shopId) {
+ private void saveShopVerifyLog(Orders order, Constants.OrderLogType logType, String logInfo, String remark, Integer shopId) {
OrderLog log = new OrderLog();
log.setOrderId(order.getId());
- log.setTitle(title);
- log.setLogInfo(logInfo);
+ log.setTitle(logType.getTitle());
+ log.setLogInfo(logInfo != null ? logInfo : logType.getStatusInfo());
log.setRemark(remark);
+ log.setObjType(logType.getStatus());
log.setOrderStatus(order.getStatus());
log.setOptUserId(shopId);
log.setOptUserType(2); // 2=闂ㄥ簵
log.setCreateTime(new Date());
log.setDeleted(Constants.ZERO);
orderLogService.create(log);
+ }
+
+ /**
+ * 鍙戦�佽鍗曠珯鍐呬俊閫氱煡
+ */
+ private void sendOrderNotice(Integer memberId, Constants.MemberOrderNotify notify, Integer orderId, String... params) {
+ Notice notice = new Notice();
+ notice.setUserType(0); // 0=浼氬憳
+ notice.setUserId(memberId);
+ notice.setTitle(notify.getTitle());
+ notice.setContent(notify.format(params));
+ notice.setObjId(orderId);
+ notice.setObjType(0); // 0=璁㈠崟
+ notice.setStatus(0); // 0=鏈
+ notice.setIsdeleted(Constants.ZERO);
+ notice.setCreateDate(new Date());
+ noticeService.create(notice);
+ }
+
+ /**
+ * 鍙戦�侀棬搴楃珯鍐呬俊閫氱煡
+ */
+ private void sendShopNotice(Integer shopId, Constants.ShopOrderNotify notify, Integer orderId, String... params) {
+ Notice notice = new Notice();
+ notice.setUserType(2); // 2=闂ㄥ簵
+ notice.setUserId(shopId);
+ notice.setTitle(notify.getTitle());
+ notice.setContent(notify.format(params));
+ notice.setObjId(orderId);
+ notice.setObjType(0); // 0=璁㈠崟
+ notice.setStatus(0); // 0=鏈
+ notice.setIsdeleted(Constants.ZERO);
+ notice.setCreateDate(new Date());
+ noticeService.create(notice);
+ }
+
+ /**
+ * 閫氱煡瀛樹欢闂ㄥ簵鍜屽彇浠堕棬搴楋紙璁㈠崟瀹屾垚/璇勪环绛夛級
+ */
+ private void notifyBothShops(Orders order, Constants.ShopOrderNotify notify, String... params) {
+ if (order.getDepositShopId() != null) {
+ sendShopNotice(order.getDepositShopId(), notify, order.getId(), params);
+ }
+ if (order.getTakeShopId() != null) {
+ sendShopNotice(order.getTakeShopId(), notify, order.getId(), params);
+ }
+ }
+
+ /**
+ * 鍙戦�佸徃鏈虹珯鍐呬俊閫氱煡
+ */
+ private void sendDriverNotice(Integer driverId, Constants.DriverOrderNotify notify, Integer orderId, String... params) {
+ DriverInfo driver = driverInfoMapper.selectById(driverId);
+ if (driver == null || driver.getMemberId() == null) {
+ return;
+ }
+ Notice notice = new Notice();
+ notice.setUserType(1); // 1=鍙告満
+ notice.setUserId(driver.getMemberId());
+ notice.setTitle(notify.getTitle());
+ notice.setContent(notify.format(params));
+ notice.setObjId(orderId);
+ notice.setObjType(0); // 0=璁㈠崟
+ notice.setStatus(0); // 0=鏈
+ notice.setIsdeleted(Constants.ZERO);
+ notice.setCreateDate(new Date());
+ noticeService.create(notice);
}
@Override
@@ -1717,6 +2094,7 @@
order.setPayStatus(Constants.ONE); // 宸叉敮浠�
order.setPayTime(now);
order.setWxExternalNo(wxTradeNo);
+ order.setPayAmount(order.getTotalAmount());
order.setUpdateTime(now);
// 鐢熸垚浼氬憳鏍搁攢鐮�
order.setMemberVerifyCode(generateVerifyCode());
@@ -1739,6 +2117,26 @@
}
}
ordersMapper.updateById(order);
+
+ // 閫氱煡浼氬憳锛氳鍗曞緟鏍搁獙
+ sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.WAIT_VERIFY, order.getId(),
+ "orderNo", order.getCode(),
+ "storeCode", order.getMemberVerifyCode());
+
+ // 灏卞湴瀵勫瓨璁㈠崟锛氶�氱煡瀛樹欢闂ㄥ簵寰呮牳楠�
+ if (Constants.ZERO.equals(order.getType()) && order.getDepositShopId() != null) {
+ sendShopNotice(order.getDepositShopId(), Constants.ShopOrderNotify.WAIT_VERIFY, order.getId(),
+ "orderNo", order.getCode());
+ }
+
+ // 鐭俊閫氱煡瀛樹欢闂ㄥ簵锛氭湁鏂拌鍗曞緟鏍搁獙
+ if (order.getDepositShopId() != null) {
+ ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
+ if (depositShop != null) {
+ sendSmsNotify(depositShop.getLinkPhone(), Constants.SmsNotify.SHOP_WAIT_VERIFY,
+ "orderNo", order.getCode());
+ }
+ }
}
@Override
@@ -1782,8 +2180,9 @@
otherOrders.setCreateTime(now);
otherOrdersMapper.insert(otherOrders);
- // 5. 鍞よ捣寰俊鏀粯
- return wxPayForOtherOrder(otherOrders, member.getOpenid(), Constants.OrdersAttach.OVERDUE_FEE);
+ // 5. 鍞よ捣寰俊鏀粯V3
+ return wxPayV3(otherOrders.getOutTradeNo(), otherOrders.getPayAccount(), otherOrders.getId(),
+ member.getOpenid(), Constants.OrdersAttach.OVERDUE_FEE);
}
@Override
@@ -1835,11 +2234,10 @@
if (!Constants.equalsInteger(order.getMemberId(), memberId)) {
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "鏃犳潈鎿嶄綔姝よ鍗�");
}
- // 浠呭凡瀹屾垚(7)銆佸凡鍙栨秷(99)銆佸凡閫�娆�(96)鍙垹闄�
+ // 浠呭凡瀹屾垚(7)銆佸凡鍙栨秷(99)
int status = Constants.formatIntegerNum(order.getStatus());
if (status != Constants.OrderStatus.finished.getStatus()
- && status != Constants.OrderStatus.cancelled.getStatus()
- && status != Constants.OrderStatus.closed.getStatus()) {
+ && status != Constants.OrderStatus.cancelled.getStatus()) {
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鍙垹闄�");
}
ordersMapper.update(new UpdateWrapper<Orders>().lambda()
@@ -1850,9 +2248,10 @@
@Override
@Transactional(rollbackFor = {Exception.class, BusinessException.class})
- public PayResponse payShopDeposit(Integer shopId) {
+ public PayResponse payShopDeposit(Integer memberId) {
// 1. 鏌ヨ闂ㄥ簵淇℃伅
- ShopInfo shopInfo = shopInfoMapper.selectById(shopId);
+ ShopInfo shopInfo = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda()
+ .eq(ShopInfo::getRegionMemberId,memberId));
if (shopInfo == null) {
throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "闂ㄥ簵涓嶅瓨鍦�");
}
@@ -1876,14 +2275,15 @@
otherOrders.setMemberId(shopInfo.getRegionMemberId());
otherOrders.setPayAccount(shopInfo.getDepositAmount());
otherOrders.setPayStatus(Constants.ZERO);
- otherOrders.setCode("SD" + new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(now) + shopId);
+ otherOrders.setCode("SD" + new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(now) + shopInfo.getId());
otherOrders.setOutTradeNo(outTradeNo);
otherOrders.setDeleted(Constants.ZERO);
otherOrders.setCreateTime(now);
otherOrdersMapper.insert(otherOrders);
- // 5. 鍞よ捣寰俊鏀粯
- return wxPayForOtherOrder(otherOrders, member.getOpenid(), Constants.OrdersAttach.SHOP_DEPOSIT);
+ // 5. 鍞よ捣寰俊鏀粯V3
+ return wxPayV3(otherOrders.getOutTradeNo(), otherOrders.getPayAccount(), otherOrders.getId(),
+ member.getOpenid(), Constants.OrdersAttach.SHOP_DEPOSIT);
}
@Override
@@ -1929,6 +2329,15 @@
}
shopInfo.setUpdateTime(now);
shopInfoMapper.updateById(shopInfo);
+
+ // 鐭俊閫氱煡闂ㄥ簵锛氭垚鍔熷叆椹�
+ String rawPassword = shopInfo.getTelephone() != null && shopInfo.getTelephone().length() >= 6
+ ? shopInfo.getTelephone().substring(shopInfo.getTelephone().length() - 6) + "@123456" : "";
+ sendSmsNotify(shopInfo.getTelephone(),
+ Constants.SmsNotify.SHOP_AUTH_SUCCESS,
+ "storeName", shopInfo.getName(),
+ "phone", shopInfo.getTelephone() != null ? shopInfo.getTelephone() : "",
+ "password", rawPassword);
// 6. 鎶奸噾鏀粯瀹屾垚鍚庯紝鑻ュ煄甯傛湭寮�閫氬垯鑷姩寮�閫�
if (shopInfo.getAreaId() != null) {
@@ -2020,6 +2429,20 @@
}
}
}
+
+ // 閫氱煡鐩稿叧闂ㄥ簵锛氳鍗曞凡缁撶畻
+ notifyBothShops(order, Constants.ShopOrderNotify.SETTLED,
+ "orderNo", order.getCode(),
+ "amount", String.valueOf(Constants.getFormatMoney(
+ order.getTotalAmount() != null ? order.getTotalAmount() : 0L)));
+
+ // 閫氱煡鍙告満锛氳鍗曞凡缁撶畻
+ if (order.getAcceptDriver() != null) {
+ sendDriverNotice(order.getAcceptDriver(), Constants.DriverOrderNotify.SETTLED, order.getId(),
+ "orderNo", order.getCode(),
+ "amount", String.valueOf(Constants.getFormatMoney(
+ order.getDriverFee() != null ? order.getDriverFee() : 0L)));
+ }
}
}
@@ -2108,6 +2531,9 @@
orderCommentMapper.insert(driverComment);
}
+ // 4.4 淇濆瓨璇勪环闄勪欢鍥剧墖锛坥bj_type=15锛屾渶澶�3寮狅級
+ saveVerifyImages(order.getId(), dto.getImages(), Constants.FileType.COMMENT_ATTACH.getKey(), null);
+
// 5. 鏇存柊闂ㄥ簵/鍙告満骞冲潎璇勫垎
updateTargetScore(Constants.ONE, order.getDepositShopId());
if (isRemote && order.getTakeShopId() != null) {
@@ -2115,6 +2541,20 @@
}
if (isRemote && order.getAcceptDriver() != null) {
updateTargetScore(Constants.THREE, order.getAcceptDriver());
+ }
+
+ // 閫氱煡浼氬憳锛氳鍗曞凡璇勪环
+ sendOrderNotice(memberId, Constants.MemberOrderNotify.EVALUATED, order.getId(),
+ "orderNo", order.getCode());
+
+ // 閫氱煡瀛樹欢闂ㄥ簵鍜屽彇浠堕棬搴楋細璁㈠崟宸茶瘎浠�
+ notifyBothShops(order, Constants.ShopOrderNotify.EVALUATED,
+ "orderNo", order.getCode());
+
+ // 閫氱煡鍙告満锛氳鍗曞凡璇勪环
+ if (order.getAcceptDriver() != null) {
+ sendDriverNotice(order.getAcceptDriver(), Constants.DriverOrderNotify.EVALUATED, order.getId(),
+ "orderNo", order.getCode());
}
}
@@ -2180,6 +2620,129 @@
@Override
@Transactional(rollbackFor = {Exception.class, BusinessException.class})
+ public void verifyOrder(String verifyCode, Integer shopId, List<String> images, String remark) {
+ if (StringUtils.isBlank(verifyCode)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏍搁攢鐮佷笉鑳戒负绌�");
+ }
+ // 鍏堟煡浼氬憳鏍搁攢鐮�
+ Orders query = new Orders();
+ query.setMemberVerifyCode(verifyCode);
+ query.setDeleted(Constants.ZERO);
+ Orders byMemberCode = findOne(query);
+ if (byMemberCode != null) {
+ shopVerifyOrder(verifyCode, shopId, images, remark);
+ } else {
+ driverVerifyOrder(verifyCode, images, remark, shopId);
+ }
+ }
+
+ @Override
+ @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+ public void verifyOrderByShopId(Integer orderId, Integer shopId, List<String> images, String remark) {
+ if (orderId == null) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璁㈠崟涓婚敭涓嶈兘涓虹┖");
+ }
+ // 鏍规嵁璁㈠崟涓婚敭鏌ユ壘璁㈠崟
+ Orders order = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda()
+ .eq(Orders::getId, orderId)
+ .eq(Orders::getDeleted, Constants.ZERO)
+ .last("limit 1"));
+ if (order == null) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "璁㈠崟涓嶅瓨鍦�");
+ }
+
+ // 鏌ヨ闂ㄥ簵鍚嶇О鐢ㄤ簬鏃ュ織
+ String shopName = "";
+ ShopInfo shopInfo = shopInfoMapper.selectById(shopId);
+ if (shopInfo != null) {
+ shopName = shopInfo.getName() != null ? shopInfo.getName() : "";
+ }
+
+ Integer status = order.getStatus();
+ Date now = new Date();
+ if (Constants.equalsInteger(status, Constants.OrderStatus.waitDeposit.getStatus())) {
+ // 寰呭瘎瀛�(1) 鈫� 宸插瘎瀛�(2)锛屼袱绉嶇被鍨嬮�氱敤
+ // 鏍¢獙褰撳墠闂ㄥ簵鏄惁涓鸿鍗曠殑瀛樹欢闂ㄥ簵
+ if (!shopId.equals(order.getDepositShopId())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曚笉灞炰簬褰撳墠闂ㄥ簵锛屾棤娉曟牳閿�");
+ }
+ order.setStatus(Constants.equalsInteger(order.getType(),Constants.ZERO)?Constants.OrderStatus.arrived.getStatus():Constants.OrderStatus.deposited.getStatus());
+ order.setDepositTime(now);
+ // 閲婃斁褰撳墠鏍搁攢鐮侊紝鐢熸垚鏂扮殑鏍搁攢鐮佷緵鍙栦欢鏃朵娇鐢�
+ String verifyCode = order.getMemberVerifyCode();
+ if (StringUtils.isNotBlank(verifyCode)) {
+ releaseVerifyCode(verifyCode);
+ }
+ order.setMemberVerifyCode(generateVerifyCode());
+ ordersMapper.updateById(order);
+ // 淇濆瓨瀵勫瓨鍥剧墖锛坥bj_type=2 璁㈠崟瀵勫瓨鍥剧墖锛屾渶澶�3寮狅級
+ saveVerifyImages(order.getId(), images, Constants.FileType.ORDER_DEPOSIT.getKey(), shopId);
+ // 璁板綍璁㈠崟鏃ュ織
+ saveShopVerifyLog(order, Constants.OrderLogType.shopDeposit, Constants.OrderLogType.shopDeposit.format(shopName), remark, shopId);
+ // 閫氱煡浼氬憳锛氶棬搴楁牳閿�鎴愬姛
+ if (Constants.equalsInteger(order.getType(), Constants.ONE)) {
+ // 寮傚湴瀵勫瓨 鈫� 寰呮姠鍗�
+ sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.WAIT_GRAB, order.getId(),
+ "orderNo", order.getCode());
+ } else {
+ // 灏卞湴瀵勫瓨 鈫� 寰呭彇浠舵彁閱�
+ sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.WAIT_PICKUP_REMIND, order.getId(),
+ "orderNo", order.getCode(), "shopName", shopName);
+ }
+ } else if (Constants.equalsInteger(status, Constants.OrderStatus.arrived.getStatus())) {
+ // 寮傚湴瀵勫瓨 + 鏃犲彇浠堕棬搴� 鈫� 鏃犳硶鏍搁攢锛堝鎴疯嚜鍙栵紝鏃犻棬搴楁搷浣滐級
+ if (Constants.equalsInteger(order.getType(), Constants.ONE) && order.getTakeShopId() == null) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曟棤鍙栦欢闂ㄥ簵锛屾棤娉曟牳閿�");
+ }
+ // 鏍¢獙鍙栦欢闂ㄥ簵涓庡綋鍓嶇櫥褰曢棬搴椾竴鑷�
+ if (!shopId.equals(order.getTakeShopId())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曚笉灞炰簬褰撳墠闂ㄥ簵锛屾棤娉曟牳閿�");
+ }
+ // 鏍¢獙鏄惁宸茬‘璁ら【瀹㈠埌搴�
+ if (order.getConfirmArriveTime() == null) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇峰厛纭椤惧鍒板簵");
+ }
+ // 鏍¢獙鏄惁瀛樺湪寰呭鐞嗙殑閫炬湡璐圭敤
+ if (Constants.equalsInteger(order.getOverdueStatus(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀛樺湪閫炬湡璐圭敤寰呭鐞嗭紝璇峰厛瀹屾垚閫炬湡璐圭敤鏀粯");
+ }
+ // 寰呭彇浠�(5) 鈫� 宸插畬鎴�(7)
+ order.setStatus(Constants.OrderStatus.finished.getStatus());
+ order.setConfirmArriveTime(now);
+ ordersMapper.updateById(order);
+ // 璁㈠崟瀹屾垚锛岄噴鏀炬牳閿�鐮�
+ String verifyCode = order.getMemberVerifyCode();
+ if (StringUtils.isNotBlank(verifyCode)) {
+ releaseVerifyCode(verifyCode);
+ }
+ // 淇濆瓨鍑哄簱鍥剧墖锛坥bj_type=13 闂ㄥ簵鍑哄簱鍥剧墖锛屾渶澶�3寮狅級
+ saveVerifyImages(order.getId(), images, Constants.FileType.STORE_OUT.getKey(), shopId);
+ // 鐢熸垚鏀剁泭璁板綍
+ calculateAndSaveOrderFees(order.getId());
+ generateRevenueRecords(order.getId());
+ // 璁板綍璁㈠崟鏃ュ織
+ saveShopVerifyLog(order, Constants.OrderLogType.shopTake, Constants.OrderLogType.shopTake.format(shopName), remark, shopId);
+ // 閫氱煡浼氬憳锛氳鍗曞凡瀹屾垚
+ sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.FINISHED, order.getId(),
+ "orderNo", order.getCode());
+ // 閫氱煡瀛樹欢闂ㄥ簵鍜屽彇浠堕棬搴楋細璁㈠崟宸插畬鎴�
+ String settleDays = operationConfigBiz.getConfig().getSettlementDate();
+ notifyBothShops(order, Constants.ShopOrderNotify.FINISHED,
+ "orderNo", order.getCode(),
+ "settleDays", settleDays != null ? settleDays : "7");
+ // 閫氱煡鍙告満锛氳鍗曞凡瀹屾垚
+ if (order.getAcceptDriver() != null) {
+ sendDriverNotice(order.getAcceptDriver(), Constants.DriverOrderNotify.FINISHED, order.getId(),
+ "orderNo", order.getCode(),
+ "settleDays", settleDays != null ? settleDays : "7");
+ }
+ } else {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鍏佽鏍搁攢");
+ }
+ }
+
+ @Override
+ @Transactional(rollbackFor = {Exception.class, BusinessException.class})
public void shopVerifyOrder(String verifyCode, Integer shopId, List<String> images, String remark) {
if (StringUtils.isBlank(verifyCode)) {
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏍搁攢鐮佷笉鑳戒负绌�");
@@ -2217,7 +2780,17 @@
// 淇濆瓨瀵勫瓨鍥剧墖锛坥bj_type=2 璁㈠崟瀵勫瓨鍥剧墖锛屾渶澶�3寮狅級
saveVerifyImages(order.getId(), images, Constants.FileType.ORDER_DEPOSIT.getKey(), shopId);
// 璁板綍璁㈠崟鏃ュ織
- saveShopVerifyLog(order, "闂ㄥ簵纭瀵勫瓨", "闂ㄥ簵銆�" + shopName + "銆戠‘璁ゅ瘎瀛�", remark, shopId);
+ saveShopVerifyLog(order, Constants.OrderLogType.shopDeposit, Constants.OrderLogType.shopDeposit.format(shopName), remark, shopId);
+ // 閫氱煡浼氬憳锛氶棬搴楁牳閿�鎴愬姛
+ if (Constants.equalsInteger(order.getType(), Constants.ONE)) {
+ // 寮傚湴瀵勫瓨 鈫� 寰呮姠鍗�
+ sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.WAIT_GRAB, order.getId(),
+ "orderNo", order.getCode());
+ } else {
+ // 灏卞湴瀵勫瓨 鈫� 寰呭彇浠舵彁閱�
+ sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.WAIT_PICKUP_REMIND, order.getId(),
+ "orderNo", order.getCode(), "shopName", shopName);
+ }
} else if (Constants.equalsInteger(status, Constants.OrderStatus.arrived.getStatus())) {
// 寮傚湴瀵勫瓨 + 鏃犲彇浠堕棬搴� 鈫� 鏃犳硶鏍搁攢锛堝鎴疯嚜鍙栵紝鏃犻棬搴楁搷浣滐級
if (Constants.equalsInteger(order.getType(), Constants.ONE) && order.getTakeShopId() == null) {
@@ -2226,6 +2799,14 @@
// 鏍¢獙鍙栦欢闂ㄥ簵涓庡綋鍓嶇櫥褰曢棬搴椾竴鑷�
if (!shopId.equals(order.getTakeShopId())) {
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曚笉灞炰簬褰撳墠闂ㄥ簵锛屾棤娉曟牳閿�");
+ }
+ // 鏍¢獙鏄惁宸茬‘璁ら【瀹㈠埌搴�
+ if (order.getConfirmArriveTime() == null) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇峰厛纭椤惧鍒板簵");
+ }
+ // 鏍¢獙鏄惁瀛樺湪寰呭鐞嗙殑閫炬湡璐圭敤
+ if (Constants.equalsInteger(order.getOverdueStatus(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀛樺湪閫炬湡璐圭敤寰呭鐞嗭紝璇峰厛瀹屾垚閫炬湡璐圭敤鏀粯");
}
// 寰呭彇浠�(5) 鈫� 宸插畬鎴�(7)
order.setStatus(Constants.OrderStatus.finished.getStatus());
@@ -2239,7 +2820,21 @@
calculateAndSaveOrderFees(order.getId());
generateRevenueRecords(order.getId());
// 璁板綍璁㈠崟鏃ュ織
- saveShopVerifyLog(order, "闂ㄥ簵纭鍙栦欢", "闂ㄥ簵銆�" + shopName + "銆戠‘璁ゅ彇浠讹紝璁㈠崟瀹屾垚", remark, shopId);
+ saveShopVerifyLog(order, Constants.OrderLogType.shopTake, Constants.OrderLogType.shopTake.format(shopName), remark, shopId);
+ // 閫氱煡浼氬憳锛氳鍗曞凡瀹屾垚
+ sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.FINISHED, order.getId(),
+ "orderNo", order.getCode());
+ // 閫氱煡瀛樹欢闂ㄥ簵鍜屽彇浠堕棬搴楋細璁㈠崟宸插畬鎴�
+ String settleDays = operationConfigBiz.getConfig().getSettlementDate();
+ notifyBothShops(order, Constants.ShopOrderNotify.FINISHED,
+ "orderNo", order.getCode(),
+ "settleDays", settleDays != null ? settleDays : "7");
+ // 閫氱煡鍙告満锛氳鍗曞凡瀹屾垚
+ if (order.getAcceptDriver() != null) {
+ sendDriverNotice(order.getAcceptDriver(), Constants.DriverOrderNotify.FINISHED, order.getId(),
+ "orderNo", order.getCode(),
+ "settleDays", settleDays != null ? settleDays : "7");
+ }
} else {
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鍏佽鏍搁攢");
}
@@ -2313,16 +2908,19 @@
refundRecord.setType(3); // 鍑哄簱閫�娆�
refundRecord.setCreateTime(now);
refundRecord.setRefundRemark(remark);
+ refundRecord.setRefundAmount(order.getRefundAmount());
refundRecord.setDeleted(Constants.ZERO);
+ refundRecord.setBeforeStatus(order.getStatus());
ordersRefundMapper.insert(refundRecord);
- // 璋冪敤寰俊閫�娆撅紙鏀惧湪鏈�鍚庯紝纭繚鍓嶇疆鎿嶄綔鍏ㄩ儴鎴愬姛锛�
- String refundCode = wxMiniUtilService.wxRefund(
- order.getOutTradeNo(), order.getPayAmount(), order.getRefundAmount());
+ // 璋冪敤寰俊閫�娆綱3锛堟斁鍦ㄦ渶鍚庯紝纭繚鍓嶇疆鎿嶄綔鍏ㄩ儴鎴愬姛锛�
+ Refund refundResult = wxPayV3Service.refund(
+ order.getOutTradeNo(), order.getPayAmount(), order.getRefundAmount(),
+ "璁㈠崟閫�娆�", wxPayProperties.getV3RefundNotifyUrl());
- // 閫�娆炬垚鍔熷悗鍥炲~閫�娆惧崟鍙峰拰鏃堕棿
- refundRecord.setRefundCode(refundCode);
- refundRecord.setRefundTime(new Date());
+ // 閫�娆炬垚鍔熷悗鍥炲~閫�娆惧崟鍙凤紝鏍囪閫�娆句腑
+ refundRecord.setRefundCode(refundResult.getOutRefundNo());
+ refundRecord.setStatus(Constants.ZERO); // 閫�娆句腑
ordersRefundMapper.updateById(refundRecord);
}
@@ -2335,7 +2933,73 @@
if (order.getRefundAmount() != null && order.getRefundAmount() > 0) {
logInfo += "锛岄��娆�" + Constants.getFormatMoney(order.getRefundAmount()) + "鍏�";
}
- saveShopVerifyLog(order, "闂ㄥ簵纭鍑哄簱", logInfo, remark, shopId);
+ saveShopVerifyLog(order, Constants.OrderLogType.shopOutStock, logInfo, remark, shopId);
+ // 閫氱煡浼氬憳锛氳鍗曞凡瀹屾垚
+ sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.FINISHED, order.getId(),
+ "orderNo", order.getCode());
+ // 閫氱煡瀛樹欢闂ㄥ簵鍜屽彇浠堕棬搴楋細璁㈠崟宸插畬鎴�
+ String settleDays = operationConfigBiz.getConfig().getSettlementDate();
+ notifyBothShops(order, Constants.ShopOrderNotify.FINISHED,
+ "orderNo", order.getCode(),
+ "settleDays", settleDays != null ? settleDays : "7");
+ // 閫氱煡鍙告満锛氳鍗曞凡瀹屾垚
+ if (order.getAcceptDriver() != null) {
+ sendDriverNotice(order.getAcceptDriver(), Constants.DriverOrderNotify.FINISHED, order.getId(),
+ "orderNo", order.getCode(),
+ "settleDays", settleDays != null ? settleDays : "7");
+ }
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void memberConfirmReceipt(Integer orderId, Integer memberId) {
+ // 1. 鏌ヨ璁㈠崟
+ Orders order = ordersMapper.selectById(orderId);
+ if (order == null || Constants.equalsInteger(order.getDeleted(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "璁㈠崟涓嶅瓨鍦�");
+ }
+ // 2. 鏍¢獙褰掑睘
+ if (!memberId.equals(order.getMemberId())) {
+ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "鏃犳潈鎿嶄綔璇ヨ鍗�");
+ }
+ // 3. 鏍¢獙璁㈠崟绫诲瀷锛氬紓鍦板瘎瀛�
+ if (!Constants.ONE.equals(order.getType())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呭紓鍦板瘎瀛樿鍗曞彲鎿嶄綔");
+ }
+ // 4. 鏍¢獙鏃犲彇浠堕棬搴�
+ if (order.getTakeShopId() != null) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曟湁鍙栦欢闂ㄥ簵锛岄渶闂ㄥ簵纭鍑哄簱");
+ }
+ // 5. 鏍¢獙鐘舵�侊細宸查�佽揪(5)
+ if (!Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.arrived.getStatus())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鍏佽纭鏀惰揣");
+ }
+
+ // 6. 鏇存柊璁㈠崟鐘舵�佷负宸插畬鎴�
+ Date now = new Date();
+ order.setStatus(Constants.OrderStatus.finished.getStatus());
+ order.setFinishTime(now);
+ order.setUpdateTime(now);
+ ordersMapper.updateById(order);
+
+ // 7. 鐢熸垚鏀剁泭璁板綍
+ calculateAndSaveOrderFees(orderId);
+ generateRevenueRecords(orderId);
+
+ // 閫氱煡浼氬憳锛氳鍗曞凡瀹屾垚
+ sendOrderNotice(memberId, Constants.MemberOrderNotify.FINISHED, orderId,
+ "orderNo", order.getCode());
+ // 閫氱煡瀛樹欢闂ㄥ簵鍜屽彇浠堕棬搴楋細璁㈠崟宸插畬鎴�
+ String settleDays = operationConfigBiz.getConfig().getSettlementDate();
+ notifyBothShops(order, Constants.ShopOrderNotify.FINISHED,
+ "orderNo", order.getCode(),
+ "settleDays", settleDays != null ? settleDays : "7");
+ // 閫氱煡鍙告満锛氳鍗曞凡瀹屾垚
+ if (order.getAcceptDriver() != null) {
+ sendDriverNotice(order.getAcceptDriver(), Constants.DriverOrderNotify.FINISHED, order.getId(),
+ "orderNo", order.getCode(),
+ "settleDays", settleDays != null ? settleDays : "7");
+ }
}
@Override
@@ -2361,7 +3025,7 @@
Long takeShopFee = 0L;
Long driverFee = 0L;
- if (Constants.equalsInteger(order.getType(), Constants.TWO)) {
+ if (Constants.equalsInteger(order.getType(), Constants.ONE)) {
// 寮傚湴瀵勫瓨锛氬瓨浠堕棬搴� + 鍙告満
driverFee = new BigDecimal(totalAmount)
.multiply(driverRate)
@@ -2487,6 +3151,35 @@
// 淇濆瓨闄勪欢锛坥bj_type=3 闂ㄥ簵鍏ュ簱鍥剧墖锛屾渶澶�3寮狅級
saveVerifyImages(order.getId(), images, Constants.FileType.ORDER_TAKE.getKey(), driverId);
+
+ // 閫氱煡浼氬憳锛氳鍗曞凡閫佽揪
+ String destination = order.getTakeShopAddress() != null ? order.getTakeShopAddress() : "";
+ if (order.getMemberVerifyCode() != null) {
+ sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.ARRIVED_HAS_SHOP, order.getId(),
+ "orderNo", order.getCode(),
+ "destination", destination,
+ "pickupCode", order.getMemberVerifyCode());
+ } else {
+ sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.ARRIVED_NO_SHOP, order.getId(),
+ "orderNo", order.getCode(),
+ "destination", destination);
+ }
+
+ // 閫氱煡鍙栦欢闂ㄥ簵锛氳鍗曞凡閫佽揪
+ if (order.getTakeShopId() != null) {
+ sendShopNotice(order.getTakeShopId(), Constants.ShopOrderNotify.ARRIVED, order.getId(),
+ "orderNo", order.getCode(),
+ "destination", destination);
+ }
+
+ // 鐭俊閫氱煡浼氬憳锛氳鏉庡凡閫佽揪
+ Member arrivedMember = memberMapper.selectById(order.getMemberId());
+ if (arrivedMember != null) {
+ sendSmsNotify(arrivedMember.getTelephone(), Constants.SmsNotify.MEMBER_ARRIVED,
+ "orderNo", order.getCode(),
+ "address", destination,
+ "code", order.getMemberVerifyCode() != null ? order.getMemberVerifyCode() : "");
+ }
}
/**
@@ -2572,9 +3265,9 @@
ordersMapper.updateById(order);
// 璁板綍璁㈠崟鏃ュ織
- saveShopVerifyLog(order, "纭椤惧鍒板簵锛堥�炬湡锛�",
- "闂ㄥ簵銆�" + shopName + "銆戠‘璁ら【瀹㈠埌搴楋紝閫炬湡" + overdueInfo.getOverdueDays()
- + "澶╋紝閫炬湡璐圭敤" + Constants.getFormatMoney(overdueInfo.getOverdueFee()) + "鍏�",
+ String overdueLogInfo = "闂ㄥ簵銆�" + shopName + "銆戠‘璁ら【瀹㈠埌搴楋紝閫炬湡" + overdueInfo.getOverdueDays()
+ + "澶╋紝閫炬湡璐圭敤" + Constants.getFormatMoney(overdueInfo.getOverdueFee()) + "鍏�";
+ saveShopVerifyLog(order, Constants.OrderLogType.shopConfirmArriveOverdue, overdueLogInfo,
null, shopId);
} else {
// 鏈�炬湡锛氭爣璁伴�炬湡鐘舵�佷负0锛岃鍗曚繚鎸佸綋鍓嶇姸鎬�
@@ -2618,7 +3311,7 @@
if (order.getRefundAmount() != null && order.getRefundAmount() > 0) {
logInfo += "锛岄渶閫�娆�" + Constants.getFormatMoney(order.getRefundAmount()) + "鍏�";
}
- saveShopVerifyLog(order, "纭椤惧鍒板簵", logInfo, null, shopId);
+ saveShopVerifyLog(order, Constants.OrderLogType.shopConfirmArrive, logInfo, null, shopId);
}
}
@@ -2661,12 +3354,6 @@
if (Constants.equalsInteger(status, Constants.OrderStatus.cancelled.getStatus())) {
return "璁㈠崟宸插彇娑堬紝鎰熻阿鎮ㄧ殑鏀寔锛屾杩庝笅娆″啀浼氾紒";
}
- if (Constants.equalsInteger(status, Constants.OrderStatus.cancelling.getStatus())) {
- return "閫�娆剧敵璇峰凡鎻愪氦锛屽钩鍙颁細灏藉揩涓烘偍澶勭悊閫�娆�";
- }
- if (Constants.equalsInteger(status, Constants.OrderStatus.closed.getStatus())) {
- return "閫�娆惧凡鎴愬姛鍘熻矾杩斿洖锛岃娉ㄦ剰鏌ユ敹";
- }
return "";
}
@@ -2701,6 +3388,62 @@
}
/**
+ /**
+ * 濉厖閫炬湡鐘舵�佸埌 VO锛圡yOrderVO锛�
+ * overdueStatus: 0=鏈埌搴楁湭閫炬湡 1=鏈埌搴楀瓨鍦ㄩ�炬湡 2=宸插埌搴楁湭閫炬湡 3=宸插埌搴楀緟鏀粯閫炬湡 4=閫炬湡宸叉敮浠�
+ */
+ private void fillOverdueStatus(MyOrderVO vo, Orders order, List<OrdersDetail> details) {
+ Integer[] result = calcOverdueStatus(order, details);
+ vo.setOverdueStatus(result[0]);
+ vo.setOverdue(result[1] == 1);
+ vo.setOverdueDays(result[2]);
+ vo.setOverdueFee(result[3].longValue());
+ }
+
+ /**
+ * 濉厖閫炬湡鐘舵�佸埌 VO锛圡yOrderDetailVO锛�
+ */
+ private void fillOverdueStatus(MyOrderDetailVO vo, Orders order, List<OrdersDetail> details) {
+ Integer[] result = calcOverdueStatus(order, details);
+ vo.setOverdueStatus(result[0]);
+ vo.setOverdue(result[1] == 1);
+ vo.setOverdueDays(result[2]);
+ vo.setOverdueFee(result[3].longValue());
+ }
+
+ /**
+ * 璁$畻閫炬湡鐘舵��
+ * @return [overdueStatus, isOverdue(0/1), overdueDays, overdueFee]
+ */
+ private Integer[] calcOverdueStatus(Orders order, List<OrdersDetail> details) {
+ // 4=閫炬湡宸叉敮浠橈紙璁㈠崟 overdueStatus=2锛�
+ if (Constants.equalsInteger(order.getOverdueStatus(), Constants.TWO)) {
+ return new Integer[]{4, 1, order.getOverdueDays(), order.getOverdueAmount() != null ? order.getOverdueAmount().intValue() : 0};
+ }
+ // 3=宸插埌搴楀緟鏀粯閫炬湡锛堣鍗� overdueStatus=1锛�
+ if (Constants.equalsInteger(order.getOverdueStatus(), Constants.ONE)) {
+ return new Integer[]{3, 1, order.getOverdueDays(), order.getOverdueAmount() != null ? order.getOverdueAmount().intValue() : 0};
+ }
+ // 璁$畻瀹炴椂閫炬湡
+ OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(order, details);
+ boolean hasOverdue = overdueInfo.getOverdue() != null && overdueInfo.getOverdue()
+ && overdueInfo.getOverdueFee() != null && overdueInfo.getOverdueFee() > 0;
+ if (order.getConfirmArriveTime() != null) {
+ // 宸插埌搴�
+ int days = hasOverdue ? overdueInfo.getOverdueDays() : 0;
+ long fee = hasOverdue ? overdueInfo.getOverdueFee() : 0L;
+ return new Integer[]{2, hasOverdue ? 1 : 0, days, (int) fee};
+ } else {
+ // 鏈埌搴�
+ if (hasOverdue) {
+ return new Integer[]{1, 1, overdueInfo.getOverdueDays(), overdueInfo.getOverdueFee().intValue()};
+ } else {
+ return new Integer[]{0, 0, 0, 0};
+ }
+ }
+ }
+
+ /**
* 閫炬湡璐圭敤鍐呴儴璁$畻锛堜笉鏌ュ簱锛屾帴鍙楅鏌ヨ鐨勬暟鎹級
* 渚涘垎椤电瓑宸叉煡璇㈡槑缁嗙殑涓氬姟鍦烘櫙澶嶇敤锛岄伩鍏嶉噸澶嶆煡璇�
*/
@@ -2717,8 +3460,8 @@
// 鐗╁搧鍩虹鏃ヨ垂鐢� = 危(鍗曚环 脳 鏁伴噺)
long dailyBaseFee = 0L;
for (OrdersDetail d : details) {
- dailyBaseFee += (d.getUnitPrice() != null ? d.getUnitPrice() : 0L)
- * (d.getNum() != null ? d.getNum() : 0);
+ dailyBaseFee += (d.getLocallyPrice() != null ? d.getLocallyPrice() : 0L)
+ * (d.getNum() != null ? d.getNum() : 1);
}
Date now = new Date();
@@ -2802,25 +3545,20 @@
/**
* 灏卞湴瀵勫瓨閫炬湡澶╂暟璁$畻
- * 杩囦簡棰勮鍙栦欢鏃堕棿褰撳ぉ鐨�12鐐瑰悗鎵嶇畻涓�澶�
+ * 杩囦簡棰勮鍙栦欢鏃ユ湡鐨勬鏃ワ紙鍙瘮杈冨勾鏈堟棩锛夊悗寮�濮嬭閫炬湡澶╂暟
*/
private int calcLocalOverdueDays(Date now, Date expectedTakeTime) {
- if (expectedTakeTime == null || !now.after(expectedTakeTime)) {
+ if (expectedTakeTime == null) {
return 0;
}
- // 鍩哄噯鏃堕棿 = 棰勮鍙栦欢鏃ユ湡鐨�12:00
+ // 鍙彇骞存湀鏃�
Calendar baseCal = Calendar.getInstance();
baseCal.setTime(expectedTakeTime);
- baseCal.set(Calendar.HOUR_OF_DAY, 12);
+ baseCal.set(Calendar.HOUR_OF_DAY, 0);
baseCal.set(Calendar.MINUTE, 0);
baseCal.set(Calendar.SECOND, 0);
baseCal.set(Calendar.MILLISECOND, 0);
- Date baseTime = baseCal.getTime();
- if (!now.after(baseTime)) {
- return 0;
- }
- // 閫炬湡澶╂暟 = 褰撳墠鏃ユ湡 - 鍩哄噯鏃ユ湡锛堟寜澶╁彇宸級
Calendar nowCal = Calendar.getInstance();
nowCal.setTime(now);
nowCal.set(Calendar.HOUR_OF_DAY, 0);
@@ -2828,40 +3566,31 @@
nowCal.set(Calendar.SECOND, 0);
nowCal.set(Calendar.MILLISECOND, 0);
- Calendar baseDateCal = Calendar.getInstance();
- baseDateCal.setTime(baseTime);
- baseDateCal.set(Calendar.HOUR_OF_DAY, 0);
- baseDateCal.set(Calendar.MINUTE, 0);
- baseDateCal.set(Calendar.SECOND, 0);
- baseDateCal.set(Calendar.MILLISECOND, 0);
-
- long diffMs = nowCal.getTimeInMillis() - baseDateCal.getTimeInMillis();
- int days = (int) (diffMs / (1000 * 60 * 60 * 24));
- return Math.max(days, 0);
+ // 鍩哄噯鏃ユ湡 = 棰勮鍙栦欢鏃ユ湡鐨勬鏃ワ紝褰撳ぉ鍙婁箣鍓嶄笉绠楅�炬湡
+ if (nowCal.before(baseCal)) {
+ return 0;
+ }
+ // 閫炬湡澶╂暟 = 褰撳墠鏃ユ湡 - 鍩哄噯鏃ユ湡
+ long diffMs = nowCal.getTimeInMillis() - baseCal.getTimeInMillis();
+ return (int) (diffMs / (1000 * 60 * 60 * 24));
}
/**
* 寮傚湴瀵勫瓨閫炬湡澶╂暟璁$畻
- * 杩囦簡杞Щ鍒板簵鏃堕棿褰撳ぉ鐨勬櫄涓�12鐐癸紙24:00锛夊悗鎵嶇畻绗竴澶�
+ * 杩囦簡杞Щ鍒板簵鏃ユ湡鐨勬鏃ワ紙鍙瘮杈冨勾鏈堟棩锛夊悗寮�濮嬭閫炬湡澶╂暟
*/
private int calcRemoteOverdueDays(Date now, Date arriveTime) {
- if (arriveTime == null || !now.after(arriveTime)) {
+ if (arriveTime == null) {
return 0;
}
- // 鍩哄噯鏃堕棿 = 杞Щ鍒板簵鏃ユ湡鐨勬鏃� 00:00锛堝嵆褰撳ぉ24:00锛�
+ // 鍙彇骞存湀鏃�
Calendar baseCal = Calendar.getInstance();
baseCal.setTime(arriveTime);
baseCal.set(Calendar.HOUR_OF_DAY, 0);
baseCal.set(Calendar.MINUTE, 0);
baseCal.set(Calendar.SECOND, 0);
baseCal.set(Calendar.MILLISECOND, 0);
- baseCal.add(Calendar.DAY_OF_MONTH, 1); // 娆℃棩00:00 = 褰撳ぉ24:00
- Date baseTime = baseCal.getTime();
- if (!now.after(baseTime)) {
- return 0;
- }
- // 閫炬湡澶╂暟 = 褰撳墠鏃ユ湡 - 鍩哄噯鏃ユ湡
Calendar nowCal = Calendar.getInstance();
nowCal.setTime(now);
nowCal.set(Calendar.HOUR_OF_DAY, 0);
@@ -2869,16 +3598,69 @@
nowCal.set(Calendar.SECOND, 0);
nowCal.set(Calendar.MILLISECOND, 0);
- Calendar baseDateCal = Calendar.getInstance();
- baseDateCal.setTime(baseTime);
- baseDateCal.set(Calendar.HOUR_OF_DAY, 0);
- baseDateCal.set(Calendar.MINUTE, 0);
- baseDateCal.set(Calendar.SECOND, 0);
- baseDateCal.set(Calendar.MILLISECOND, 0);
+ // 鍩哄噯鏃ユ湡 = 鍒板簵鏃ユ湡鐨勬鏃ワ紝褰撳ぉ鍙婁箣鍓嶄笉绠楅�炬湡
+ baseCal.add(Calendar.DAY_OF_MONTH, 1);
+ if (nowCal.before(baseCal)) {
+ return 0;
+ }
+ // 閫炬湡澶╂暟 = 褰撳墠鏃ユ湡 - 鍩哄噯鏃ユ湡
+ long diffMs = nowCal.getTimeInMillis() - baseCal.getTimeInMillis();
+ return (int) (diffMs / (1000 * 60 * 60 * 24));
+ }
- long diffMs = nowCal.getTimeInMillis() - baseDateCal.getTimeInMillis();
- int days = (int) (diffMs / (1000 * 60 * 60 * 24));
- return Math.max(days, 0);
+ @Override
+ public ActiveOrderTipVO getActiveOrderTip(Integer memberId) {
+ // 鏌ヨ鐘舵�佷负 0~5 鐨勬渶鏂颁竴鏉¤鍗�
+ QueryWrapper<Orders> wrapper = new QueryWrapper<>();
+ wrapper.eq("MEMBER_ID", memberId)
+ .in("STATUS", 0, 1, 2, 3, 4, 5)
+ .orderByDesc("CREATE_TIME")
+ .last("LIMIT 1");
+ Orders order = ordersMapper.selectOne(wrapper);
+ if (order == null) {
+ return null;
+ }
+
+ ActiveOrderTipVO vo = new ActiveOrderTipVO();
+ vo.setOrderId(order.getId());
+ vo.setStatus(order.getStatus());
+
+ // 鏋勫缓鎻愮ず鏂囨
+ boolean isLocal = Constants.equalsInteger(order.getType(), Constants.ZERO);
+ Integer status = order.getStatus();
+ String tip = null;
+
+ if (Constants.equalsInteger(status, Constants.OrderStatus.waitPay.getStatus())) {
+ // 寰呮敮浠橈細鎻愮ず鏀粯鍊掕鏃�
+ String minutes = "";
+ try {
+ minutes = operationConfigBiz.getConfig().getAutoCancelTime();
+ } catch (Exception ignored) {}
+ tip = "璇峰湪" + (StringUtils.isNotBlank(minutes) ? minutes : "") + "鍒嗛挓鍐呭畬鎴愭敮浠橈紝瓒呮椂璁㈠崟灏嗚嚜鍔ㄥ彇娑�";
+
+ // 璁$畻鏀粯鍊掕鏃�
+ if (StringUtils.isNotBlank(minutes) && order.getCreateTime() != null) {
+ long timeoutMs = Long.parseLong(minutes) * 60 * 1000;
+ long deadline = order.getCreateTime().getTime() + timeoutMs;
+ long remain = deadline - System.currentTimeMillis();
+ vo.setPayCountdown(remain > 0 ? remain : -1L);
+ } else {
+ vo.setPayCountdown(-1L);
+ }
+ } else if (Constants.equalsInteger(status, Constants.OrderStatus.waitDeposit.getStatus())) {
+ tip = "璁㈠崟宸叉敮浠橈紝璇峰墠寰�闂ㄥ簵瀵勫瓨";
+ } else if (Constants.equalsInteger(status, Constants.OrderStatus.deposited.getStatus())) {
+ tip = isLocal ? "琛屾潕宸插瘎瀛橈紝璇峰嚟鍙栦欢鐮佸墠寰�鎸囧畾闂ㄥ簵鍙栦欢" : "闂ㄥ簵宸叉帴鍗曪紝姝e湪涓烘偍瀹夋帓鍙栦欢鍙告満";
+ } else if (Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) {
+ tip = isLocal ? "琛屾潕宸插瘎瀛橈紝璇峰嚟鍙栦欢鐮佸墠寰�鎸囧畾闂ㄥ簵鍙栦欢" : "宸叉湁鍙告満鎶㈠崟锛屾鍓嶅線鍙栦欢鍦扮偣";
+ } else if (Constants.equalsInteger(status, Constants.OrderStatus.delivering.getStatus())) {
+ tip = "鍙告満宸插彇浠讹紝姝h繍寰�鐩殑鍦�";
+ } else if (Constants.equalsInteger(status, Constants.OrderStatus.arrived.getStatus())) {
+ tip = "琛屾潕宸查�佽揪鏈嶅姟鐐癸紝璇峰強鏃跺墠寰�鍙栦欢";
+ }
+
+ vo.setTip(tip);
+ return vo;
}
@Override
@@ -2888,7 +3670,7 @@
// 鑵捐鍦板浘璺濈鐭╅樀API璁$畻瀹為檯璺濈
String from = fromLat + "," + fromLng;
String to = toLat + "," + toLng;
- JSONObject distanceResult = MapUtil.distanceSingle("driving", from, to);
+ JSONObject distanceResult = MapUtil.direction("driving", from, to);
// 鑾峰彇璺濈锛堢背锛夛紝杞叕閲�
int distanceMeters = distanceResult.getIntValue("distance");
@@ -2906,4 +3688,293 @@
return vo;
}
+ @Override
+ public int cancelTimeoutUnpaidOrders() {
+ // 鑾峰彇瓒呮椂閰嶇疆锛堝垎閽燂級
+ String autoCancelTimeStr = operationConfigBiz.getConfig().getAutoCancelTime();
+ if (StringUtils.isBlank(autoCancelTimeStr)) {
+ log.info("鏈厤缃秴鏃跺彇娑堟椂闂达紝璺宠繃");
+ return 0;
+ }
+ int autoCancelMinutes;
+ try {
+ autoCancelMinutes = Integer.parseInt(autoCancelTimeStr);
+ } catch (NumberFormatException e) {
+ log.warn("瓒呮椂鍙栨秷鏃堕棿閰嶇疆寮傚父: {}", autoCancelTimeStr);
+ return 0;
+ }
+ if (autoCancelMinutes <= 0) {
+ return 0;
+ }
+
+ // 鏌ヨ鎵�鏈夎秴鏃舵湭鏀粯璁㈠崟锛歴tatus=0 涓� 鍒涘缓鏃堕棿 + 閰嶇疆鍒嗛挓鏁� < 褰撳墠鏃堕棿
+ Date deadline = new Date(System.currentTimeMillis() - (long) autoCancelMinutes * 60 * 1000);
+ List<Orders> timeoutOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda()
+ .eq(Orders::getStatus, Constants.OrderStatus.waitPay.getStatus())
+ .eq(Orders::getDeleted, Constants.ZERO)
+ .lt(Orders::getCreateTime, deadline));
+
+ if (timeoutOrders == null || timeoutOrders.isEmpty()) {
+ return 0;
+ }
+
+ int count = 0;
+ Date now = new Date();
+ for (Orders order : timeoutOrders) {
+ try {
+ order.setStatus(Constants.OrderStatus.cancelled.getStatus());
+ order.setCancelTime(now);
+ order.setUpdateTime(now);
+ ordersMapper.updateById(order);
+
+ // 鍐欏叆鎿嶄綔鏃ュ織
+ OrderLog orderLog = new OrderLog();
+ orderLog.setOrderId(order.getId());
+ orderLog.setTitle(Constants.OrderLogType.systemCancel.getTitle());
+ orderLog.setLogInfo(Constants.OrderLogType.systemCancel.format("璁㈠崟瓒呮椂" + autoCancelMinutes + "鍒嗛挓鏈敮浠橈紝绯荤粺鑷姩鍙栨秷"));
+ orderLog.setObjType(Constants.OrderLogType.systemCancel.getStatus());
+ orderLog.setOrderStatus(Constants.OrderStatus.cancelled.getStatus());
+ orderLog.setOptUserType(3); // 3=绯荤粺
+ orderLog.setCreateTime(now);
+ orderLog.setDeleted(Constants.ZERO);
+ orderLogService.create(orderLog);
+
+ // 鐭俊閫氱煡浼氬憳锛氳鍗曞凡鍙栨秷
+ if (order.getMemberId() != null) {
+ Member member = memberMapper.selectById(order.getMemberId());
+ sendSmsNotify(member != null ? member.getTelephone() : null,
+ Constants.SmsNotify.MEMBER_CANCELLED, "orderNo", order.getCode());
+ }
+
+ count++;
+ } catch (Exception e) {
+ log.error("鍙栨秷瓒呮椂璁㈠崟寮傚父, orderId={}, error={}", order.getId(), e.getMessage());
+ }
+ }
+ log.info("瓒呮椂鏈敮浠樿鍗曡嚜鍔ㄥ彇娑堝畬鎴愶紝鍏卞彇娑坽}鍗�", count);
+ return count;
+ }
+
+ @Override
+ public int notifyUngrabbedOrders() {
+ // 鑾峰彇鏃犱汉鎶㈠崟閫氱煡鏃堕棿閰嶇疆锛堝垎閽燂級
+ String noGrabTimeStr = operationConfigBiz.getConfig().getNoGrabNotifyTime();
+ if (StringUtils.isBlank(noGrabTimeStr)) {
+ return 0;
+ }
+ int noGrabMinutes;
+ try {
+ noGrabMinutes = Integer.parseInt(noGrabTimeStr);
+ } catch (NumberFormatException e) {
+ log.warn("鏃犱汉鎶㈠崟閫氱煡鏃堕棿閰嶇疆寮傚父: {}", noGrabTimeStr);
+ return 0;
+ }
+ if (noGrabMinutes <= 0) {
+ return 0;
+ }
+
+ // 鑾峰彇閫氱煡浜哄憳涓婚敭鍒楄〃
+ String noGrabUsers = operationConfigBiz.getConfig().getNoGrabNotifyUsers();
+ if (StringUtils.isBlank(noGrabUsers)) {
+ return 0;
+ }
+ List<String> userIdStrList = Arrays.asList(noGrabUsers.split(","));
+ List<Integer> userIds = new ArrayList<>();
+ for (String idStr : userIdStrList) {
+ if (StringUtils.isNotBlank(idStr.trim())) {
+ userIds.add(Integer.parseInt(idStr.trim()));
+ }
+ }
+ if (userIds.isEmpty()) {
+ return 0;
+ }
+
+ // 鏌ヨ閫氱煡浜哄憳鎵嬫満鍙�
+ List<String> notifyPhones = new ArrayList<>();
+ for (Integer userId : userIds) {
+ SystemUser user = systemUserMapper.selectById(userId);
+ if (user != null && StringUtils.isNotBlank(user.getMobile())) {
+ notifyPhones.add(user.getMobile());
+ }
+ }
+ if (notifyPhones.isEmpty()) {
+ log.warn("鏃犱汉鎶㈠崟閫氱煡浜哄憳鍧囨棤鏈夋晥鎵嬫満鍙�");
+ return 0;
+ }
+
+ // 鏌ヨ寮傚湴宸插瘎瀛�(status=2)銆佹湭閫氱煡(platformSmsNotified=0鎴杗ull)銆佽秴鏃剁殑璁㈠崟
+ Date deadline = new Date(System.currentTimeMillis() - (long) noGrabMinutes * 60 * 1000);
+ List<Orders> ungrabbedOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda()
+ .eq(Orders::getType, Constants.ONE) // 寮傚湴瀵勫瓨
+ .eq(Orders::getStatus, Constants.OrderStatus.deposited.getStatus()) // 宸插瘎瀛�
+ .eq(Orders::getDeleted, Constants.ZERO)
+ .ne(Orders::getPlatformSmsNotified, Constants.ONE) // 鏈�氱煡
+ .lt(Orders::getPlatformSmsNotifiedTime, deadline)); // 閫氱煡鍩哄噯鏃堕棿瓒呰繃閰嶇疆鏃堕棿
+
+ if (ungrabbedOrders == null || ungrabbedOrders.isEmpty()) {
+ return 0;
+ }
+
+ int count = 0;
+ Date now = new Date();
+ for (Orders order : ungrabbedOrders) {
+ try {
+ // 缁欐墍鏈夐�氱煡浜哄憳鍙戠煭淇�
+ for (String phone : notifyPhones) {
+ sendSmsNotify(phone, Constants.SmsNotify.PLATFORM_WAIT_GRAB,
+ "orderNo", order.getCode(),
+ "time", String.valueOf(noGrabMinutes));
+ }
+ // 鏍囪宸查�氱煡 + 璁板綍閫氱煡鏃堕棿
+ order.setPlatformSmsNotified(Constants.ONE);
+ order.setPlatformSmsNotifiedTime(now);
+ order.setUpdateTime(now);
+ ordersMapper.updateById(order);
+ count++;
+ } catch (Exception e) {
+ log.error("鏃犱汉鎶㈠崟鐭俊閫氱煡寮傚父, orderId={}, error={}", order.getId(), e.getMessage());
+ }
+ }
+ log.info("鏃犱汉鎶㈠崟鐭俊閫氱煡瀹屾垚锛屽叡閫氱煡{}鍗�", count);
+ return count;
+ }
+
+ @Override
+ public int autoCompleteOrders() {
+ // 鑾峰彇鑷姩纭鏀惰揣澶╂暟閰嶇疆
+ String autoConfirmDaysStr = operationConfigBiz.getConfig().getAutoConfirmReceipt();
+ if (StringUtils.isBlank(autoConfirmDaysStr)) {
+ return 0;
+ }
+ int autoConfirmDays;
+ try {
+ autoConfirmDays = Integer.parseInt(autoConfirmDaysStr);
+ } catch (NumberFormatException e) {
+ log.warn("鑷姩纭鏀惰揣澶╂暟閰嶇疆寮傚父: {}", autoConfirmDaysStr);
+ return 0;
+ }
+ if (autoConfirmDays <= 0) {
+ return 0;
+ }
+
+ // 鏌ヨ宸查�佽揪(status=5)涓旈�佽揪鏃堕棿瓒呰繃閰嶇疆澶╂暟鐨勮鍗�
+ Date deadline = new Date(System.currentTimeMillis() - (long) autoConfirmDays * 24 * 60 * 60 * 1000);
+ List<Orders> orders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda()
+ .eq(Orders::getStatus, Constants.OrderStatus.arrived.getStatus())
+ .eq(Orders::getDeleted, Constants.ZERO)
+ .isNotNull(Orders::getArriveTime)
+ .lt(Orders::getArriveTime, deadline));
+
+ if (orders == null || orders.isEmpty()) {
+ return 0;
+ }
+
+ int count = 0;
+ Date now = new Date();
+ for (Orders order : orders) {
+ try {
+ // 閫炬湡鏈敮浠樼殑涓嶈嚜鍔ㄥ畬鎴�
+ if (Constants.equalsInteger(order.getOverdueStatus(), Constants.ONE)) {
+ continue;
+ }
+
+ // 鏇存柊璁㈠崟鐘舵�佷负宸插畬鎴�
+ order.setStatus(Constants.OrderStatus.finished.getStatus());
+ order.setFinishTime(now);
+ order.setUpdateTime(now);
+ ordersMapper.updateById(order);
+
+ // 閲婃斁鏍搁攢鐮�
+ if (StringUtils.isNotBlank(order.getMemberVerifyCode())) {
+ releaseVerifyCode(order.getMemberVerifyCode());
+ }
+
+ // 鐢熸垚鏀剁泭璁板綍
+ calculateAndSaveOrderFees(order.getId());
+ generateRevenueRecords(order.getId());
+
+ // 璁板綍鎿嶄綔鏃ュ織
+ OrderLog orderLog = new OrderLog();
+ orderLog.setOrderId(order.getId());
+ orderLog.setTitle(Constants.OrderLogType.systemComplete.getTitle());
+ orderLog.setLogInfo(Constants.OrderLogType.systemComplete.format("璁㈠崟宸查�佽揪瓒呰繃" + autoConfirmDays + "澶╂湭纭锛岀郴缁熻嚜鍔ㄥ畬鎴�"));
+ orderLog.setObjType(Constants.OrderLogType.systemComplete.getStatus());
+ orderLog.setOrderStatus(Constants.OrderStatus.finished.getStatus());
+ orderLog.setOptUserType(3); // 3=绯荤粺
+ orderLog.setCreateTime(now);
+ orderLog.setDeleted(Constants.ZERO);
+ orderLogService.create(orderLog);
+
+ // 閫氱煡浼氬憳锛氳鍗曞凡瀹屾垚
+ sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.FINISHED, order.getId(),
+ "orderNo", order.getCode());
+ // 閫氱煡瀛樹欢闂ㄥ簵鍜屽彇浠堕棬搴�
+ String settleDays = operationConfigBiz.getConfig().getSettlementDate();
+ notifyBothShops(order, Constants.ShopOrderNotify.FINISHED,
+ "orderNo", order.getCode(),
+ "settleDays", settleDays != null ? settleDays : "7");
+ // 閫氱煡鍙告満
+ if (order.getAcceptDriver() != null) {
+ sendDriverNotice(order.getAcceptDriver(), Constants.DriverOrderNotify.FINISHED, order.getId(),
+ "orderNo", order.getCode(),
+ "settleDays", settleDays != null ? settleDays : "7");
+ }
+
+ count++;
+ } catch (Exception e) {
+ log.error("鑷姩瀹屾垚璁㈠崟寮傚父, orderId={}, error={}", order.getId(), e.getMessage());
+ }
+ }
+ log.info("鑷姩瀹屾垚瓒呮椂璁㈠崟瀹屾垚锛屽叡瀹屾垚{}鍗�", count);
+ return count;
+ }
+
+ /**
+ * 鍙戦�佺煭淇¢�氱煡锛堝け璐ヤ笉褰卞搷涓讳笟鍔★級
+ * @param phone 鎺ユ敹鎵嬫満鍙�
+ * @param smsNotify 鐭俊妯℃澘鏋氫妇
+ * @param paramPairs 妯℃澘鍙傛暟锛宬ey-value 浜ゆ浛浼犲叆锛屽 "orderNo", "XL202604220001"
+ */
+ private void sendSmsNotify(String phone, Constants.SmsNotify smsNotify, String... paramPairs) {
+ if (StringUtils.isBlank(phone)) {
+ return;
+ }
+ String content = smsNotify.format(paramPairs);
+ try {
+ JSONObject templateParam = new JSONObject();
+ for (int i = 0; i < paramPairs.length - 1; i += 2) {
+ templateParam.put(paramPairs[i], paramPairs[i + 1]);
+ }
+ boolean result = AliSmsService.sendSms(phone, smsNotify.getTemplateCode(),
+ templateParam.toJSONString());
+ if (result) {
+ log.info("鐭俊鍙戦�佹垚鍔�: phone={}, template={}", phone, smsNotify.name());
+ } else {
+ log.warn("鐭俊鍙戦�佸け璐�: phone={}, template={}", phone, smsNotify.name());
+ }
+ // 瀛樺偍鐭俊璁板綍
+ Smsrecord record = new Smsrecord();
+ record.setPhone(phone);
+ record.setContent(content);
+ record.setType(Constants.ONE); // 1=璁㈠崟閫氱煡
+ record.setStatus(result ? Constants.ONE : Constants.ZERO); // 1=宸插彂閫�, 0=鍙戦�佸け璐�
+ record.setCreateTime(new Date());
+ record.setDeleted(Constants.ZERO);
+ smsrecordMapper.insert(record);
+ } catch (Exception e) {
+ log.error("鐭俊鍙戦�佸紓甯�: phone={}, template={}, error={}", phone, smsNotify.name(), e.getMessage());
+ // 寮傚父涔熻褰�
+ try {
+ Smsrecord record = new Smsrecord();
+ record.setPhone(phone);
+ record.setContent(content);
+ record.setType(Constants.ONE);
+ record.setStatus(Constants.ZERO); // 鍙戦�佸け璐�
+ record.setCreateTime(new Date());
+ record.setDeleted(Constants.ZERO);
+ smsrecordMapper.insert(record);
+ } catch (Exception ignored) {}
+ }
+ }
+
}
--
Gitblit v1.9.3