From 4ab710d8d70017f090dd9601099ded1a50a58a10 Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期一, 27 四月 2026 22:34:52 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'
---
server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java | 325 ++++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 266 insertions(+), 59 deletions(-)
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
index 5bd7f52..6617be5 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
@@ -30,6 +30,8 @@
import com.doumee.dao.business.OrderLogMapper;
import com.doumee.dao.dto.*;
import com.doumee.dao.vo.AccountResponse;
+import com.doumee.dao.vo.DriverActiveOrderCountVO;
+import com.doumee.dao.vo.DriverCancelLimitVO;
import com.doumee.dao.vo.DriverCenterVO;
import com.doumee.dao.vo.DriverGrabOrderVO;
import com.doumee.dao.vo.DriverOrderDetailVO;
@@ -48,6 +50,7 @@
import org.springframework.util.CollectionUtils;
import java.util.*;
+import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
@@ -477,7 +480,7 @@
}
// 鐘舵�佹牎楠岋細auditStatus=null(鏈彁浜�)鎴朼uditStatus=2(瀹℃壒椹冲洖)鍙彁浜よ璇�
if (driverInfo.getAuditStatus() != null
- && !Constants.equalsInteger(driverInfo.getAuditStatus(), Constants.TWO)) {
+ && !(Constants.equalsInteger(driverInfo.getAuditStatus(), Constants.TWO)||Constants.equalsInteger(driverInfo.getAuditStatus(), 99))) {
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "褰撳墠鐘舵�佷笉鍏佽鎻愪氦璁よ瘉");
}
// 鏍规嵁杞﹁締绫诲瀷鍒ゆ柇鏄惁闇�瑕侀┚椹惰瘉
@@ -631,7 +634,7 @@
// 瀹℃壒缁撴灉锛歛uditDTO.auditStatus 0=閫氳繃鈫抋uditStatus=1锛�1=鎷掔粷鈫抋uditStatus=2
Integer newAuditStatus;
if (Constants.equalsInteger(auditDTO.getAuditStatus(), Constants.ZERO)) {
- newAuditStatus = Constants.ONE; // 瀹℃壒閫氳繃
+ newAuditStatus = Constants.THREE; // 瀹℃壒閫氳繃
// 瀹℃壒閫氳繃鏃跺徃鏈哄畾绾т负蹇呭~
if (auditDTO.getDriverLevel() == null || auditDTO.getDriverLevel() < 1 || auditDTO.getDriverLevel() > 5) {
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "瀹℃壒閫氳繃鏃跺繀椤诲~鍐欏徃鏈哄畾绾�");
@@ -845,7 +848,7 @@
Long todayOrderCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
.eq(Orders::getAcceptDriver, driver.getId())
.eq(Orders::getDeleted, Constants.ZERO)
- .ge(Orders::getFinishTime, todayStart));
+ .ge(Orders::getAcceptTime, todayStart));
vo.setTodayOrderCount(todayOrderCount.intValue());
// 寰呭彇璐э紙宸叉帴鍗�=3锛�
@@ -945,10 +948,8 @@
goodTypeIds = cats.stream().map(Category::getId).collect(Collectors.toList());
}
- // 3. Haversine SQL鍏紡锛氬徃鏈哄埌瀛樹欢闂ㄥ簵璺濈(km)锛屼娇鐢∣rders鑷甫鍧愭爣
- String depositDist = "(6371 * acos(cos(radians(" + driverLat + ")) * cos(radians(t.DEPOSIT_LGT)) "
- + "* cos(radians(t.DEPOSIT_LAT) - radians(" + driverLng + ")) "
- + "+ sin(radians(" + driverLat + ")) * sin(radians(t.DEPOSIT_LGT))))";
+ // 3. ST_Distance_Sphere璁$畻鍙告満鍒板瓨浠堕棬搴楄窛绂�(km)锛屼娇鐢∣rders鑷甫鍧愭爣
+ String depositDist = "(ST_Distance_Sphere(POINT(" + driverLng + ", " + driverLat + "), POINT(t.DEPOSIT_LGT, t.DEPOSIT_LAT)) / 1000)";
// 4. 鏋勯�燤PJ鏌ヨ
IPage<Orders> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
@@ -963,6 +964,9 @@
.select("s2.link_phone as takeShopLinkPhone")
// 鐗╁搧绛夌骇璐甸噸鏍囪瘑
.select("c2.other_field as c2OtherField")
+ .select("c2.name as goodLevelName")
+ // 鏄惁瀛樺湪鐗瑰ぇ灏哄
+ .select("IF(EXISTS(SELECT 1 FROM orders_detail od JOIN category c3 ON c3.id = od.LUGGAGE_ID AND c3.TYPE = 4 AND c3.OTHER_FIELD = '1' WHERE od.ORDER_ID = t.ID AND od.DELETED = 0), 1, 0) as hasOversized")
// JOIN
.leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID and s1.DELETED = 0")
.leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID and s2.DELETED = 0")
@@ -1062,13 +1066,15 @@
.select("s2.address", Orders::getTakeShopAddress)
.select("s2.link_phone as takeShopLinkPhone")
.select("c2.other_field as c2OtherField")
+ .select("c2.name as goodLevelName")
+ .select("IF(EXISTS(SELECT 1 FROM orders_detail od JOIN category c3 ON c3.id = od.LUGGAGE_ID AND c3.TYPE = 4 AND c3.OTHER_FIELD = '1' WHERE od.ORDER_ID = t.ID AND od.DELETED = 0), 1, 0) as hasOversized")
.leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID and s1.DELETED = 0")
.leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID and s2.DELETED = 0")
.leftJoin("category c1 on c1.id = t.GOOD_TYPE and c1.DELETED = 0")
.leftJoin("category c2 on c2.id = c1.RELATION_ID and c2.DELETED = 0 and c2.TYPE = 3")
.eq(Orders::getAcceptDriver, driver.getId())
.eq(Orders::getType, Constants.ONE)
- .eq(Orders::getStatus, dto.getStatus())
+ .eq(Objects.nonNull(dto.getStatus()),Orders::getStatus, dto.getStatus())
.eq(Orders::getDeleted, Constants.ZERO)
.orderByAsc(Orders::getAcceptTime);
@@ -1103,10 +1109,13 @@
wrapper.selectAll(Orders.class)
.select("s1.name", Orders::getDepositShopName)
.select("s1.address", Orders::getDepositShopAddress)
+ .select("s1.telephone", Orders::getDepositShopLinkPhone)
.select("s2.name", Orders::getTakeShopName)
.select("s2.address", Orders::getTakeShopAddress)
- .select("s2.link_phone as takeShopLinkPhone")
+ .select("s2.telephone", Orders::getTakeShopLinkPhone)
.select("c2.other_field as c2OtherField")
+ .select("c1.name as goodTypeName")
+ .select("IF(EXISTS(SELECT 1 FROM orders_detail od JOIN category c3 ON c3.id = od.LUGGAGE_ID AND c3.TYPE = 4 AND c3.OTHER_FIELD = '1' WHERE od.ORDER_ID = t.ID AND od.DELETED = 0), 1, 0) as hasOversized")
.leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID and s1.DELETED = 0")
.leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID and s2.DELETED = 0")
.leftJoin("category c1 on c1.id = t.GOOD_TYPE and c1.DELETED = 0")
@@ -1164,11 +1173,29 @@
vo.setDepositShopAddress(base.getDepositShopAddress());
vo.setDepositDistance(base.getDepositDistance());
vo.setTakeName(base.getTakeName());
+ vo.setTakeAddress(base.getTakeAddress());
+ vo.setTakeShopId(base.getTakeShopId());
+
vo.setTakeDistance(base.getTakeDistance());
- vo.setContactPhone(base.getContactPhone());
+
+ // 鑱旂郴鐢佃瘽锛氭寜璁㈠崟鐘舵�佽繑鍥�
+ vo.setDepositShopPhone(order.getDepositShopLinkPhone());
+ if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.delivering.getStatus())
+ || Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.arrived.getStatus())) {
+ if (order.getTakeShopId() != null && StringUtils.isNotBlank(order.getTakeShopLinkPhone())) {
+ vo.setTakeContactPhone(order.getTakeShopLinkPhone());
+ } else {
+ vo.setTakeContactPhone(order.getTakePhone());
+ }
+ }
vo.setDriverFee(base.getDriverFee());
vo.setUrgentAmount(base.getUrgentAmount());
+ vo.setPlatformRewardAmount(order.getPlatformRewardAmount());
vo.setIsValuable(base.getIsValuable());
+ vo.setGoodLevelName(base.getGoodLevelName());
+ vo.setGoodTypeName(order.getGoodTypeName());
+ vo.setHasOversized(base.getHasOversized());
+ vo.setDriverVerifyCode(base.getDriverVerifyCode());
// 鐗╁搧鏄庣粏锛堣浆鎹㈢被鍨嬶級
List<DriverOrderDetailVO.OrderItem> detailItems = new ArrayList<>();
@@ -1177,6 +1204,7 @@
DriverOrderDetailVO.OrderItem item = new DriverOrderDetailVO.OrderItem();
item.setName(src.getName());
item.setQuantity(src.getQuantity());
+ item.setIsOversized(src.getIsOversized());
detailItems.add(item);
}
}
@@ -1185,6 +1213,11 @@
// 璇︽儏鐗规湁瀛楁
vo.setStatus(order.getStatus());
vo.setStatusDesc(getStatusDesc(order.getStatus()));
+ vo.setCreateTime(order.getCreateTime());
+ vo.setAcceptTime(order.getAcceptTime());
+ vo.setDriverTakeTime(order.getDriverTakeTime());
+ vo.setFinishTime(order.getFinishTime());
+ vo.setRemark(order.getRemark());
// 瀹㈡埛淇℃伅
String customerInfo = "";
@@ -1197,52 +1230,27 @@
vo.setCustomerInfo(customerInfo);
// 瀵艰埅缁忕含搴︼紙浣跨敤Orders鑷甫鍧愭爣锛�
- if (Constants.equalsInteger(order.getStatus(), Constants.TWO)) {
+ if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.accepted.getStatus())) {
if (order.getDepositLgt() != null && order.getDepositLat() != null) {
vo.setNavigateLat(order.getDepositLgt().doubleValue());
vo.setNavigateLng(order.getDepositLat().doubleValue());
}
- } else {
+ } else if(Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.delivering.getStatus())){
if (order.getTakeLgt() != null && order.getTakeLat() != null) {
vo.setNavigateLat(order.getTakeLgt().doubleValue());
vo.setNavigateLng(order.getTakeLat().doubleValue());
}
}
- // 寮傚湴瀵勫瓨瀹炴椂缁忕含搴︼紙鎸夌姸鎬佽繑鍥烇級
- if (Constants.ONE.equals(order.getType())) {
- // 鍙告満鑷韩缁忕含搴�
- vo.setDriverLng(driverLng);
- vo.setDriverLat(driverLat);
-
- // status=3(宸叉帴鍗�)锛氳繑鍥炲瓨浠堕棬搴楃粡绾害
- if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.accepted.getStatus())) {
- if (order.getDepositShopId() != null) {
- ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
- if (depositShop != null) {
- vo.setDepositShopLng(depositShop.getLongitude());
- vo.setDepositShopLat(depositShop.getLatitude());
- }
- }
- }
- // status=4(閰嶉�佷腑)锛氳繑鍥炲彇浠剁偣缁忕含搴�
- if (Constants.equalsInteger(order.getStatus(), 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());
- }
- }
- }
-
+ vo.setDepositShopLng(order.getDepositLgt().doubleValue());
+ vo.setDepositShopLat(order.getDepositLat().doubleValue());
+ vo.setTakeLng(order.getTakeLgt().doubleValue());
+ vo.setTakeLat(order.getTakeLat().doubleValue());
+ vo.setDriverLng(driverLng);
+ vo.setDriverLat(driverLat);
// 涓嬪崟闄勪欢鍥剧墖
String imgPrefix = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
- + systemDictDataBiz.queryByCode(Constants.OSS, Constants.MEMBER_FILES).getCode();
+ + systemDictDataBiz.queryByCode(Constants.OSS, Constants.ORDERS_FILES).getCode();
vo.setOrderImages(getFileUrls(orderId, Constants.FileType.ORDER_FILE.getKey(), imgPrefix));
// 璇勪环淇℃伅
@@ -1283,7 +1291,7 @@
if (!Constants.ONE.equals(order.getType())) {
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呭紓鍦板瘎瀛樿鍗曞彲鍙栨秷");
}
- if (!Constants.TWO.equals(order.getStatus())) {
+ if (!Constants.equalsInteger(Constants.OrderStatus.accepted.getStatus(), order.getStatus())) {
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鍏佽鍙栨秷");
}
if (!driverId.equals(order.getAcceptDriver())) {
@@ -1316,6 +1324,7 @@
.set(Orders::getAcceptDriver, null)
.set(Orders::getAcceptTime, null)
.set(Orders::getAcceptType, null)
+ .set(Orders::getStatus, Constants.OrderStatus.deposited.getStatus())
.eq(Orders::getId, orderId));
// 5. 鍐欏叆鍙栨秷鏃ュ織
@@ -1380,11 +1389,13 @@
// 5. 鍘熷瓙鏇存柊锛氬甫 status=2 鏉′欢闃叉骞跺彂閲嶅鎶㈠崟
Date now = new Date();
+ String driverVerifyCode = generateVerifyCode();
int rows = ordersMapper.update(new UpdateWrapper<Orders>().lambda()
.set(Orders::getAcceptDriver, driverId)
.set(Orders::getAcceptTime, now)
.set(Orders::getAcceptType, 0) // 0=鎵嬪姩鎶㈠崟
.set(Orders::getStatus, Constants.OrderStatus.accepted.getStatus())
+ .set(Orders::getDriverVerifyCode, driverVerifyCode)
.set(Orders::getUpdateTime, now)
.eq(Orders::getId, orderId)
.eq(Orders::getStatus, Constants.TWO));
@@ -1412,7 +1423,8 @@
// 閫氱煡瀛樹欢闂ㄥ簵锛氳鍗曞凡鎶㈠崟寰呭彇浠�
if (order.getDepositShopId() != null) {
sendShopNotice(order.getDepositShopId(), Constants.ShopOrderNotify.WAIT_PICKUP, orderId,
- "orderNo", order.getCode());
+ "orderNo", order.getCode(),
+ "name", driver.getName());
}
// 閫氱煡鍙告満锛氭姠鍗曟垚鍔�
@@ -1474,6 +1486,7 @@
// 4. 鏇存柊璁㈠崟鐘舵�佷负娲鹃�佷腑(4)
ordersMapper.update(new UpdateWrapper<Orders>().lambda()
.set(Orders::getStatus, Constants.OrderStatus.delivering.getStatus())
+ .set(Orders::getTakeTime, now)
.set(Orders::getUpdateTime, now)
.eq(Orders::getId, orderId));
@@ -1486,6 +1499,7 @@
log.setOptUserId(driver.getMemberId());
log.setOptUserType(Constants.ONE);
log.setOrderStatus(Constants.OrderStatus.delivering.getStatus());
+ log.setRemark(dto.getRemark());
log.setCreateTime(now);
log.setDeleted(Constants.ZERO);
orderLogMapper.insert(log);
@@ -1636,6 +1650,22 @@
return String.format("%.1fkm", km);
}
+ /**
+ * 鐢熸垚6浣嶆暟瀛楁牳閿�鐮侊紙Redis SETNX 淇濊瘉鍞竴锛�
+ */
+ private String generateVerifyCode() {
+ Random random = new Random();
+ String redisKey = Constants.REDIS_VERIFY_CODE_KEY;
+ for (int i = 0; i < 200; i++) {
+ String code = String.format("%06d", random.nextInt(1000000));
+ Boolean success = redisTemplate.opsForValue().setIfAbsent(redisKey + code, "1", 24, TimeUnit.HOURS);
+ if (success != null && success) {
+ return code;
+ }
+ }
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏍搁攢鐮佺敓鎴愬け璐ワ紝璇烽噸璇�");
+ }
+
private double haversine(double lat1, double lng1, double lat2, double lng2) {
double R = 6371;
double dLat = Math.toRadians(lat2 - lat1);
@@ -1682,14 +1712,17 @@
vo.setIsUrgent(order.getIsUrgent());
vo.setDriverFee(order.getDriverFee());
vo.setUrgentAmount(order.getUrgentAmount());
+ vo.setPlatformRewardAmount(order.getPlatformRewardAmount());
// 瀛樹欢闂ㄥ簵锛堜娇鐢∣rders鑷甫鍧愭爣锛�
vo.setDepositShopName(order.getDepositShopName());
vo.setDepositShopAddress(order.getDepositShopAddress());
+ vo.setDepositLng(order.getDepositLgt() != null ? order.getDepositLgt().doubleValue() : null);
+ vo.setDepositLat(order.getDepositLat() != null ? order.getDepositLat().doubleValue() : null);
if (needDepositDist && driverLat != null && driverLng != null
&& order.getDepositLgt() != null && order.getDepositLat() != null) {
- double distKm = haversine(driverLat, driverLng,
- order.getDepositLgt().doubleValue(), order.getDepositLat().doubleValue());
+ double distKm = haversine(driverLat, driverLng, order.getDepositLat().doubleValue(),
+ order.getDepositLgt().doubleValue());
vo.setDepositDistance(formatDistance(distKm));
}
@@ -1697,28 +1730,60 @@
boolean hasTakeShop = order.getTakeShopId() != null && StringUtils.isNotBlank(order.getTakeShopName());
if (hasTakeShop) {
vo.setTakeName(order.getTakeShopName());
+ vo.setTakeAddress(order.getTakeShopAddress());
+ vo.setTakeShopId(order.getTakeShopId());
vo.setContactPhone(order.getTakeShopLinkPhone());
} else {
vo.setTakeName(order.getTakeLocation());
+ vo.setTakeAddress(order.getTakeLocationRemark());
vo.setContactPhone(order.getTakePhone());
}
+ vo.setTakeLng(order.getTakeLgt() != null ? order.getTakeLgt().doubleValue() : null);
+ vo.setTakeLat(order.getTakeLat() != null ? order.getTakeLat().doubleValue() : null);
if (driverLat != null && driverLng != null
&& order.getTakeLgt() != null && order.getTakeLat() != null) {
- double takeDist = haversine(driverLat, driverLng,
- order.getTakeLgt().doubleValue(), order.getTakeLat().doubleValue());
+ double takeDist = haversine(driverLat, driverLng, order.getTakeLat().doubleValue(),
+ order.getTakeLgt().doubleValue());
vo.setTakeDistance(formatDistance(takeDist));
}
// 璐甸噸鐗╁搧
vo.setIsValuable("1".equals(order.getC2OtherField()));
+ vo.setGoodLevelName(order.getGoodLevelName());
+ vo.setHasOversized(order.getHasOversized());
+
+ // 寰呭彇璐х姸鎬�(status=3)杩斿洖鍙告満鍙栬揣鐮�
+ if (Constants.equalsInteger(order.getStatus(), Constants.THREE)||Constants.equalsInteger(order.getStatus(), Constants.FOUR)) {
+ vo.setDriverVerifyCode(order.getDriverVerifyCode());
+ }
+
+ // 璁㈠崟鐘舵��
+ vo.setStatus(order.getStatus());
+ vo.setStatusDesc(getStatusDesc(order.getStatus()));
+ vo.setCreateTime(order.getCreateTime());
// 鐗╁搧鏄庣粏
List<OrdersDetail> details = detailMap.getOrDefault(order.getId(), Collections.emptyList());
+ // 鎵归噺鏌ヨ娑夊強鍒扮殑 luggageId 瀵瑰簲鐨� category锛屽垽鏂槸鍚﹀ぇ浠�
+ Set<Integer> luggageIds = details.stream()
+ .map(OrdersDetail::getLuggageId)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toSet());
+ Set<Integer> oversizedIds = new HashSet<>();
+ if (!luggageIds.isEmpty()) {
+ categoryMapper.selectList(new QueryWrapper<Category>().lambda()
+ .in(Category::getId, luggageIds)
+ .eq(Category::getType, Constants.FOUR)
+ .eq(Category::getOtherField, "1")
+ .eq(Category::getDeleted, Constants.ZERO))
+ .forEach(c -> oversizedIds.add(c.getId()));
+ }
List<DriverGrabOrderVO.OrderItem> items = new ArrayList<>();
for (OrdersDetail detail : details) {
DriverGrabOrderVO.OrderItem item = new DriverGrabOrderVO.OrderItem();
item.setName(detail.getLuggageName());
item.setQuantity(detail.getNum());
+ item.setIsOversized(oversizedIds.contains(detail.getLuggageId()) ? Constants.ONE : Constants.ZERO);
items.add(item);
}
vo.setItems(items);
@@ -1771,11 +1836,14 @@
}
@Override
- public void changePassword(Integer driverId, String newPassword, String token) {
- if (StringUtils.isBlank(newPassword)) {
- throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵嗙爜涓嶈兘涓虹┖");
+ public void changePassword(Integer driverId, String oldPassword, String newPassword, String token) {
+ if (StringUtils.isBlank(oldPassword)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏃у瘑鐮佷笉鑳戒负绌�");
}
- // 鏍¢獙瀵嗙爜蹇呴』鍚屾椂鍖呭惈瀛楁瘝鍜屾暟瀛�
+ if (StringUtils.isBlank(newPassword)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏂板瘑鐮佷笉鑳戒负绌�");
+ }
+ // 鏍¢獙鏂板瘑鐮佸繀椤诲悓鏃跺寘鍚瓧姣嶅拰鏁板瓧
boolean hasLetter = newPassword.chars().anyMatch(Character::isLetter);
boolean hasDigit = newPassword.chars().anyMatch(Character::isDigit);
if (!hasLetter || !hasDigit) {
@@ -1789,6 +1857,11 @@
Member member = memberMapper.selectById(driverInfo.getMemberId());
if (member == null) {
throw new BusinessException(ResponseStatus.DATA_EMPTY);
+ }
+ // 鏍¢獙鏃у瘑鐮�
+ String oldEncryptPwd = secure.encryptPassword(oldPassword, member.getSalt());
+ if (!oldEncryptPwd.equals(member.getPassword())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏃у瘑鐮侀敊璇�");
}
// 鍔犲瘑鏂板瘑鐮佸苟鏇存柊
String salt = RandomStringUtils.randomAlphanumeric(6);
@@ -1804,7 +1877,7 @@
}
@Override
- public Map<String, Integer> getActiveOrderCount(Integer driverId) {
+ public DriverActiveOrderCountVO getActiveOrderCount(Integer driverId) {
// 宸叉姠鍗�(status=3)鏁伴噺
Long grabbed = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
.eq(Orders::getAcceptDriver, driverId)
@@ -1815,10 +1888,144 @@
.eq(Orders::getAcceptDriver, driverId)
.eq(Orders::getStatus, Constants.OrderStatus.delivering.getStatus())
.eq(Orders::getDeleted, Constants.ZERO));
- Map<String, Integer> result = new HashMap<>();
- result.put("grabbedCount", grabbed != null ? grabbed.intValue() : 0);
- result.put("deliveringCount", delivering != null ? delivering.intValue() : 0);
- return result;
+ DriverActiveOrderCountVO vo = new DriverActiveOrderCountVO();
+ vo.setGrabbedCount(grabbed != null ? grabbed.intValue() : 0);
+ vo.setDeliveringCount(delivering != null ? delivering.intValue() : 0);
+ return vo;
+ }
+
+ @Override
+ public PageData<DriverGrabOrderVO> driverOrderPage(Integer driverId, PageWrap<DriverOrderPageDTO> pageWrap) {
+ DriverInfo driver = driverInfoMapper.selectById(driverId);
+ if (driver == null) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鍙告満淇℃伅涓嶅瓨鍦�");
+ }
+
+ DriverOrderPageDTO model = pageWrap.getModel();
+ Integer status = model != null ? model.getStatus() : null;
+
+ // 鍚堟硶鐘舵�佹牎楠�
+ List<Integer> validStatuses = Arrays.asList(
+ Constants.OrderStatus.accepted.getStatus(),
+ Constants.OrderStatus.delivering.getStatus(),
+ Constants.OrderStatus.arrived.getStatus(),
+ Constants.OrderStatus.finished.getStatus());
+ if (status != null && !validStatuses.contains(status)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鐘舵�佸彧鑳戒负3(寰呭彇浠�)銆�4(閰嶉�佷腑)銆�7(宸插畬鎴�)");
+ }
+
+ IPage<Orders> p = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+ MPJLambdaWrapper<Orders> wrapper = new MPJLambdaWrapper<>();
+ wrapper.selectAll(Orders.class)
+ .select("s1.name", Orders::getDepositShopName)
+ .select("s1.address", Orders::getDepositShopAddress)
+ .select("s2.name", Orders::getTakeShopName)
+ .select("s2.address", Orders::getTakeShopAddress)
+ .select("s2.link_phone as takeShopLinkPhone")
+ .select("c2.other_field as c2OtherField")
+ .select("c2.name as goodLevelName")
+ .select("IF(EXISTS(SELECT 1 FROM orders_detail od JOIN category c3 ON c3.id = od.LUGGAGE_ID AND c3.TYPE = 4 AND c3.OTHER_FIELD = '1' WHERE od.ORDER_ID = t.ID AND od.DELETED = 0), 1, 0) as hasOversized")
+ .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID and s1.DELETED = 0")
+ .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID and s2.DELETED = 0")
+ .leftJoin("category c1 on c1.id = t.GOOD_TYPE and c1.DELETED = 0")
+ .leftJoin("category c2 on c2.id = c1.RELATION_ID and c2.DELETED = 0 and c2.TYPE = 3")
+ .eq(Orders::getAcceptDriver, driverId)
+ .in(status == null, Orders::getStatus, validStatuses)
+ .eq(status != null, Orders::getStatus, status)
+ .eq(Orders::getDeleted, Constants.ZERO)
+ .orderByDesc(Orders::getAcceptTime);
+
+ IPage<Orders> orderPage = ordersMapper.selectJoinPage(p, Orders.class, wrapper);
+
+ List<DriverGrabOrderVO> voList = new ArrayList<>();
+ if (orderPage != null && orderPage.getRecords() != null) {
+ // 鎵归噺鏌ョ墿鍝佹槑缁�
+ List<Integer> orderIds = orderPage.getRecords().stream().map(Orders::getId).collect(Collectors.toList());
+ Map<Integer, List<OrdersDetail>> detailMap = new HashMap<>();
+ if (!orderIds.isEmpty()) {
+ List<OrdersDetail> allDetails = ordersDetailMapper.selectList(
+ new QueryWrapper<OrdersDetail>().lambda()
+ .in(OrdersDetail::getOrderId, orderIds));
+ for (OrdersDetail d : allDetails) {
+ detailMap.computeIfAbsent(d.getOrderId(), k -> new ArrayList<>()).add(d);
+ }
+ }
+
+ Double driverLat = driver.getLatitude();
+ Double driverLng = driver.getLongitude();
+ Date now = new Date();
+ for (Orders order : orderPage.getRecords()) {
+ boolean needDepositDist = Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.accepted.getStatus());
+ voList.add(buildDriverOrderVO(order, driverLat, driverLng, needDepositDist, now, detailMap));
+ }
+ }
+
+ IPage<DriverGrabOrderVO> vPage = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+ PageData<DriverGrabOrderVO> pageData = PageData.from(vPage);
+ pageData.setRecords(voList);
+ if (orderPage != null) {
+ pageData.setTotal(orderPage.getTotal());
+ pageData.setPage(orderPage.getCurrent());
+ pageData.setCapacity(orderPage.getSize());
+ }
+ return pageData;
+ }
+
+ @Override
+ public DriverCancelLimitVO getTodayCancelLimit(Integer driverId) {
+ DriverInfo driver = driverInfoMapper.selectById(driverId);
+ if (driver == null) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鍙告満淇℃伅涓嶅瓨鍦�");
+ }
+
+ // 姣忔棩鍙栨秷涓婇檺
+ String limitStr = operationConfigBiz.getConfig().getDriverDailyCancelLimit();
+ int limit = 3;
+ if (StringUtils.isNotBlank(limitStr)) {
+ try { limit = Integer.parseInt(limitStr); } catch (NumberFormatException ignored) {}
+ }
+
+ // 浠婃棩宸插彇娑堟鏁�
+ Calendar cal = Calendar.getInstance();
+ cal.set(Calendar.HOUR_OF_DAY, 0);
+ cal.set(Calendar.MINUTE, 0);
+ cal.set(Calendar.SECOND, 0);
+ cal.set(Calendar.MILLISECOND, 0);
+ Date todayStart = cal.getTime();
+ Long todayCancelCount = orderLogMapper.selectCount(new QueryWrapper<OrderLog>().lambda()
+ .eq(OrderLog::getOptUserId, driver.getMemberId())
+ .eq(OrderLog::getObjType, Constants.OrderLogType.driverCancel.getStatus())
+ .eq(OrderLog::getOptUserType, Constants.ONE)
+ .ge(OrderLog::getCreateTime, todayStart));
+ int used = todayCancelCount != null ? todayCancelCount.intValue() : 0;
+
+ DriverCancelLimitVO vo = new DriverCancelLimitVO();
+ vo.setLimit(limit);
+ vo.setUsed(used);
+ vo.setRemain(Math.max(limit - used, 0));
+ return vo;
+ }
+
+ @Override
+ public boolean checkDriverToken(String token) {
+ if (StringUtils.isBlank(token) || !token.startsWith(Constants.ONE + "")) {
+ return false;
+ }
+ String tokenRedis = (String) redisTemplate.opsForValue().get(Constants.REDIS_TOKEN_KEY + token);
+ if (StringUtils.isBlank(tokenRedis)) {
+ return false;
+ }
+ try {
+ int lastIndex = token.lastIndexOf("_") + 1;
+ Integer memberId = Integer.valueOf(token.substring(lastIndex));
+ Member member = memberMapper.selectById(memberId);
+ return member != null
+ && !Constants.ONE.equals(member.getDeleted())
+ && !Constants.ONE.equals(member.getStatus())
+ && Constants.ONE.equals(member.getUserType());
+ } catch (Exception e) {
+ return false;
+ }
}
}
--
Gitblit v1.9.3