From c74a6f59490cfb9a0ee37f70427739b74e7fbd58 Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期三, 20 五月 2026 08:50:29 +0800
Subject: [PATCH] 代码生成
---
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java | 1146 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 1,086 insertions(+), 60 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 ae1b254..3524470 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
@@ -21,6 +21,7 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.GeoUtils;
import com.doumee.core.utils.ID;
import com.doumee.core.utils.geocode.MapUtil;
import com.doumee.core.utils.Utils;
@@ -35,6 +36,8 @@
import com.doumee.dao.dto.CommentOrderDTO;
import com.doumee.dao.dto.CreateOrderDTO;
import com.doumee.dao.dto.DispatchDTO;
+import com.doumee.dao.dto.HandleOrderExceptionDTO;
+import com.doumee.dao.dto.ManualRefundDTO;
import com.doumee.dao.dto.MyOrderDTO;
import com.doumee.dao.dto.OrderItemDTO;
import com.doumee.dao.vo.*;
@@ -111,6 +114,9 @@
@Autowired
private RevenueMapper revenueMapper;
+ @Autowired
+ private RewardRecordMapper rewardRecordMapper;
+
@Autowired
@@ -124,6 +130,9 @@
@Autowired
private RedisTemplate<String, Object> redisTemplate;
+
+ @Autowired
+ private MemberCouponMapper memberCouponMapper;
@Autowired
private AreasBiz areasBiz;
@@ -228,7 +237,7 @@
.leftJoin(Category.class, Category::getId, Orders::getGoodType)
.leftJoin(DriverInfo.class, DriverInfo::getId, Orders::getAcceptDriver)
.leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID")
- .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID");
+ .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID") ;
;
Utils.MP.blankToNull(pageWrap.getModel());
queryWrapper.eq(pageWrap.getModel().getDeleted() != null, Orders::getDeleted, pageWrap.getModel().getDeleted());
@@ -237,7 +246,7 @@
queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getTakeShopName()), "s2.name", pageWrap.getModel().getTakeShopName());
queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getGoodsInfo()), Orders::getGoodsInfo, pageWrap.getModel().getGoodsInfo());
queryWrapper.ge(pageWrap.getModel().getCreateStartTime() != null, Orders::getCreateTime, pageWrap.getModel().getCreateStartTime());
- queryWrapper.le(pageWrap.getModel().getCreateEndTime() != null, Orders::getCreateTime, pageWrap.getModel().getCreateEndTime());
+ queryWrapper.le(pageWrap.getModel().getCreateEndTime() != null, Orders::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateEndTime()));
queryWrapper.eq(pageWrap.getModel().getDepositShopId() != null, Orders::getDepositShopId, pageWrap.getModel().getDepositShopId());
queryWrapper.eq(pageWrap.getModel().getType() != null, Orders::getType, pageWrap.getModel().getType());
queryWrapper.eq(pageWrap.getModel().getStatus() != null, Orders::getStatus, pageWrap.getModel().getStatus());
@@ -255,6 +264,14 @@
Constants.OrderStatus os = Constants.OrderStatus.getByKey(o.getStatus());
o.setStatusDesc(os != null ? os.getValue() : "");
}
+ if(Constants.equalsInteger(o.getIsUrgent(),Constants.ZERO)){
+ o.setUrgentAmount(Constants.ZERO.longValue());
+ }
+ // 瀹炰粯閲戦 = 鏀粯閲戦 - 閫�娆鹃噾棰� + 閫炬湡璐圭敤
+ long pay = o.getPayAmount() != null ? o.getPayAmount() : 0L;
+ long refund = o.getRefundAmount() != null ? o.getRefundAmount() : 0L;
+ long overdue = o.getOverdueAmount() != null ? o.getOverdueAmount() : 0L;
+ o.setPayAmount(pay - refund + overdue);
}
return pageData;
}
@@ -423,6 +440,7 @@
result.setTotalPrice(totalPrice);
result.setDays(days);
result.setUrgentFee(0L);
+ resolveCoupon(result, dto.getMemberId(), dto.getCouponId(), totalPrice);
return result;
}
@@ -504,6 +522,7 @@
// 3. 閫愰」璁$畻杩愯垂锛氳捣姝ヤ环 + 瓒呭嚭閮ㄥ垎闃舵浠�
List<ItemPriceVO> itemList = new ArrayList<>();
long itemPriceTotal = 0L;
+ long maxExtraFeeTotal = 0L; // 鏈�澶ц秴鍑鸿窛绂昏垂鐢紙鍗曚环脳鏁伴噺锛�
for (OrderItemDTO item : dto.getItems()) {
PricingRule rule = ruleMap.get(String.valueOf(item.getCategoryId()));
@@ -519,13 +538,15 @@
long extraPricePerUnit = Long.parseLong(rule.getFieldE());
// 闃舵璁′环锛氳窛绂� 鈮� 璧锋璺濈鍙栬捣姝ヤ环锛岃秴鍑烘寜 ceil(瓒呭嚭璺濈/鍗曚綅) 脳 鍗曚环绱姞
+ long extraFee = 0L;
long unitPrice;
if (distanceKm.compareTo(startDistance) <= 0) {
unitPrice = startPrice;
} else {
BigDecimal extraKm = distanceKm.subtract(startDistance);
BigDecimal extraCount = extraKm.divide(extraDistanceUnit, 0, RoundingMode.CEILING);
- unitPrice = startPrice + extraCount.longValue() * extraPricePerUnit;
+ extraFee = extraCount.longValue() * extraPricePerUnit;
+ unitPrice = startPrice + extraFee;
}
long subtotal = unitPrice * item.getQuantity();
@@ -548,8 +569,17 @@
vo.setExtraPrice(extraPricePerUnit);
itemList.add(vo);
- itemPriceTotal += subtotal;
+ // 鎵�鏈夌墿鍝佺殑璧锋浠访楁暟閲� 绱姞
+ itemPriceTotal += startPrice * item.getQuantity();
+ // 璁板綍鏈�澶х殑瓒呭嚭璺濈璐圭敤
+ long extraFeeTotal = extraFee * item.getQuantity();
+ if (extraFeeTotal > maxExtraFeeTotal) {
+ maxExtraFeeTotal = extraFeeTotal;
+ }
}
+
+ // 澶氱墿鍝佹椂鍙姞鏈�澶х殑瓒呭嚭璺濈璐圭敤
+ itemPriceTotal += maxExtraFeeTotal;
// 4. 淇濅环璐圭敤锛氭姤浠烽噾棰� 脳 淇濅环璐圭巼(瀛楀吀 INSURANCE_RATE)锛屽厓鈫掑垎锛堜繚浠烽噾棰�>0鏃惰璐癸級
long insuranceFeeFen = 0L;
@@ -614,7 +644,50 @@
}
}
+ resolveCoupon(result, dto.getMemberId(), dto.getCouponId(), totalPrice);
return result;
+ }
+
+ private void resolveCoupon(PriceCalculateVO result, Integer memberId, Integer couponId, long totalPrice) {
+ if (memberId == null) {
+ result.setDeductionAmount(0L);
+ return;
+ }
+ // 鏌ヨ鍙敤浼樻儬鍒革細宸查鍙栥�佹湭杩囨湡銆佹弧瓒虫弧棰濋棬妲�
+ Date now = new Date();
+ List<MemberCoupon> availableCoupons = memberCouponMapper.selectList(new QueryWrapper<MemberCoupon>().lambda()
+ .eq(MemberCoupon::getMemberId, memberId)
+ .eq(MemberCoupon::getStatus, Constants.CouponStatus.claimed.getKey())
+ .eq(MemberCoupon::getIsdeleted, Constants.ZERO)
+ .le(MemberCoupon::getLimitPrice, totalPrice)
+ .ge(MemberCoupon::getEndDate, now)
+ .orderByDesc(MemberCoupon::getPrice)
+ .orderByAsc(MemberCoupon::getEndDate));
+ result.setAvailableCoupons(availableCoupons);
+
+ if (couponId == null) {
+ result.setDeductionAmount(0L);
+ return;
+ }
+
+ MemberCoupon selected;
+ if (couponId == -1) {
+ selected = availableCoupons.isEmpty() ? null : availableCoupons.get(0);
+ } else {
+ selected = availableCoupons.stream()
+ .filter(mc -> mc.getId().equals(couponId))
+ .findFirst().orElse(null);
+ if (selected == null) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浼樻儬鍒告棤鏁堟垨涓嶅彲鐢�");
+ }
+ }
+
+ if (selected != null) {
+ result.setDeductionAmount(selected.getPrice());
+ result.setSelectedCoupon(selected);
+ } else {
+ result.setDeductionAmount(0L);
+ }
}
@Override
@@ -751,6 +824,8 @@
priceDTO.setDepositEndTime(takeTime);
priceDTO.setItems(dto.getItems());
priceDTO.setDeclaredAmount(dto.getDeclaredAmount());
+ priceDTO.setMemberId(memberId);
+ priceDTO.setCouponId(dto.getCouponId());
priceResult = calculateLocalPrice(priceDTO);
} else {
// 寮傚湴瀵勫瓨
@@ -763,6 +838,8 @@
priceDTO.setItems(dto.getItems());
priceDTO.setDeclaredAmount(dto.getDeclaredAmount());
priceDTO.setUrgent(Constants.ONE.equals(dto.getIsUrgent()));
+ priceDTO.setMemberId(memberId);
+ priceDTO.setCouponId(dto.getCouponId());
priceResult = calculateRemotePrice(priceDTO);
}
@@ -786,6 +863,7 @@
orders.setDeleted(Constants.ZERO);
orders.setCreateTime(now);
orders.setUpdateTime(now);
+ orders.setIsConverted(Constants.ZERO);
// 瀵勪欢淇℃伅
orders.setDepositShopId(dto.getDepositShopId());
@@ -850,8 +928,12 @@
// 璐圭敤淇℃伅(鍒�)
orders.setBasicAmount(priceResult.getItemPrice());
orders.setEstimatedAmount(priceResult.getTotalPrice());
- orders.setTotalAmount(priceResult.getTotalPrice());
+ long deductionAmount = priceResult.getDeductionAmount() != null ? priceResult.getDeductionAmount() : 0L;
+ orders.setTotalAmount(priceResult.getTotalPrice() - deductionAmount);
orders.setUrgentAmount(priceResult.getUrgentFee());
+ orders.setCouponId(dto.getCouponId());
+ orders.setDeductionAmount(deductionAmount);
+ orders.setManualRefund(Constants.ZERO);
// 瀛樺偍鍔犳�ョ郴鏁�
if (Constants.ONE.equals(dto.getType()) && Constants.ONE.equals(dto.getIsUrgent())) {
String urgentRateStr = systemDictDataBiz.queryByCode(
@@ -874,6 +956,16 @@
ordersMapper.insert(orders);
Integer orderId = orders.getId();
+
+ // 鏍囪浼樻儬鍒稿凡浣跨敤
+ MemberCoupon selectedCoupon = priceResult.getSelectedCoupon();
+ if (selectedCoupon != null) {
+ memberCouponMapper.update(new UpdateWrapper<MemberCoupon>().lambda()
+ .set(MemberCoupon::getStatus, Constants.CouponStatus.used.getKey())
+ .set(MemberCoupon::getUseDate, new Date())
+ .set(MemberCoupon::getOrderId, orderId)
+ .eq(MemberCoupon::getId, selectedCoupon.getId()));
+ }
// 鍒涘缓璁㈠崟鏃ュ織
OrderLog createLog = new OrderLog();
@@ -1062,6 +1154,7 @@
OrderDetailVO vo = new OrderDetailVO();
vo.setOrder(order);
+ vo.setDeductionAmount(order.getDeductionAmount());
// 璁㈠崟鐘舵�佹弿杩�
if (order.getStatus() != null) {
@@ -1200,7 +1293,6 @@
com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<Orders> updateWrapper =
new UpdateWrapper<Orders>().lambda()
.eq(Orders::getId, order.getId())
- .set(Orders::getIsUrgent, Constants.ONE)
.set(Orders::getPlatformRewardAmount, urgentFeeFen)
.set(Orders::getPlatformSmsNotified, Constants.ZERO) // 閲嶇疆閫氱煡鐘舵�佷负鏈�氱煡
.set(Orders::getPlatformSmsNotifiedTime, new Date()) // 閲嶇疆閫氱煡鍩哄噯鏃堕棿涓哄綋鍓�
@@ -1221,7 +1313,8 @@
if (dto.getDriverId() != null) {
// 鏍¢獙鍙告満淇℃伅
DriverInfo driverInfo = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda()
- .eq(DriverInfo::getMemberId, dto.getDriverId())
+ .eq(DriverInfo::getId, dto.getDriverId())
+ .eq(DriverInfo::getVersionType, Constants.ZERO)
.eq(DriverInfo::getDeleted, Constants.ZERO)
.last("limit 1"));
if (driverInfo == null) {
@@ -1242,13 +1335,10 @@
updateWrapper.set(Orders::getAcceptType, 1); // 1=绯荤粺娲惧崟
updateWrapper.set(Orders::getStatus, Constants.OrderStatus.accepted.getStatus());
- Member driver = memberMapper.selectById(dto.getDriverId());
- String driverName = driver != null ? driver.getName() : String.valueOf(dto.getDriverId());
-
OrderLog driverLog = new OrderLog();
driverLog.setOrderId(order.getId());
driverLog.setTitle(Constants.OrderLogType.assignDriver.getTitle());
- driverLog.setLogInfo(Constants.OrderLogType.assignDriver.format(driverName, dto.getUrgentFee().toPlainString()));
+ driverLog.setLogInfo(Constants.OrderLogType.assignDriver.format(driverInfo.getName(), dto.getUrgentFee().toPlainString()));
driverLog.setObjType(Constants.OrderLogType.assignDriver.getStatus());
driverLog.setOrderStatus(Constants.OrderStatus.accepted.getStatus());
driverLog.setOptUserType(3);
@@ -1432,20 +1522,31 @@
return;
}
Integer cityId = Integer.valueOf(orders.getCityId());
+ boolean isRemote = Constants.equalsInteger(orders.getType(), Constants.ONE);
+ boolean isCompany = Constants.equalsInteger(depositShop.getCompanyType(), Constants.ONE);
- // 鍙告満鍗犳瘮锛歠ieldA=4锛堥厤閫佸憳锛�
+ // 鍙告満鍗犳瘮锛歠ieldA=4锛堥厤閫佸憳锛夛紝濮嬬粓浠庡煄甯傞厤缃彇
BigDecimal driverRata = getRevenueShareRata(cityId, Constants.FOUR);
- // 瀵勪欢闂ㄥ簵鍗犳瘮锛歠ieldA=0(浼佷笟瀵�)/1(涓汉瀵�)
- int depositFieldA = Constants.equalsInteger(depositShop.getCompanyType(), Constants.ONE) ? Constants.ZERO : Constants.ONE;
- BigDecimal depositShopRata = getRevenueShareRata(cityId, depositFieldA);
- // 鍙栦欢闂ㄥ簵鍗犳瘮锛氭棤鍙栦欢闂ㄥ簵鏃舵瘮渚嬩负0
- BigDecimal takeShopRata = BigDecimal.ZERO;
- if (takeShop != null) {
- int takeFieldA = Constants.equalsInteger(takeShop.getCompanyType(), Constants.ONE) ? Constants.TWO : Constants.THREE;
- takeShopRata = getRevenueShareRata(cityId, takeFieldA);
+
+ // 瀛樹欢闂ㄥ簵鍗犳瘮
+ BigDecimal depositShopRata;
+ if (isRemote) {
+ int fallbackFieldA = isCompany ? Constants.ZERO : Constants.ONE;
+ depositShopRata = getShopRevenueShare(depositShop, "remoteDeposit", cityId, fallbackFieldA);
+ } else {
+ int fallbackFieldA = isCompany ? Constants.FIVE : Constants.SIX;
+ depositShopRata = getShopRevenueShare(depositShop, "localDeposit", cityId, fallbackFieldA);
}
- // 璁$畻钖叕锛堝垎锛夛細totalAmount 涓哄垎锛宺ata 涓烘瘮渚嬪�硷紙濡� 0.15 琛ㄧず 15%锛�
+ // 鍙栦欢闂ㄥ簵鍗犳瘮
+ BigDecimal takeShopRata = BigDecimal.ZERO;
+ if (isRemote && takeShop != null) {
+ boolean takeIsCompany = Constants.equalsInteger(takeShop.getCompanyType(), Constants.ONE);
+ int fallbackFieldA = takeIsCompany ? Constants.TWO : Constants.THREE;
+ takeShopRata = getShopRevenueShare(takeShop, "remoteTake", cityId, fallbackFieldA);
+ }
+
+ // 璁$畻钖叕锛堝垎锛�
long driverFee = new BigDecimal(totalAmount).multiply(driverRata).longValue();
long depositShopFee = new BigDecimal(totalAmount).multiply(depositShopRata).longValue();
long takeShopFee = new BigDecimal(totalAmount).multiply(takeShopRata).longValue();
@@ -1462,7 +1563,7 @@
* 浠� pricing_rule 琛ㄨ幏鍙栧垎鎴愭瘮渚嬶紙type=4锛�
*
* @param cityId 鍩庡競涓婚敭
- * @param fieldA 绫诲瀷锛�0=浼佷笟瀵�, 1=涓汉瀵�, 2=浼佷笟鍙�, 3=涓汉鍙�, 4=閰嶉�佸憳
+ * @param fieldA 绫诲瀷锛�0=寮傚湴浼佷笟瀵�, 1=寮傚湴涓汉瀵�, 2=寮傚湴浼佷笟鍙�, 3=寮傚湴涓汉鍙�, 4=閰嶉�佸憳, 5=灏卞湴浼佷笟瀛�, 6=灏卞湴涓汉瀛�
* @return 鍒嗘垚姣斾緥锛堝 0.15 琛ㄧず 15%锛�
*/
private BigDecimal getRevenueShareRata(Integer cityId, int fieldA) {
@@ -1473,10 +1574,35 @@
.eq(PricingRule::getFieldA, String.valueOf(fieldA))
.last("limit 1"));
if (rule != null && StringUtils.isNotBlank(rule.getFieldB())) {
- // fieldB 瀛樺偍鐨勬槸鐧惧垎姣旀暣鏁帮紙濡�15琛ㄧず15%锛夛紝杞崲涓哄皬鏁版瘮渚嬶紙0.15锛�
+ // fieldB 瀛樺偍鐨勬槸鐧惧垎姣旀暟瀛楋紙濡�15琛ㄧず15%锛夛紝杞崲涓哄皬鏁版瘮渚嬶紙0.15锛�
return new BigDecimal(rule.getFieldB()).divide(new BigDecimal("100"), 4, BigDecimal.ROUND_HALF_UP);
}
return BigDecimal.ZERO;
+ }
+
+ /**
+ * 鑾峰彇闂ㄥ簵鏀剁泭鍗犳瘮锛氫紭鍏堜粠闂ㄥ簵 revenueShareConfig 鍙栵紝鏃犲垯鍏滃簳鍩庡競 pricing_rule
+ *
+ * @param shop 闂ㄥ簵淇℃伅
+ * @param jsonKey revenueShareConfig 涓殑閿悕
+ * @param cityId 鍩庡競涓婚敭锛堝厹搴曠敤锛�
+ * @param fallbackFieldA 鍏滃簳 pricing_rule fieldA 鍊�
+ * @return 鍒嗘垚姣斾緥
+ */
+ private BigDecimal getShopRevenueShare(ShopInfo shop, String jsonKey, Integer cityId, int fallbackFieldA) {
+ if (shop != null && StringUtils.isNotBlank(shop.getRevenueShareConfig())) {
+ try {
+ JSONObject config = JSONObject.parseObject(shop.getRevenueShareConfig());
+ if (config != null && config.containsKey(jsonKey)) {
+ Double value = config.getDouble(jsonKey);
+ if (value != null) {
+ return new BigDecimal(value).divide(new BigDecimal("100"), 4, BigDecimal.ROUND_HALF_UP);
+ }
+ }
+ } catch (Exception ignored) {
+ }
+ }
+ return getRevenueShareRata(cityId, fallbackFieldA);
}
@Override
@@ -1503,6 +1629,7 @@
.select("s1.name", Orders::getDepositShopName)
.select("s1.link_name", Orders::getDepositShopLinkName)
.select("s1.link_phone", Orders::getDepositShopLinkPhone)
+ .select("s1.address", Orders::getDepositShopAddress)
.select("s2.name", Orders::getTakeShopName)
.select("s2.address", Orders::getTakeShopAddress)
.select("s2.link_phone", Orders::getTakeShopLinkPhone)
@@ -1516,6 +1643,28 @@
.eq(status != null, Orders::getStatus, status)
.in(statusList != null, Orders::getStatus, statusList)
.orderByDesc(Orders::getCreateTime);
+ // 鍙紑绁ㄨ鍗曪細澧炲姞鏈堜唤闄愬埗
+ if (model != null && model.getInvoiceStatus() != null && Constants.equalsInteger(model.getInvoiceStatus(), Constants.ONE)) {
+ wrapper.in(Orders::getInvoiceStatus, Arrays.asList(Constants.ONE, 99));
+ String monthLimitStr = operationConfigBiz.getConfig().getInvoiceMonthLimit();
+ if (StringUtils.isNotBlank(monthLimitStr)) {
+ int monthLimit = Integer.parseInt(monthLimitStr);
+ Calendar cal = Calendar.getInstance();
+ cal.add(Calendar.MONTH, -monthLimit);
+ cal.set(Calendar.HOUR_OF_DAY, 0);
+ cal.set(Calendar.MINUTE, 0);
+ cal.set(Calendar.SECOND, 0);
+ cal.set(Calendar.MILLISECOND, 0);
+ wrapper.ge(Orders::getFinishTime, cal.getTime());
+ }
+ }
+ // 鍏抽敭璇嶆悳绱細鏀朵欢浜�/鏀朵欢浜虹數璇濇ā绯娿�佽鍗曞彿绮惧噯
+ if (model != null && StringUtils.isNotBlank(model.getKeyword())) {
+ String kw = model.getKeyword().trim();
+ wrapper.and(w -> w.like(Orders::getTakeUser, kw)
+ .or().like(Orders::getTakePhone, kw)
+ .or().eq(Orders::getCode, kw));
+ }
IPage<Orders> orderPage = ordersMapper.selectJoinPage(p, Orders.class, wrapper);
List<MyOrderVO> voList = new ArrayList<>();
@@ -1544,7 +1693,7 @@
vo.setDepositShopName(o.getDepositShopName());
vo.setDepositShopLinkName(o.getDepositShopLinkName());
vo.setDepositShopPhone(o.getDepositShopLinkPhone());
-
+ vo.setDepositShopAddress(o.getDepositShopAddress());
// 鍙栦欢淇℃伅锛氭湁鍙栦欢闂ㄥ簵鍙栭棬搴楋紝鏃犲垯鍙栫敤鎴疯嚜閫夊彇浠剁偣
if (o.getTakeShopId() != null) {
vo.setTakeShopId(o.getTakeShopId());
@@ -1586,6 +1735,14 @@
vo.setOrderImages(getFileUrlsFromList(o.getId(),files));
// 閫炬湡鐘舵��
fillOverdueStatus(vo, o, details);
+ // 浼樻儬鍒告姷鎵i噾棰�
+ vo.setDeductionAmount(o.getDeductionAmount());
+ // 鍙紑绁ㄩ噾棰濓紙鏀粯閲戦 - 閫�娆鹃噾棰濓級
+ if (model != null && model.getInvoiceStatus() != null && Constants.equalsInteger(model.getInvoiceStatus(), Constants.ONE)) {
+ long payAmt = o.getPayAmount() != null ? o.getPayAmount() : 0L;
+ long refundAmt = o.getRefundAmount() != null ? o.getRefundAmount() : 0L;
+ vo.setInvoiceAmount(payAmt - refundAmt);
+ }
voList.add(vo);
}
}
@@ -1665,8 +1822,20 @@
}
wrapper.eq(status != null, Orders::getStatus, status)
- .in(statusList != null && !Constants.equalsInteger(combinedStatus, Constants.SEVEN), Orders::getStatus, statusList)
- .orderByDesc(Orders::getId);
+ .in(statusList != null && !Constants.equalsInteger(combinedStatus, Constants.SEVEN), Orders::getStatus, statusList);
+ if(Objects.nonNull(model.getCombinedStatus())&&Constants.equalsInteger(model.getCombinedStatus(),Constants.OrderCombinedStatus.finished.getKey())){
+ wrapper.orderByDesc(Orders::getFinishTime);
+ }else{
+ wrapper.orderByDesc(Orders::getId);
+ }
+ // 鍏抽敭璇嶆悳绱細鏀朵欢浜�/鏀朵欢浜虹數璇濇ā绯娿�佽鍗曞彿绮惧噯
+ MyOrderDTO shopModel = pageWrap.getModel();
+ if (shopModel != null && StringUtils.isNotBlank(shopModel.getKeyword())) {
+ String kw = shopModel.getKeyword().trim();
+ wrapper.and(w -> w.like(Orders::getTakeUser, kw)
+ .or().like(Orders::getTakePhone, kw)
+ .or().eq(Orders::getCode, kw));
+ }
IPage<Orders> orderPage = ordersMapper.selectJoinPage(p, Orders.class, wrapper);
List<MyOrderVO> voList = new ArrayList<>();
@@ -1719,8 +1888,6 @@
.eq(OrdersDetail::getDeleted, Constants.ZERO));
vo.setDetailList(buildDetailList(details));
-
-
// 閫炬湡鐘舵��
fillOverdueStatus(vo, o, details);
@@ -1823,7 +1990,10 @@
//搴忓彿
vo.setSortnum(Constants.formatIntegerNum(order.getDepositShopId())+"-"+order.getId());
if(order.getTakeShopId()!=null){
- vo.setSortnumTake(Constants.formatIntegerNum(order.getTakeShopId())+"-"+order.getId());
+ String dateStr = new SimpleDateFormat("dd").format(order.getPayTime() != null ? order.getPayTime() : new Date());
+ String autoNumStr = String.format("%03d", order.getAutoNum() != null ? order.getAutoNum() : 0);
+ String sort = order.getTakeShopId() + "-" + dateStr + "-" + autoNumStr;
+ vo.setSortnumTake(sort);
}
// 瀛樹欢闂ㄥ簵
if (order.getDepositShopId() != null) {
@@ -1977,6 +2147,7 @@
order.setStatus(Constants.OrderStatus.cancelled.getStatus());
order.setCancelTime(now);
ordersMapper.updateById(order);
+ restoreCoupon(order);
saveCancelLog(order, Constants.OrderLogType.memberCancel, "浼氬憳鍙栨秷璁㈠崟锛堝緟鏀粯锛�", memberId);
// 鐭俊閫氱煡浼氬憳锛氳鍗曞凡鍙栨秷
Member cancelMember1 = memberMapper.selectById(memberId);
@@ -2038,6 +2209,7 @@
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "閫�娆惧け璐ワ紝璇疯仈绯诲鏈嶅鐞�");
}
ordersRefundMapper.insert(refund);
+ restoreCoupon(order);
return;
}
@@ -2054,20 +2226,37 @@
DriverInfo originalDriver = originalDriverId != null ? driverInfoMapper.selectById(originalDriverId) : null;
ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
- // 鍙栦欢鐐逛俊鎭洿鏂颁负瀛樹欢闂ㄥ簵锛屼娇鐢� UpdateWrapper 纭繚 null 瀛楁涔熻兘鐢熸晥
+
+ // 璁$畻灏卞湴瀵勫瓨瀛樹欢闂ㄥ簵鍒嗘垚姣斾緥
+ Integer cityId = Integer.valueOf(order.getCityId());
+ boolean isCompany = depositShop != null && Constants.equalsInteger(depositShop.getCompanyType(), Constants.ONE);
+ int fallbackFieldA = isCompany ? Constants.FIVE : Constants.SIX;
+ BigDecimal localDepositRata = getShopRevenueShare(depositShop, "localDeposit", cityId, fallbackFieldA);
+ Long totalAmount = order.getTotalAmount() != null ? order.getTotalAmount() : 0L;
+ Long localDepositFee = new BigDecimal(totalAmount).multiply(localDepositRata)
+ .setScale(0, RoundingMode.HALF_UP).longValue();
+
+ // 鍙栦欢鐐逛俊鎭洿鏂颁负瀛樹欢闂ㄥ簵锛岄噸绠楀垎鎴�
UpdateWrapper<Orders> updateWrapper = new UpdateWrapper<>();
updateWrapper.lambda()
.eq(Orders::getId, order.getId())
.set(Orders::getType, Constants.ZERO)
+ .set(Orders::getStatus, Constants.OrderStatus.arrived.getKey())
+ .set(Orders::getIsConverted, Constants.ONE)
.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());
+ .set(Orders::getExpectedTakeTime, new Date())
+ // 瀛樹欢闂ㄥ簵鍒嗘垚鎸夊氨鍦板瘎瀛橀噸绠�
+ .set(Orders::getDepositShopFeeRata, localDepositRata)
+ .set(Orders::getDepositShopFee, localDepositFee)
+ // 鍙告満銆佸彇浠堕棬搴楀垎鎴愬綊闆�
+ .set(Orders::getDriverFeeRata, BigDecimal.ZERO)
+ .set(Orders::getDriverFee, 0L)
+ .set(Orders::getTakeShopFeeRata, BigDecimal.ZERO)
+ .set(Orders::getTakeShopFee, 0L);
if (Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) {
updateWrapper.lambda()
.set(Orders::getAcceptDriver, null)
@@ -2092,6 +2281,19 @@
/**
* 淇濆瓨鍙栨秷璁㈠崟鎿嶄綔鏃ュ織
*/
+ private void restoreCoupon(Orders order) {
+// if (order.getCouponId() == null || order.getDeductionAmount() == null || order.getDeductionAmount() <= 0) {
+// return;
+// }
+// memberCouponMapper.update(new UpdateWrapper<MemberCoupon>().lambda()
+// .set(MemberCoupon::getStatus, Constants.CouponStatus.claimed.getKey())
+// .set(MemberCoupon::getUseDate, null)
+// .set(MemberCoupon::getOrderId, null)
+// .eq(MemberCoupon::getId, order.getCouponId())
+// .eq(MemberCoupon::getOrderId, order.getId())
+// .eq(MemberCoupon::getStatus, Constants.CouponStatus.used.getKey()));
+ }
+
private void saveCancelLog(Orders order, Constants.OrderLogType logType, String reason, Integer memberId) {
OrderLog log = new OrderLog();
log.setOrderId(order.getId());
@@ -2104,6 +2306,217 @@
log.setCreateTime(new Date());
log.setDeleted(Constants.ZERO);
orderLogService.create(log);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void manualRefund(ManualRefundDTO dto, Integer userId) {
+ // 1. 鏍¢獙璁㈠崟
+ Orders order = ordersMapper.selectById(dto.getOrderId());
+ if (order == null || Constants.equalsInteger(order.getDeleted(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY);
+ }
+ if (!Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.finished.getStatus())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呭凡瀹屾垚璁㈠崟鍙墜鍔ㄩ��娆�");
+ }
+ if (Constants.equalsInteger(order.getManualRefund(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曞凡鎵嬪姩閫�娆�");
+ }
+ // 寮傚父璁㈠崟涓嶅厑璁告墜鍔ㄩ��娆�
+ if (Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "寮傚父璁㈠崟涓嶆敮鎸佹墜鍔ㄩ��娆�");
+ }
+
+ // 2. 鏍¢獙閫�娆鹃噾棰�
+ long payAmount = order.getPayAmount() != null ? order.getPayAmount() : 0L;
+ long existingRefund = order.getRefundAmount() != null ? order.getRefundAmount() : 0L;
+ long maxRefund = payAmount - existingRefund;
+ if (dto.getRefundAmount() <= 0) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "閫�娆鹃噾棰濆繀椤诲ぇ浜�0");
+ }
+ if (dto.getRefundAmount() > maxRefund) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "閫�娆鹃噾棰濅笉鑳借秴杩囧彲閫�閲戦(" + maxRefund + "鍒�)");
+ }
+
+ // 3. 鏍¢獙骞舵竻鐞嗘墸娆鹃噾棰濓紙鏍规嵁璁㈠崟绫诲瀷锛�
+ boolean isRemote = Constants.equalsInteger(order.getType(), Constants.ONE);
+ Long depositShopDeduct = dto.getDepositShopDeduct();
+ Long takeShopDeduct = dto.getTakeShopDeduct();
+ Long driverDeduct = dto.getDriverDeduct();
+
+ if (!isRemote) {
+ takeShopDeduct = null;
+ driverDeduct = null;
+ } else {
+ if (order.getTakeShopId() == null) {
+ takeShopDeduct = null;
+ }
+ }
+ if (depositShopDeduct != null && depositShopDeduct < 0) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀛樹欢闂ㄥ簵鎵f閲戦涓嶈兘涓鸿礋");
+ }
+ if (takeShopDeduct != null && takeShopDeduct < 0) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鍙栦欢闂ㄥ簵鎵f閲戦涓嶈兘涓鸿礋");
+ }
+ if (driverDeduct != null && driverDeduct < 0) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鍙告満鎵f閲戦涓嶈兘涓鸿礋");
+ }
+
+ // 4. 鏋勫缓 deductInfo JSON
+ String deductInfo = null;
+ JSONObject deductJson = new JSONObject();
+ if (depositShopDeduct != null) {
+ deductJson.put("depositShopDeduct", depositShopDeduct);
+ }
+ if (takeShopDeduct != null) {
+ deductJson.put("takeShopDeduct", takeShopDeduct);
+ }
+ if (driverDeduct != null) {
+ deductJson.put("driverDeduct", driverDeduct);
+ }
+ if (deductJson.size() > 0) {
+ deductInfo = deductJson.toJSONString();
+ }
+
+ // 5. 鍒涘缓閫�娆捐褰�
+ Date now = new Date();
+ String outRefundNo = ID.nextGUID();
+ OrdersRefund refund = new OrdersRefund();
+ refund.setOrderId(order.getId());
+ refund.setType(Constants.FOUR); // 鎵嬪姩閫�娆�
+ refund.setRefundAmount(dto.getRefundAmount());
+ refund.setDeductInfo(deductInfo);
+ refund.setRefundRemark(dto.getRemark());
+ refund.setUserId(userId);
+ refund.setBeforeStatus(order.getStatus());
+ refund.setRefundCode(outRefundNo);
+ refund.setCreateTime(now);
+ refund.setDeleted(Constants.ZERO);
+ ordersRefundMapper.insert(refund);
+
+ // 6. 璋冪敤寰俊閫�娆�
+ try {
+ Refund refundResult = wxPayV3Service.refund(
+ outRefundNo, order.getOutTradeNo(), payAmount, dto.getRefundAmount(),
+ "鎵嬪姩閫�娆�", wxPayProperties.getV3RefundNotifyUrl());
+
+ com.wechat.pay.java.service.refund.model.Status refundStatus = refundResult.getStatus();
+ if (com.wechat.pay.java.service.refund.model.Status.SUCCESS.equals(refundStatus)) {
+ refund.setStatus(Constants.ONE);
+ refund.setRefundTime(now);
+ ordersRefundMapper.updateById(refund);
+ // 閫�娆炬垚鍔燂紝鎵ц鎵f
+ processManualRefundDeduction(order, depositShopDeduct, takeShopDeduct, driverDeduct);
+ } else if (com.wechat.pay.java.service.refund.model.Status.PROCESSING.equals(refundStatus)) {
+ refund.setStatus(Constants.ZERO); // 閫�娆句腑锛岀瓑鍥炶皟
+ ordersRefundMapper.updateById(refund);
+ } else {
+ refund.setStatus(Constants.TWO);
+ refund.setRefundRemark("寰俊閫�娆惧け璐�: " + refundStatus.name());
+ ordersRefundMapper.updateById(refund);
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "閫�娆惧け璐ワ紝璇疯仈绯诲鏈嶅鐞�");
+ }
+ } catch (BusinessException e) {
+ throw e;
+ } catch (Exception e) {
+ log.error("鎵嬪姩閫�娆捐皟鐢ㄥ井淇¢��娆惧紓甯�, orderId={}", order.getId(), e);
+ refund.setStatus(Constants.TWO);
+ ordersRefundMapper.updateById(refund);
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "閫�娆捐皟鐢ㄥ紓甯革紝璇风◢鍚庨噸璇�");
+ }
+
+ // 7. 鏇存柊璁㈠崟锛氭爣璁板凡鎵嬪姩閫�娆撅紝绱姞閫�娆鹃噾棰�
+ ordersMapper.update(new UpdateWrapper<Orders>().lambda()
+ .set(Orders::getManualRefund, Constants.ONE)
+ .setSql(" REFUND_AMOUNT = IFNULL(REFUND_AMOUNT, 0) + " + dto.getRefundAmount())
+ .set(Orders::getUpdateTime, now)
+ .eq(Orders::getId, order.getId()));
+ }
+
+ /**
+ * 鎵嬪姩閫�娆炬垚鍔熷悗锛屾牴鎹墸娆句俊鎭墸闄ゅ搴旀柟浣欓骞剁敓鎴愭敹鏀褰�
+ */
+ private void processManualRefundDeduction(Orders order, Long depositShopDeduct, Long takeShopDeduct, Long driverDeduct) {
+ Date now = new Date();
+
+ // 瀛樹欢闂ㄥ簵鎵f
+ if (depositShopDeduct != null && depositShopDeduct > 0 && order.getDepositShopId() != null) {
+ ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
+ if (depositShop != null) {
+ shopInfoMapper.update(new UpdateWrapper<ShopInfo>().lambda()
+ .setSql(" BALANCE = IFNULL(BALANCE, 0) - " + depositShopDeduct)
+ .eq(ShopInfo::getId, depositShop.getId()));
+ revenueMapper.insert(buildDeductRevenue(depositShop.getId(), Constants.TWO,
+ depositShopDeduct, order.getId(), order.getCode(), now));
+ }
+ }
+
+ // 鍙栦欢闂ㄥ簵鎵f
+ if (takeShopDeduct != null && takeShopDeduct > 0 && order.getTakeShopId() != null) {
+ ShopInfo takeShop = shopInfoMapper.selectById(order.getTakeShopId());
+ if (takeShop != null) {
+ shopInfoMapper.update(new UpdateWrapper<ShopInfo>().lambda()
+ .setSql(" BALANCE = IFNULL(BALANCE, 0) - " + takeShopDeduct)
+ .eq(ShopInfo::getId, takeShop.getId()));
+ revenueMapper.insert(buildDeductRevenue(takeShop.getId(), Constants.TWO,
+ takeShopDeduct, order.getId(), order.getCode(), now));
+ }
+ }
+
+ // 鍙告満鎵f
+ if (driverDeduct != null && driverDeduct > 0 && order.getAcceptDriver() != null) {
+ DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver());
+ if (driver != null && driver.getMemberId() != null) {
+ driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda()
+ .setSql(" BALANCE = IFNULL(BALANCE, 0) - " + driverDeduct)
+ .eq(DriverInfo::getId, driver.getId()));
+ revenueMapper.insert(buildDeductRevenue(driver.getMemberId(), Constants.ONE,
+ driverDeduct, order.getId(), order.getCode(), now));
+ }
+ }
+ }
+
+ private Revenue buildDeductRevenue(Integer memberId, Integer memberType, Long amount, Integer orderId, String orderNo, Date now) {
+ Revenue revenue = new Revenue();
+ revenue.setMemberId(memberId);
+ revenue.setMemberType(memberType);
+ revenue.setType(Constants.FOUR); // 璐d换鎵f
+ revenue.setOptType(-Constants.ONE); // 鏀嚭
+ revenue.setAmount(amount);
+ revenue.setVaildStatus(Constants.ONE); // 宸插叆璐�
+ revenue.setObjId(orderId);
+ revenue.setObjType(Constants.ZERO); // 璁㈠崟涓氬姟
+ revenue.setOrderNo(orderNo);
+ revenue.setStatus(Constants.ZERO); // 鎴愬姛
+ revenue.setDeleted(Constants.ZERO);
+ revenue.setCreateTime(now);
+ return revenue;
+ }
+
+ @Override
+ public void processManualRefundCallback(OrdersRefund refundRecord) {
+ if (!Constants.equalsInteger(refundRecord.getType(), Constants.FOUR)) {
+ return;
+ }
+ if (StringUtils.isBlank(refundRecord.getDeductInfo())) {
+ return;
+ }
+ Orders order = ordersMapper.selectById(refundRecord.getOrderId());
+ if (order == null) {
+ return;
+ }
+ JSONObject deductJson = JSONObject.parseObject(refundRecord.getDeductInfo());
+ Long depositShopDeduct = deductJson.getLong("depositShopDeduct");
+ Long takeShopDeduct = deductJson.getLong("takeShopDeduct");
+ Long driverDeduct = deductJson.getLong("driverDeduct");
+ processManualRefundDeduction(order, depositShopDeduct, takeShopDeduct, driverDeduct);
+
+ // 鏍囪璁㈠崟宸叉墜鍔ㄩ��娆撅紝绱姞閫�娆鹃噾棰�
+ ordersMapper.update(new UpdateWrapper<Orders>().lambda()
+ .set(Orders::getManualRefund, Constants.ONE)
+ .setSql(" REFUND_AMOUNT = IFNULL(REFUND_AMOUNT, 0) + " + refundRecord.getRefundAmount())
+ .set(Orders::getUpdateTime, new Date())
+ .eq(Orders::getId, order.getId()));
}
/**
@@ -2174,6 +2587,10 @@
* 鍙戦�佸徃鏈虹珯鍐呬俊閫氱煡
*/
private void sendDriverNotice(Integer driverId, Constants.DriverOrderNotify notify, Integer orderId, String... params) {
+ sendDriverNotice(driverId, notify, orderId, 0, params);
+ }
+
+ private void sendDriverNotice(Integer driverId, Constants.DriverOrderNotify notify, Integer objId, Integer objType, String... params) {
DriverInfo driver = driverInfoMapper.selectById(driverId);
if (driver == null || driver.getMemberId() == null) {
return;
@@ -2183,8 +2600,8 @@
notice.setUserId(driver.getMemberId());
notice.setTitle(notify.getTitle());
notice.setContent(notify.format(params));
- notice.setObjId(orderId);
- notice.setObjType(0); // 0=璁㈠崟
+ notice.setObjId(objId);
+ notice.setObjType(objType);
notice.setStatus(0); // 0=鏈
notice.setIsdeleted(Constants.ZERO);
notice.setCreateDate(new Date());
@@ -2212,6 +2629,14 @@
order.setWxExternalNo(wxTradeNo);
order.setPayAmount(order.getTotalAmount());
order.setUpdateTime(now);
+ // 璁$畻搴楅摵璁㈠崟搴忓彿锛氬綋鍓嶅瓨浠堕棬搴楀綋澶╁凡鏀粯璁㈠崟鏁� + 1
+ Date todayStart = DateUtil.getStartOfDay(now);
+ Long currentCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
+ .eq(Orders::getDepositShopId, order.getDepositShopId())
+ .eq(Orders::getPayStatus, Constants.ONE)
+ .ge(Orders::getPayTime, todayStart)
+ .eq(Orders::getDeleted, Constants.ZERO));
+ order.setAutoNum(currentCount + 1);
// 鐢熸垚浼氬憳鏍搁攢鐮�
order.setMemberVerifyCode(generateVerifyCode());
// 寮傚湴瀵勫瓨锛氳绠楅璁¢�佽揪鏃堕棿
@@ -2440,26 +2865,37 @@
otherOrders.setUpdateTime(now);
otherOrdersMapper.updateById(otherOrders);
- // 4. 鏌ヨ闂ㄥ簵淇℃伅锛堥�氳繃娉ㄥ唽浼氬憳涓婚敭鍏宠仈锛�
+ // 4. 鏌ヨ鍙樻洿鐗堟湰闂ㄥ簵淇℃伅锛堥�氳繃娉ㄥ唽浼氬憳涓婚敭鍏宠仈锛�
ShopInfo shopInfo = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda()
.eq(ShopInfo::getRegionMemberId, otherOrders.getMemberId())
.eq(ShopInfo::getDeleted, Constants.ZERO)
+ .eq(ShopInfo::getVersionType, Constants.ONE)
.last("limit 1"));
if (shopInfo == null) {
- throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "闂ㄥ簵涓嶅瓨鍦�");
+ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "闂ㄥ簵鍙樻洿璁板綍涓嶅瓨鍦�");
}
- // 5. 鏇存柊闂ㄥ簵鐘舵�侊細宸叉敮浠樻娂閲�
- shopInfo.setAuditStatus(Constants.THREE); // 3=宸叉敮浠樻娂閲�
+ // 5. 鏇存柊鍙樻洿鐗堟湰鏀粯鐘舵��
+ Member member = memberMapper.selectById(otherOrders.getMemberId());
+ shopInfo.setAuditStatus(Constants.THREE);
shopInfo.setPayStatus(Constants.ONE);
shopInfo.setPayTime(now);
shopInfo.setWxExternalNo(wxTradeNo);
shopInfo.setCode(otherOrders.getCode());
- Member member = memberMapper.selectById(otherOrders.getMemberId());
if (member != null) {
shopInfo.setPayMemberOpenId(member.getOpenid());
}
shopInfo.setUpdateTime(now);
shopInfoMapper.updateById(shopInfo);
+
+ // 6. 鍚屾鏇存柊姝e紡鐗堟湰鐘舵�佷负宸叉敮浠樻娂閲�
+ if (shopInfo.getRelationShopId() != null) {
+ ShopInfo officialShop = shopInfoMapper.selectById(shopInfo.getRelationShopId());
+ if (officialShop != null) {
+ officialShop.setAuditStatus(Constants.THREE);
+ officialShop.setUpdateTime(now);
+ shopInfoMapper.updateById(officialShop);
+ }
+ }
// 鐭俊閫氱煡闂ㄥ簵锛氭垚鍔熷叆椹�
String rawPassword = shopInfo.getTelephone() != null && shopInfo.getTelephone().length() >= 6
@@ -2806,6 +3242,10 @@
}
order.setMemberVerifyCode(generateVerifyCode());
ordersMapper.updateById(order);
+ // 瀵勫瓨鏃跺浘鐗囧繀濉�
+// if (images == null || images.isEmpty()) {
+// throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇蜂笂浼犲瘎瀛樺浘鐗�");
+// }
// 淇濆瓨瀵勫瓨鍥剧墖锛坥bj_type=2 璁㈠崟瀵勫瓨鍥剧墖锛屾渶澶�3寮狅級
saveVerifyImages(order.getId(), images, Constants.FileType.ORDER_DEPOSIT.getKey(), shopId);
// 璁板綍璁㈠崟鏃ュ織
@@ -2841,8 +3281,15 @@
}
// 寰呭彇浠�(5) 鈫� 宸插畬鎴�(7)
order.setStatus(Constants.OrderStatus.finished.getStatus());
- order.setConfirmArriveTime(now);
+ order.setFinishTime(now);
+ order.setInvoiceStatus(Constants.ONE);
ordersMapper.updateById(order);
+ // 灏卞湴瀵勫瓨(type=0)鍙栦欢鏃跺浘鐗囦笉蹇呭~锛屽叾浠栫被鍨嬪彇浠跺繀濉�
+ if (!Constants.equalsInteger(order.getType(), Constants.ZERO)) {
+ if (images == null || images.isEmpty()) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇蜂笂浼犲彇浠跺浘鐗�");
+ }
+ }
// 璁㈠崟瀹屾垚锛岄噴鏀炬牳閿�鐮�
String verifyCode = order.getMemberVerifyCode();
if (StringUtils.isNotBlank(verifyCode)) {
@@ -2983,6 +3430,30 @@
sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.WAIT_PICKUP_REMIND, order.getId(),
"orderNo", order.getCode(), "shopName", shopName);
}
+ // 寮傚父璁㈠崟瀵勫瓨鏍搁攢锛氭爣璁板師璁㈠崟瀹屾垚
+ if (Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE) && order.getRelationOrderId() != null) {
+ Orders originalOrder = ordersMapper.selectById(order.getRelationOrderId());
+ if (originalOrder != null) {
+ originalOrder.setStatus(Constants.OrderStatus.finished.getStatus());
+ originalOrder.setInvoiceStatus(Constants.ONE);
+ originalOrder.setFinishTime(now);
+ originalOrder.setUpdateTime(now);
+ ordersMapper.updateById(originalOrder);
+ // 瑙﹀彂鍘熻鍗曟敹鐩婅绠�
+ calculateAndSaveOrderFees(originalOrder.getId());
+ generateRevenueRecords(originalOrder.getId());
+ // 閫氱煡浼氬憳锛氳鍗曞凡瀹屾垚
+ sendOrderNotice(originalOrder.getMemberId(), Constants.MemberOrderNotify.FINISHED, originalOrder.getId(),
+ "orderNo", originalOrder.getCode());
+ // 閫氱煡鍙告満锛氳鍗曞凡瀹屾垚
+ if (originalOrder.getAcceptDriver() != null) {
+ String settleDays = operationConfigBiz.getConfig().getSettlementDate();
+ sendDriverNotice(originalOrder.getAcceptDriver(), Constants.DriverOrderNotify.FINISHED, originalOrder.getId(),
+ "orderNo", originalOrder.getCode(),
+ "settleDays", settleDays != null ? settleDays : "7");
+ }
+ }
+ }
} else if (Constants.equalsInteger(status, Constants.OrderStatus.arrived.getStatus())) {
// 寮傚湴瀵勫瓨 + 鏃犲彇浠堕棬搴� 鈫� 鏃犳硶鏍搁攢锛堝鎴疯嚜鍙栵紝鏃犻棬搴楁搷浣滐級
if (Constants.equalsInteger(order.getType(), Constants.ONE) && order.getTakeShopId() == null) {
@@ -3002,6 +3473,7 @@
}
// 寰呭彇浠�(5) 鈫� 宸插畬鎴�(7)
order.setStatus(Constants.OrderStatus.finished.getStatus());
+ order.setInvoiceStatus(Constants.ONE);
order.setConfirmArriveTime(now);
ordersMapper.updateById(order);
// 璁㈠崟瀹屾垚锛岄噴鏀炬牳閿�鐮�
@@ -3078,6 +3550,7 @@
// 7. 鏇存柊璁㈠崟鐘舵�佷负宸插畬鎴�
Date now = new Date();
order.setStatus(Constants.OrderStatus.finished.getStatus());
+ order.setInvoiceStatus(Constants.ONE);
order.setFinishTime(now);
order.setUpdateTime(now);
ordersMapper.updateById(order);
@@ -3167,10 +3640,15 @@
if (!Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.arrived.getStatus())) {
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鍏佽纭鏀惰揣");
}
+ // 5.1 鏍¢獙寮傚父鐘舵��
+ if (Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璁㈠崟寮傚父锛屽凡琚浆瀛橈紝璇疯仈绯荤鐞嗗憳鎴栨煡鐪嬬煭淇�");
+ }
// 6. 鏇存柊璁㈠崟鐘舵�佷负宸插畬鎴�
Date now = new Date();
order.setStatus(Constants.OrderStatus.finished.getStatus());
+ order.setInvoiceStatus(Constants.ONE);
order.setFinishTime(now);
order.setUpdateTime(now);
ordersMapper.updateById(order);
@@ -3207,7 +3685,6 @@
BigDecimal depositRate = order.getDepositShopFeeRata() != null ? order.getDepositShopFeeRata() : BigDecimal.ZERO;
BigDecimal takeRate = order.getTakeShopFeeRata() != null ? order.getTakeShopFeeRata() : BigDecimal.ZERO;
BigDecimal driverRate = order.getDriverFeeRata() != null ? order.getDriverFeeRata() : BigDecimal.ZERO;
- Long exceptionFeeVal = order.getExceptionFee() != null ? order.getExceptionFee() : 0L;
//瀛樹欢闂ㄥ簵鏀剁泭
Long depositShopFee = new BigDecimal(totalAmount)
@@ -3223,8 +3700,7 @@
driverFee = new BigDecimal(totalAmount)
.multiply(driverRate)
.setScale(0, RoundingMode.HALF_UP)
- .longValue()
- + exceptionFeeVal;
+ .longValue();
// 寮傚湴瀵勫瓨涓旀湁鍙栦欢闂ㄥ簵锛氬姞涓婂彇浠堕棬搴楁敹鐩�
if (order.getTakeShopId() != null) {
@@ -3283,6 +3759,91 @@
driverFee, orderId, order.getCode()));
}
}
+
+ // 寮傚父璁㈠崟锛氬徃鏈哄紓甯歌ˉ鍋匡紙寮傚湴 + 寮傚父鏍囪 + 鏈夊紓甯歌ˉ鍋块噾棰濓級
+ if (Constants.equalsInteger(order.getType(), Constants.ONE)
+ && Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE)
+ && order.getExceptionFee() != null && order.getExceptionFee() > 0
+ && order.getAcceptDriver() != null) {
+ DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver());
+ if (driver != null && driver.getMemberId() != null) {
+ Revenue exRevenue = new Revenue();
+ exRevenue.setMemberId(driver.getMemberId());
+ exRevenue.setMemberType(Constants.ONE); // 1=鍙告満
+ exRevenue.setType(5); // 5=寮傚父閲戦
+ exRevenue.setOptType(Constants.ONE); // 1=鏀跺叆
+ exRevenue.setAmount(order.getExceptionFee());
+ exRevenue.setVaildStatus(Constants.ZERO);
+ exRevenue.setObjId(orderId);
+ exRevenue.setObjType(Constants.ZERO);
+ exRevenue.setStatus(Constants.ZERO);
+ exRevenue.setOrderNo(order.getCode());
+ exRevenue.setDeleted(Constants.ZERO);
+ exRevenue.setCreateTime(now);
+ revenueMapper.insert(exRevenue);
+ }
+ }
+
+ // 鍙告満濂栧姳閲戯紙浠呯敓鎴愬鍔辫褰曪紝涓嶇洿鎺ュ叆璐︼級
+ generateDriverReward(order);
+ }
+
+ /**
+ * 鐢熸垚鍙告満濂栧姳璁板綍
+ * 瑙勫垯锛�
+ * 宸插鍔辨鏁� < registerRewardOrderCount 鈫� 娉ㄥ唽濂栧姳锛坱ype=0, amount=registerRewardAmount锛�
+ * registerRewardOrderCount <= 宸插鍔辨鏁� < (registerRewardOrderCount + platformRewardOrderCount) 鈫� 骞冲彴濂栧姳锛坱ype=1, amount=platformRewardAmount锛�
+ * 瓒呭嚭鎬诲悕棰濅笉濂栧姳
+ */
+ private void generateDriverReward(Orders order) {
+ if (order.getAcceptDriver() == null) return;
+ DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver());
+ if (driver == null || driver.getId() == null) return;
+
+ // 璇诲彇濂栧姳閰嶇疆
+ String registerCountStr = operationConfigBiz.getConfig().getRegisterRewardOrderCount();
+ String registerAmountStr = operationConfigBiz.getConfig().getRegisterRewardAmount();
+ String platformCountStr = operationConfigBiz.getConfig().getPlatformRewardOrderCount();
+ String platformAmountStr = operationConfigBiz.getConfig().getPlatformRewardAmount();
+ if (StringUtils.isAnyBlank(registerCountStr, registerAmountStr, platformCountStr, platformAmountStr)) return;
+
+ int registerCount = Integer.parseInt(registerCountStr);
+ long registerAmount = new BigDecimal(registerAmountStr).multiply(BigDecimal.valueOf(100)).longValue();
+ int platformCount = Integer.parseInt(platformCountStr);
+ long platformAmount = new BigDecimal(platformAmountStr).multiply(BigDecimal.valueOf(100)).longValue();
+ int totalRewardSlots = registerCount + platformCount; // 鎬诲鍔卞悕棰�
+
+ // 鏌ヨ鍙告満宸插鍔辨鏁�
+ Long rewarded = rewardRecordMapper.selectCount(new QueryWrapper<RewardRecord>().lambda()
+ .eq(RewardRecord::getDriverId, driver.getId())
+ .eq(RewardRecord::getDeleted, Constants.ZERO));
+ int count = rewarded.intValue();
+ if (count >= totalRewardSlots) return; // 宸茶秴鍑哄鍔卞悕棰�
+
+ // 鍒ゆ柇鏈濂栧姳绫诲瀷鍜岄噾棰�
+ int rewardType;
+ long rewardAmount;
+ if (count < registerCount) {
+ // 娉ㄥ唽濂栧姳闃舵
+ rewardType = Constants.ZERO;
+ rewardAmount = registerAmount;
+ } else {
+ // 骞冲彴濂栧姳闃舵
+ rewardType = Constants.ONE;
+ rewardAmount = platformAmount;
+ }
+ if (rewardAmount <= 0) return;
+
+ // 鍒涘缓濂栧姳璁板綍锛堢姸鎬�=0寰呴鍙栵紝鍚庣画鐢卞徃鏈洪鍙栨椂鍏ヨ处锛�
+ RewardRecord record = new RewardRecord();
+ record.setOrderId(order.getId());
+ record.setDriverId(driver.getId());
+ record.setStatus(Constants.ZERO); // 0=寰呴鍙�
+ record.setType(rewardType); // 0=娉ㄥ唽濂栧姳, 1=骞冲彴濂栧姳
+ record.setAmount(rewardAmount);
+ record.setDeleted(Constants.ZERO);
+ record.setCreateTime(new Date());
+ rewardRecordMapper.insert(record);
}
/**
@@ -3444,9 +4005,58 @@
new QueryWrapper<OrdersDetail>().lambda()
.eq(OrdersDetail::getOrderId, orderId)
.eq(OrdersDetail::getDeleted, Constants.ZERO));
- OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(order, details);
Date now = new Date();
+
+ // 寮傚父璁㈠崟閫炬湡閫昏緫
+ if (Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE)
+ && order.getRelationOrderId() != null) {
+ Orders originalOrder = ordersMapper.selectById(order.getRelationOrderId());
+ long driverExceptionFee = (originalOrder != null && originalOrder.getExceptionFee() != null)
+ ? originalOrder.getExceptionFee() : 0L;
+ long shopExceptionFee = order.getShopCompensationAmount() != null ? order.getShopCompensationAmount() : 0L;
+ long totalExceptionFee = driverExceptionFee + shopExceptionFee;
+
+ // 鍒ゆ柇鏄惁褰撳ぉ鍙栦欢锛堟寜 expectedTakeTime 鏃ユ湡锛�
+ boolean sameDay = isSameDay(now, order.getExpectedTakeTime());
+
+ long overdueFee;
+ int overdueDays;
+ if (sameDay) {
+ // 褰撳ぉ鍙栦欢锛氶�炬湡璐圭敤 = 寮傚父璐圭敤鎬诲拰
+ overdueFee = totalExceptionFee;
+ overdueDays = totalExceptionFee > 0 ? 1 : 0;
+ } else {
+ // 闈炲綋澶╁彇浠讹細姝e父閫炬湡璁$畻 + 鍙告満寮傚父璐圭敤锛堜笉鍚棬搴楀紓甯歌垂鐢級
+ OverdueFeeVO normalOverdue = calculateOverdueFeeInternal(order, details);
+ long normalFee = (normalOverdue != null && normalOverdue.getOverdueFee() != null)
+ ? normalOverdue.getOverdueFee() : 0L;
+ overdueFee = normalFee + driverExceptionFee;
+ overdueDays = (normalOverdue != null && normalOverdue.getOverdueDays() != null)
+ ? normalOverdue.getOverdueDays() : 0;
+ }
+
+ order.setConfirmArriveTime(now);
+ order.setUpdateTime(now);
+ if (overdueFee > 0) {
+ order.setOverdueStatus(Constants.ONE);
+ order.setOverdueDays(overdueDays);
+ order.setOverdueAmount(overdueFee);
+ ordersMapper.updateById(order);
+ String overdueLogInfo = "闂ㄥ簵銆�" + shopName + "銆戠‘璁ら【瀹㈠埌搴楋紝閫炬湡" + overdueDays
+ + "澶╋紝閫炬湡璐圭敤" + Constants.getFormatMoney(overdueFee) + "鍏�";
+ saveShopVerifyLog(order, Constants.OrderLogType.shopConfirmArriveOverdue, overdueLogInfo, null, shopId);
+ } else {
+ order.setOverdueStatus(Constants.ZERO);
+ ordersMapper.updateById(order);
+ saveShopVerifyLog(order, Constants.OrderLogType.shopConfirmArrive,
+ "闂ㄥ簵銆�" + shopName + "銆戠‘璁ら【瀹㈠埌搴楋紝鏈�炬湡", null, shopId);
+ }
+ return;
+ }
+
+ // 鏅�氳鍗曢�炬湡璁$畻
+ OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(order, details);
if (overdueInfo.getOverdue() && overdueInfo.getOverdueDays() > 0) {
// 瀛樺湪閫炬湡锛氭爣璁伴�炬湡鐘舵�侊紝璁㈠崟淇濇寔褰撳墠鐘舵��
@@ -3472,17 +4082,26 @@
int actualDays = calcActualDepositDays(now, order.getDepositTime());
order.setDepositDays(actualDays);
- int estimatedDays = order.getEstimatedDepositDays() != null ? order.getEstimatedDepositDays() : 1;
- int refundDays = estimatedDays - actualDays;
- if (refundDays > 0) {
- // 閫�娆鹃噾棰� = 閫�娆惧ぉ鏁� 脳 危(鐗╁搧鍗曚环 脳 鏁伴噺)
- long dailyBaseFee = 0L;
- for (OrdersDetail d : details) {
- dailyBaseFee += (d.getUnitPrice() != null ? d.getUnitPrice() : 0L)
- * (d.getNum() != null ? d.getNum() : 0);
+ long dailyBaseFee = 0L;
+ for (OrdersDetail d : details) {
+ dailyBaseFee += (d.getLocallyPrice() != null ? d.getLocallyPrice() : 0L)
+ * (d.getNum() != null ? d.getNum() : 0);
+ }
+
+ if (Constants.equalsInteger(order.getIsConverted(), Constants.ONE)) {
+ // 杞崲璁㈠崟锛氬疄闄呰垂鐢ㄤ笌宸蹭粯閲戦瀵规瘮
+ long actualFee = (long) actualDays * dailyBaseFee;
+ long payAmount = order.getPayAmount() != null ? order.getPayAmount() : 0L;
+ if (actualFee < payAmount) {
+ order.setRefundAmount(payAmount - actualFee);
}
- long refundAmount = (long) refundDays * dailyBaseFee;
- order.setRefundAmount(refundAmount);
+ } else {
+ // 鏅�氳鍗曪細鎸夐璁″ぉ鏁颁笌瀹為檯澶╂暟宸绠楅��娆�
+ int estimatedDays = order.getEstimatedDepositDays() != null ? order.getEstimatedDepositDays() : 1;
+ int refundDays = estimatedDays - actualDays;
+ if (refundDays > 0) {
+ order.setRefundAmount((long) refundDays * dailyBaseFee);
+ }
}
}
@@ -3536,7 +4155,12 @@
return "鍙告満宸插彇浠讹紝姝h繍寰�鐩殑鍦�";
}
if (Constants.equalsInteger(status, Constants.OrderStatus.arrived.getStatus())) {
- return "琛屾潕宸查�佽揪鏈嶅姟鐐癸紝璇峰強鏃跺墠寰�鍙栦欢";
+ if(Constants.equalsInteger(order.getType(),Constants.ZERO)){
+ return "琛屾潕宸插瘎瀛橈紝璇峰嚟鍙栦欢鐮佸墠寰�鎸囧畾闂ㄥ簵鍙栦欢~";
+ }else{
+ return "琛屾潕宸查�佽揪鏈嶅姟鐐癸紝璇峰強鏃跺墠寰�鍙栦欢";
+ }
+
}
if (Constants.equalsInteger(status, Constants.OrderStatus.finished.getStatus())) {
if (Constants.equalsInteger(order.getCommentStatus(), Constants.ONE)) {
@@ -3666,6 +4290,31 @@
if (Constants.equalsInteger(order.getType(), Constants.ZERO)) {
// ========== 灏卞湴瀵勫瓨 ==========
+
+ // 杞崲璁㈠崟锛堝紓鍦拌浆灏卞湴锛夛細鎸夊瘎瀛樻椂闂村埌褰撳墠鏃堕棿璁$畻瀹為檯璐圭敤
+ if (Constants.equalsInteger(order.getIsConverted(), Constants.ONE)) {
+ int actualDays = calcActualDepositDays(now, order.getDepositTime());
+ long actualFee = (long) actualDays * dailyBaseFee;
+ long payAmount = order.getPayAmount() != null ? order.getPayAmount() : 0L;
+
+ OverdueFeeVO vo = new OverdueFeeVO();
+ vo.setDailyBaseFee(dailyBaseFee);
+ if (actualFee <= payAmount) {
+ // 瀹為檯璐圭敤 <= 宸蹭粯閲戦锛氭湭閫炬湡
+ vo.setOverdue(false);
+ vo.setOverdueDays(0);
+ vo.setOverdueFee(0L);
+ } else {
+ // 瀹為檯璐圭敤 > 宸蹭粯閲戦锛氶�炬湡锛屽樊浠蜂负閫炬湡璐圭敤
+ int overDays = actualDays - (order.getEstimatedDepositDays() != null ? order.getEstimatedDepositDays() : 1);
+ vo.setOverdue(true);
+ vo.setOverdueDays(Math.max(overDays, 1));
+ vo.setOverdueFee(actualFee - payAmount);
+ }
+ return vo;
+ }
+
+ // 鏅�氬氨鍦板瘎瀛�
overdueDays = calcLocalOverdueDays(now, order.getExpectedTakeTime());
overdueFee = (long) overdueDays * dailyBaseFee;
@@ -3737,6 +4386,16 @@
long diffMs = nowCal.getTimeInMillis() - depositCal.getTimeInMillis();
int days = (int) (diffMs / (1000 * 60 * 60 * 24));
return Math.max(days, 1);
+ }
+
+ private boolean isSameDay(Date d1, Date d2) {
+ if (d1 == null || d2 == null) return false;
+ Calendar c1 = Calendar.getInstance();
+ c1.setTime(d1);
+ Calendar c2 = Calendar.getInstance();
+ c2.setTime(d2);
+ return c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR)
+ && c1.get(Calendar.DAY_OF_YEAR) == c2.get(Calendar.DAY_OF_YEAR);
}
/**
@@ -4023,7 +4682,6 @@
"time", String.valueOf(noGrabMinutes));
}
// 鏍囪宸查�氱煡 + 璁板綍閫氱煡鏃堕棿
- order.setPlatformSmsNotified(Constants.ONE);
order.setPlatformSmsNotifiedTime(now);
order.setUpdateTime(now);
ordersMapper.updateById(order);
@@ -4077,6 +4735,7 @@
// 鏇存柊璁㈠崟鐘舵�佷负宸插畬鎴�
order.setStatus(Constants.OrderStatus.finished.getStatus());
+ order.setInvoiceStatus(Constants.ONE);
order.setFinishTime(now);
order.setUpdateTime(now);
ordersMapper.updateById(order);
@@ -4134,6 +4793,9 @@
*/
private void sendSmsNotify(String phone, Constants.SmsNotify smsNotify, String... paramPairs) {
if (StringUtils.isBlank(phone)) {
+ return;
+ }
+ if (!smsNotify.isEnabled()) {
return;
}
String content = smsNotify.format(paramPairs);
@@ -4202,8 +4864,10 @@
}
}
- //搴忓彿
- String sort = Constants.formatIntegerNum(shopId)+"-"+orders.getId();
+ //搴忓彿锛氬晢閾篒D-鏃ユ湡-鑷闀垮簭鍙凤紙濡� 32-06-001锛�
+ String dateStr = new SimpleDateFormat("dd").format(orders.getPayTime() != null ? orders.getPayTime() : new Date());
+ String autoNumStr = String.format("%03d", orders.getAutoNum() != null ? orders.getAutoNum() : 0);
+ String sort = shopId + "-" + dateStr + "-" + autoNumStr;
// String content = printService.getPrintContent(shop.getName(), detailList, userInfo, orders.getCode(), orders.getRemark(),
String content = printService.getPrintContent(shop.getName(), detailList, userInfo, orders.getCode(), sort,
orders.getTakeLocationRemark(),
@@ -4273,4 +4937,366 @@
JPushUtil.sendByAliases(aliases, title, content, extras);
}
+ @Override
+ public int notifyArrivalPickUp() {
+ String timeStr = operationConfigBiz.getConfig().getArrivalPickUpTime();
+ if (StringUtils.isBlank(timeStr)) {
+ return 0;
+ }
+ int minutes;
+ try {
+ minutes = Integer.parseInt(timeStr);
+ } catch (NumberFormatException e) {
+ log.warn("鍗冲皢鍒拌揪鍙栦欢鏃堕棿閰嶇疆寮傚父: {}", timeStr);
+ return 0;
+ }
+ if (minutes <= 0) {
+ return 0;
+ }
+ // 璁$畻鏃堕棿绐楀彛锛氬綋鍓嶆椂闂� + minutes 灏辨槸"鍗冲皢鍒拌揪"鐨勪复鐣岀偣
+ Date now = new Date();
+ Date threshold = new Date(now.getTime() + (long) minutes * 60 * 1000);
+ // 鏌ヨ锛歴tatus=5銆佹湭閫氱煡銆佸氨鍦板瘎瀛� or 寮傚湴(鏈夊彇浠堕棬搴�)銆侀璁″彇浠舵椂闂村湪 now~threshold 涔嬮棿
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ String nowStr = sdf.format(now);
+ String thresholdStr = sdf.format(threshold);
+ List<Orders> orders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda()
+ .eq(Orders::getStatus, Constants.OrderStatus.arrived.getStatus())
+ .eq(Orders::getPayStatus, Constants.ONE)
+ .eq(Orders::getDeleted, Constants.ZERO)
+ .and(w -> w
+ .eq(Orders::getType, Constants.ZERO)
+ .or(w2 -> w2.eq(Orders::getType, Constants.ONE).isNotNull(Orders::getTakeShopId))
+ )
+ .ne(Orders::getPickUpNotifyStatus, Constants.ONE)
+ .isNotNull(Orders::getExpectedTakeTime)
+ .apply("DATE_FORMAT(EXPECTED_TAKE_TIME, '%Y-%m-%d %H:%i:%s') >= {0}", nowStr)
+ .apply("DATE_FORMAT(EXPECTED_TAKE_TIME, '%Y-%m-%d %H:%i:%s') <= {0}", thresholdStr));
+ if (orders == null || orders.isEmpty()) {
+ return 0;
+ }
+ int count = 0;
+ for (Orders order : orders) {
+ Member member = memberMapper.selectById(order.getMemberId());
+ if (member != null && StringUtils.isNotBlank(member.getTelephone())) {
+ sendSmsNotify(member.getTelephone(), Constants.SmsNotify.MEMBER_TIME_OUT,
+ "orderNo", order.getCode());
+ }
+ order.setPickUpNotifyStatus(Constants.ONE);
+ ordersMapper.updateById(order);
+ count++;
+ }
+ return count;
+ }
+
+ @Override
+ public Boolean checkOperationRadius(Integer orderId, Integer userId, Integer userType, Double lng, Double lat) {
+ String radiusStr = operationConfigBiz.getConfig().getOperationRadius();
+ if (StringUtils.isBlank(radiusStr)) {
+ return true;
+ }
+ double radiusM;
+ try {
+ radiusM = Double.parseDouble(radiusStr);
+ } catch (NumberFormatException e) {
+ return true;
+ }
+ if (radiusM <= 0) {
+ return true;
+ }
+ Orders order = ordersMapper.selectById(orderId);
+ if (order == null) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璁㈠崟涓嶅瓨鍦�");
+ }
+ BigDecimal targetLat;
+ BigDecimal targetLgt;
+ if (Constants.equalsInteger(userType, Constants.ZERO)) {
+ // 闂ㄥ簵鎿嶄綔
+ if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.waitDeposit.getStatus())) {
+ // status=1 闂ㄥ簵瀵勫瓨鏍搁獙
+ if (!Constants.equalsInteger(order.getDepositShopId(), userId)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏃犳潈鎿嶄綔璇ヨ鍗�");
+ }
+ targetLat = order.getDepositLat();
+ targetLgt = order.getDepositLgt();
+ } else if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.arrived.getStatus())) {
+ // status=5 闂ㄥ簵瀹屾垚鏍搁攢
+ if (Constants.equalsInteger(order.getType(), Constants.ZERO)) {
+ // 灏卞湴瀛樺彇 鈫� 瀵规瘮瀛樹欢闂ㄥ簵
+ if (!Constants.equalsInteger(order.getDepositShopId(), userId)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏃犳潈鎿嶄綔璇ヨ鍗�");
+ }
+ targetLat = order.getDepositLat();
+ targetLgt = order.getDepositLgt();
+ } else {
+ // 寮傚湴瀛樺彇 鈫� 瀵规瘮鍙栦欢闂ㄥ簵
+ if (!Constants.equalsInteger(order.getTakeShopId(), userId)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏃犳潈鎿嶄綔璇ヨ鍗�");
+ }
+ targetLat = order.getTakeLat();
+ targetLgt = order.getTakeLgt();
+ }
+ } else {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璁㈠崟鐘舵�佷笉鍏佽姝ゆ搷浣�");
+ }
+ } else if (Constants.equalsInteger(userType, Constants.ONE)) {
+ // 鍙告満鎿嶄綔
+ if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.deposited.getStatus())) {
+ // status=2 鍙告満鍙栦欢
+ if (!Constants.equalsInteger(order.getAcceptDriver(), userId)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏃犳潈鎿嶄綔璇ヨ鍗�");
+ }
+ targetLat = order.getDepositLat();
+ targetLgt = order.getDepositLgt();
+ } else if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.delivering.getStatus())) {
+ // status=4 鍙告満閫佽揪
+ if (!Constants.equalsInteger(order.getAcceptDriver(), userId)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏃犳潈鎿嶄綔璇ヨ鍗�");
+ }
+ targetLat = order.getTakeLat();
+ targetLgt = order.getTakeLgt();
+ } else {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璁㈠崟鐘舵�佷笉鍏佽姝ゆ搷浣�");
+ }
+ } else {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鐢ㄦ埛绫诲瀷涓嶅悎娉�");
+ }
+ if (targetLat == null || targetLgt == null) {
+ return true;
+ }
+ double distanceKm = GeoUtils.haversineDistance(lat, lng, targetLat.doubleValue(), targetLgt.doubleValue());
+ return distanceKm * 1000 <= radiusM;
+ }
+
+ @Override
+ @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+ public void handleOrderException(HandleOrderExceptionDTO dto) {
+ // ========== A. 鏍¢獙 ==========
+ Orders original = ordersMapper.selectById(dto.getOrderId());
+ if (original == null || Constants.equalsInteger(original.getDeleted(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "璁㈠崟涓嶅瓨鍦�");
+ }
+ if (!Constants.equalsInteger(original.getType(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呮敮鎸佸紓鍦拌鍗曞紓甯稿鐞�");
+ }
+ if (original.getTakeShopId() != null) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曞凡鍏宠仈鍙栦欢闂ㄥ簵锛屼笉鏀寔寮傚父澶勭悊");
+ }
+ if (!Constants.equalsInteger(original.getStatus(), Constants.FIVE)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呮敮鎸佸凡閫佽揪鐘舵�佺殑璁㈠崟");
+ }
+ if (Constants.equalsInteger(original.getExceptionStatus(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曞凡澶勭悊杩囧紓甯革紝璇峰嬁閲嶅鎿嶄綔");
+ }
+
+ ShopInfo newShop = shopInfoMapper.selectById(dto.getDepositShopId());
+ if (newShop == null || Constants.equalsInteger(newShop.getStatus(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀛樻斁闂ㄥ簵涓嶅瓨鍦ㄦ垨宸茬鐢�");
+ }
+
+ Date now = new Date();
+
+ // ========== B. 鍒涘缓鏂拌鍗曪紙灏卞湴瀛樺彇锛� ==========
+ String orderCode = "JC" + new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(now)
+ + String.format("%04d", new java.util.Random().nextInt(10000));
+ String orderTradeNo = generateOrderTradeNo();
+
+ // 褰撳ぉ23:30
+ Calendar cal = Calendar.getInstance();
+ cal.set(Calendar.HOUR_OF_DAY, 23);
+ cal.set(Calendar.MINUTE, 30);
+ cal.set(Calendar.SECOND, 0);
+ cal.set(Calendar.MILLISECOND, 0);
+ Date expectedTakeTime = cal.getTime();
+
+ // 璁$畻鍩虹鍗曚环
+ Long price = 0L;
+ Long basicAmount = 0L;
+ // 鏌ヨ鍘熻鍗曟槑缁嗚幏鍙栫墿鍝佸垪琛�
+ List<OrdersDetail> originalDetails = ordersDetailMapper.selectList(
+ new QueryWrapper<OrdersDetail>().lambda()
+ .eq(OrdersDetail::getOrderId, original.getId())
+ .eq(OrdersDetail::getDeleted, Constants.ZERO));
+ if (!CollectionUtils.isEmpty(originalDetails)) {
+ CalculateLocalPriceDTO priceDTO = new CalculateLocalPriceDTO();
+ priceDTO.setCityId(Integer.valueOf(original.getCityId()));
+ priceDTO.setDepositStartTime(now);
+ priceDTO.setDepositEndTime(expectedTakeTime);
+ List<OrderItemDTO> items = new ArrayList<>();
+ for (OrdersDetail d : originalDetails) {
+ OrderItemDTO item = new OrderItemDTO();
+ item.setCategoryId(d.getLuggageId());
+ item.setQuantity(d.getNum());
+ items.add(item);
+ }
+ priceDTO.setItems(items);
+ PriceCalculateVO priceResult = calculateLocalPrice(priceDTO);
+ if (priceResult != null) {
+ price = priceResult.getItemPrice();
+ basicAmount = priceResult.getItemPrice();
+ }
+ }
+
+ // 瀛樹欢闂ㄥ簵鍒嗘垚鍗犳瘮锛堝氨鍦板瓨鍙栵級
+ Integer cityId = Integer.valueOf(original.getCityId());
+ boolean isCompany = Constants.equalsInteger(newShop.getCompanyType(), Constants.ONE);
+ int fallbackFieldA = isCompany ? Constants.FIVE : Constants.SIX;
+ BigDecimal depositShopFeeRate = getShopRevenueShare(newShop, "localDeposit", cityId, fallbackFieldA);
+
+ Orders newOrder = new Orders();
+ newOrder.setCode(orderCode);
+ newOrder.setOutTradeNo(orderTradeNo);
+ newOrder.setMemberId(original.getMemberId());
+ newOrder.setType(Constants.ZERO); // 灏卞湴瀛樺彇
+ newOrder.setCityId(original.getCityId());
+ newOrder.setStatus(Constants.ONE); // 寰呭瘎瀛�
+ newOrder.setPayStatus(Constants.ONE); // 宸叉敮浠�
+ newOrder.setPayTime(now);
+ newOrder.setCommentStatus(Constants.ZERO);
+ newOrder.setSettlementStatus(Constants.ZERO);
+ newOrder.setDeleted(Constants.ZERO);
+ newOrder.setCreateTime(now);
+ newOrder.setUpdateTime(now);
+ newOrder.setIsConverted(Constants.ZERO);
+
+ // 瀛樹欢淇℃伅锛堝叆鍙傞棬搴楋級
+ newOrder.setDepositShopId(dto.getDepositShopId());
+ newOrder.setDepositLocation(newShop.getAddress());
+ newOrder.setDepositLocationRemark(newShop.getAddress());
+ newOrder.setDepositLat(BigDecimal.valueOf(newShop.getLatitude()));
+ newOrder.setDepositLgt(BigDecimal.valueOf(newShop.getLongitude()));
+ // 鍙栦欢淇℃伅锛堝氨鍦�=瀛樹欢闂ㄥ簵锛�
+ newOrder.setTakeShopId(dto.getDepositShopId());
+ newOrder.setTakeLocation(newShop.getAddress());
+ newOrder.setTakeLocationRemark(newShop.getAddress());
+ newOrder.setTakeLat(BigDecimal.valueOf(newShop.getLatitude()));
+ newOrder.setTakeLgt(BigDecimal.valueOf(newShop.getLongitude()));
+
+ // 鏃堕棿
+ newOrder.setExpectedDepositTime(now);
+ newOrder.setExpectedTakeTime(expectedTakeTime);
+ newOrder.setEstimatedDepositDays(1);
+
+ // 鐗╁搧淇℃伅
+ newOrder.setGoodType(original.getGoodType());
+ newOrder.setGoodLevel(original.getGoodLevel());
+ newOrder.setGoodsInfo(original.getGoodsInfo());
+ newOrder.setSupplement(original.getSupplement());
+ newOrder.setSelfTake(original.getSelfTake());
+ newOrder.setTakeUser(original.getTakeUser());
+ newOrder.setTakePhone(original.getTakePhone());
+
+ // 寮傚父鏍囪
+ newOrder.setExceptionStatus(Constants.ONE);
+ newOrder.setRelationOrderId(original.getId());
+ newOrder.setExceptionInfo(dto.getRemark());
+
+ // 璐圭敤
+ newOrder.setIsUrgent(Constants.ZERO);
+ newOrder.setUrgentRata(BigDecimal.ONE);
+ newOrder.setUrgentAmount(0L);
+ newOrder.setDeclaredAmount(0L);
+ newOrder.setDeclaredFee(0L);
+ newOrder.setPrice(price);
+ newOrder.setBasicAmount(basicAmount);
+ newOrder.setEstimatedAmount(basicAmount);
+ newOrder.setTotalAmount(0L);
+ newOrder.setPayAmount(0L);
+ newOrder.setManualRefund(Constants.ZERO);
+
+ // 璐圭敤鍒嗛厤
+ newOrder.setDriverFee(0L);
+ newOrder.setDriverFeeRata(BigDecimal.ZERO);
+ newOrder.setDepositShopFee(0L);
+ newOrder.setDepositShopFeeRata(depositShopFeeRate);
+ newOrder.setTakeShopFee(0L);
+ newOrder.setTakeShopFeeRata(BigDecimal.ZERO);
+
+ // 闂ㄥ簵琛ュ伩閲戦
+ newOrder.setShopCompensationAmount(dto.getShopCompensation());
+
+ newOrder.setRemark(dto.getRemark());
+ newOrder.setPlatformSmsNotified(Constants.ZERO);
+ newOrder.setMemberVerifyCode(generateVerifyCode());
+ newOrder.setDriverVerifyCode(generateVerifyCode());
+ // 璁$畻搴楅摵璁㈠崟搴忓彿
+ Date todayStart = DateUtil.getStartOfDay(now);
+ Long currentCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
+ .eq(Orders::getDepositShopId, dto.getDepositShopId())
+ .eq(Orders::getPayStatus, Constants.ONE)
+ .ge(Orders::getPayTime, todayStart)
+ .eq(Orders::getDeleted, Constants.ZERO));
+ newOrder.setAutoNum(currentCount + 1);
+ ordersMapper.insert(newOrder);
+
+ // ========== C. 鍒涘缓鏂拌鍗曟槑缁� ==========
+ if (!CollectionUtils.isEmpty(originalDetails)) {
+ for (OrdersDetail od : originalDetails) {
+ OrdersDetail detail = new OrdersDetail();
+ detail.setOrderId(newOrder.getId());
+ detail.setLuggageId(od.getLuggageId());
+ detail.setLuggageName(od.getLuggageName());
+ detail.setLuggageDetail(od.getLuggageDetail());
+ detail.setNum(od.getNum());
+ detail.setUnitPrice(od.getLocallyPrice());
+ detail.setLocallyPrice(od.getLocallyPrice());
+ detail.setDeleted(Constants.ZERO);
+ detail.setCreateTime(now);
+ ordersDetailMapper.insert(detail);
+ }
+ }
+
+ // ========== D. 鎷疯礉闄勪欢 ==========
+ List<Multifile> originalFiles = multifileMapper.selectList(
+ new QueryWrapper<Multifile>().lambda()
+ .eq(Multifile::getObjId, original.getId())
+ .eq(Multifile::getObjType, Constants.FileType.ORDER_FILE.getKey())
+ .eq(Multifile::getIsdeleted, Constants.ZERO));
+ if (!CollectionUtils.isEmpty(originalFiles)) {
+ int sortNum = 1;
+ for (Multifile mf : originalFiles) {
+ Multifile newFile = new Multifile();
+ newFile.setObjId(newOrder.getId());
+ newFile.setObjType(Constants.FileType.ORDER_FILE.getKey());
+ newFile.setType(mf.getType());
+ newFile.setFileurl(mf.getFileurl());
+ newFile.setIsdeleted(Constants.ZERO);
+ newFile.setCreateDate(now);
+ newFile.setSortnum(sortNum++);
+ multifileMapper.insert(newFile);
+ }
+ }
+
+ // ========== E. 鏇存柊鍘熻鍗� ==========
+ ordersMapper.update(new UpdateWrapper<Orders>().lambda()
+ .set(Orders::getExceptionStatus, Constants.ONE)
+ .set(Orders::getExceptionFee, dto.getDriverCompensation())
+ .set(Orders::getUpdateTime, now)
+ .eq(Orders::getId, original.getId()));
+
+ // ========== F. 鍙戦�佺煭淇¢�氱煡 ==========
+ // 鍙告満绔�-寮傚父娲惧崟
+ if (original.getAcceptDriver() != null) {
+ DriverInfo driver = driverInfoMapper.selectById(original.getAcceptDriver());
+ if (driver != null && StringUtils.isNotBlank(driver.getTelephone())) {
+ sendSmsNotify(driver.getTelephone(), Constants.SmsNotify.EXCEPTION_DISPATCH,
+ "orderNo", original.getCode(),
+ "address", newShop.getAddress(),
+ "code", newOrder.getMemberVerifyCode());
+ }
+ }
+ // 浼氬憳绔�-寮傚父娲惧崟
+ String memberPhone = StringUtils.isNotBlank(original.getTakePhone()) ? original.getTakePhone() : null;
+ if (memberPhone == null) {
+ Member member = memberMapper.selectById(original.getMemberId());
+ if (member != null) {
+ memberPhone = member.getTelephone();
+ }
+ }
+ if (StringUtils.isNotBlank(memberPhone)) {
+ sendSmsNotify(memberPhone, Constants.SmsNotify.MEMBER_EXCEPTION_DISPATCH,
+ "address", newShop.getAddress());
+ }
+ }
+
}
--
Gitblit v1.9.3