server/services/db/db_change.sql
@@ -5,6 +5,19 @@ -- ============================================================ -- 2026/04/17 订åé¢è®¡éè¾¾æ¶é´å段 -- ============================================================ ALTER TABLE `orders` ADD COLUMN `ESTIMATED_DELIVERY_TIME` DATETIME DEFAULT NULL COMMENT 'é¢è®¡éè¾¾æ¶é´' AFTER `CODE`; -- ============================================================ -- 2026/04/17 叿ºå®æ¶å®ä½å段 -- ============================================================ ALTER TABLE `driver_info` ADD COLUMN `LONGITUDE` DOUBLE DEFAULT NULL COMMENT 'å®ä½ç»åº¦' AFTER `ACCEPTING_STATUS`; ALTER TABLE `driver_info` ADD COLUMN `LATITUDE` DOUBLE DEFAULT NULL COMMENT 'å®ä½çº¬åº¦' AFTER `LONGITUDE`; -- ============================================================ -- 2026/04/16 订åç»ç®åè½ï¼ç»ç®æ¶é´å段 + é¨åº/叿ºä½é¢å段 -- ============================================================ ALTER TABLE `orders` ADD COLUMN `SETTLEMENT_TIME` DATETIME DEFAULT NULL COMMENT 'ç»ç®æ¶é´' AFTER `SETTLEMENT_STATUS`; @@ -14,6 +27,7 @@ ALTER TABLE `driver_info` ADD COLUMN `BALANCE` BIGINT DEFAULT 0 COMMENT 'å½åä½é¢(å)' AFTER `SCORE`; ALTER TABLE `driver_info` ADD COLUMN `TOTAL_BALANCE` BIGINT DEFAULT 0 COMMENT 'å岿»éé¢(å)' AFTER `BALANCE`; ALTER TABLE `driver_info` ADD COLUMN `ACCEPTING_STATUS` INT DEFAULT 0 COMMENT 'æ¯å¦æ¥åä¸ï¼0=æªæ¥åï¼1=æ¥åä¸' AFTER `TOTAL_BALANCE`; -- ============================================================ server/services/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
@@ -29,11 +29,10 @@ public static final String MEMBER_ID = "MEMBER_ID"; public static final String MEMBER_INFO = "MEMBER_INFO"; public static final String SHOP_ID = "SHOP_ID"; public static final String SHOP_INFO = "SHOP_INFO"; public static final String DRIVER_ID = "DRIVER_ID"; @Resource private RedisTemplate<String,Object> redisTemplate; server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java
@@ -1,6 +1,7 @@ package com.doumee.config.jwt; import com.alibaba.fastjson.JSONObject; import com.doumee.core.annotation.LoginDriverRequired; import com.doumee.core.annotation.LoginRequired; import com.doumee.core.annotation.LoginShopRequired; import com.doumee.core.constants.Constants; @@ -87,6 +88,22 @@ } else { throw new BusinessException(ResponseStatus.BE_OVERDUE.getCode(),"æªç»å½"); } }else if (beanType.isAnnotationPresent(LoginDriverRequired.class)) { //è·åtoken String token = request.getHeader(JwtTokenUtil.HEADER_KEY); // ä» http 请æ±å¤´ä¸ååº token if (StringUtils.isNotBlank(token)) { checkDriverLogin(request,response); } else { throw new BusinessException(ResponseStatus.BE_OVERDUE.getCode(),"æªç»å½"); } }else if (handlerMethod.hasMethodAnnotation(LoginDriverRequired.class)){ //è·åtoken String token = request.getHeader(JwtTokenUtil.HEADER_KEY); // ä» http 请æ±å¤´ä¸ååº token if (StringUtils.isNotBlank(token)) { checkDriverLogin(request,response); } else { throw new BusinessException(ResponseStatus.BE_OVERDUE.getCode(),"æªç»å½"); } } return true; } @@ -99,11 +116,10 @@ public Boolean checkMemberLogin(HttpServletRequest request, HttpServletResponse response){ String token = request.getHeader(JwtTokenUtil.HEADER_KEY); try { if(!token.startsWith(Constants.ZERO+"")){ throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME); } String tokenRedis = (String) redisTemplate.opsForValue().get(token); String tokenRedis = (String) redisTemplate.opsForValue().get(Constants.REDIS_TOKEN_KEY+token); if(StringUtils.isBlank(tokenRedis)){ throw new BusinessException(ResponseStatus.BE_OVERDUE); } @@ -117,7 +133,6 @@ } Integer count = dao.queryForObject("select count(1) from member where id = ?", Integer.class, member.getId()); if (count != null && count > 0) { request.setAttribute(JwtTokenUtil.MEMBER_INFO, JSONObject.toJSONString(member)); request.setAttribute(JwtTokenUtil.MEMBER_ID, member.getId()); return true; }else{ @@ -135,7 +150,7 @@ if(!token.startsWith(Constants.TWO+"")){ throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME); } String tokenRedis = (String) redisTemplate.opsForValue().get(token); String tokenRedis = (String) redisTemplate.opsForValue().get(Constants.REDIS_TOKEN_KEY+token); if(StringUtils.isBlank(tokenRedis)){ throw new BusinessException(ResponseStatus.BE_OVERDUE); } @@ -159,7 +174,6 @@ } Integer count = dao.queryForObject("select count(1) from shop where id = ?", Integer.class, shopId); if (count != null && count > 0) { request.setAttribute(JwtTokenUtil.SHOP_INFO, JSONObject.toJSONString(shop)); request.setAttribute(JwtTokenUtil.SHOP_ID, shop.getId()); return true; }else{ @@ -170,6 +184,37 @@ } } public Boolean checkDriverLogin(HttpServletRequest request, HttpServletResponse response){ String token = request.getHeader(JwtTokenUtil.HEADER_KEY); try { if(!token.startsWith(Constants.ONE+"")){ throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME); } String tokenRedis = (String) redisTemplate.opsForValue().get(Constants.REDIS_TOKEN_KEY+token); if(StringUtils.isBlank(tokenRedis)){ throw new BusinessException(ResponseStatus.BE_OVERDUE); } Integer memberId = getTokenId(token); Integer isDeleted = dao.queryForObject(" select COALESCE(DELETED,1) from member where user_type = 1 and id = ?", Integer.class, memberId); if(isDeleted== Constants.ONE){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"叿ºä¿¡æ¯å·²å é¤,请è系管çå"); } Integer isForbidden = dao.queryForObject(" select COALESCE(STATUS,0) from member where user_type = 1 and id = ?", Integer.class, memberId); if(isForbidden == Constants.ONE){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"叿ºä¿¡æ¯å·²ç¦ç¨,请è系管çå"); } Integer count = dao.queryForObject("select count(1) from member where user_type = 1 and id = ?", Integer.class, memberId); if (count != null && count > 0) { request.setAttribute(JwtTokenUtil.DRIVER_ID, memberId); return true; }else{ throw new BusinessException(ResponseStatus.BE_OVERDUE.getCode(),"叿ºä¿¡æ¯åºé"); } } catch (IllegalArgumentException | JwtException e) { throw new BusinessException(ResponseStatus.BE_OVERDUE); } } public Integer getTokenId(String token){ try { server/services/src/main/java/com/doumee/core/annotation/LoginDriverRequired.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,10 @@ package com.doumee.core.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface LoginDriverRequired {} server/services/src/main/java/com/doumee/core/utils/Tencent/MapUtil.java
@@ -28,6 +28,9 @@ /** è·ç¦»ç©éµAPI */ public static final String MATRIX_URL = "https://apis.map.qq.com/ws/distance/v1/matrix"; /** éå°çè§£æ */ public static final String GEO_URL = "https://apis.map.qq.com/ws/geocoder/v1/"; /** æ¯æçæ¨¡å¼ */ private static final List<String> SUPPORTED_MODES = Arrays.asList("driving", "bicycling"); @@ -121,4 +124,59 @@ .map(row -> ((JSONObject) row).getJSONArray("elements").getJSONObject(0)) .collect(Collectors.toList()); } /** * éå°çè§£æ - æ ¹æ®ç»çº¬åº¦è·åå°åä¿¡æ¯ * * @param lat 纬度 * @param lng ç»åº¦ * @return result.ad_info ä¸ç adcode(åºåç )ãcity(åå¸)ãdistrict(åº) çä¿¡æ¯ */ public static JSONObject reverseGeocode(double lat, double lng) { try { String url = GEO_URL + "?key=" + tencentKey + "&location=" + lat + "," + lng; log.info("è ¾è®¯å°å¾éå°çè§£æè¯·æ±: location={},{}", lat, lng); JSONObject json = new Http().build(url) .setConnectTimeout(5000) .setReadTimeout(10000) .get() .toJSONObject(); log.info("è ¾è®¯å°å¾éå°çè§£æååº: {}", json); if (json.getIntValue("status") != 0) { throw new RuntimeException("è ¾è®¯å°å¾éå°çè§£æå¤±è´¥: " + json.getString("message")); } return json.getJSONObject("result"); } catch (IOException e) { log.error("è ¾è®¯å°å¾éå°çè§£æå¼å¸¸", e); throw new RuntimeException("è ¾è®¯å°å¾éå°çè§£æå¼å¸¸", e); } } /** * å¤æä¸¤ä¸ªç»çº¬åº¦æ¯å¦å¨åä¸ä¸ªåå¸ * * @param lat1 第ä¸ä¸ªç¹çº¬åº¦ * @param lng1 第ä¸ä¸ªç¹ç»åº¦ * @param lat2 第äºä¸ªç¹çº¬åº¦ * @param lng2 第äºä¸ªç¹ç»åº¦ * @return true=ååï¼false=ä¸åå */ public static boolean isSameCity(double lat1, double lng1, double lat2, double lng2) { JSONObject result1 = reverseGeocode(lat1, lng1); JSONObject result2 = reverseGeocode(lat2, lng2); String city1 = result1.getJSONObject("ad_info").getString("city"); String city2 = result2.getJSONObject("ad_info").getString("city"); log.info("夿åå: ({},{}) => city={}, ({},{}) => city={}", lat1, lng1, city1, lat2, lng2, city2); return city1 != null && city1.equals(city2); } } server/services/src/main/java/com/doumee/core/utils/aliyun/AliSmsService.java
ÎļþÃû´Ó server/services/src/main/java/com/doumee/service/business/AliSmsService.java ÐÞ¸Ä @@ -1,4 +1,4 @@ package com.doumee.service.business; package com.doumee.core.utils.aliyun; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; server/services/src/main/java/com/doumee/dao/business/model/Category.java
@@ -79,7 +79,7 @@ @ExcelColumn(name="æåºç ï¼ååºï¼") private Integer sortnum; @ApiModelProperty(value = "éå±å段1 (type=1:æ¯å¦éè¦ä¸ä¼ 驾驶è¯ï¼0=ä¸éè¦ï¼1=éè¦ï¼) ") @ApiModelProperty(value = "éå±å段1 (type=1:æ¯å¦éè¦ä¸ä¼ 驾驶è¯ï¼0=ä¸éè¦ï¼1=éè¦ï¼type=3:æ¯å¦è´µéç©åï¼0=å¦ï¼1=æ¯ï¼type=4:尺寸æè¿°ï¼) ") @ExcelColumn(name="å 容") private String otherField; server/services/src/main/java/com/doumee/dao/business/model/DriverInfo.java
@@ -141,6 +141,15 @@ @ApiModelProperty(value = "å岿»éé¢(å)") private Long totalBalance; @ApiModelProperty(value = "æ¯å¦æ¥åä¸ï¼0=å·²ä¸çº¿ï¼1=æ¥åä¸", example = "0") private Integer acceptingStatus; @ApiModelProperty(value = "å®ä½ç»åº¦", example = "116.404") private Double longitude; @ApiModelProperty(value = "å®ä½çº¬åº¦", example = "39.915") private Double latitude; @ApiModelProperty(value = "车è¾ç §çå表") @TableField(exist = false) private List<Multifile> carImgList = new ArrayList<>(); server/services/src/main/java/com/doumee/dao/business/model/Orders.java
@@ -284,6 +284,10 @@ @ExcelColumn(name = "订åç¼å·") private String code; @ApiModelProperty(value = "é¢è®¡éè¾¾æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date estimatedDeliveryTime; @ApiModelProperty(value = "叿ºèªé ¬ï¼åï¼") @ExcelColumn(name = "叿ºèªé ¬") private Long driverFee; @@ -397,4 +401,12 @@ @ApiModelProperty(value = "åä»¶é¨åºå°åï¼å ³èæ¥è¯¢ï¼") private String takeShopAddress; @TableField(exist = false) @ApiModelProperty(value = "åä»¶é¨åºèç³»çµè¯ï¼å ³èæ¥è¯¢ï¼") private String takeShopLinkPhone; @TableField(exist = false) @ApiModelProperty(value = "ç©åççº§è´µéæ è¯ï¼å ³èæ¥è¯¢ï¼0=å¦ï¼1=æ¯ï¼") private String c2OtherField; } server/services/src/main/java/com/doumee/dao/business/model/PricingRule.java
@@ -48,7 +48,7 @@ @ApiModelProperty(value = "åå¸ä¸»é®ï¼area_idï¼", example = "1") private Integer cityId; @ApiModelProperty(value = "ç±»åï¼0=å°±å°ååè§åï¼1=å¼å°ååè§åï¼2=é¢è®¡å¤±æï¼3=é¨åºæ³¨åæ¼éï¼4=åææ¯ä¾", example = "0") @ApiModelProperty(value = "ç±»åï¼0=å°±å°ååè§åï¼1=å¼å°ååè§åï¼2=é¢è®¡æ¶æï¼3=é¨åºæ³¨åæ¼éï¼4=åææ¯ä¾", example = "0") @ExcelColumn(name = "ç±»å", index = 2, width = 10, valueMapping = "0=å°±å°ååè§å;1=å¼å°ååè§å;2=é¢è®¡å¤±æ;3=é¨åºæ³¨åæ¼é;4=åææ¯ä¾;") private Integer type; server/services/src/main/java/com/doumee/dao/dto/CalculateLocalPriceDTO.java
@@ -8,6 +8,7 @@ import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.math.BigDecimal; import java.util.Date; import java.util.List; /** @@ -24,17 +25,18 @@ @NotNull(message = "åå¸ä¸è½ä¸ºç©º") private Integer cityId; @ApiModelProperty(value = "é¢è®¡åæ¾å¤©æ°", required = true) @NotNull(message = "é¢è®¡åæ¾å¤©æ°ä¸è½ä¸ºç©º") private Integer estimatedDepositDays; @ApiModelProperty(value = "é¢è®¡åæ¾å¼å§æ¶é´", required = true) @NotNull(message = "é¢è®¡åæ¾å¼å§æ¶é´ä¸è½ä¸ºç©º") private Date depositStartTime; @ApiModelProperty(value = "é¢è®¡åæ¾ç»ææ¶é´", required = true) @NotNull(message = "é¢è®¡åæ¾ç»ææ¶é´ä¸è½ä¸ºç©º") private Date depositEndTime; @ApiModelProperty(value = "ç©åå表", required = true) @NotEmpty(message = "ç©åå表ä¸è½ä¸ºç©º") @Valid private List<OrderItemDTO> items; @ApiModelProperty(value = "æ¯å¦ä¿ä»·") private Boolean insured; @ApiModelProperty(value = "ä¿ä»·éé¢(å )") private BigDecimal declaredAmount; server/services/src/main/java/com/doumee/dao/dto/CalculateRemotePriceDTO.java
@@ -45,9 +45,6 @@ @Valid private List<OrderItemDTO> items; @ApiModelProperty(value = "æ¯å¦ä¿ä»·") private Boolean insured; @ApiModelProperty(value = "ä¿ä»·éé¢(å )") private BigDecimal declaredAmount; server/services/src/main/java/com/doumee/dao/dto/RevenueQueryDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,28 @@ package com.doumee.dao.dto; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; @Data @ApiModel("æµæ°´æ¥è¯¢æ¡ä»¶") public class RevenueQueryDTO { @ApiModelProperty(value = "æ¶æ¯ç±»åï¼1=æ¶å ¥ï¼-1=æ¯åº") private Integer optType; @ApiModelProperty(value = "åå¨ç±»åï¼0=å®æè®¢åï¼1=æç°æ¯åºï¼2=æç°éåï¼3=å¹³å°å¥å±") private Integer type; @JsonFormat(pattern = "yyyy-MM-dd") @ApiModelProperty(value = "å¼å§æ¶é´") private Date startTime; @JsonFormat(pattern = "yyyy-MM-dd") @ApiModelProperty(value = "ç»ææ¶é´") private Date endTime; } server/services/src/main/java/com/doumee/dao/dto/SameCityCheckDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,34 @@ package com.doumee.dao.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotNull; /** * æ ¡éªä¸¤ä¸ªç»çº¬åº¦æ¯å¦ååè¯·æ± * @author rk * @date 2026/04/17 */ @Data @ApiModel("æ ¡éªåå请æ±") public class SameCityCheckDTO { @NotNull(message = "第ä¸ä¸ªç¹çº¬åº¦ä¸è½ä¸ºç©º") @ApiModelProperty(value = "第ä¸ä¸ªç¹çº¬åº¦", example = "39.915", required = true) private Double lat1; @NotNull(message = "第ä¸ä¸ªç¹ç»åº¦ä¸è½ä¸ºç©º") @ApiModelProperty(value = "第ä¸ä¸ªç¹ç»åº¦", example = "116.404", required = true) private Double lng1; @NotNull(message = "第äºä¸ªç¹çº¬åº¦ä¸è½ä¸ºç©º") @ApiModelProperty(value = "第äºä¸ªç¹çº¬åº¦", example = "31.230", required = true) private Double lat2; @NotNull(message = "第äºä¸ªç¹ç»åº¦ä¸è½ä¸ºç©º") @ApiModelProperty(value = "第äºä¸ªç¹ç»åº¦", example = "121.473", required = true) private Double lng2; } server/services/src/main/java/com/doumee/dao/dto/ShopApplyDTO.java
@@ -19,6 +19,9 @@ @ApiModel("é¨åºå ¥é©»ç³è¯·è¯·æ±") public class ShopApplyDTO implements Serializable { @ApiModelProperty(value = "ç»å½ç¨æ·ä¸»é®", hidden = true, example = "0") private Integer memberId; @ApiModelProperty(value = "ä¼ä¸ç±»åï¼0=个人ï¼1=ä¼ä¸", required = true, example = "0") @NotNull(message = "ä¼ä¸ç±»åä¸è½ä¸ºç©º") private Integer companyType; server/services/src/main/java/com/doumee/dao/dto/ShopNearbyDTO.java
@@ -36,4 +36,7 @@ @ApiModelProperty(value = "é¨åºåç§°ï¼æ¨¡ç³æ¥è¯¢ï¼", example = "XXé¨åº") private String name; @ApiModelProperty(value = "åå¸ä¸»é®", example = "1") private Integer cityId; } server/services/src/main/java/com/doumee/dao/vo/AccountResponse.java
@@ -27,15 +27,6 @@ @ApiModelProperty(value = "ç¨æ·ä¿¡æ¯") private Member member; @ApiModelProperty(value = "ææ³¨åçé¨åºä¸»é®ï¼é¨åºç¨æ·æ¶è¿åï¼") private Integer shopId; @ApiModelProperty(value = "ææ³¨åçé¨åºå®¡æ ¸ç¶æï¼é¨åºç¨æ·æ¶è¿åï¼: 0=å¾ å®¡æ ¸ 1=å·²éè¿ 2=已驳å 3=已缴纳ä¿è¯é") private Integer shopAuditStatus; @ApiModelProperty(value = "é¨åºtoken") private String loginShopToken; server/services/src/main/java/com/doumee/dao/vo/DriverCenterVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,46 @@ package com.doumee.dao.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * 叿ºç«¯é¦é¡µä¿¡æ¯ * @author rk * @date 2026/04/17 */ @Data @ApiModel("叿ºç«¯é¦é¡µä¿¡æ¯") public class DriverCenterVO { @ApiModelProperty(value = "叿ºå§å") private String name; @ApiModelProperty(value = "叿ºå¤´å") private String imgUrl; @ApiModelProperty(value = "叿ºå¤´åå ¨è·¯å¾") private String fullImgUrl; @ApiModelProperty(value = "车çå·") private String carCode; @ApiModelProperty(value = "æå¡è¯å") private String score; @ApiModelProperty(value = "仿¥é¢è®¡ä½£é(å)") private Long todayCommission; @ApiModelProperty(value = "仿¥æ¥åæ°") private Integer todayOrderCount; @ApiModelProperty(value = "æçä½é¢(å)") private Long balance; @ApiModelProperty(value = "å¾ åè´§è®¢åæ°é") private Integer waitPickCount; @ApiModelProperty(value = "å¾ é éè®¢åæ°é") private Integer waitDeliverCount; } server/services/src/main/java/com/doumee/dao/vo/EstimatedDeliveryResultVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,26 @@ package com.doumee.dao.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; /** * é¢è®¡éè¾¾æ¶æç»æ * @author rk * @date 2026/04/17 */ @Data @ApiModel("é¢è®¡éè¾¾æ¶æç»æ") public class EstimatedDeliveryResultVO { @ApiModelProperty(value = "å®é è·ç¦»ï¼å ¬éï¼") private BigDecimal distanceKm; @ApiModelProperty(value = "æ éè¾¾æ¶æï¼å°æ¶ï¼") private BigDecimal standardHours; @ApiModelProperty(value = "æéè¾¾æ¶æï¼å°æ¶ï¼") private BigDecimal expressHours; } server/services/src/main/java/com/doumee/dao/vo/RevenueSummaryVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,17 @@ package com.doumee.dao.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel("æµæ°´æ¶æ¯ç»è®¡") public class RevenueSummaryVO { @ApiModelProperty(value = "æ¶å ¥æ»é¢ï¼åï¼") private Long totalIncome; @ApiModelProperty(value = "æ¯åºæ»é¢ï¼åï¼") private Long totalExpense; } server/services/src/main/java/com/doumee/dao/vo/ShopNearbyVO.java
@@ -36,4 +36,10 @@ @ApiModelProperty(value = "é¨åºè¯å") private BigDecimal score; @ApiModelProperty(value = "é¨åºçº¬åº¦") private Double latitude; @ApiModelProperty(value = "é¨åºç»åº¦") private Double longitude; } server/services/src/main/java/com/doumee/dao/vo/ShopWebDetailVO.java
@@ -33,4 +33,16 @@ @ApiModelProperty(value = "è·ç¦»ï¼å¦ 500mã1.2kmï¼ï¼æ ç»çº¬åº¦å ¥åæ¶ä¸ºç©º") private String distanceText; @ApiModelProperty(value = "å¯åç±»åï¼éå·åéçcategory主é®ï¼") private String depositTypes; @ApiModelProperty(value = "æ¶è´¹æ å") private String feeStandard; @ApiModelProperty(value = "é¨åºçº¬åº¦") private Double latitude; @ApiModelProperty(value = "é¨åºç»åº¦") private Double longitude; } server/services/src/main/java/com/doumee/dao/vo/UserCenterVO.java
@@ -12,6 +12,9 @@ @Data public class UserCenterVO { @ApiModelProperty(value = "openid") private String openid; @ApiModelProperty(value = "ä¼å头åå ¨è·¯å¾") private String fullCoverImage; @@ -36,4 +39,18 @@ @ApiModelProperty(value = "å¾ æ¶è´§è®¢åæ°é") private Integer waitReceiveCount; @ApiModelProperty(value = "鿬¾ä¸è®¢åæ°é") private Integer refundingCount; @ApiModelProperty(value = "ææ³¨åçé¨åºä¸»é®ï¼é¨åºç¨æ·æ¶è¿åï¼") private Integer shopId; @ApiModelProperty(value = "ææ³¨åçé¨åºå®¡æ ¸ç¶æï¼é¨åºç¨æ·æ¶è¿åï¼: 0=å¾ å®¡æ ¸ 1=å·²éè¿ 2=已驳å 3=已缴纳ä¿è¯é") private Integer shopAuditStatus; @ApiModelProperty(value = "æå½åç»å®çé¨åº") private String bindShopId; } server/services/src/main/java/com/doumee/service/business/AreasService.java
@@ -140,4 +140,12 @@ */ List<Areas> getOpenCityList(); /** * æ ¹æ®åå¸åç§°æ¥è¯¢å·²å¼éçåå¸ä¿¡æ¯ * * @param cityName åå¸åç§° * @return åå¸ä¿¡æ¯ï¼æªå¼éåè¿ånull */ Areas getOpenedCityByName(String cityName); } server/services/src/main/java/com/doumee/service/business/DriverInfoService.java
@@ -2,6 +2,8 @@ import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.dao.dto.DriverActiveOrderDTO; import com.doumee.dao.dto.DriverGrabOrderDTO; import com.doumee.dao.business.model.DriverInfo; import com.doumee.dao.dto.DriverLoginRequest; import com.doumee.dao.dto.DriverRegisterRequest; @@ -161,4 +163,56 @@ */ void changeStatus(com.doumee.dao.dto.ChangeStatusDTO dto); /** * 忢叿ºæ¥åç¶æ * * @param memberId ä¼åä¸»é® * @param status æ¥åç¶æï¼0=æªæ¥åï¼1=æ¥åä¸ */ void updateAcceptingStatus(Integer memberId, Integer status); /** * æ´æ°å¸æºå®æ¶å®ä½ * * @param memberId ä¼åä¸»é® * @param longitude ç»åº¦ * @param latitude 纬度 */ void updateLocation(Integer memberId, Double longitude, Double latitude); /** * è·å叿ºç«¯é¦é¡µä¿¡æ¯ * * @param memberId ä¼åä¸»é® * @return DriverCenterVO */ com.doumee.dao.vo.DriverCenterVO getDriverCenterInfo(Integer memberId); /** * 叿ºæ¢å大å - å页æ¥è¯¢å¯æ¢è®¢å * * @param memberId å½åç»å½ä¼åä¸»é® * @param pageWrap åé¡µè¯·æ± * @return PageData<DriverGrabOrderVO> */ com.doumee.core.model.PageData<com.doumee.dao.vo.DriverGrabOrderVO> grabOrderHall(Integer memberId, PageWrap<DriverGrabOrderDTO> pageWrap); /** * 叿ºè¿è¡ä¸è®¢åå表 * * @param memberId ä¼åä¸»é® * @param dto æ¥è¯¢æ¡ä»¶ï¼status: 3=å·²æ¢å, 4=æ´¾éä¸ï¼ * @return 订åå表 */ java.util.List<com.doumee.dao.vo.DriverGrabOrderVO> activeOrders(Integer memberId, DriverActiveOrderDTO dto); /** * 叿ºç«¯è®¢å详æ * * @param driverId 叿ºä¸»é® * @param orderId 订åä¸»é® * @return DriverOrderDetailVO */ com.doumee.dao.vo.DriverOrderDetailVO driverOrderDetail(Integer driverId, Integer orderId); } server/services/src/main/java/com/doumee/service/business/OrdersService.java
@@ -17,6 +17,7 @@ import com.doumee.dao.vo.OverdueFeeVO; import com.doumee.dao.vo.PayResponse; import com.doumee.dao.vo.PriceCalculateVO; import com.doumee.dao.vo.EstimatedDeliveryResultVO; import java.math.BigDecimal; import java.util.List; @@ -355,4 +356,19 @@ */ PageData<MyOrderVO> findShopOrderPage(PageWrap<MyOrderDTO> pageWrap, Integer shopId); /** * 计ç®ä¸¤å°ä¹é´çé¢è®¡éè¾¾æ¶æï¼æ éè¾¾ + æéè¾¾ï¼ * éè¿è ¾è®¯å°å¾API计ç®å®é è·ç¦»ï¼åæ ¹æ®pricing_rule type=2è®¡ç®æ¶æ * * @param cityId åå¸ä¸»é® * @param fromLat èµ·ç¹çº¬åº¦ * @param fromLng èµ·ç¹ç»åº¦ * @param toLat ç»ç¹çº¬åº¦ * @param toLng ç»ç¹ç»åº¦ * @return é¢è®¡éè¾¾æ¶æç»æ */ EstimatedDeliveryResultVO calculateEstimatedDelivery(Integer cityId, Double fromLat, Double fromLng, Double toLat, Double toLng); } server/services/src/main/java/com/doumee/service/business/RevenueService.java
@@ -3,7 +3,9 @@ import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.dao.business.model.Revenue; import com.doumee.dao.dto.RevenueQueryDTO; import com.doumee.dao.vo.RevenueStatisticsVO; import com.doumee.dao.vo.RevenueSummaryVO; import java.util.List; @@ -113,4 +115,40 @@ */ RevenueStatisticsVO getDriverRevenueStatistics(Integer memberId); /** * 叿ºæµæ°´å页æ¥è¯¢ * * @param pageWrap å页忰 * @param memberId ä¼åä¸»é® * @return åé¡µç»æ */ PageData<Revenue> findDriverRevenuePage(PageWrap<RevenueQueryDTO> pageWrap, Integer memberId); /** * é¨åºæµæ°´å页æ¥è¯¢ * * @param pageWrap å页忰 * @param shopId é¨åºä¸»é® * @return åé¡µç»æ */ PageData<Revenue> findShopRevenuePage(PageWrap<RevenueQueryDTO> pageWrap, Integer shopId); /** * 叿ºæµæ°´æ¶æ¯ç»è®¡ * * @param queryDTO æ¥è¯¢æ¡ä»¶ * @param memberId ä¼åä¸»é® * @return æ¶æ¯æ±æ» */ RevenueSummaryVO getDriverRevenueSummary(RevenueQueryDTO queryDTO, Integer memberId); /** * é¨åºæµæ°´æ¶æ¯ç»è®¡ * * @param queryDTO æ¥è¯¢æ¡ä»¶ * @param shopId é¨åºä¸»é® * @return æ¶æ¯æ±æ» */ RevenueSummaryVO getShopRevenueSummary(RevenueQueryDTO queryDTO, Integer shopId); } server/services/src/main/java/com/doumee/service/business/ShopInfoService.java
@@ -109,7 +109,7 @@ * @param request ç³è¯·è¯·æ± * @param member å½åç»å½ä¼å */ void applyShop(ShopApplyDTO request, Member member); void applyShop(ShopApplyDTO request); /** * æ¥è¯¢é¨åºè¯¦æ ï¼å«éä»¶ï¼ server/services/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java
@@ -537,4 +537,19 @@ return list; } @Override public Areas getOpenedCityByName(String cityName) { if (StringUtils.isBlank(cityName)) { return null; } QueryWrapper<Areas> qw = new QueryWrapper<>(); qw.lambda() .eq(Areas::getType, Constants.ONE) .eq(Areas::getStatus, Constants.ONE) .eq(Areas::getIsdeleted, Constants.ZERO) .eq(Areas::getName, cityName) .last("limit 1"); return areasMapper.selectOne(qw); } } server/services/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java
@@ -229,6 +229,6 @@ private String getBannerPath() { return systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.BANNER_FILES).getCode(); + systemDictDataBiz.queryByCode(Constants.OSS, Constants.BANNER_FILES).getCode(); } } server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
@@ -140,7 +140,7 @@ } if(StringUtils.isNotBlank(category.getIcon())){ String path = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode() +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.CATEGORY_FILES).getCode(); +systemDictDataBiz.queryByCode(Constants.OSS,Constants.CATEGORY_FILES).getCode(); category.setIconFull(path + category.getIcon()); } return category; @@ -209,7 +209,7 @@ PageData<Category> result =PageData.from(categoryMapper.selectJoinPage(page, Category.class,queryWrapper)); if(result!=null && result.getRecords()!=null){ String path = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode() +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.CATEGORY_FILES).getCode(); +systemDictDataBiz.queryByCode(Constants.OSS,Constants.CATEGORY_FILES).getCode(); for(Category cate : result.getRecords()){ try { if(StringUtils.isNotBlank(cate.getIcon())){ @@ -237,7 +237,7 @@ ); if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(categoryList)){ String path = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode() +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.CATEGORY_FILES).getCode(); +systemDictDataBiz.queryByCode(Constants.OSS,Constants.CATEGORY_FILES).getCode(); for (Category category:categoryList) { if(StringUtils.isNotBlank(category.getIcon())){ category.setIconFull(path + category.getIcon()); @@ -276,7 +276,7 @@ // 3. æ¼æ¥å¾æ å ¨è·¯å¾ if (!CollectionUtils.isEmpty(sizeList)) { String path = systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.CATEGORY_FILES).getCode(); + systemDictDataBiz.queryByCode(Constants.OSS, Constants.CATEGORY_FILES).getCode(); for (Category cate : sizeList) { if (StringUtils.isNotBlank(cate.getIcon())) { cate.setIconFull(path + cate.getIcon()); server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
@@ -17,19 +17,30 @@ import com.doumee.dao.business.MultifileMapper; import com.doumee.dao.business.SmsrecordMapper; import com.doumee.dao.business.CategoryMapper; import com.doumee.dao.business.OrdersMapper; import com.doumee.dao.business.OrdersDetailMapper; import com.doumee.dao.business.RevenueMapper; import com.doumee.biz.system.SystemDictDataBiz; import com.doumee.dao.business.model.Category; import com.doumee.dao.business.model.DriverInfo; import com.doumee.dao.business.model.Member; import com.doumee.dao.business.model.Multifile; import com.doumee.dao.business.model.Smsrecord; import com.doumee.dao.business.model.Orders; import com.doumee.dao.business.model.OrdersDetail; import com.doumee.dao.business.model.Revenue; import com.doumee.dao.vo.AccountResponse; import com.doumee.dao.vo.DriverCenterVO; import com.doumee.dao.vo.DriverGrabOrderVO; import com.doumee.dao.vo.DriverOrderDetailVO; import com.doumee.dao.dto.AuditDTO; import com.doumee.dao.dto.ChangeStatusDTO; import com.doumee.dao.dto.DriverLoginRequest; import com.doumee.dao.dto.DriverRegisterRequest; import com.doumee.dao.dto.DriverVerifyRequest; import com.doumee.service.business.AliSmsService; import com.doumee.dao.dto.DriverActiveOrderDTO; import com.doumee.dao.dto.DriverGrabOrderDTO; import com.doumee.core.utils.aliyun.AliSmsService; import com.doumee.service.business.DriverInfoService; import com.alibaba.fastjson.JSONObject; import com.github.yulichang.wrapper.MPJLambdaWrapper; @@ -41,10 +52,8 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.*; import java.util.stream.Collectors; /** * 叿ºæ³¨åä¿¡æ¯Serviceå®ç° @@ -77,6 +86,15 @@ @Autowired private CategoryMapper categoryMapper; @Autowired private OrdersMapper ordersMapper; @Autowired private RevenueMapper revenueMapper; @Autowired private OrdersDetailMapper ordersDetailMapper; @Autowired private SystemDictDataBiz systemDictDataBiz; @@ -289,7 +307,7 @@ member.setCreateTime(now); member.setUpdateTime(now); member.setTelephone(telephone); member.setNickName(telephone); member.setNickName(telephone.substring(0, 3) + "****" + telephone.substring(7)); member.setName(telephone); member.setUserType(Constants.ONE); member.setBusinessStatus(Constants.ZERO); @@ -556,7 +574,7 @@ String imgPrefix = ""; try { imgPrefix = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.DRIVER_FILES).getCode(); + systemDictDataBiz.queryByCode(Constants.OSS, Constants.DRIVER_FILES).getCode(); } catch (Exception e) { // æªé ç½®æ¶å¿½ç¥ } @@ -630,4 +648,534 @@ } } @Override public void updateAcceptingStatus(Integer memberId, Integer status) { if (!Constants.ZERO.equals(status) && !Constants.ONE.equals(status)) { throw new BusinessException(ResponseStatus.BAD_REQUEST); } DriverInfo driver = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda() .eq(DriverInfo::getMemberId, memberId) .eq(DriverInfo::getDeleted, Constants.ZERO) .last("limit 1")); if (driver == null) { throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "叿ºä¿¡æ¯ä¸åå¨"); } driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda() .set(DriverInfo::getAcceptingStatus, status) .eq(DriverInfo::getId, driver.getId())); } @Override public void updateLocation(Integer memberId, Double longitude, Double latitude) { if (longitude == null || latitude == null) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "ç»çº¬åº¦ä¸è½ä¸ºç©º"); } DriverInfo driver = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda() .eq(DriverInfo::getMemberId, memberId) .eq(DriverInfo::getDeleted, Constants.ZERO) .last("limit 1")); if (driver == null) { throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "叿ºä¿¡æ¯ä¸åå¨"); } driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda() .set(DriverInfo::getLongitude, longitude) .set(DriverInfo::getLatitude, latitude) .eq(DriverInfo::getId, driver.getId())); } @Override public DriverCenterVO getDriverCenterInfo(Integer memberId) { DriverInfo driver = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda() .eq(DriverInfo::getMemberId, memberId) .eq(DriverInfo::getDeleted, Constants.ZERO) .last("limit 1")); if (driver == null) { throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "叿ºä¿¡æ¯ä¸åå¨"); } DriverCenterVO vo = new DriverCenterVO(); vo.setName(driver.getName()); vo.setImgUrl(driver.getImgurl()); vo.setCarCode(driver.getCarCode()); vo.setScore(driver.getScore() != null ? driver.getScore().toPlainString() : "0"); vo.setBalance(driver.getBalance() != null ? driver.getBalance() : 0L); // 头åå ¨è·¯å¾ if (StringUtils.isNotBlank(driver.getImgurl())) { String imgPrefix = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.OSS, Constants.MEMBER_FILES).getCode(); vo.setFullImgUrl(imgPrefix + driver.getImgurl()); } // 仿¥é¢è®¡ä½£éï¼revenue表ä¸ä»å¤©çæ¶å ¥è®°å½éé¢ä¹å Date now = new Date(); Calendar cal = Calendar.getInstance(); cal.setTime(now); 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(); QueryWrapper<Revenue> revenueWrapper = new QueryWrapper<>(); revenueWrapper.lambda() .eq(Revenue::getMemberId, memberId) .eq(Revenue::getMemberType, Constants.ONE) .eq(Revenue::getOptType, Constants.ONE) .eq(Revenue::getDeleted, Constants.ZERO) .ge(Revenue::getCreateTime, todayStart); revenueWrapper.select("IFNULL(SUM(AMOUNT),0) as amount"); Revenue sumResult = revenueMapper.selectOne(revenueWrapper); vo.setTodayCommission(sumResult != null && sumResult.getAmount() != null ? sumResult.getAmount() : 0L); // 仿¥æ¥åæ°ï¼ä»å¤©å®æçè®¢åæ°ï¼acceptDriver=叿ºä¸»é®ï¼ç¶æ=å·²å®æï¼ Long todayOrderCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda() .eq(Orders::getAcceptDriver, driver.getId()) .eq(Orders::getDeleted, Constants.ZERO) .ge(Orders::getFinishTime, todayStart)); vo.setTodayOrderCount(todayOrderCount.intValue()); // å¾ åè´§ï¼å·²æ¥å=3ï¼ Long waitPickCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda() .eq(Orders::getAcceptDriver, driver.getId()) .eq(Orders::getDeleted, Constants.ZERO) .eq(Orders::getStatus, Constants.OrderStatus.accepted.getStatus())); vo.setWaitPickCount(waitPickCount.intValue()); // å¾ é éï¼æ´¾éä¸=4ï¼ Long waitDeliverCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda() .eq(Orders::getAcceptDriver, driver.getId()) .eq(Orders::getDeleted, Constants.ZERO) .eq(Orders::getStatus, Constants.OrderStatus.delivering.getStatus())); vo.setWaitDeliverCount(waitDeliverCount.intValue()); return vo; } @Override public PageData<DriverGrabOrderVO> grabOrderHall(Integer memberId, PageWrap<DriverGrabOrderDTO> pageWrap) { DriverGrabOrderDTO dto = pageWrap.getModel(); // 1. è·å叿ºå®ä½ DriverInfo driver = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda() .eq(DriverInfo::getMemberId, memberId) .eq(DriverInfo::getDeleted, Constants.ZERO) .last("limit 1")); if (driver == null || driver.getLatitude() == null || driver.getLongitude() == null) { throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "叿ºä½ç½®ä¿¡æ¯ç¼ºå¤±ï¼è¯·å å¼å¯å®ä½"); } double driverLat = driver.getLatitude(); double driverLng = driver.getLongitude(); // 2. 颿¥ç©åç级对åºçç©ååç±»ID List<Integer> goodTypeIds = null; if (dto != null && dto.getGradeId() != null) { List<Category> cats = categoryMapper.selectList(new QueryWrapper<Category>().lambda() .eq(Category::getDeleted, Constants.ZERO) .eq(Category::getType, Constants.TWO) .eq(Category::getRelationId, dto.getGradeId())); if (cats.isEmpty()) { return emptyPage(pageWrap); } goodTypeIds = cats.stream().map(Category::getId).collect(Collectors.toList()); } // 3. Haversine SQLå ¬å¼ï¼å¸æºå°åä»¶é¨åºè·ç¦»(km)ï¼ä½¿ç¨Ordersèªå¸¦åæ 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))))"; // 4. æé MPJæ¥è¯¢ IPage<Orders> page = 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") // 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") .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"); // æ ¸å¿æ¡ä»¶ wrapper.eq(Orders::getType, Constants.ONE) .eq(Orders::getStatus, Constants.TWO) .eq(Orders::getDeleted, Constants.ZERO); // å æ¥ OR å¨é éèå´å wrapper.and(w -> w .eq(Orders::getIsUrgent, Constants.ONE) .or() .apply(depositDist + " <= s1.delivery_area")); // ç¨æ·è·ç¦»è¿æ»¤ if (dto != null && dto.getDistance() != null && dto.getDistance() > 0) { double maxKm = dto.getDistance() / 1000.0; wrapper.apply(depositDist + " <= {0}", maxKm); } // ç©åççº§è¿æ»¤ if (goodTypeIds != null && !goodTypeIds.isEmpty()) { wrapper.in(Orders::getGoodType, goodTypeIds); } // æåº Integer sortType = (dto != null) ? dto.getSortType() : null; if (sortType != null && sortType == Constants.TWO) { wrapper.last("ORDER BY " + depositDist + " ASC"); } else { wrapper.orderByDesc(Orders::getCreateTime); } IPage<Orders> result = ordersMapper.selectJoinPage(page, Orders.class, wrapper); // 5. æ¹éæ¥è¯¢ç©åæç» List<Integer> orderIds = result.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); } } // 6. æå»ºVOï¼ä½¿ç¨å ±ç¨æ¹æ³ï¼ Date now = new Date(); List<DriverGrabOrderVO> voList = new ArrayList<>(); for (Orders order : result.getRecords()) { voList.add(buildDriverOrderVO(order, driverLat, driverLng, true, now, detailMap)); } // 7. æå¨å页 PageData<DriverGrabOrderVO> pageData = new PageData<>(result.getCurrent(), result.getSize()); pageData.setTotal(result.getTotal()); pageData.setRecords(voList); return pageData; } @Override public List<DriverGrabOrderVO> activeOrders(Integer memberId, DriverActiveOrderDTO dto) { if (dto == null || dto.getStatus() == null || (!Constants.equalsInteger(dto.getStatus(), Constants.THREE) && !Constants.equalsInteger(dto.getStatus(), Constants.FOUR))) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "订åç¶æåªè½ä¸º3(å·²æ¢å)æ4(æ´¾éä¸)"); } // è·å叿ºä¿¡æ¯ DriverInfo driver = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda() .eq(DriverInfo::getMemberId, memberId) .eq(DriverInfo::getDeleted, Constants.ZERO) .last("limit 1")); if (driver == null) { throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "叿ºä¿¡æ¯ä¸åå¨"); } boolean needDepositDist = Constants.equalsInteger(dto.getStatus(), Constants.THREE); Double driverLat = driver.getLatitude(); Double driverLng = driver.getLongitude(); // MPJæ¥è¯¢ 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") .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(Orders::getDeleted, Constants.ZERO) .orderByAsc(Orders::getAcceptTime); List<Orders> ordersList = ordersMapper.selectJoinList(Orders.class, wrapper); // æ¹éæ¥ç©åæç» List<Integer> orderIds = ordersList.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); } } // æå»ºVOï¼ä½¿ç¨å ±ç¨æ¹æ³ï¼ Date now = new Date(); List<DriverGrabOrderVO> voList = new ArrayList<>(); for (Orders order : ordersList) { voList.add(buildDriverOrderVO(order, driverLat, driverLng, needDepositDist, now, detailMap)); } return voList; } @Override public DriverOrderDetailVO driverOrderDetail(Integer driverId, Integer orderId) { // æ¥è¯¢è®¢åï¼MPJ JOIN é¨åºåç§°+åç±»ï¼è·ç¦»è®¡ç®ä½¿ç¨Ordersèªå¸¦åæ ï¼ 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") .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::getId, orderId) .eq(Orders::getDeleted, Constants.ZERO); Orders order = ordersMapper.selectJoinOne(Orders.class, wrapper); if (order == null) { throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "订åä¸åå¨"); } // æéæ ¡éªï¼æ¢å大å å¯è§(status=2, type=1) æ å·²æ¢å/æ´¾éä¸(acceptDriver=driverId) boolean canView = false; if (Constants.equalsInteger(order.getStatus(), Constants.TWO) && Constants.equalsInteger(order.getType(), Constants.ONE)) { canView = true; } if (driverId != null && driverId.equals(order.getAcceptDriver())) { canView = true; } if (!canView) { throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "æ ææ¥ç该订å"); } // è·å叿ºä½ç½®ï¼ç¨äºè·ç¦»è®¡ç®ï¼ Double driverLat = null; Double driverLng = null; if (driverId != null) { DriverInfo driver = driverInfoMapper.selectById(driverId); if (driver != null) { driverLat = driver.getLatitude(); driverLng = driver.getLongitude(); } } // ç©åæç» List<OrdersDetail> details = ordersDetailMapper.selectList( new QueryWrapper<OrdersDetail>().lambda() .eq(OrdersDetail::getOrderId, orderId)); Map<Integer, List<OrdersDetail>> detailMap = new HashMap<>(); for (OrdersDetail d : details) { detailMap.computeIfAbsent(d.getOrderId(), k -> new ArrayList<>()).add(d); } // 使ç¨å ±ç¨æ¹æ³æå»ºåºç¡VOåæ®µ Date now = new Date(); DriverGrabOrderVO base = buildDriverOrderVO(order, driverLat, driverLng, true, now, detailMap); // æå»ºè¯¦æ VO DriverOrderDetailVO vo = new DriverOrderDetailVO(); vo.setId(base.getId()); vo.setCode(base.getCode()); vo.setRemainMinutes(base.getRemainMinutes()); vo.setIsUrgent(base.getIsUrgent()); vo.setDepositShopName(base.getDepositShopName()); vo.setDepositShopAddress(base.getDepositShopAddress()); vo.setDepositDistance(base.getDepositDistance()); vo.setTakeName(base.getTakeName()); vo.setTakeDistance(base.getTakeDistance()); vo.setContactPhone(base.getContactPhone()); vo.setDriverFee(base.getDriverFee()); vo.setUrgentAmount(base.getUrgentAmount()); vo.setIsValuable(base.getIsValuable()); // ç©åæç»ï¼è½¬æ¢ç±»åï¼ List<DriverOrderDetailVO.OrderItem> detailItems = new ArrayList<>(); if (base.getItems() != null) { for (DriverGrabOrderVO.OrderItem src : base.getItems()) { DriverOrderDetailVO.OrderItem item = new DriverOrderDetailVO.OrderItem(); item.setName(src.getName()); item.setQuantity(src.getQuantity()); detailItems.add(item); } } vo.setItems(detailItems); // 详æ ç¹æåæ®µ vo.setStatus(order.getStatus()); vo.setStatusDesc(getStatusDesc(order.getStatus())); // 客æ·ä¿¡æ¯ String customerInfo = ""; if (StringUtils.isNotBlank(order.getTakeUser())) { customerInfo = order.getTakeUser(); } if (StringUtils.isNotBlank(order.getTakePhone()) && order.getTakePhone().length() >= 4) { customerInfo += "ï¼ææºå°¾å·" + order.getTakePhone().substring(order.getTakePhone().length() - 4) + "ï¼"; } vo.setCustomerInfo(customerInfo); // 导èªç»çº¬åº¦ï¼ä½¿ç¨Ordersèªå¸¦åæ ï¼ if (Constants.equalsInteger(order.getStatus(), Constants.TWO)) { if (order.getDepositLgt() != null && order.getDepositLat() != null) { vo.setNavigateLat(order.getDepositLgt().doubleValue()); vo.setNavigateLng(order.getDepositLat().doubleValue()); } } else { if (order.getTakeLgt() != null && order.getTakeLat() != null) { vo.setNavigateLat(order.getTakeLgt().doubleValue()); vo.setNavigateLng(order.getTakeLat().doubleValue()); } } // ä¸åéä»¶å¾ç String imgPrefix = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.OSS, Constants.MEMBER_FILES).getCode(); vo.setOrderImages(getFileUrls(orderId, Constants.FileType.ORDER_FILE.getKey(), imgPrefix)); return vo; } private List<String> getFileUrls(Integer orderId, int objType, String prefix) { List<Multifile> files = multifileMapper.selectList( new QueryWrapper<Multifile>().lambda() .eq(Multifile::getObjId, orderId) .eq(Multifile::getObjType, objType) .eq(Multifile::getIsdeleted, Constants.ZERO) .orderByAsc(Multifile::getSortnum)); List<String> urls = new ArrayList<>(); if (files != null) { for (Multifile f : files) { if (StringUtils.isNotBlank(f.getFileurl())) { urls.add(prefix + f.getFileurl()); } } } return urls; } private String getStatusDesc(Integer status) { if (status == null) return ""; switch (status) { case 0: return "å¾ æ¯ä»"; case 1: return "å¾ å¯å"; case 2: return "å·²å¯å"; case 3: return "å·²æ¥å"; case 4: return "æ´¾éä¸"; case 5: return "å¾ åä»¶"; case 7: return "已宿"; case 96: return "订åå ³é"; case 98: return "åæ¶ä¸"; case 99: return "已忶"; default: return ""; } } private String formatDistance(double km) { if (km < 1) { return Math.round(km * 1000) + "m"; } return String.format("%.1fkm", km); } private double haversine(double lat1, double lng1, double lat2, double lng2) { double R = 6371; double dLat = Math.toRadians(lat2 - lat1); double dLng = Math.toRadians(lng2 - lng1); double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.sin(dLng / 2) * Math.sin(dLng / 2); double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); return R * c; } private <T> PageData<T> emptyPage(PageWrap<?> pageWrap) { PageData<T> pd = new PageData<>(pageWrap.getPage(), pageWrap.getCapacity()); pd.setTotal(0); pd.setRecords(new ArrayList<>()); return pd; } /** * æå»ºå¸æºç«¯è®¢ååè¡¨å ±ç¨VOï¼ä½¿ç¨Ordersèªå¸¦åæ 计ç®è·ç¦»ï¼ * * @param order 订åå®ä½ï¼MPJ已填å depositShopNameçå ³èåæ®µï¼ * @param driverLat 叿ºçº¬åº¦ * @param driverLng 叿ºç»åº¦ * @param needDepositDist æ¯å¦éè¦è®¡ç®è·åä»¶é¨åºè·ç¦» * @param now å½åæ¶é´ * @param detailMap 订åç©åæç»Mapï¼orderId â detailListï¼ * @return DriverGrabOrderVO */ private DriverGrabOrderVO buildDriverOrderVO(Orders order, Double driverLat, Double driverLng, boolean needDepositDist, Date now, Map<Integer, List<OrdersDetail>> detailMap) { DriverGrabOrderVO vo = new DriverGrabOrderVO(); vo.setId(order.getId()); vo.setCode(order.getCode()); // å©ä½æ¶é¿ if (order.getEstimatedDeliveryTime() != null) { long diffMs = order.getEstimatedDeliveryTime().getTime() - now.getTime(); vo.setRemainMinutes(diffMs > 0 ? diffMs / (60 * 1000) : 0L); } else { vo.setRemainMinutes(0L); } vo.setIsUrgent(order.getIsUrgent()); vo.setDriverFee(order.getDriverFee()); vo.setUrgentAmount(order.getUrgentAmount()); // åä»¶é¨åºï¼ä½¿ç¨Ordersèªå¸¦åæ ï¼ vo.setDepositShopName(order.getDepositShopName()); vo.setDepositShopAddress(order.getDepositShopAddress()); if (needDepositDist && driverLat != null && driverLng != null && order.getDepositLgt() != null && order.getDepositLat() != null) { double distKm = haversine(driverLat, driverLng, order.getDepositLgt().doubleValue(), order.getDepositLat().doubleValue()); vo.setDepositDistance(formatDistance(distKm)); } // åä»¶ä¿¡æ¯ + èç³»çµè¯ï¼ä½¿ç¨Ordersèªå¸¦åæ ï¼ boolean hasTakeShop = order.getTakeShopId() != null && StringUtils.isNotBlank(order.getTakeShopName()); if (hasTakeShop) { vo.setTakeName(order.getTakeShopName()); vo.setContactPhone(order.getTakeShopLinkPhone()); } else { vo.setTakeName(order.getTakeLocation()); vo.setContactPhone(order.getTakePhone()); } if (driverLat != null && driverLng != null && order.getTakeLgt() != null && order.getTakeLat() != null) { double takeDist = haversine(driverLat, driverLng, order.getTakeLgt().doubleValue(), order.getTakeLat().doubleValue()); vo.setTakeDistance(formatDistance(takeDist)); } // è´µéç©å vo.setIsValuable("1".equals(order.getC2OtherField())); // ç©åæç» List<OrdersDetail> details = detailMap.getOrDefault(order.getId(), Collections.emptyList()); List<DriverGrabOrderVO.OrderItem> items = new ArrayList<>(); for (OrdersDetail detail : details) { DriverGrabOrderVO.OrderItem item = new DriverGrabOrderVO.OrderItem(); item.setName(detail.getLuggageName()); item.setQuantity(detail.getNum()); items.add(item); } vo.setItems(items); return vo; } } server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -286,8 +286,6 @@ String token = JwtTokenUtil.generateTokenForRedis(member.getId(), Constants.ZERO, JSONObject.toJSONString(member), redisTemplate); accountResponse.setToken(token); accountResponse.setMember(member); // é¨åºç¨æ·èº«ä»½æ¶ï¼è¿åç³è¯·çé¨åºç¶æ fillShopInfo(accountResponse, member); return accountResponse; } catch (WxErrorException e) { throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "微信ç»å½å¼å¸¸ï¼è¯·è系管çå"); @@ -341,8 +339,6 @@ AccountResponse accountResponse = new AccountResponse(); accountResponse.setToken(token); accountResponse.setMember(member); // é¨åºç¨æ·èº«ä»½æ¶ï¼è¿åç³è¯·çé¨åºç¶æ fillShopInfo(accountResponse, member); return accountResponse; } catch (Exception e) { e.printStackTrace(); @@ -353,15 +349,25 @@ /** * é¨åºç¨æ·èº«ä»½æ¶ï¼å¡«å é¨åºå®¡æ ¸ç¶æ */ private void fillShopInfo(AccountResponse response, Member member) { private void fillShopInfo(UserCenterVO userCenterVO, Member member) { if (Constants.TWO.equals(member.getUserType())) { ShopInfo shopInfo = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda() .eq(ShopInfo::getRegionMemberId, member.getId()) .eq(ShopInfo::getDeleted, Constants.ZERO) .last("limit 1")); if (shopInfo != null) { response.setShopId(shopInfo.getId()); response.setShopAuditStatus(shopInfo.getAuditStatus()); userCenterVO.setShopId(shopInfo.getId()); userCenterVO.setShopAuditStatus(shopInfo.getAuditStatus()); } } // æ ¹æ®openidæ¥è¯¢å½åç»å®çé¨åº if (StringUtils.isNotBlank(member.getOpenid())) { ShopInfo bindShop = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda() .eq(ShopInfo::getOpenid, member.getOpenid()) .eq(ShopInfo::getDeleted, Constants.ZERO) .last("limit 1")); if (bindShop != null) { userCenterVO.setBindShopId(String.valueOf(bindShop.getId())); } } } @@ -398,6 +404,7 @@ userCenterVO.setName(member.getName()); userCenterVO.setTelephone(member.getTelephone()); userCenterVO.setCoverImage(member.getCoverImage()); userCenterVO.setOpenid(member.getOpenid()); if(StringUtils.isNotBlank(member.getCoverImage())){ String path = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode() +systemDictDataBiz.queryByCode(Constants.OSS,Constants.MEMBER_FILES).getCode(); @@ -417,6 +424,14 @@ .eq(Orders::getDeleted, Constants.ZERO) .in(Orders::getStatus, Arrays.stream(waitReceiveStatuses).boxed().collect(Collectors.toList()))); userCenterVO.setWaitReceiveCount(waitReceiveCount.intValue()); // 鿬¾ä¸è®¢åæ°é Long refundingCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda() .eq(Orders::getMemberId, memberId) .eq(Orders::getDeleted, Constants.ZERO) .eq(Orders::getStatus, 98)); userCenterVO.setRefundingCount(refundingCount.intValue()); // é¨åºç¨æ·èº«ä»½æ¶ï¼è¿åç³è¯·çé¨åºç¶æ fillShopInfo(userCenterVO, member); return userCenterVO; } server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
@@ -33,6 +33,7 @@ import com.doumee.service.business.OrderLogService; import com.doumee.service.business.OrdersService; 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; @@ -111,6 +112,10 @@ @Autowired private PricingRuleMapper pricingRuleMapper; @Autowired private PricingRuleService pricingRuleService; @Autowired private RedisTemplate<String, Object> redisTemplate; @@ -303,9 +308,9 @@ */ @Override public PriceCalculateVO calculateLocalPrice(CalculateLocalPriceDTO dto) { // å¤©æ°æ ¡éªï¼æå°1天 int days = dto.getEstimatedDepositDays() != null && dto.getEstimatedDepositDays() > 0 ? dto.getEstimatedDepositDays() : 1; // æ ¹æ®å¼å§åç»ææ¶é´è®¡ç®å¤©æ°ï¼æå°1天 long diffMs = dto.getDepositEndTime().getTime() - dto.getDepositStartTime().getTime(); int days = (int) Math.max(1, (diffMs / (1000 * 60 * 60 * 24)) + 1); // æ¶éææç©åç±»åID List<Integer> categoryIds = new ArrayList<>(); @@ -364,9 +369,9 @@ itemPriceTotal += subtotal; } // ä¿ä»·è´¹ç¨ï¼æ¥ä»·éé¢ Ã ä¿ä»·è´¹ç(åå ¸ INSURANCE_RATE)ï¼å âå // ä¿ä»·è´¹ç¨ï¼æ¥ä»·éé¢ Ã ä¿ä»·è´¹ç(åå ¸ INSURANCE_RATE)ï¼å âåï¼ä¿ä»·éé¢>0æ¶è®¡è´¹ï¼ long insuranceFeeFen = 0L; if (Boolean.TRUE.equals(dto.getInsured()) && dto.getDeclaredAmount() != null) { if (dto.getDeclaredAmount() != null && dto.getDeclaredAmount().compareTo(BigDecimal.ZERO) > 0) { BigDecimal insuranceFeeYuan = calculateInsuranceFee(dto.getDeclaredAmount()); insuranceFeeFen = insuranceFeeYuan.multiply(new BigDecimal(100)).longValue(); } @@ -504,9 +509,9 @@ itemPriceTotal += subtotal; } // 4. ä¿ä»·è´¹ç¨ï¼æ¥ä»·éé¢ Ã ä¿ä»·è´¹ç(åå ¸ INSURANCE_RATE)ï¼å âå // 4. ä¿ä»·è´¹ç¨ï¼æ¥ä»·éé¢ Ã ä¿ä»·è´¹ç(åå ¸ INSURANCE_RATE)ï¼å âåï¼ä¿ä»·éé¢>0æ¶è®¡è´¹ï¼ long insuranceFeeFen = 0L; if (Boolean.TRUE.equals(dto.getInsured()) && dto.getDeclaredAmount() != null) { if (dto.getDeclaredAmount() != null && dto.getDeclaredAmount().compareTo(BigDecimal.ZERO) > 0) { BigDecimal insuranceFeeYuan = calculateInsuranceFee(dto.getDeclaredAmount()); insuranceFeeFen = insuranceFeeYuan.multiply(new BigDecimal(100)).longValue(); } @@ -633,6 +638,11 @@ 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(), dto.getTakeLat().doubleValue(), dto.getTakeLgt().doubleValue())) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "å¼å°å¯å订åååç¹ä¸è½å¨åä¸åå¸ï¼å¦éååå¯åè¯·éæ©å°±è¿é¨åº"); } takeLat = dto.getTakeLat(); takeLgt = dto.getTakeLgt(); takeLocationValue = dto.getTakeLocation(); @@ -647,15 +657,12 @@ // ========== 3. 计ç®è´¹ç¨ ========== PriceCalculateVO priceResult; if (Constants.ZERO.equals(dto.getType())) { // å°±å°å¯åï¼è®¡ç®å¤©æ° long diffMs = takeTime.getTime() - depositTime.getTime(); int days = (int) Math.max(1, (diffMs / (1000 * 60 * 60 * 24)) + 1); // å°±å°å¯å CalculateLocalPriceDTO priceDTO = new CalculateLocalPriceDTO(); priceDTO.setCityId(dto.getCityId()); priceDTO.setEstimatedDepositDays(days); priceDTO.setDepositStartTime(depositTime); priceDTO.setDepositEndTime(takeTime); priceDTO.setItems(dto.getItems()); priceDTO.setInsured(dto.getDeclaredAmount() != null && dto.getDeclaredAmount().compareTo(BigDecimal.ZERO) > 0); priceDTO.setDeclaredAmount(dto.getDeclaredAmount()); priceResult = calculateLocalPrice(priceDTO); } else { @@ -667,7 +674,6 @@ priceDTO.setToLat(takeLat); priceDTO.setToLgt(takeLgt); priceDTO.setItems(dto.getItems()); priceDTO.setInsured(dto.getDeclaredAmount() != null && dto.getDeclaredAmount().compareTo(BigDecimal.ZERO) > 0); priceDTO.setDeclaredAmount(dto.getDeclaredAmount()); priceDTO.setUrgent(Constants.ONE.equals(dto.getIsUrgent())); priceResult = calculateRemotePrice(priceDTO); @@ -1714,6 +1720,24 @@ order.setUpdateTime(now); // çæä¼åæ ¸éç order.setMemberVerifyCode(generateVerifyCode()); // å¼å°å¯åï¼è®¡ç®é¢è®¡éè¾¾æ¶é´ if (Constants.ONE.equals(order.getType()) && order.getDepositLat() != null && order.getDepositLgt() != null && order.getTakeLat() != null && order.getTakeLgt() != null) { EstimatedDeliveryResultVO deliveryResult = calculateEstimatedDelivery( Integer.valueOf(order.getCityId()), order.getDepositLat().doubleValue(), order.getDepositLgt().doubleValue(), order.getTakeLat().doubleValue(), order.getTakeLgt().doubleValue()); // isUrgent: 0=æ éè¾¾; 1=æéè¾¾ BigDecimal hours = Constants.ONE.equals(order.getIsUrgent()) ? deliveryResult.getExpressHours() : deliveryResult.getStandardHours(); if (hours != null) { long millis = hours.multiply(new BigDecimal("3600000")) .setScale(0, RoundingMode.HALF_UP).longValue(); order.setEstimatedDeliveryTime(new Date(now.getTime() + millis)); } } ordersMapper.updateById(order); } @@ -2857,4 +2881,29 @@ return Math.max(days, 0); } @Override public EstimatedDeliveryResultVO calculateEstimatedDelivery(Integer cityId, Double fromLat, Double fromLng, Double toLat, Double toLng) { // è ¾è®¯å°å¾è·ç¦»ç©éµAPI计ç®å®é è·ç¦» String from = fromLat + "," + fromLng; String to = toLat + "," + toLng; JSONObject distanceResult = MapUtil.distanceSingle("driving", from, to); // è·åè·ç¦»ï¼ç±³ï¼ï¼è½¬å ¬é int distanceMeters = distanceResult.getIntValue("distance"); BigDecimal distanceKm = new BigDecimal(distanceMeters) .divide(new BigDecimal("1000"), 2, RoundingMode.HALF_UP); // æ ¹æ®pricing_rule type=2 è®¡ç® æ éè¾¾(1) å æéè¾¾(2) æ¶æ BigDecimal standardTime = pricingRuleService.calculateEstimatedTime(cityId, 1, distanceKm); BigDecimal expressTime = pricingRuleService.calculateEstimatedTime(cityId, 2, distanceKm); EstimatedDeliveryResultVO vo = new EstimatedDeliveryResultVO(); vo.setDistanceKm(distanceKm); vo.setStandardHours(standardTime); vo.setExpressHours(expressTime); return vo; } } server/services/src/main/java/com/doumee/service/business/impl/RevenueServiceImpl.java
@@ -18,7 +18,9 @@ import com.doumee.dao.business.model.ShopInfo; import com.doumee.dao.business.model.Member; import com.doumee.dao.business.model.WithdrawalOrders; import com.doumee.dao.dto.RevenueQueryDTO; import com.doumee.dao.vo.RevenueStatisticsVO; import com.doumee.dao.vo.RevenueSummaryVO; import com.doumee.service.business.RevenueService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -235,4 +237,118 @@ return vo; } @Override public PageData<Revenue> findDriverRevenuePage(PageWrap<RevenueQueryDTO> pageWrap, Integer memberId) { IPage<Revenue> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); QueryWrapper<Revenue> qw = buildRevenueQueryWrapper(pageWrap.getModel(), memberId); PageData<Revenue> result = PageData.from(revenueMapper.selectPage(page, qw)); if (result != null && result.getRecords() != null) { for (Revenue model : result.getRecords()) { model.setAmountInfo(Constants.getFormatMoney(model.getAmount())); } } return result; } @Override public PageData<Revenue> findShopRevenuePage(PageWrap<RevenueQueryDTO> pageWrap, Integer shopId) { ShopInfo shop = shopInfoMapper.selectById(shopId); if (shop == null || Constants.equalsInteger(shop.getDeleted(), Constants.ONE)) { throw new BusinessException(ResponseStatus.DATA_EMPTY); } IPage<Revenue> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); QueryWrapper<Revenue> qw = buildRevenueQueryWrapper(pageWrap.getModel(), shop.getRegionMemberId()); PageData<Revenue> result = PageData.from(revenueMapper.selectPage(page, qw)); if (result != null && result.getRecords() != null) { for (Revenue model : result.getRecords()) { model.setAmountInfo(Constants.getFormatMoney(model.getAmount())); } } return result; } @Override public RevenueSummaryVO getDriverRevenueSummary(RevenueQueryDTO queryDTO, Integer memberId) { return buildRevenueSummary(queryDTO, memberId); } @Override public RevenueSummaryVO getShopRevenueSummary(RevenueQueryDTO queryDTO, Integer shopId) { ShopInfo shop = shopInfoMapper.selectById(shopId); if (shop == null || Constants.equalsInteger(shop.getDeleted(), Constants.ONE)) { throw new BusinessException(ResponseStatus.DATA_EMPTY); } return buildRevenueSummary(queryDTO, shop.getRegionMemberId()); } private QueryWrapper<Revenue> buildRevenueQueryWrapper(RevenueQueryDTO query, Integer memberId) { QueryWrapper<Revenue> qw = new QueryWrapper<>(); qw.lambda().eq(Revenue::getDeleted, Constants.ZERO); qw.lambda().eq(Revenue::getMemberId, memberId); if (query != null) { if (query.getOptType() != null) { qw.lambda().eq(Revenue::getOptType, query.getOptType()); } if (query.getType() != null) { qw.lambda().eq(Revenue::getType, query.getType()); } if (query.getStartTime() != null) { qw.lambda().ge(Revenue::getCreateTime, query.getStartTime()); } if (query.getEndTime() != null) { qw.lambda().le(Revenue::getCreateTime, Utils.Date.getEnd(query.getEndTime())); } } qw.lambda().orderByDesc(Revenue::getCreateTime); return qw; } private RevenueSummaryVO buildRevenueSummary(RevenueQueryDTO queryDTO, Integer memberId) { // æ¶å ¥ QueryWrapper<Revenue> incomeQw = new QueryWrapper<>(); incomeQw.eq("DELETED", Constants.ZERO); incomeQw.eq("MEMBER_ID", memberId); incomeQw.eq("OPT_TYPE", Constants.ONE); if (queryDTO != null) { if (queryDTO.getType() != null) { incomeQw.eq("TYPE", queryDTO.getType()); } if (queryDTO.getStartTime() != null) { incomeQw.ge("CREATE_TIME", queryDTO.getStartTime()); } if (queryDTO.getEndTime() != null) { incomeQw.le("CREATE_TIME", Utils.Date.getEnd(queryDTO.getEndTime())); } } incomeQw.select("IFNULL(SUM(AMOUNT), 0) as amount"); Map<String, Object> incomeResult = revenueMapper.selectMaps(incomeQw).stream().findFirst().orElse(null); long totalIncome = incomeResult != null && incomeResult.get("amount") != null ? Long.parseLong(incomeResult.get("amount").toString()) : 0L; // æ¯åº QueryWrapper<Revenue> expenseQw = new QueryWrapper<>(); expenseQw.eq("DELETED", Constants.ZERO); expenseQw.eq("MEMBER_ID", memberId); expenseQw.eq("OPT_TYPE", -Constants.ONE); if (queryDTO != null) { if (queryDTO.getType() != null) { expenseQw.eq("TYPE", queryDTO.getType()); } if (queryDTO.getStartTime() != null) { expenseQw.ge("CREATE_TIME", queryDTO.getStartTime()); } if (queryDTO.getEndTime() != null) { expenseQw.le("CREATE_TIME", Utils.Date.getEnd(queryDTO.getEndTime())); } } expenseQw.select("IFNULL(SUM(AMOUNT), 0) as amount"); Map<String, Object> expenseResult = revenueMapper.selectMaps(expenseQw).stream().findFirst().orElse(null); long totalExpense = expenseResult != null && expenseResult.get("amount") != null ? Long.parseLong(expenseResult.get("amount").toString()) : 0L; RevenueSummaryVO vo = new RevenueSummaryVO(); vo.setTotalIncome(totalIncome); vo.setTotalExpense(totalExpense); return vo; } } server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java
@@ -236,8 +236,8 @@ @Override @Transactional(rollbackFor = Exception.class) public void applyShop(ShopApplyDTO request, Member member) { Integer memberId = member.getId(); public void applyShop(ShopApplyDTO request) { Member member = memberMapper.selectById(request.getMemberId()); // 1. æ ¡éªé¨åºææºå·å¯ä¸æ§ï¼shop_info.telephoneï¼ checkTelephoneUnique(request.getTelephone(), null); @@ -275,7 +275,7 @@ // 3. æ¥è¯¢è¯¥ä¼åæ¯å¦å·²æé¨åºè®°å½ QueryWrapper<ShopInfo> existQw = new QueryWrapper<>(); existQw.lambda() .eq(ShopInfo::getRegionMemberId, memberId) .eq(ShopInfo::getRegionMemberId, member.getId()) .eq(ShopInfo::getDeleted, Constants.ZERO) .last("limit 1"); ShopInfo existing = shopInfoMapper.selectOne(existQw); @@ -317,7 +317,6 @@ existing.setAliAccount(request.getAliAccount()); existing.setAuditStatus(Constants.ZERO); existing.setUpdateTime(now); existing.setUpdateUser(memberId); existing.setAuditRemark(null); existing.setAuditTime(null); existing.setAuditUserId(null); @@ -351,8 +350,7 @@ shopInfo.setDeleted(Constants.ZERO); shopInfo.setCreateTime(now); shopInfo.setUpdateTime(now); shopInfo.setCreateUser(memberId); shopInfo.setRegionMemberId(memberId); shopInfo.setRegionMemberId(member.getId()); shopInfoMapper.insert(shopInfo); shopId = shopInfo.getId(); } @@ -662,7 +660,7 @@ String imgPrefix = ""; try { imgPrefix = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.SHOP_FILES).getCode(); + systemDictDataBiz.queryByCode(Constants.OSS, Constants.SHOP_FILES).getCode(); } catch (Exception e) { // æªé ç½®æ¶å¿½ç¥ } @@ -720,7 +718,7 @@ String memberPrefix = ""; try { memberPrefix = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.MEMBER_FILES).getCode(); + systemDictDataBiz.queryByCode(Constants.OSS, Constants.MEMBER_FILES).getCode(); } catch (Exception e) { // æªé ç½®æ¶å¿½ç¥ } @@ -761,6 +759,12 @@ qw.lambda().like(ShopInfo::getName, dto.getName()); } // åå¸çéï¼areaIdæ¯åºå¿ï¼éå¹é å ¶parentIdçäºåå¸IDï¼ if (dto.getCityId() != null) { qw.inSql("AREA_ID", "SELECT id FROM areas WHERE parent_id = " + dto.getCityId() + " AND isdeleted = 0"); } // è·ç¦»çéï¼åä½ï¼ç±³ â 转æ¢ä¸ºkmæ¯è¾ï¼ if (distanceMeter != null && distanceMeter > 0) { double maxKm = distanceMeter / 1000.0; @@ -793,6 +797,8 @@ vo.setShopHours(shop.getShopHours()); vo.setAddress(shop.getAddress()); vo.setScore(shop.getScore()); vo.setLatitude(shop.getLatitude()); vo.setLongitude(shop.getLongitude()); // é¨å¤´ç §ç¬¬ä¸å¼ vo.setCoverImg(getFirstImage(shop.getId(), Constants.FileType.STORE_FRONT.getKey(), imgPrefix)); // è·ç¦» @@ -823,6 +829,10 @@ vo.setName(shop.getName()); vo.setAddress(shop.getAddress()); vo.setContent(shop.getContent()); vo.setDepositTypes(shop.getDepositTypes()); vo.setFeeStandard(shop.getFeeStandard()); vo.setLatitude(shop.getLatitude()); vo.setLongitude(shop.getLongitude()); // é¨å¤´ç § + å é¨ç § å ¨è·¯å¾éå String imgPrefix = getShopPrefix(); @@ -911,7 +921,7 @@ private String getShopPrefix() { try { return systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.SHOP_FILES).getCode(); + systemDictDataBiz.queryByCode(Constants.OSS, Constants.SHOP_FILES).getCode(); } catch (Exception e) { return ""; } @@ -965,7 +975,7 @@ vo.setCoverImg(shop.getCoverImg()); if (StringUtils.isNotBlank(shop.getCoverImg())) { String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.SHOP_FILES).getCode(); + systemDictDataBiz.queryByCode(Constants.OSS, Constants.SHOP_FILES).getCode(); vo.setFullCoverImg(path + shop.getCoverImg()); } vo.setHasMessage(false); @@ -1055,7 +1065,6 @@ if (shop == null) { return null; } // å建tokenï¼generateTokenForRedis å·²èªå¨æ¸ é¤è¯¥ç¨æ·æ§tokenï¼ä¿è¯å¯ä¸ææï¼ String token = JwtTokenUtil.generateTokenForRedis(shop.getId(), Constants.TWO, JSONObject.toJSONString(shop), redisTemplate); server/services/src/main/java/com/doumee/service/business/impl/SmsrecordServiceImpl.java
@@ -1,7 +1,5 @@ package com.doumee.service.business.impl; import com.alibaba.fastjson.JSONObject; import com.aliyuncs.CommonResponse; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -14,7 +12,7 @@ import com.doumee.core.utils.DateUtil; import com.doumee.core.utils.Strings; import com.doumee.core.utils.Utils; import com.doumee.core.utils.aliyun.ALiYunSmSUtil; import com.doumee.core.utils.aliyun.AliSmsService; import com.doumee.dao.business.SmsrecordMapper; import com.doumee.dao.business.model.Smsrecord; import com.doumee.service.business.SmsrecordService; @@ -179,15 +177,10 @@ ); String digits = Strings.randomNumeric(4); //åééªè¯ç Map<String,Object> map = new HashMap<String,Object>(); map.put("code",digits); CommonResponse response = ALiYunSmSUtil.sendMessage(phone,map); if(response.getHttpResponse().isSuccess()){ JSONObject data = JSONObject.parseObject(response.getData()); String returnCode = data.getString("Code"); if(!returnCode.equals("OK")){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"çä¿¡åé失败ï¼" + data.getString("Message")); } String templateParam = "{\"code\":\"" + digits + "\"}"; Boolean result = AliSmsService.sendSms(phone, "SMS_491325122", templateParam); if (!result) { throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "çä¿¡åé失败ï¼è¯·ç¨åéè¯"); } //åå¨çä¿¡éªè¯ç Smsrecord smsrecord = new Smsrecord(); server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java
@@ -258,6 +258,22 @@ update.setUpdateTime(now); withdrawalOrdersMapper.updateById(update); // æ´æ°å ³èçæç° Revenue è®°å½ç¶æ // éè¿ objId + objType=1(æç°ä¸å¡) + type=1(æç°æ¯åº) æ¾å°åå§æç°æ¯åºè®°å½ Revenue withdrawalRevenue = revenueMapper.selectOne(new QueryWrapper<Revenue>().lambda() .eq(Revenue::getObjId, order.getId()) .eq(Revenue::getObjType, Constants.ONE) .eq(Revenue::getType, Constants.ONE) .eq(Revenue::getDeleted, Constants.ZERO) .last("limit 1")); if (withdrawalRevenue != null) { Integer revenueStatus = Constants.ONE.equals(dto.getStatus()) ? Constants.ZERO : Constants.ONE; // éè¿=0æå, 驳å=1失败 revenueMapper.update(new UpdateWrapper<Revenue>().lambda() .set(Revenue::getStatus, revenueStatus) .set(Revenue::getUpdateTime, now) .eq(Revenue::getId, withdrawalRevenue.getId())); } // 驳忶éåä½é¢ if (Constants.TWO.equals(dto.getStatus())) { Long amountFen = order.getAmount() != null ? order.getAmount() : 0L; @@ -295,7 +311,8 @@ revenue.setVaildStatus(Constants.ONE); // å·²å ¥è´¦ revenue.setObjId(order.getId()); revenue.setObjType(Constants.ONE); // 1=æç°ä¸å¡ revenue.setStatus(Constants.ZERO); revenue.setOrderNo(order.getOutBillNo()); revenue.setStatus(Constants.ZERO); // 0=æå revenue.setDeleted(Constants.ZERO); revenue.setCreateTime(now); revenueMapper.insert(revenue); @@ -390,7 +407,8 @@ revenue.setVaildStatus(Constants.ONE); revenue.setObjId(order.getId()); revenue.setObjType(Constants.ONE); revenue.setStatus(Constants.ZERO); revenue.setOrderNo(billNo); revenue.setStatus(Constants.TWO); // 2=å¤çä¸ revenue.setDeleted(Constants.ZERO); revenue.setCreateTime(now); revenueMapper.insert(revenue); @@ -440,7 +458,8 @@ revenue.setVaildStatus(Constants.ONE); // å·²å ¥è´¦ revenue.setObjId(order.getId()); revenue.setObjType(Constants.ONE); // 1=æç°ä¸å¡ revenue.setStatus(Constants.ZERO); revenue.setOrderNo(billNo); revenue.setStatus(Constants.TWO); // 2=å¤çä¸ revenue.setDeleted(Constants.ZERO); revenue.setCreateTime(now); revenueMapper.insert(revenue); server/services/src/main/resources/application-dev.yml
@@ -87,8 +87,14 @@ appSecret: 3462fa186da7cb06c544df8d8664b63a mchId: 1229817002 mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM notifyUrl: https://test.doumee.cn/dmmall_web_api/web/api/wxPayNotify notifyUrl: http://xiaopiqiu2.natapp1.cc/web/api/wxPayNotify keyPath: D:\DouMee\dmkjWxcert\apiclient_cert.p12 # appId: wx6264b4f3a697cbe8 # appSecret: 23734577e8978138c946b727f0394027 # mchId: 1629568742 # mchKey: NJTLJSTZYXZRGScaiwubuzichanbu666 # notifyUrl: https://test.doumee.cn/dmmall_web_api/web/api/wxPayNotify # keyPath: D:\DouMee\gtxljcWxcert\apiclient_cert.p12 alipay: pay: server/web/src/main/java/com/doumee/api/web/ApiController.java
@@ -42,16 +42,8 @@ return obj != null ? (Integer) obj : null; } /** * è·åç»å½ç¨æ·å¯¹è±¡ä¿¡æ¯ * @return */ protected Member getMemberResponse(){ Object obj = this.getRequest().getAttribute(JwtTokenUtil.MEMBER_INFO); if(obj != null){ return JSONObject.parseObject(obj.toString(),Member.class); } return null; protected Integer getDriverId() { Object obj = this.getRequest().getAttribute(JwtTokenUtil.DRIVER_ID); return obj != null ? (Integer) obj : null; } } server/web/src/main/java/com/doumee/api/web/ConfigApi.java
@@ -3,12 +3,13 @@ import com.doumee.core.annotation.LoginRequired; import com.doumee.core.annotation.trace.Trace; import com.doumee.core.model.ApiResponse; import com.doumee.core.utils.Tencent.MapUtil; import com.doumee.dao.business.model.Areas; import com.doumee.dao.business.model.Banner; import com.doumee.dao.business.model.Category; import com.doumee.dao.dto.CalculateLocalPriceDTO; import com.doumee.dao.dto.CalculateRemotePriceDTO; import com.doumee.dao.vo.AccountResponse; import com.doumee.dao.dto.SameCityCheckDTO; import com.doumee.dao.vo.PriceCalculateVO; import com.doumee.dao.vo.PlatformAboutVO; import com.doumee.service.business.*; @@ -17,7 +18,6 @@ import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.checkerframework.checker.units.qual.A; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -118,10 +118,20 @@ return ApiResponse.success("æä½æå", ordersService.calculateRemotePrice(dto)); } @ApiOperation(value = "æ ¡éªä¸¤ä¸ªç»çº¬åº¦æ¯å¦åå", notes = "ä¼ å ¥ä¸¤ç»ç»çº¬åº¦ï¼è¿åæ¯å¦å¨åä¸åå¸") @PostMapping("/isSameCity") public ApiResponse<Boolean> isSameCity(@RequestBody SameCityCheckDTO dto) { return ApiResponse.success("æä½æå", MapUtil.isSameCity(dto.getLat1(), dto.getLng1(), dto.getLat2(), dto.getLng2())); } @ApiOperation(value = "æ ¹æ®åå¸åç§°æ¥è¯¢åå¸ä¿¡æ¯", notes = "ä» è¿åå·²å¼éçåå¸ï¼æªå¼éè¿å空") @GetMapping("/getCityByName") @ApiImplicitParams({ @ApiImplicitParam(paramType = "query", dataType = "String", name = "cityName", value = "åå¸åç§°", required = true) }) public ApiResponse<Areas> getCityByName(@RequestParam String cityName) { return ApiResponse.success("æ¥è¯¢æå", areasService.getOpenedCityByName(cityName)); } } server/web/src/main/java/com/doumee/api/web/DriverInfoApi.java
@@ -1,12 +1,20 @@ package com.doumee.api.web; import com.doumee.core.annotation.LoginDriverRequired; import com.doumee.core.annotation.LoginRequired; import com.doumee.core.annotation.trace.Trace; import com.doumee.core.model.ApiResponse; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.dao.dto.DriverActiveOrderDTO; import com.doumee.dao.dto.DriverGrabOrderDTO; import com.doumee.dao.dto.DriverLoginRequest; import com.doumee.dao.dto.DriverRegisterRequest; import com.doumee.dao.dto.DriverVerifyRequest; import com.doumee.dao.vo.AccountResponse; import com.doumee.dao.vo.DriverCenterVO; import com.doumee.dao.vo.DriverGrabOrderVO; import com.doumee.dao.vo.DriverOrderDetailVO; import com.doumee.service.business.DriverInfoService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -15,6 +23,9 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.util.List; /** * 叿ºéªè¯ç ç»å½æ¥å£ @@ -56,7 +67,7 @@ return ApiResponse.success("ç»å½æå", driverInfoService.login(request)); } @LoginRequired @LoginDriverRequired @Trace @ApiOperation(value = "æäº¤å®å认è¯", notes = "忬¡æäº¤æé©³ååä¿®æ¹") @PostMapping("/submitVerify") @@ -64,11 +75,11 @@ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true) }) public ApiResponse submitVerify(@RequestBody DriverVerifyRequest request) { driverInfoService.submitVerify(this.getMemberId(), request); driverInfoService.submitVerify(this.getDriverId(), request); return ApiResponse.success("æäº¤æå"); } @LoginRequired @LoginDriverRequired @Trace @ApiOperation(value = "æ¥è¯¢å®å认è¯è¯¦æ ", notes = "叿ºç«¯æ¥è¯¢") @GetMapping("/verifyDetail") @@ -76,7 +87,79 @@ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true) }) public ApiResponse verifyDetail() { return ApiResponse.success(driverInfoService.getVerifyDetail(this.getMemberId())); return ApiResponse.success(driverInfoService.getVerifyDetail(this.getDriverId())); } @LoginDriverRequired @Trace @ApiOperation(value = "忢æ¥åç¶æ", notes = "0=æªæ¥åï¼1=æ¥åä¸") @GetMapping("/updateAcceptingStatus") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true), @ApiImplicitParam(paramType = "query", dataType = "int", name = "status", value = "æ¥åç¶æï¼0=æªæ¥åï¼1=æ¥åä¸", required = true) }) public ApiResponse updateAcceptingStatus(@RequestParam Integer status) { driverInfoService.updateAcceptingStatus(this.getDriverId(), status); return ApiResponse.success("æä½æå"); } @LoginDriverRequired @Trace @ApiOperation(value = "æ´æ°å®æ¶å®ä½", notes = "叿ºç«¯ä¸æ¥å½åä½ç½®ç»çº¬åº¦") @GetMapping("/updateLocation") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true), @ApiImplicitParam(paramType = "query", dataType = "Double", name = "longitude", value = "ç»åº¦", required = true), @ApiImplicitParam(paramType = "query", dataType = "Double", name = "latitude", value = "纬度", required = true) }) public ApiResponse updateLocation(@RequestParam Double longitude, @RequestParam Double latitude) { driverInfoService.updateLocation(this.getDriverId(), longitude, latitude); return ApiResponse.success("æä½æå"); } @LoginDriverRequired @Trace @ApiOperation(value = "叿ºç«¯é¦é¡µä¿¡æ¯", notes = "å§åã头åã车çå·ãè¯åã仿¥ä½£éã仿¥æ¥åæ°ãä½é¢") @GetMapping("/centerInfo") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true) }) public ApiResponse<DriverCenterVO> centerInfo() { return ApiResponse.success("æä½æå", driverInfoService.getDriverCenterInfo(this.getDriverId())); } @LoginDriverRequired @Trace @ApiOperation(value = "叿ºæ¢å大å ", notes = "å页æ¥è¯¢å¯æ¢çå¼å°å¯å订å") @PostMapping("/grabOrderHall") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true) }) public ApiResponse<PageData<DriverGrabOrderVO>> grabOrderHall(@RequestBody PageWrap<DriverGrabOrderDTO> pageWrap) { return ApiResponse.success("æä½æå", driverInfoService.grabOrderHall(this.getDriverId(), pageWrap)); } @LoginDriverRequired @Trace @ApiOperation(value = "叿ºè¿è¡ä¸è®¢å", notes = "æ¥è¯¢å·²æ¢å(status=3)ææ´¾éä¸(status=4)ç订åå表") @PostMapping("/activeOrders") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true) }) public ApiResponse<List<DriverGrabOrderVO>> activeOrders(@RequestBody @Valid DriverActiveOrderDTO dto) { return ApiResponse.success("æä½æå", driverInfoService.activeOrders(this.getDriverId(), dto)); } @LoginDriverRequired @Trace @ApiOperation(value = "叿ºç«¯è®¢å详æ ", notes = "æ ¹æ®è®¢å䏻鮿¥è¯¢è¯¦æ ") @GetMapping("/orderDetail") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true), @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "orderId", value = "订å主é®", required = true) }) public ApiResponse<DriverOrderDetailVO> orderDetail(@RequestParam Integer orderId) { return ApiResponse.success("æä½æå", driverInfoService.driverOrderDetail(this.getDriverId(), orderId)); } } server/web/src/main/java/com/doumee/api/web/RevenueApi.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,72 @@ package com.doumee.api.web; import com.doumee.core.annotation.LoginRequired; import com.doumee.core.annotation.LoginShopRequired; import com.doumee.core.annotation.trace.Trace; import com.doumee.core.model.ApiResponse; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.dao.business.model.Revenue; import com.doumee.dao.dto.RevenueQueryDTO; import com.doumee.dao.vo.RevenueSummaryVO; import com.doumee.service.business.RevenueService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @Api(tags = "äº¤ææµæ°´") @Trace(exclude = true) @RestController @RequestMapping("/web/revenue") @Slf4j public class RevenueApi extends ApiController { @Autowired private RevenueService revenueService; @LoginRequired @ApiOperation(value = "叿ºæµæ°´å页", notes = "å°ç¨åºç«¯") @PostMapping("/driverPage") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true), }) public ApiResponse<PageData<Revenue>> driverPage(@RequestBody @Validated PageWrap<RevenueQueryDTO> pageWrap) { return ApiResponse.success("æ¥è¯¢æå", revenueService.findDriverRevenuePage(pageWrap, getMemberId())); } @LoginRequired @ApiOperation(value = "叿ºæµæ°´æ¶æ¯ç»è®¡", notes = "æ ¹æ®æ¥è¯¢æ¡ä»¶ç»è®¡æ¶å ¥ä¸æ¯åº") @PostMapping("/driverSummary") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true), }) public ApiResponse<RevenueSummaryVO> driverSummary(@RequestBody RevenueQueryDTO queryDTO) { return ApiResponse.success("æ¥è¯¢æå", revenueService.getDriverRevenueSummary(queryDTO, getMemberId())); } @LoginShopRequired @ApiOperation(value = "é¨åºæµæ°´å页", notes = "å°ç¨åºç«¯") @PostMapping("/shopPage") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "é¨åºtokenå¼", required = true), }) public ApiResponse<PageData<Revenue>> shopPage(@RequestBody @Validated PageWrap<RevenueQueryDTO> pageWrap) { return ApiResponse.success("æ¥è¯¢æå", revenueService.findShopRevenuePage(pageWrap, getShopId())); } @LoginShopRequired @ApiOperation(value = "é¨åºæµæ°´æ¶æ¯ç»è®¡", notes = "æ ¹æ®æ¥è¯¢æ¡ä»¶ç»è®¡æ¶å ¥ä¸æ¯åº") @PostMapping("/shopSummary") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "é¨åºtokenå¼", required = true), }) public ApiResponse<RevenueSummaryVO> shopSummary(@RequestBody RevenueQueryDTO queryDTO) { return ApiResponse.success("æ¥è¯¢æå", revenueService.getShopRevenueSummary(queryDTO, getShopId())); } } server/web/src/main/java/com/doumee/api/web/ShopInfoApi.java
@@ -45,8 +45,8 @@ @ApiOperation("é¨åºå ¥é©»ç³è¯·/ä¿®æ¹") @PostMapping("/apply") public ApiResponse apply(@RequestBody @Validated ShopApplyDTO request) { Member member = this.getMemberResponse(); shopInfoService.applyShop(request, member); request.setMemberId(getMemberId()); shopInfoService.applyShop(request); return ApiResponse.success("æä½æå"); } server/web/src/main/java/com/doumee/api/web/WalletApi.java
@@ -5,6 +5,7 @@ import com.doumee.core.model.ApiResponse; import com.doumee.dao.dto.WithdrawalDTO; import com.doumee.dao.vo.RevenueStatisticsVO; import com.doumee.dao.business.model.WithdrawalOrders; import com.doumee.service.business.RevenueService; import com.doumee.service.business.WithdrawalOrdersService; import io.swagger.annotations.Api; @@ -14,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -80,4 +82,15 @@ return ApiResponse.success("æ¥è¯¢æå", revenueService.getDriverRevenueStatistics(getMemberId())); } @LoginRequired @ApiOperation(value = "æç°è¯¦æ ", notes = "æ ¹æ®æç°ä¸»é®æ¥è¯¢è¯¦æ ï¼å«å®¡æ¹äººä¿¡æ¯ï¼") @GetMapping("/detail/{id}") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true), @ApiImplicitParam(paramType = "path", dataType = "Integer", name = "id", value = "æç°è®°å½ä¸»é®", required = true) }) public ApiResponse<WithdrawalOrders> detail(@PathVariable Integer id) { return ApiResponse.success("æ¥è¯¢æå", withdrawalOrdersService.findById(id)); } } server/web/src/main/resources/application.yml
@@ -12,7 +12,7 @@ spring: profiles: active: pro active: dev # JSONè¿åé ç½® jackson: # é»è®¤æ¶åº