server/admin/src/main/java/com/doumee/api/business/IdentityInfoController.java
ÎļþÒÑɾ³ý server/admin/src/main/java/com/doumee/api/business/OrdersController.java
@@ -122,4 +122,12 @@ return ApiResponse.success(null); } @ApiOperation("æå¨è§¦å订åç»ç®") @PostMapping("/settle") @RequiresPermissions("business:orders:update") public ApiResponse settleOrders() { ordersService.settleOrders(); return ApiResponse.success("ç»ç®å®æ"); } } server/admin/src/main/java/com/doumee/api/business/OtherOrdersController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,82 @@ package com.doumee.api.business; import com.doumee.api.BaseController; import com.doumee.core.annotation.excel.ExcelExporter; import com.doumee.core.model.ApiResponse; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.dao.business.model.OtherOrders; import com.doumee.service.business.OtherOrdersService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.List; /** * å ¶ä»è®¢å管ç * @author rk * @date 2026/04/16 */ @Api(tags = "å ¶ä»è®¢å") @RestController @RequestMapping("/business/otherOrders") public class OtherOrdersController extends BaseController { @Autowired private OtherOrdersService otherOrdersService; @ApiOperation("æ ¹æ®IDå é¤") @GetMapping("/delete/{id}") @RequiresPermissions("business:otherOrders:delete") public ApiResponse deleteById(@PathVariable Integer id) { otherOrdersService.deleteById(id); return ApiResponse.success(null); } @ApiOperation("æ¹éå é¤") @GetMapping("/delete/batch") @RequiresPermissions("business:otherOrders:delete") public ApiResponse deleteByIdInBatch(@RequestParam String ids) { String[] idArray = ids.split(","); List<Integer> idList = new ArrayList<>(); for (String id : idArray) { idList.add(Integer.valueOf(id)); } otherOrdersService.deleteByIdInBatch(idList); return ApiResponse.success(null); } @ApiOperation("æ ¹æ®IDä¿®æ¹") @PostMapping("/updateById") @RequiresPermissions("business:otherOrders:update") public ApiResponse updateById(@RequestBody OtherOrders otherOrders) { otherOrdersService.updateById(otherOrders); return ApiResponse.success(null); } @ApiOperation("å页æ¥è¯¢") @PostMapping("/page") @RequiresPermissions("business:otherOrders:query") public ApiResponse<PageData<OtherOrders>> findPage(@RequestBody PageWrap<OtherOrders> pageWrap) { return ApiResponse.success(otherOrdersService.findPage(pageWrap)); } @ApiOperation("导åºExcel") @PostMapping("/exportExcel") @RequiresPermissions("business:otherOrders:exportExcel") public void exportExcel(@RequestBody PageWrap<OtherOrders> pageWrap, HttpServletResponse response) { ExcelExporter.build(OtherOrders.class).export(otherOrdersService.findPage(pageWrap).getRecords(), "å ¶ä»è®¢å", response); } @ApiOperation("æ ¹æ®IDæ¥è¯¢") @GetMapping("/{id}") @RequiresPermissions("business:otherOrders:query") public ApiResponse findById(@PathVariable Integer id) { return ApiResponse.success(otherOrdersService.findById(id)); } } server/services/db/db_change.sql
@@ -5,6 +5,66 @@ -- ============================================================ -- 2026/04/16 订åç»ç®åè½ï¼ç»ç®æ¶é´å段 + é¨åº/叿ºä½é¢å段 -- ============================================================ ALTER TABLE `orders` ADD COLUMN `SETTLEMENT_TIME` DATETIME DEFAULT NULL COMMENT 'ç»ç®æ¶é´' AFTER `SETTLEMENT_STATUS`; ALTER TABLE `shop_info` ADD COLUMN `BALANCE` BIGINT DEFAULT 0 COMMENT 'å½åä½é¢(å)' AFTER `DELIVERY_AREA`; ALTER TABLE `shop_info` ADD COLUMN `TOTAL_BALANCE` BIGINT DEFAULT 0 COMMENT 'å岿»éé¢(å)' AFTER `BALANCE`; 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`; -- ============================================================ -- 2026/04/16 叿ºè¯ååæ®µ + 订åè¯ä»·è®°å½è¡¨ -- ============================================================ ALTER TABLE `driver_info` ADD COLUMN `SCORE` DECIMAL(2,1) DEFAULT NULL COMMENT '叿ºè¯å' AFTER `DRIVER_LEVEL`; CREATE TABLE `order_comment` ( `ID` INT NOT NULL AUTO_INCREMENT COMMENT '主é®', `DELETED` INT DEFAULT 0 COMMENT 'æ¯å¦å·²å é¤ 0æªå é¤ 1å·²å é¤', `CREATE_USER` INT DEFAULT NULL COMMENT 'å建人ç¼ç ', `CREATE_TIME` DATETIME DEFAULT NULL COMMENT 'å建æ¶é´', `UPDATE_USER` INT DEFAULT NULL COMMENT 'æ´æ°äººç¼ç ', `UPDATE_TIME` DATETIME DEFAULT NULL COMMENT 'æ´æ°æ¶é´', `REMARK` VARCHAR(500) DEFAULT NULL COMMENT '夿³¨', `ORDER_ID` INT NOT NULL COMMENT 'å ³è订å主é®', `ORDER_CODE` VARCHAR(50) DEFAULT NULL COMMENT '订åç¼å·', `MEMBER_ID` INT NOT NULL COMMENT 'è¯ä»·äºº(ä¼å)主é®', `TARGET_TYPE` INT NOT NULL COMMENT 'è¯ä»·å¯¹è±¡ç±»åï¼1=åä»¶é¨åºï¼2=åä»¶é¨åºï¼3=叿º', `TARGET_ID` INT NOT NULL COMMENT 'è¯ä»·å¯¹è±¡ä¸»é®(shop_info.idædriver_info.id)', `SCORE` INT NOT NULL COMMENT 'è¯å1-5', `CONTENT` VARCHAR(500) DEFAULT NULL COMMENT 'è¯ä»·å 容', PRIMARY KEY (`ID`) ) COMMENT='订åè¯ä»·è®°å½'; -- ============================================================ -- 2026/04/16 æ°å¢å ¶ä»è®¢åè®°å½è¡¨ -- ============================================================ CREATE TABLE `other_orders` ( `ID` int NOT NULL AUTO_INCREMENT COMMENT '主é®', `DELETED` tinyint DEFAULT NULL COMMENT 'æ¯å¦å·²å é¤ 0æªå é¤ 1å·²å é¤', `CREATE_USER` int DEFAULT NULL COMMENT 'å建人ç¼ç ', `CREATE_TIME` datetime DEFAULT NULL COMMENT 'å建æ¶é´', `UPDATE_USER` int DEFAULT NULL COMMENT 'æ´æ°äººç¼ç ', `UPDATE_TIME` datetime DEFAULT NULL COMMENT 'æ´æ°æ¶é´', `REMARK` varchar(2000) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '夿³¨', `TYPE` int DEFAULT NULL COMMENT '订åç±»åï¼0=åºéºæ¼é订å;1=叿ºæ¼é订å;2=é¾æè´¹ç¨è®¢å;', `OBJ_ID` int DEFAULT NULL COMMENT 'å ³èä¼åä¸»é® åºéºãä¼å', `PAY_ACCOUNT` bigint DEFAULT NULL COMMENT 'å®é æ¯ä»è´¹ç¨', `PAY_STATUS` int DEFAULT NULL COMMENT 'æ¯ä»ç¶æï¼0=æªæ¯ä»;1=å·²æ¯ä»;', `PAY_TIME` datetime DEFAULT NULL COMMENT 'æ¯ä»æ¶é´', `CODE` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '订åç¼å·', `WX_EXTERNAL_NO` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信平å°äº¤æè®¢åå·', `ORDER_ID` int DEFAULT NULL COMMENT 'å ³èå¯å订å主é®', `OUT_TRADE_NO` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '䏿¹è®¢åå·', PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='å ¶ä»è®¢åè®°å½'; -- ============================================================ -- 2026/04/15 订åè¡¨æ·»å æ ¸éç åæ®µ -- ============================================================ server/services/src/main/java/com/doumee/api/common/PublicCloudController.java
@@ -4,8 +4,6 @@ import com.alibaba.fastjson.JSONObject; import com.doumee.api.BaseController; import com.doumee.biz.system.SystemDictDataBiz; import com.doumee.config.annotation.EncryptionReq; import com.doumee.config.annotation.EncryptionResp; import com.doumee.core.annotation.trace.Trace; import com.doumee.core.constants.Constants; import com.doumee.core.constants.ResponseStatus; @@ -13,12 +11,7 @@ import com.doumee.core.model.ApiResponse; import com.doumee.core.utils.DateUtil; import com.doumee.core.utils.FtpUtil; import com.doumee.core.utils.azure.AzureBlobUtil; import com.doumee.core.utils.huaweiOBS.ObsUtil; import com.doumee.core.utils.qiyeweixin.QywxUtil; import com.doumee.core.utils.qiyeweixin.model.response.QywxUploadMediaResponse; import com.doumee.dao.system.model.SystemDictData; import com.doumee.service.common.EmailService; import com.doumee.core.utils.aliyun.ALiYunUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -67,7 +60,7 @@ if(Objects.isNull(folder)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"ç®æ æä»¶å¤¹é误"); } String prefixPath = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RESOURCE_PATH).getCode(); String prefixPath = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode(); InputStream is = null; response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); @@ -90,10 +83,11 @@ String fName = date+"/"+ UUID.randomUUID()+endType; String fileName = folder+"/"+fName; boolean r =false; ObsUtil obsUtil = new ObsUtil( systemDictDataBiz.queryByCode(Constants.HWY_OBS,Constants.HWY_OBS_ACCESSID).getCode(), systemDictDataBiz.queryByCode(Constants.HWY_OBS,Constants.HWY_OBS_ACCESSKEY).getCode(), systemDictDataBiz.queryByCode(Constants.HWY_OBS,Constants.HWY_OBS_ENDPOINT).getCode()); r = obsUtil.uploadFile( systemDictDataBiz.queryByCode(Constants.HWY_OBS,Constants.HWY_OBS_BUCKET).getCode(),is,fileName);//ä¸ä¼ ALiYunUtil obs = new ALiYunUtil(systemDictDataBiz.queryByCode(Constants.OSS,Constants.ENDPOINT).getCode(),systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_ID).getCode(), systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_KEY).getCode()); r = obs.uploadOnlineObject(file.getInputStream(),systemDictDataBiz.queryByCode(Constants.OSS,Constants.BUCKETNAME).getCode(), fileName,null); if(r){ context.put("success", true); context.put("code", 200); server/services/src/main/java/com/doumee/config/wx/SendWxMessage.java
@@ -5,7 +5,6 @@ import com.doumee.core.constants.Constants; import com.doumee.core.utils.DateUtil; import com.doumee.core.utils.HttpsUtil; import com.doumee.dao.business.model.IdentityInfo; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.error.WxErrorException; import org.springframework.beans.factory.annotation.Autowired; @@ -29,38 +28,5 @@ @Autowired private SystemDictDataBiz systemDictDataBiz; /** * ä¿¡æ¯è®¤è¯ * @param openid * @param identityInfo * @throws WxErrorException */ public void identityInfoMessage(String openid, IdentityInfo identityInfo){ try{ String accessToken = WxMiniConfig.wxMaService.getAccessToken(); log.info("微信å°ç¨åº->å¾®ä¿¡æ¶æ¯éç¥ - 认è¯ä¿¡æ¯ -> accessTokenï¼{}",accessToken); //è¿éç®åèµ·è§æä»¬æ¯æ¬¡é½è·åææ°çaccess_tokenï¼æ¶é´å¼åä¸ï¼åºè¯¥å¨access_tokenå¿«è¿ææ¶åéæ°è·åï¼ String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken; //æ¼æ¥æ¨éçæ¨¡ç WxMsgVO wxMsgVO = new WxMsgVO(); //ç¨æ·çopenidï¼è¦åéç»é£ä¸ªç¨æ·ï¼ wxMsgVO.setTouser(openid); //è®¢é æ¶æ¯æ¨¡æ¿id wxMsgVO.setTemplate_id("VJho7-lf-4_WZFfOzenDnX6sOhYBJWwkLExVjBB563U"); Map<String, TemplateData> m = new HashMap<>(4); m.put("thing2", new TemplateData(Constants.equalsInteger(identityInfo.getType(),Constants.ZERO)?"ç¨å·¥è®¤è¯":Constants.equalsInteger(identityInfo.getType(),Constants.ONE)?"è¿è´§è®¤è¯":"ä¾é¤è®¤è¯")); m.put("phrase6", new TemplateData(Constants.equalsInteger(identityInfo.getAuditStatus(),Constants.TWO)?"éè¿":"æªéè¿")); m.put("time12", new TemplateData(DateUtil.formatDate(identityInfo.getAuditTime(),"yyyy-MM-dd HH:mm"))); wxMsgVO.setPage(mineUrl); wxMsgVO.setData(m); log.error("微信å°ç¨åº->å¾®ä¿¡æ¶æ¯éç¥ è®¤è¯ä¿¡æ¯ï¼{}", JSONObject.toJSONString(wxMsgVO)); String responseEntity = HttpsUtil.postJson(url,JSONObject.toJSONString(wxMsgVO)); log.error("微信å°ç¨åº->å¾®ä¿¡æ¶æ¯éç¥ è®¤è¯ä¿¡æ¯ï¼{}", JSONObject.toJSONString(responseEntity)); }catch (WxErrorException wxErrorException){ } } } server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -18,11 +18,8 @@ */ public class Constants { public static final String HWY_OBS ="HWY_OBS" ; public static final String HWY_OBS_ACCESSID ="HWY_OBS_ACCESSID" ; public static final String HWY_OBS_ACCESSKEY ="HWY_OBS_ACCESSKEY" ; public static final String HWY_OBS_ENDPOINT ="HWY_OBS_ENDPOINT" ; public static final String HWY_OBS_BUCKET ="HWY_OBS_BUCKET" ; public static final String OSS ="OSS" ; public static final String RESOURCE_PATH ="RESOURCE_PATH" ; public static final String QYWX_CORPID = "QYWX_CORPID"; public static final String QYWX_SECRET = "QYWX_SECRET"; @@ -53,6 +50,11 @@ public static final String USER_AGREEMENT ="USER_AGREEMENT" ; public static final String PRIVACY_AGREEMENT ="PRIVACY_AGREEMENT" ; public static final String ACCESS_ID="ACCESS_ID"; public static final String BUCKETNAME = "BUCKETNAME"; public static final String ACCESS_KEY = "ACCESS_KEY"; public static final String ENDPOINT = "ENDPOINT"; public static final String QYWX = "QYWX"; public static final Integer ONE = 1; @@ -413,7 +415,7 @@ STORAGE_ORDER("storageOrder", "å¯å订å"), SHOP_DEPOSIT("shopDeposit", "åºéºæ¼é订å"), DRIVER_DEPOSIT("driverDeposit", "叿ºæ¼é订å"), OVERDUE_FEE("overdueFee", "é¾æè´¹ç¨è®¢å") OVERDUE_FEE("overdueFee", "订åé¾æè´¹ç¨") ; private final String key; @@ -475,8 +477,8 @@ public enum OrderCombinedStatus { waitPay(0, "å¾ æ¯ä»", new int[]{OrderStatus.waitPay.status}), waitDeposit(1, "å¾ æ ¸éª", new int[]{OrderStatus.waitDeposit.status}), waitDeliver(2, "å¾ é é", new int[]{OrderStatus.deposited.status}), waitReceive(3, "å¾ æ¶è´§", new int[]{OrderStatus.accepted.status, OrderStatus.delivering.status, OrderStatus.arrived.status}), waitDeliver(2, "å¾ é é", new int[]{OrderStatus.accepted.status}), waitReceive(3, "å¾ æ¶è´§", new int[]{ OrderStatus.delivering.status, OrderStatus.arrived.status}), finished(4, "已宿", new int[]{OrderStatus.finished.status}), refund(5, "鿬¾", new int[]{OrderStatus.closed.status, OrderStatus.cancelling.status}) ; server/services/src/main/java/com/doumee/core/utils/huaweiOBS/ObsUtil.java
ÎļþÒÑɾ³ý server/services/src/main/java/com/doumee/dao/business/IdentityInfoMapper.java
ÎļþÒÑɾ³ý server/services/src/main/java/com/doumee/dao/business/MemberMapper.java
@@ -15,15 +15,4 @@ */ public interface MemberMapper extends MPJBaseMapper<Member> { @Select(" select * , " + " ifnull((select r.level from receive_weight r where r.RECEIVE_MAX > RECEIVE_NUM and RECEIVE_NUM > r.RECEIVE_MIN limit 1 ),0) as level ," + " ifnull( (select CONVERT( ST_Distance_Sphere ( POINT ( ii.lgt, ii.lat ), POINT ( #{lgt}, #{lat} )) /1000,DECIMAL(15,2)) from identity_info ii where ii.AUDIT_STATUS = 2 and type = 0 and ii.member_id = ID limit 1 ),0) as distance " + " from member " + " where id in ( " + " select ii.member_id from identity_info ii where ii.AUDIT_STATUS = 2 and type = #{orderType} " + " and ( CONVERT( ST_Distance_Sphere ( POINT ( ii.lgt, ii.lat ), POINT ( #{lgt}, #{lat} )) /1000,DECIMAL(15,2))) < 100 " + " ) and RELEASE_MEMBER_ID != #{releaseMemberId} " + " order by level , score desc , distance asc ") List<Member> getList(@Param("lgt") BigDecimal lgt, @Param("lat") BigDecimal lat, @Param("orderType") Integer orderType, @Param("releaseMemberId") Integer releaseMemberId); } server/services/src/main/java/com/doumee/dao/business/OrderCommentMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,12 @@ package com.doumee.dao.business; import com.doumee.dao.business.model.OrderComment; import com.github.yulichang.base.MPJBaseMapper; /** * 订åè¯ä»·è®°å½Mapper * @author rk * @date 2026/04/16 */ public interface OrderCommentMapper extends MPJBaseMapper<OrderComment> { } server/services/src/main/java/com/doumee/dao/business/OtherOrdersMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,7 @@ package com.doumee.dao.business; import com.doumee.dao.business.model.OtherOrders; import com.github.yulichang.base.MPJBaseMapper; public interface OtherOrdersMapper extends MPJBaseMapper<OtherOrders> { } server/services/src/main/java/com/doumee/dao/business/model/DriverInfo.java
@@ -10,6 +10,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -131,6 +132,15 @@ @ApiModelProperty(value = "叿ºå®çº§ï¼( 5 - 1 S A B C D )", example = "1") private Integer driverLevel; @ApiModelProperty(value = "叿ºè¯å") private BigDecimal score; @ApiModelProperty(value = "å½åä½é¢(å)") private Long balance; @ApiModelProperty(value = "å岿»éé¢(å)") private Long totalBalance; @ApiModelProperty(value = "车è¾ç §çå表") @TableField(exist = false) private List<Multifile> carImgList = new ArrayList<>(); server/services/src/main/java/com/doumee/dao/business/model/IdentityInfo.java
ÎļþÒÑɾ³ý server/services/src/main/java/com/doumee/dao/business/model/OrderComment.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,68 @@ package com.doumee.dao.business.model; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; /** * 订åè¯ä»·è®°å½ * @author rk * @date 2026/04/16 */ @Data @ApiModel("订åè¯ä»·è®°å½") @TableName("`order_comment`") public class OrderComment { @TableId(type = IdType.AUTO) @ApiModelProperty(value = "主é®", example = "1") private Integer id; @ApiModelProperty(value = "æ¯å¦å·²å é¤ 0æªå é¤ 1å·²å é¤", example = "0") private Integer deleted; @ApiModelProperty(value = "å建人ç¼ç ", example = "1") private Integer createUser; @ApiModelProperty(value = "å建æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; @ApiModelProperty(value = "æ´æ°äººç¼ç ", example = "1") private Integer updateUser; @ApiModelProperty(value = "æ´æ°æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date updateTime; @ApiModelProperty(value = "夿³¨") private String remark; @ApiModelProperty(value = "å ³è订å主é®", example = "1") private Integer orderId; @ApiModelProperty(value = "订åç¼å·") private String orderCode; @ApiModelProperty(value = "è¯ä»·äºº(ä¼å)主é®", example = "1") private Integer memberId; @ApiModelProperty(value = "è¯ä»·å¯¹è±¡ç±»åï¼1=åä»¶é¨åºï¼2=åä»¶é¨åºï¼3=叿º", example = "1") private Integer targetType; @ApiModelProperty(value = "è¯ä»·å¯¹è±¡ä¸»é®(shop_info.idædriver_info.id)", example = "1") private Integer targetId; @ApiModelProperty(value = "è¯å1-5", example = "5") private Integer score; @ApiModelProperty(value = "è¯ä»·å 容") private String content; } server/services/src/main/java/com/doumee/dao/business/model/Orders.java
@@ -337,7 +337,7 @@ @ExcelColumn(name = "å¼å¸¸è´¹ç¨") private Long exceptionAmount; @ApiModelProperty(value = "å¼å¸¸è¡¥å¿/è¡¥å¿å¸æºï¼åï¼") @ApiModelProperty(value = "å¼å¸¸è¡¥å¿å¸æºï¼åï¼") @ExcelColumn(name = "å¼å¸¸è¡¥å¿") private Long exceptionFee; @@ -348,6 +348,10 @@ @ApiModelProperty(value = "ç»ç®ç¶æï¼0=å¾ ç»ç®ï¼1=å·²ç»ç®ï¼") private Integer settlementStatus; @ApiModelProperty(value = "ç»ç®æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date settlementTime; @ApiModelProperty(value = "䏿¹è®¢åå·") private String outTradeNo; server/services/src/main/java/com/doumee/dao/business/model/OrdersRefund.java
@@ -47,7 +47,7 @@ @ApiModelProperty(value = "订å主é®", example = "1") private Integer orderId; @ApiModelProperty(value = "鿬¾æ¹å¼ï¼0=æªåä»¶ç´æ¥åæ¶ï¼1=å¹³å°ç´æ¥åæ¶ï¼2=å·²åä»¶ç³è¯·åæ¶", example = "0") @ApiModelProperty(value = "鿬¾æ¹å¼ï¼0=æªåä»¶ç´æ¥åæ¶ï¼1=å¹³å°ç´æ¥åæ¶ï¼2=å·²åä»¶ç³è¯·åæ¶ï¼3=订å宿鿬¾", example = "0") private Integer type; @ApiModelProperty(value = "åæ¶åå ") server/services/src/main/java/com/doumee/dao/business/model/OtherOrders.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,90 @@ package com.doumee.dao.business.model; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.doumee.core.annotation.excel.ExcelColumn; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; /** * å ¶ä»è®¢åè®°å½ * @author rk * @date 2026/04/16 */ @Data @ApiModel("å ¶ä»è®¢åè®°å½") @TableName("`other_orders`") public class OtherOrders { @TableId(type = IdType.AUTO) @ApiModelProperty(value = "主é®", example = "1") @ExcelColumn(name = "主é®") private Integer id; @ApiModelProperty(value = "æ¯å¦å·²å é¤ 0æªå é¤ 1å·²å é¤", example = "0") @ExcelColumn(name = "æ¯å¦å·²å é¤") private Integer deleted; @ApiModelProperty(value = "å建人ç¼ç ", example = "1") @ExcelColumn(name = "å建人ç¼ç ") private Integer createUser; @ApiModelProperty(value = "å建æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ExcelColumn(name = "å建æ¶é´", width = 16, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date createTime; @ApiModelProperty(value = "æ´æ°äººç¼ç ", example = "1") @ExcelColumn(name = "æ´æ°äººç¼ç ") private Integer updateUser; @ApiModelProperty(value = "æ´æ°æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date updateTime; @ApiModelProperty(value = "夿³¨") @ExcelColumn(name = "夿³¨") private String remark; @ApiModelProperty(value = "订åç±»åï¼0=åºéºæ¼é订å;1=叿ºæ¼é订å;2=é¾æè´¹ç¨è®¢å", example = "0") @ExcelColumn(name = "订åç±»å", valueMapping = "0=åºéºæ¼é订å;1=叿ºæ¼é订å;2=é¾æè´¹ç¨è®¢å;") private Integer type; @ApiModelProperty(value = "å ³èä¼å主é®", example = "1") @ExcelColumn(name = "å ³èä¼å主é®") private Integer memberId; @ApiModelProperty(value = "å®é æ¯ä»è´¹ç¨") @ExcelColumn(name = "å®é æ¯ä»è´¹ç¨") private Long payAccount; @ApiModelProperty(value = "æ¯ä»ç¶æï¼0=æªæ¯ä»;1=å·²æ¯ä»", example = "0") @ExcelColumn(name = "æ¯ä»ç¶æ", valueMapping = "0=æªæ¯ä»;1=å·²æ¯ä»;") private Integer payStatus; @ApiModelProperty(value = "æ¯ä»æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ExcelColumn(name = "æ¯ä»æ¶é´", width = 16, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date payTime; @ApiModelProperty(value = "订åç¼å·") @ExcelColumn(name = "订åç¼å·") private String code; @ApiModelProperty(value = "微信平å°äº¤æè®¢åå·") @ExcelColumn(name = "微信平å°äº¤æè®¢åå·") private String wxExternalNo; @ApiModelProperty(value = "å ³èå¯å订å主é®", example = "1") @ExcelColumn(name = "å ³èå¯å订å主é®") private Integer orderId; @ApiModelProperty(value = "䏿¹è®¢åå·") @ExcelColumn(name = "䏿¹è®¢åå·") private String outTradeNo; } server/services/src/main/java/com/doumee/dao/business/model/ShopInfo.java
@@ -156,6 +156,12 @@ @ApiModelProperty(value = "é éèå´(km)") private BigDecimal deliveryArea; @ApiModelProperty(value = "å½åä½é¢(å)") private Long balance; @ApiModelProperty(value = "å岿»éé¢(å)") private Long totalBalance; @ApiModelProperty(value = "æ¯ä»å®æç°è´¦æ·") private String aliAccount; server/services/src/main/java/com/doumee/dao/dto/CommentOrderDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,44 @@ package com.doumee.dao.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; /** * 订åè¯ä»·è¯·æ± * * @author rk * @date 2026/04/16 */ @Data @ApiModel("订åè¯ä»·è¯·æ±") public class CommentOrderDTO { @NotNull(message = "订å主é®ä¸è½ä¸ºç©º") @ApiModelProperty(value = "订å主é®", required = true) private Integer orderId; @NotNull(message = "åä»¶é¨åºè¯åä¸è½ä¸ºç©º") @Min(value = 1, message = "è¯åæä½1æ") @Max(value = 5, message = "è¯åæé«5æ") @ApiModelProperty(value = "åä»¶é¨åºè¯å1-5", required = true, example = "5") private Integer depositScore; @Min(value = 1, message = "è¯åæä½1æ") @Max(value = 5, message = "è¯åæé«5æ") @ApiModelProperty(value = "åä»¶é¨åºè¯å1-5ï¼å¼å°å¯å䏿åä»¶é¨åºæ¶å¿ å¡«ï¼", example = "5") private Integer takeScore; @Min(value = 1, message = "è¯åæä½1æ") @Max(value = 5, message = "è¯åæé«5æ") @ApiModelProperty(value = "叿ºè¯å1-5ï¼å¼å°å¯å订åå¿ å¡«ï¼", example = "5") private Integer driverScore; @ApiModelProperty(value = "è¯ä»·å 容") private String content; } server/services/src/main/java/com/doumee/dao/dto/ShopApplyDTO.java
@@ -100,4 +100,8 @@ @ApiModelProperty(value = "社ä¿ç¼´çº³è¯æï¼ä¸ªäººç±»åå¿ å¡«ï¼æå¤3å¼ ï¼") @Size(max = 3, message = "社ä¿ç¼´çº³è¯ææå¤3å¼ ") private List<String> socialSecurityImgs; @ApiModelProperty(value = "æ¯ä»å®æç°è´¦æ·", required = true) @NotBlank(message = "æ¯ä»å®æç°è´¦æ·ä¸è½ä¸ºç©º") private String aliAccount; } server/services/src/main/java/com/doumee/dao/dto/StoreOutDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,31 @@ package com.doumee.dao.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import java.util.List; /** * é¨åºç¡®è®¤åºåºè¯·æ± * * @author rk * @date 2026/04/16 */ @Data @ApiModel("é¨åºç¡®è®¤åºåºè¯·æ±") public class StoreOutDTO { @NotNull(message = "订å主é®ä¸è½ä¸ºç©º") @ApiModelProperty(value = "订å主é®", required = true) private Integer orderId; @Size(max = 3, message = "æå¤ä¸ä¼ 3å¼ å¾ç") @ApiModelProperty(value = "åºåºå¾çå°ååè¡¨ï¼æå¤3å¼ ") private List<String> images; @ApiModelProperty(value = "åºåºå¤æ³¨") private String remark; } server/services/src/main/java/com/doumee/dao/dto/WithdrawalDTO.java
@@ -1,10 +1,12 @@ package com.doumee.dao.dto; import com.doumee.dao.business.model.Member; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.DecimalMin; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import java.math.BigDecimal; /** @@ -17,13 +19,13 @@ @ApiModel("æç°ç³è¯·") public class WithdrawalDTO { @ApiModelProperty(value = "æç°éé¢ (åä½ï¼å )") @ApiModelProperty(value = "æç°éé¢ (åä½ï¼å )", required = true) @NotNull(message = "æç°éé¢ä¸è½ä¸ºç©º") @DecimalMin(value = "0.01", message = "æç°éé¢ä¸è½å°äº0.01å ") private BigDecimal amount; @ApiModelProperty(value = "çå®å§å") private String name; @ApiModelProperty(value = "æ¯ä»å®æç°è´¦æ·", required = true) @NotBlank(message = "æ¯ä»å®æç°è´¦æ·ä¸è½ä¸ºç©º") private String aliAccount; @ApiModelProperty(value = "ç¨æ·ä¿¡æ¯",hidden = true) private Member member; } server/services/src/main/java/com/doumee/dao/vo/MyOrderVO.java
@@ -91,4 +91,9 @@ @ApiModelProperty(value = "ç©åæç»å表") private List<OrderItemVO> detailList; // ---- é¨åºç«¯ ---- @ApiModelProperty(value = "å½åé¨åºè§è²ï¼1=åä»¶é¨åºï¼2=åä»¶é¨åºï¼ä» é¨åºç«¯è¿åï¼") private Integer shopRole; } server/services/src/main/java/com/doumee/dao/vo/PlatformAboutVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,28 @@ package com.doumee.dao.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * å¹³å°ä¿¡æ¯ï¼å ³äºæä»¬ãåè®®çï¼ * * @author rk * @date 2026/04/16 */ @Data @ApiModel("å¹³å°ä¿¡æ¯") public class PlatformAboutVO { @ApiModelProperty(value = "å ³äºæä»¬") private String aboutUs; @ApiModelProperty(value = "ç¨æ·åè®®") private String userAgreement; @ApiModelProperty(value = "éç§åè®®") private String privacyAgreement; @ApiModelProperty(value = "æå¡ä»ç»") private String serverIntroduce; } server/services/src/main/java/com/doumee/dao/vo/RevenueStatisticsVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ package com.doumee.dao.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * æ¶çç»è®¡VO * @author rk * @date 2026/04/16 */ @Data @ApiModel("æ¶çç»è®¡") public class RevenueStatisticsVO { @ApiModelProperty(value = "å½åè´¦æ·ä½é¢ï¼åï¼") private Long balance; @ApiModelProperty(value = "å¾ ç»ç®éé¢ï¼åï¼") private Long pendingAmount; @ApiModelProperty(value = "累计æç°éé¢ï¼åï¼") private Long totalWithdrawn; @ApiModelProperty(value = "æç°ä¸éé¢ï¼åï¼") private Long withdrawingAmount; } server/services/src/main/java/com/doumee/dao/vo/ShopCenterVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,33 @@ package com.doumee.dao.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class ShopCenterVO { @ApiModelProperty(value = "é¨åºå¤´åå ¨è·¯å¾") private String fullCoverImg; @ApiModelProperty(value = "é¨åºå¤´ååè·¯å¾") private String coverImg; @ApiModelProperty(value = "é¨åºåç§°") private String shopName; @ApiModelProperty(value = "è系人åç§°") private String linkName; @ApiModelProperty(value = "é¨åºç±»åï¼0=个人ï¼1=ä¼ä¸") private Integer companyType; @ApiModelProperty(value = "æ¯å¦ææ¶æ¯") private Boolean hasMessage; @ApiModelProperty(value = "å¾ æ ¸éªè®¢åæ°é") private Integer waitDepositCount; @ApiModelProperty(value = "å¾ æ¶è´§è®¢åæ°é") private Integer waitReceiveCount; } server/services/src/main/java/com/doumee/dao/vo/UserCenterVO.java
@@ -1,6 +1,5 @@ package com.doumee.dao.vo; import com.doumee.core.annotation.excel.ExcelColumn; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -13,39 +12,28 @@ @Data public class UserCenterVO { @ApiModelProperty(value = "åå¸ä»»å¡æ»æ° - ååæ¹ä½¿ç¨") private Integer releaseTaskTotal; @ApiModelProperty(value = "ä¼å头åå ¨è·¯å¾") private String fullCoverImage; @ApiModelProperty(value = "å¾ æ¥å任塿»æ° - ååæ¹ä½¿ç¨") private Integer waitReceiveTotal; @ApiModelProperty(value = "ä¼å头ååè·¯å¾") private String coverImage; @ApiModelProperty(value = "è¿è¡ä¸ä»»å¡æ»æ° - ååæ¹ä½¿ç¨") private Integer doingTotal; @ApiModelProperty(value = "ä¼åæµç§°") private String nickName; @ApiModelProperty(value = "å¾ è¯ä»·ä»»å¡æ»æ° - ååæ¹ä½¿ç¨") private Integer waitCommentTotal; @ApiModelProperty(value = "å§å") private String name; @ApiModelProperty(value = "è¿è¡ä¸ä»»å¡æ°é - æ¥åæ¹ä½¿ç¨") private Integer taskingTotal; @ApiModelProperty(value = "èç³»çµè¯") private String telephone; @ApiModelProperty(value = "宿任塿°é - æ¥åæ¹ä½¿ç¨") private Integer doneTotal; @ApiModelProperty(value = "æ¯å¦ææ¶æ¯") private Boolean hasMessage; @ApiModelProperty(value = "å·²æ¥å任塿°é - æ¥åæ¹ä½¿ç¨") private Integer receiveTotal; @ApiModelProperty(value = "å¾ æ¯ä»è®¢åæ°é") private Integer waitPayCount; @ApiModelProperty(value = "æå¡ä»ç»") private String serverIntroduce; @ApiModelProperty(value = "å¾ æ¶è´§è®¢åæ°é") private Integer waitReceiveCount; @ApiModelProperty(value = "å ³äºæä»¬") private String aboutUs; @ApiModelProperty(value = "ç¨æ·åè®®") private String userAgreement; @ApiModelProperty(value = "éç§åè®®") private String privacyAgreement; @ApiModelProperty(value = "客æçµè¯ å¤ä¸ªä»¥,åå²") private String serverPhone; } server/services/src/main/java/com/doumee/service/business/IdentityInfoService.java
ÎļþÒÑɾ³ý server/services/src/main/java/com/doumee/service/business/MemberService.java
@@ -16,6 +16,7 @@ import com.doumee.dao.vo.AccountResponse; import com.doumee.dao.vo.MemberDetailVO; import com.doumee.dao.vo.MemberListVO; import com.doumee.dao.vo.PlatformAboutVO; import com.doumee.dao.vo.UserCenterVO; import me.chanjar.weixin.common.error.WxErrorException; import org.apache.commons.lang3.StringUtils; @@ -144,9 +145,9 @@ * @param memberId * @return */ Member getMemberInfo(Integer memberId); UserCenterVO getMemberInfo(Integer memberId); UserCenterVO getPlatformAboutUs(); PlatformAboutVO getPlatformAboutUs(); void logOut(String token,Integer memberId); server/services/src/main/java/com/doumee/service/business/OrdersService.java
@@ -7,6 +7,7 @@ import com.doumee.dao.dto.CalculateRemotePriceDTO; import com.doumee.dao.dto.CreateOrderDTO; import com.doumee.dao.dto.DispatchDTO; import com.doumee.dao.dto.CommentOrderDTO; import com.doumee.dao.dto.MyOrderDTO; import com.doumee.dao.vo.MyOrderDetailVO; import com.doumee.dao.vo.MyOrderVO; @@ -130,9 +131,9 @@ /** * ä¼ååæ¶è®¢åï¼ä» å¼å°å¯åï¼ * * @param orderId 订åä¸»é® * @param memberId ä¼åä¸»é® * @param reason åæ¶åå * @param orderId 订åä¸»é® * @param memberId ä¼åä¸»é® * @param reason åæ¶åå */ void cancelOrder(Integer orderId, Integer memberId, String reason); @@ -189,6 +190,7 @@ /** * 计ç®ä¿ä»·è´¹ç¨ * * @param declaredValue æ¥ä»·éé¢ * @return ä¿ä»·è´¹ç¨ */ @@ -196,6 +198,7 @@ /** * 计ç®å°±å°ååé¢ä¼°è´¹ç¨ * * @param dto å°±å°åå计价请æ±åæ° * @return ä»·æ ¼è®¡ç®ç»æ */ @@ -203,6 +206,7 @@ /** * 计ç®å¼å°ååé¢ä¼°è´¹ç¨ * * @param dto å¼å°åå计价请æ±åæ° * @return ä»·æ ¼è®¡ç®ç»æ */ @@ -210,7 +214,8 @@ /** * å建订åå¹¶å¤èµ·å¾®ä¿¡æ¯ä» * @param dto å建订å请æ±åæ° * * @param dto å建订å请æ±åæ° * @param memberId å½åç»å½ä¼åID * @return æ¯ä»ååº */ @@ -218,7 +223,8 @@ /** * ç»§ç»æ¯ä»ï¼å¾ æ¯ä»è®¢åéæ°å¤èµ·å¾®ä¿¡æ¯ä»ï¼ * @param orderId 订åä¸»é® * * @param orderId 订åä¸»é® * @param memberId å½åç»å½ä¼åID * @return æ¯ä»ååº */ @@ -226,6 +232,7 @@ /** * å°ç¨åºç«¯-æ¥è¯¢æç订åå页 * * @param pageWrap å页æ¥è¯¢åæ°ï¼modelå«statusï¼ * @param memberId ä¼åä¸»é® * @return åé¡µç»æ @@ -234,6 +241,7 @@ /** * æ¥è¯¢è®¢åè¶ æ¶è´¹ç¨ * * @param orderId 订åä¸»é® * @return è¶ æ¶è´¹ç¨è®¡ç®ç»æ */ @@ -260,4 +268,91 @@ */ void confirmCustomerArrived(Integer orderId, Integer shopId); } /** * é¾æè´¹ç¨æ¯ä»ï¼å¤èµ·å¾®ä¿¡æ¯ä»ï¼ * * @param orderId å¯å订åä¸»é® * @param memberId å½åç»å½ä¼åID * @return æ¯ä»ååº */ PayResponse payOverdueFee(Integer orderId, Integer memberId); /** * é¾æè´¹ç¨æ¯ä»åè°å¤ç * * @param outTradeNo åæ·è®¢åå· * @param wxTradeNo 微信订åå· */ void handleOverdueFeePayNotify(String outTradeNo, String wxTradeNo); /** * åä»¶é¨åºç¡®è®¤åºåº * å°±å°å¯å/å¼å°å¯åï¼åå¨åä»¶é¨åºï¼status=5ï¼overdueStatus=0/2ï¼confirmArriveTimeä¸ä¸ºç©º * åºåºå订å宿 * * @param orderId 订åä¸»é® * @param shopId å½åæä½é¨åºä¸»é® * @param images åºåºå¾çï¼æå¤3å¼ ï¼ * @param remark åºåºå¤æ³¨ */ void confirmStoreOut(Integer orderId, Integer shopId, List<String> images, String remark); /** * 计ç®å¹¶æ´æ°è®¢å䏿¹æ¶çï¼åä»¶é¨åº/åä»¶é¨åº/叿ºï¼ * å°±å°å¯åï¼ä» åä»¶é¨åºæ¶ç * å¼å°å¯åï¼åä»¶é¨åº + 叿ºæ¶çï¼æåä»¶é¨åºæ¶å ä¸åä»¶é¨åºæ¶ç * * @param orderId 订åä¸»é® */ void calculateAndSaveOrderFees(Integer orderId); /** * ä¼åå é¤è®¢åï¼é»è¾å é¤ï¼ä» 已宿/已忶/已鿬¾è®¢åå¯å é¤ï¼ * * @param orderId 订åä¸»é® * @param memberId ä¼åä¸»é® */ void deleteMyOrder(Integer orderId, Integer memberId); /** * é¨åºæ¯ä»æ¼éï¼å¤èµ·å¾®ä¿¡æ¯ä»ï¼ * * @param shopId é¨åºä¸»é® * @return æ¯ä»ååº */ PayResponse payShopDeposit(Integer shopId); /** * é¨åºæ¼éæ¯ä»åè°å¤ç * * @param outTradeNo åæ·è®¢åå· * @param wxTradeNo 微信订åå· */ void handleShopDepositPayNotify(String outTradeNo, String wxTradeNo); /** * 订åç»ç®ï¼æ ¹æ® SETTLEMENT_DATE é ç½®ï¼å°å·²å®æçå¾ ç»ç®è®¢åè¿è¡ç»ç® * æ´æ°è®¢åç»ç®ç¶æãRevenue å ¥è´¦ç¶æãé¨åº/叿ºä½é¢ */ void settleOrders(); /** * 订åè¯ä»· * status=7ä¸commentStatus=0æ¶å¯è¯ä»·ï¼æå¯¹è±¡ï¼åä»¶é¨åº/åä»¶é¨åº/叿ºï¼åå«è®°å½è¯å * * @param dto è¯ä»·è¯·æ± * @param memberId å½åç»å½ä¼åID */ void commentOrder(CommentOrderDTO dto, Integer memberId); /** * é¨åºç«¯è®¢åå页å表 * æ¥è¯¢åä»¶é¨åºæåä»¶é¨åºçäºå½åç»å½é¨åºç订å * * @param pageWrap å页æ¥è¯¢åæ°ï¼modelå«status/combinedStatusï¼ * @param shopId å½åç»å½é¨åºä¸»é® * @return åé¡µç»æ */ PageData<MyOrderVO> findShopOrderPage(PageWrap<MyOrderDTO> pageWrap, Integer shopId); } server/services/src/main/java/com/doumee/service/business/OtherOrdersService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,98 @@ package com.doumee.service.business; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.dao.business.model.OtherOrders; import java.util.List; /** * å ¶ä»è®¢åè®°å½Serviceå®ä¹ * @author rk * @date 2026/04/16 */ public interface OtherOrdersService { /** * å建 * * @param otherOrders å®ä½å¯¹è±¡ * @return Integer */ Integer create(OtherOrders otherOrders); /** * 主é®å é¤ * * @param id ä¸»é® */ void deleteById(Integer id); /** * å é¤ * * @param otherOrders å®ä½å¯¹è±¡ */ void delete(OtherOrders otherOrders); /** * æ¹é主é®å é¤ * * @param ids 主é®é */ void deleteByIdInBatch(List<Integer> ids); /** * 䏻鮿´æ° * * @param otherOrders å®ä½å¯¹è±¡ */ void updateById(OtherOrders otherOrders); /** * æ¹é䏻鮿´æ° * * @param otherOrdersList å®ä½é */ void updateByIdInBatch(List<OtherOrders> otherOrdersList); /** * 䏻鮿¥è¯¢ * * @param id ä¸»é® * @return OtherOrders */ OtherOrders findById(Integer id); /** * æ¡ä»¶æ¥è¯¢åæ¡è®°å½ * * @param otherOrders å®ä½å¯¹è±¡ * @return OtherOrders */ OtherOrders findOne(OtherOrders otherOrders); /** * æ¡ä»¶æ¥è¯¢ * * @param otherOrders å®ä½å¯¹è±¡ * @return List<OtherOrders> */ List<OtherOrders> findList(OtherOrders otherOrders); /** * å页æ¥è¯¢ * * @param pageWrap å页对象 * @return PageData<OtherOrders> */ PageData<OtherOrders> findPage(PageWrap<OtherOrders> pageWrap); /** * æ¡ä»¶ç»è®¡ * * @param otherOrders å®ä½å¯¹è±¡ * @return long */ long count(OtherOrders otherOrders); } server/services/src/main/java/com/doumee/service/business/RevenueService.java
@@ -3,6 +3,7 @@ import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.dao.business.model.Revenue; import com.doumee.dao.vo.RevenueStatisticsVO; import java.util.List; @@ -96,4 +97,20 @@ */ long count(Revenue revenue); /** * é¨åºæ¶çç»è®¡ * * @param shopId é¨åºä¸»é® * @return æ¶çç»è®¡ */ RevenueStatisticsVO getShopRevenueStatistics(Integer shopId); /** * 叿ºæ¶çç»è®¡ * * @param memberId ä¼åä¸»é® * @return æ¶çç»è®¡ */ RevenueStatisticsVO getDriverRevenueStatistics(Integer memberId); } server/services/src/main/java/com/doumee/service/business/ShopInfoService.java
@@ -6,6 +6,7 @@ import com.doumee.dao.business.model.Member; import com.doumee.dao.dto.*; import com.doumee.dao.vo.ShopLoginVO; import com.doumee.dao.vo.ShopCenterVO; import com.doumee.dao.vo.ShopDetailVO; import com.doumee.dao.vo.ShopNearbyVO; import com.doumee.dao.vo.ShopWebDetailVO; @@ -178,6 +179,13 @@ /** * è·åé¨åºç»å½åä¿¡æ¯ï¼é¨åºä¸å¿ï¼ * @param shopId é¨åºä¸»é® * @return é¨åºä¸å¿ä¿¡æ¯ */ ShopCenterVO getShopCenterInfo(Integer shopId); /** * é¨åºå¯ç ç»å½ * @param dto ç»å½è¯·æ± * @return ç»å½ç»æ server/services/src/main/java/com/doumee/service/business/WithdrawalOrdersService.java
@@ -4,6 +4,7 @@ import com.doumee.core.model.PageWrap; import com.doumee.dao.business.model.WithdrawalOrders; import com.doumee.dao.dto.WithdrawalApproveDTO; import com.doumee.dao.dto.WithdrawalDTO; import java.util.List; @@ -112,4 +113,20 @@ */ void approve(WithdrawalApproveDTO dto); /** * 叿ºæç°ç³è¯· * * @param dto æç°åæ° * @param memberId ä¼åä¸»é® */ void applyDriverWithdrawal(WithdrawalDTO dto, Integer memberId); /** * é¨åºæç°ç³è¯· * * @param dto æç°åæ° * @param shopId é¨åºä¸»é® */ void applyShopWithdrawal(WithdrawalDTO dto, Integer shopId); } server/services/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java
@@ -228,7 +228,7 @@ } private String getBannerPath() { return systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.RESOURCE_PATH).getCode() return systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.BANNER_FILES).getCode(); } } server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
@@ -139,7 +139,7 @@ throw new BusinessException(ResponseStatus.DATA_EMPTY); } if(StringUtils.isNotBlank(category.getIcon())){ String path = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RESOURCE_PATH).getCode() String path = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode() +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.CATEGORY_FILES).getCode(); category.setIconFull(path + category.getIcon()); } @@ -208,7 +208,7 @@ queryWrapper.orderByAsc(Category::getSortnum); PageData<Category> result =PageData.from(categoryMapper.selectJoinPage(page, Category.class,queryWrapper)); if(result!=null && result.getRecords()!=null){ String path = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RESOURCE_PATH).getCode() String path = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode() +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.CATEGORY_FILES).getCode(); for(Category cate : result.getRecords()){ try { @@ -236,7 +236,7 @@ .orderByAsc(Category::getSortnum) ); if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(categoryList)){ String path = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RESOURCE_PATH).getCode() String path = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode() +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.CATEGORY_FILES).getCode(); for (Category category:categoryList) { if(StringUtils.isNotBlank(category.getIcon())){ server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
@@ -555,7 +555,7 @@ // æ¼æ¥å¾çåç¼ String imgPrefix = ""; try { imgPrefix = systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.RESOURCE_PATH).getCode() imgPrefix = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.DRIVER_FILES).getCode(); } catch (Exception e) { // æªé ç½®æ¶å¿½ç¥ server/services/src/main/java/com/doumee/service/business/impl/IdentityInfoServiceImpl.java
ÎļþÒÑɾ³ý server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -12,12 +12,12 @@ import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.core.utils.Utils; import com.doumee.dao.business.IdentityInfoMapper; import com.doumee.dao.business.MemberMapper; import com.doumee.dao.business.OrdersMapper; import com.doumee.dao.business.ShopInfoMapper; import com.doumee.dao.business.SmsrecordMapper; import com.doumee.dao.business.model.IdentityInfo; import com.doumee.dao.business.model.Member; import com.doumee.dao.business.model.Orders; import com.doumee.dao.business.model.ShopInfo; import com.doumee.dao.business.model.MemberRevenue; import com.doumee.dao.business.model.Smsrecord; @@ -27,6 +27,7 @@ import com.doumee.dao.vo.AccountResponse; import com.doumee.dao.vo.MemberDetailVO; import com.doumee.dao.vo.MemberListVO; import com.doumee.dao.vo.PlatformAboutVO; import com.doumee.dao.vo.UserCenterVO; import com.doumee.service.business.MemberService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -45,6 +46,7 @@ import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Objects; @@ -64,9 +66,6 @@ private MemberMapper memberMapper; @Autowired private IdentityInfoMapper identityInfoMapper; @Autowired private SmsrecordMapper smsrecordMapper; @Autowired @@ -80,6 +79,9 @@ @Autowired private ShopInfoMapper shopInfoMapper; @Autowired private OrdersMapper ordersMapper; @Override @@ -129,8 +131,8 @@ throw new BusinessException(ResponseStatus.DATA_EMPTY); } if(StringUtils.isNotBlank(member.getCoverImage())){ String path = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RESOURCE_PATH).getCode() +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.MEMBER_FILES).getCode(); String path = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode() +systemDictDataBiz.queryByCode(Constants.OSS,Constants.MEMBER_FILES).getCode(); member.setFullCoverImage(path + member.getCoverImage()); } return member; @@ -323,8 +325,7 @@ member.setDeleted(Constants.ZERO); member.setOpenid(wxPhoneRequest.getOpenid()); member.setTelephone(mobile); member.setNickName(mobile); // member.setCoverImage("1.png"); member.setNickName(mobile.substring(0, 3) + "****" + mobile.substring(7)); member.setAmount(Constants.ZERO.longValue()); member.setTotalAmount(Constants.ZERO.longValue()); member.setStatus(Constants.ZERO); @@ -385,75 +386,51 @@ } // @Override // public void editUseIdentity(Member member){ // if(Objects.isNull(member) // || Objects.isNull(member.getUseIdentity())){ // throw new BusinessException(ResponseStatus.BAD_REQUEST); // } // if(Constants.equalsInteger(member.getUseIdentity(),Constants.ZERO)){ // member.setUseIdentity(Constants.ZERO); // memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getUseIdentity,Constants.ZERO).eq(Member::getId,member.getId())); // }else{ // if(identityInfoMapper.selectCount(new QueryWrapper<IdentityInfo>().lambda().eq(IdentityInfo::getDeleted,Constants.ZERO) // .eq(IdentityInfo::getMemberId,member.getId()) // .eq(IdentityInfo::getAuditStatus,Constants.TWO))>Constants.ZERO){ // memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getUseIdentity,Constants.ONE).eq(Member::getId,member.getId())); // }else{ // throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"å½åæ å¯ç¨æ¥å身份!"); // } // } // } @Override public Member getMemberInfo(Integer memberId){ Member member = this.findById(memberId); public UserCenterVO getMemberInfo(Integer memberId){ Member member = memberMapper.selectById(memberId); if(Objects.isNull(member)){ throw new BusinessException(ResponseStatus.DATA_EMPTY); } // ç¨æ·ä¸å¿æ°æ® UserCenterVO userCenterVO = new UserCenterVO(); userCenterVO.setNickName(member.getNickName()); userCenterVO.setName(member.getName()); userCenterVO.setTelephone(member.getTelephone()); userCenterVO.setCoverImage(member.getCoverImage()); if(StringUtils.isNotBlank(member.getCoverImage())){ String path = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RESOURCE_PATH).getCode() +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.MEMBER_FILES).getCode(); member.setFullCoverImage(path + member.getCoverImage()); String path = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode() +systemDictDataBiz.queryByCode(Constants.OSS,Constants.MEMBER_FILES).getCode(); userCenterVO.setFullCoverImage(path + member.getCoverImage()); } // UserCenterVO userCenterVO = new UserCenterVO(); // userCenterVO.setReleaseTaskTotal(Constants.ZERO); // userCenterVO.setWaitReceiveTotal(Constants.ZERO); // userCenterVO.setDoingTotal(Constants.ZERO); // userCenterVO.setWaitCommentTotal(Constants.ZERO); // userCenterVO.setTaskingTotal(Constants.ZERO); // userCenterVO.setDoneTotal(Constants.ZERO); // userCenterVO.setReceiveTotal(Constants.ZERO); // List<Orders> releaseOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda().eq(Orders::getDeleted,Constants.ZERO) // .eq(Orders::getReleaseMemberId,member.getId())); // if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(releaseOrders)){ // userCenterVO.setReleaseTaskTotal(releaseOrders.size()); // userCenterVO.setWaitCommentTotal(releaseOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.done.getKey())&&Constants.equalsInteger(i.getCommentStatus(),Constants.ZERO)).collect(Collectors.toList()).size()); // userCenterVO.setDoingTotal(releaseOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.doing.getKey())).collect(Collectors.toList()).size()); // userCenterVO.setWaitReceiveTotal(releaseOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.wait.getKey())).collect(Collectors.toList()).size()); // } // List<Orders> acceptOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda().eq(Orders::getDeleted,Constants.ZERO).eq(Orders::getAcceptMemberId,member.getId())); // if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(acceptOrders)){ // userCenterVO.setReceiveTotal(acceptOrders.size()); // userCenterVO.setTaskingTotal(acceptOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.doing.getKey())).collect(Collectors.toList()).size()); // userCenterVO.setDoneTotal(acceptOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.done.getKey())).collect(Collectors.toList()).size()); // } // member.setUserCenterVO(userCenterVO); return member; userCenterVO.setHasMessage(false); // å¾ æ¯ä»è®¢åæ°é Long waitPayCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda() .eq(Orders::getMemberId, memberId) .eq(Orders::getDeleted, Constants.ZERO) .eq(Orders::getStatus, Constants.OrderStatus.waitPay.getStatus())); userCenterVO.setWaitPayCount(waitPayCount.intValue()); // å¾ æ¶è´§è®¢åæ°é int[] waitReceiveStatuses = Constants.OrderCombinedStatus.waitReceive.getStatuses(); Long waitReceiveCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda() .eq(Orders::getMemberId, memberId) .eq(Orders::getDeleted, Constants.ZERO) .in(Orders::getStatus, Arrays.stream(waitReceiveStatuses).boxed().collect(Collectors.toList()))); userCenterVO.setWaitReceiveCount(waitReceiveCount.intValue()); return userCenterVO; } @Override public UserCenterVO getPlatformAboutUs(){ UserCenterVO userCenterVO = new UserCenterVO(); userCenterVO.setAboutUs(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.ABOUT_US).getCode())); userCenterVO.setUserAgreement(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.USER_AGREEMENT).getCode())); userCenterVO.setPrivacyAgreement(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PRIVACY_AGREEMENT).getCode())); userCenterVO.setServerIntroduce(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.SERVER_INTRODUCE).getCode())); return userCenterVO; public PlatformAboutVO getPlatformAboutUs(){ PlatformAboutVO vo = new PlatformAboutVO(); vo.setAboutUs(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.ABOUT_US).getCode())); vo.setUserAgreement(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.USER_AGREEMENT).getCode())); vo.setPrivacyAgreement(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PRIVACY_AGREEMENT).getCode())); vo.setServerIntroduce(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.SERVER_INTRODUCE).getCode())); return vo; } @Override @@ -543,8 +520,8 @@ detail.setArea(member.getArea()); detail.setAutoReceiveStatus(member.getAutoReceiveStatus()); if (StringUtils.isNotBlank(member.getCoverImage())) { String path = systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.MEMBER_FILES).getCode(); String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.OSS, Constants.MEMBER_FILES).getCode(); detail.setFullCoverImage(path + member.getCoverImage()); } return detail; server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
@@ -20,9 +20,11 @@ import com.doumee.dao.business.*; import com.doumee.dao.business.model.*; import com.doumee.dao.system.SystemUserMapper; import com.doumee.dao.system.model.SystemDictData; import com.doumee.dao.system.model.SystemUser; import com.doumee.dao.dto.CalculateLocalPriceDTO; import com.doumee.dao.dto.CalculateRemotePriceDTO; import com.doumee.dao.dto.CommentOrderDTO; import com.doumee.dao.dto.CreateOrderDTO; import com.doumee.dao.dto.DispatchDTO; import com.doumee.dao.dto.MyOrderDTO; @@ -30,6 +32,7 @@ import com.doumee.dao.vo.*; import com.doumee.service.business.OrderLogService; import com.doumee.service.business.OrdersService; import com.doumee.service.business.AreasService; import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest; import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; import com.github.binarywang.wxpay.exception.WxPayException; @@ -92,6 +95,15 @@ private OrdersRefundMapper ordersRefundMapper; @Autowired private OtherOrdersMapper otherOrdersMapper; @Autowired private OrderCommentMapper orderCommentMapper; @Autowired private RevenueMapper revenueMapper; @Autowired private WxMiniUtilService wxMiniUtilService; @Autowired @@ -107,6 +119,9 @@ @Autowired private OperationConfigBiz operationConfigBiz; @Autowired private AreasService areasService; @Override public Integer create(Orders orders) { @@ -1135,8 +1150,8 @@ private String getOrdersPrefix() { try { return systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.ORDERS_FILES).getCode(); return systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.OSS, Constants.ORDERS_FILES).getCode(); } catch (Exception e) { return ""; } @@ -1307,6 +1322,102 @@ vo.setDetailList(buildDetailList(details)); // é¾æä¿¡æ¯ï¼ä» å¾ åä»¶ç¶æè®¡ç®ï¼ if (Integer.valueOf(Constants.OrderStatus.arrived.getStatus()).equals(o.getStatus())) { OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(o, details); vo.setOverdue(overdueInfo.getOverdue()); vo.setOverdueDays(overdueInfo.getOverdueDays()); vo.setOverdueFee(overdueInfo.getOverdueFee()); } voList.add(vo); } } IPage<MyOrderVO> vPage = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); PageData<MyOrderVO> pageData = PageData.from(vPage); pageData.setRecords(voList); pageData.setTotal(orderPage.getTotal()); pageData.setPage(orderPage.getCurrent()); pageData.setCapacity(orderPage.getSize()); return pageData; } @Override public PageData<MyOrderVO> findShopOrderPage(PageWrap<MyOrderDTO> pageWrap, Integer shopId) { MyOrderDTO model = pageWrap.getModel(); Integer status = model != null ? model.getStatus() : null; Integer combinedStatus = model != null ? model.getCombinedStatus() : null; // è§£æåå¹¶ç¶æä¸ºå ·ä½ç¶æå表 List<Integer> statusList = null; if (combinedStatus != null) { Constants.OrderCombinedStatus combined = Constants.OrderCombinedStatus.getByKey(combinedStatus); if (combined != null) { statusList = new ArrayList<>(); for (int s : combined.getStatuses()) { statusList.add(s); } } } IPage<Orders> p = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper<Orders> wrapper = new MPJLambdaWrapper<Orders>() .selectAll(Orders.class) .select("s1.name", Orders::getDepositShopName) .select("s1.link_name", Orders::getDepositShopLinkName) .select("s1.link_phone", Orders::getDepositShopLinkPhone) .select("s2.name", Orders::getTakeShopName) .select("s2.address", Orders::getTakeShopAddress) .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID") .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID") .eq(Orders::getPayStatus, Constants.ONE) .and(w -> w.eq(Orders::getDepositShopId, shopId).or().eq(Orders::getTakeShopId, shopId)) .eq(status != null, Orders::getStatus, status) .in(statusList != null, Orders::getStatus, statusList) .orderByDesc(Orders::getCreateTime); IPage<Orders> orderPage = ordersMapper.selectJoinPage(p, Orders.class, wrapper); List<MyOrderVO> voList = new ArrayList<>(); if (orderPage != null && orderPage.getRecords() != null) { for (Orders o : orderPage.getRecords()) { MyOrderVO vo = new MyOrderVO(); vo.setId(o.getId()); vo.setCode(o.getCode()); vo.setType(o.getType()); vo.setStatus(o.getStatus()); vo.setCreateTime(o.getCreateTime()); vo.setExpectedTakeTime(o.getExpectedTakeTime()); vo.setDepositShopName(o.getDepositShopName()); vo.setDepositShopLinkName(o.getDepositShopLinkName()); vo.setDepositShopPhone(o.getDepositShopLinkPhone()); // é¨åºè§è²ï¼åä»¶é¨åº=1ï¼åä»¶é¨åº=2 if (Constants.equalsInteger(o.getDepositShopId(), shopId)) { vo.setShopRole(Constants.ONE); } else if (Constants.equalsInteger(o.getTakeShopId(), shopId)) { vo.setShopRole(Constants.TWO); } if (o.getTakeShopId() != null) { vo.setTakeShopName(o.getTakeShopName()); vo.setTakeShopAddress(o.getTakeShopAddress()); } else { vo.setTakeLocation(o.getTakeLocation()); vo.setTakeLocationRemark(o.getTakeLocationRemark()); } vo.setTakeUser(o.getTakeUser()); vo.setTakePhone(o.getTakePhone()); vo.setDeclaredFee(o.getDeclaredFee()); vo.setEstimatedAmount(o.getEstimatedAmount()); List<OrdersDetail> details = ordersDetailMapper.selectList( new QueryWrapper<OrdersDetail>().lambda() .eq(OrdersDetail::getOrderId, o.getId()) .eq(OrdersDetail::getDeleted, Constants.ZERO)); vo.setDetailList(buildDetailList(details)); if (Integer.valueOf(Constants.OrderStatus.arrived.getStatus()).equals(o.getStatus())) { OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(o, details); vo.setOverdue(overdueInfo.getOverdue()); @@ -1607,6 +1718,443 @@ } @Override @Transactional(rollbackFor = Exception.class) public PayResponse payOverdueFee(Integer orderId, Integer memberId) { // 1. æ¥è¯¢å¯å订å Orders order = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda() .eq(Orders::getId, orderId) .eq(Orders::getMemberId, memberId) .eq(Orders::getDeleted, Constants.ZERO)); if (order == null) { throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "订åä¸åå¨"); } // 2. æ ¡éªç¶æï¼å¾ åä»¶(5) + 龿(1) if (!Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.arrived.getStatus())) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "å½å订åç¶æä¸æ¯æé¾ææ¯ä»"); } if (!Constants.equalsInteger(order.getOverdueStatus(), Constants.ONE)) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "该订åä¸åå¨é¾æè´¹ç¨"); } if (order.getOverdueAmount() == null || order.getOverdueAmount() <= 0) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "é¾æè´¹ç¨å¼å¸¸ï¼æ æ³åèµ·æ¯ä»"); } // 3. æ¥è¯¢ä¼å Member member = memberMapper.selectById(memberId); if (member == null || StringUtils.isBlank(member.getOpenid())) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "ç¨æ·ä¿¡æ¯å¼å¸¸ï¼æ æ³åèµ·æ¯ä»"); } // 4. åå»ºé¾æè´¹ç¨è®¢å String outTradeNo = generateOrderTradeNo(); Date now = new Date(); OtherOrders otherOrders = new OtherOrders(); otherOrders.setType(Constants.TWO); // 2=é¾æè´¹ç¨è®¢å otherOrders.setMemberId(memberId); otherOrders.setOrderId(orderId); otherOrders.setPayAccount(order.getOverdueAmount()); otherOrders.setPayStatus(Constants.ZERO); otherOrders.setCode("OD" + new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(now) + orderId); otherOrders.setOutTradeNo(outTradeNo); otherOrders.setDeleted(Constants.ZERO); otherOrders.setCreateTime(now); otherOrdersMapper.insert(otherOrders); // 5. å¤èµ·å¾®ä¿¡æ¯ä» return wxPayForOtherOrder(otherOrders, member.getOpenid(), Constants.OrdersAttach.OVERDUE_FEE); } @Override @Transactional(rollbackFor = {Exception.class, BusinessException.class}) public void handleOverdueFeePayNotify(String outTradeNo, String wxTradeNo) { // 1. æ¥æ¾é¾æè´¹ç¨è®¢å OtherOrders otherOrders = otherOrdersMapper.selectOne(new QueryWrapper<OtherOrders>().lambda() .eq(OtherOrders::getOutTradeNo, outTradeNo) .eq(OtherOrders::getDeleted, Constants.ZERO) .last("limit 1")); if (otherOrders == null) { throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "é¾æè´¹ç¨è®¢åä¸åå¨: " + outTradeNo); } // 2. å¹çï¼å·²æ¯ä»åè·³è¿ if (Constants.equalsInteger(otherOrders.getPayStatus(), Constants.ONE)) { return; } Date now = new Date(); // 3. æ´æ°é¾æè´¹ç¨è®¢åç¶æ otherOrders.setPayStatus(Constants.ONE); otherOrders.setPayTime(now); otherOrders.setWxExternalNo(wxTradeNo); otherOrders.setUpdateTime(now); otherOrdersMapper.updateById(otherOrders); // 4. æ´æ°å¯å订åé¾æç¶æä¸ºå·²æ¯ä»(2)ï¼æ´æ°æ»éé¢ï¼éç®ä¸æ¹æ¶ç if (otherOrders.getOrderId() != null) { Orders order = ordersMapper.selectById(otherOrders.getOrderId()); if (order != null) { order.setOverdueStatus(Constants.TWO); // 2=å·²æ¯ä» // æ»éé¢ = åéé¢ + é¾æè´¹ç¨ Long overdueFee = otherOrders.getPayAccount() != null ? otherOrders.getPayAccount() : 0L; long newTotal = (order.getTotalAmount() != null ? order.getTotalAmount() : 0L) + overdueFee; order.setTotalAmount(newTotal); order.setUpdateTime(now); ordersMapper.updateById(order); // éç®ä¸æ¹æ¶ç calculateAndSaveOrderFees(order.getId()); } } } @Override public void deleteMyOrder(Integer orderId, Integer memberId) { Orders order = ordersMapper.selectById(orderId); if (order == null || !Constants.equalsInteger(order.getDeleted(), Constants.ZERO)) { throw new BusinessException(ResponseStatus.DATA_EMPTY); } if (!Constants.equalsInteger(order.getMemberId(), memberId)) { throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "æ ææä½æ¤è®¢å"); } // ä» å·²å®æ(7)ã已忶(99)ã已鿬¾(96)å¯å é¤ int status = Constants.formatIntegerNum(order.getStatus()); if (status != Constants.OrderStatus.finished.getStatus() && status != Constants.OrderStatus.cancelled.getStatus() && status != Constants.OrderStatus.closed.getStatus()) { throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "å½å订åç¶æä¸å¯å é¤"); } ordersMapper.update(new UpdateWrapper<Orders>().lambda() .set(Orders::getDeleted, Constants.ONE) .set(Orders::getUpdateTime, new Date()) .eq(Orders::getId, orderId)); } @Override @Transactional(rollbackFor = {Exception.class, BusinessException.class}) public PayResponse payShopDeposit(Integer shopId) { // 1. æ¥è¯¢é¨åºä¿¡æ¯ ShopInfo shopInfo = shopInfoMapper.selectById(shopId); if (shopInfo == null) { throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "é¨åºä¸åå¨"); } // 2. æ ¡éªç¶æï¼å®¡æ¹éè¿(1)æè½æ¯ä»æ¼é if (!Constants.equalsInteger(shopInfo.getAuditStatus(), Constants.ONE)) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "å½åé¨åºç¶æä¸æ¯ææ¯ä»æ¼é"); } if (shopInfo.getDepositAmount() == null || shopInfo.getDepositAmount() <= 0) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "æ¼ééé¢å¼å¸¸ï¼æ æ³åèµ·æ¯ä»"); } // 3. æ¥è¯¢ä¼åopenid Member member = memberMapper.selectById(shopInfo.getRegionMemberId()); if (member == null || StringUtils.isBlank(member.getOpenid())) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "ç¨æ·ä¿¡æ¯å¼å¸¸ï¼æ æ³åèµ·æ¯ä»"); } // 4. å建æ¼é订å String outTradeNo = generateOrderTradeNo(); Date now = new Date(); OtherOrders otherOrders = new OtherOrders(); otherOrders.setType(Constants.ZERO); // 0=åºéºæ¼é订å otherOrders.setMemberId(shopInfo.getRegionMemberId()); otherOrders.setPayAccount(shopInfo.getDepositAmount()); otherOrders.setPayStatus(Constants.ZERO); otherOrders.setCode("SD" + new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(now) + shopId); otherOrders.setOutTradeNo(outTradeNo); otherOrders.setDeleted(Constants.ZERO); otherOrders.setCreateTime(now); otherOrdersMapper.insert(otherOrders); // 5. å¤èµ·å¾®ä¿¡æ¯ä» return wxPayForOtherOrder(otherOrders, member.getOpenid(), Constants.OrdersAttach.SHOP_DEPOSIT); } @Override @Transactional(rollbackFor = {Exception.class, BusinessException.class}) public void handleShopDepositPayNotify(String outTradeNo, String wxTradeNo) { // 1. æ¥æ¾æ¼é订å OtherOrders otherOrders = otherOrdersMapper.selectOne(new QueryWrapper<OtherOrders>().lambda() .eq(OtherOrders::getOutTradeNo, outTradeNo) .eq(OtherOrders::getDeleted, Constants.ZERO) .last("limit 1")); if (otherOrders == null) { throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "æ¼é订åä¸åå¨: " + outTradeNo); } // 2. å¹çï¼å·²æ¯ä»åè·³è¿ if (Constants.equalsInteger(otherOrders.getPayStatus(), Constants.ONE)) { return; } Date now = new Date(); // 3. æ´æ°æ¼é订åç¶æ otherOrders.setPayStatus(Constants.ONE); otherOrders.setPayTime(now); otherOrders.setWxExternalNo(wxTradeNo); otherOrders.setUpdateTime(now); otherOrdersMapper.updateById(otherOrders); // 4. æ¥è¯¢é¨åºä¿¡æ¯ï¼éè¿æ³¨åä¼å主é®å ³èï¼ ShopInfo shopInfo = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda() .eq(ShopInfo::getRegionMemberId, otherOrders.getMemberId()) .eq(ShopInfo::getDeleted, Constants.ZERO) .last("limit 1")); if (shopInfo == null) { throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "é¨åºä¸åå¨"); } // 5. æ´æ°é¨åºç¶æï¼å·²æ¯ä»æ¼é shopInfo.setAuditStatus(Constants.THREE); // 3=å·²æ¯ä»æ¼é shopInfo.setPayStatus(Constants.ONE); shopInfo.setPayTime(now); shopInfo.setWxExternalNo(wxTradeNo); shopInfo.setCode(otherOrders.getCode()); Member member = memberMapper.selectById(otherOrders.getMemberId()); if (member != null) { shopInfo.setPayMemberOpenId(member.getOpenid()); } shopInfo.setUpdateTime(now); shopInfoMapper.updateById(shopInfo); // 6. æ¼éæ¯ä»å®æåï¼è¥å叿ªå¼éåèªå¨å¼é if (shopInfo.getAreaId() != null) { Areas shopArea = areasBiz.resolveArea(shopInfo.getAreaId()); if (shopArea != null && shopArea.getParentId() != null) { Areas cityArea = areasBiz.resolveArea(shopArea.getParentId()); if (cityArea != null && !Constants.equalsInteger(cityArea.getStatus(), Constants.ONE)) { cityArea.setStatus(Constants.ONE); cityArea.setEditDate(now); areasService.updateById(cityArea); areasService.cacheData(); } } } } @Override @Transactional(rollbackFor = {Exception.class, BusinessException.class}) public void settleOrders() { // 1. 读åç»ç®å¤©æ°é ç½® SystemDictData settlementConfig = systemDictDataBiz.queryByCode(Constants.OPERATION_CONFIG, Constants.OP_SETTLEMENT_DATE); if (settlementConfig == null || StringUtils.isBlank(settlementConfig.getCode())) { return; } int days = Integer.parseInt(settlementConfig.getCode()); // ç»ç®æªæ¢æ¶é´ = å½åæ¶é´ - N天 Calendar cal = Calendar.getInstance(); cal.add(Calendar.DAY_OF_MONTH, -days); Date deadline = cal.getTime(); // 2. æ¥è¯¢å·²å®æçå¾ ç»ç®è®¢åï¼å®ææ¶é´ <= æªæ¢æ¶é´ï¼ List<Orders> ordersList = ordersMapper.selectList(new QueryWrapper<Orders>().lambda() .eq(Orders::getDeleted, Constants.ZERO) .eq(Orders::getStatus, Constants.OrderStatus.finished.getStatus()) .eq(Orders::getSettlementStatus, Constants.ZERO) .le(Orders::getFinishTime, deadline)); if (ordersList == null || ordersList.isEmpty()) { return; } Date now = new Date(); for (Orders order : ordersList) { // 3. æ´æ°è®¢åç»ç®ç¶æ ordersMapper.update(new UpdateWrapper<Orders>().lambda() .set(Orders::getSettlementStatus, Constants.ONE) .set(Orders::getSettlementTime, now) .set(Orders::getUpdateTime, now) .eq(Orders::getId, order.getId())); // 4. æ¥è¯¢å ³èçå¾ å ¥è´¦ Revenue è®°å½ List<Revenue> revenues = revenueMapper.selectList(new QueryWrapper<Revenue>().lambda() .eq(Revenue::getObjId, order.getId()) .eq(Revenue::getObjType, Constants.ZERO) .eq(Revenue::getVaildStatus, Constants.ZERO) .eq(Revenue::getDeleted, Constants.ZERO)); for (Revenue revenue : revenues) { Long amount = revenue.getAmount() != null ? revenue.getAmount() : 0L; // æ´æ° Revenue ä¸ºå·²å ¥è´¦ revenueMapper.update(new UpdateWrapper<Revenue>().lambda() .set(Revenue::getVaildStatus, Constants.ONE) .set(Revenue::getUpdateTime, now) .eq(Revenue::getId, revenue.getId())); // æ ¹æ® memberType æ´æ°ä½é¢ if (Constants.equalsInteger(revenue.getMemberType(), Constants.ONE)) { // 叿ºï¼éè¿ memberId æ¥ DriverInfoï¼æ´æ° balance / totalBalance DriverInfo driver = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda() .eq(DriverInfo::getMemberId, revenue.getMemberId()) .eq(DriverInfo::getDeleted, Constants.ZERO) .last("limit 1")); if (driver != null) { driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda() .setSql(" BALANCE = IFNULL(BALANCE, 0) + " + amount) .setSql(" TOTAL_BALANCE = IFNULL(TOTAL_BALANCE, 0) + " + amount) .eq(DriverInfo::getId, driver.getId())); } } else if (Constants.equalsInteger(revenue.getMemberType(), Constants.TWO)) { // é¨åºï¼éè¿ memberId æ¥ ShopInfo(regionMemberId)ï¼æ´æ° balance / totalBalance ShopInfo shop = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda() .eq(ShopInfo::getRegionMemberId, revenue.getMemberId()) .eq(ShopInfo::getDeleted, Constants.ZERO) .last("limit 1")); if (shop != null) { shopInfoMapper.update(new UpdateWrapper<ShopInfo>().lambda() .setSql(" BALANCE = IFNULL(BALANCE, 0) + " + amount) .setSql(" TOTAL_BALANCE = IFNULL(TOTAL_BALANCE, 0) + " + amount) .eq(ShopInfo::getId, shop.getId())); } } } } } @Override @Transactional(rollbackFor = {Exception.class, BusinessException.class}) public void commentOrder(CommentOrderDTO dto, Integer memberId) { // 1. æ ¡éªè®¢å Orders order = ordersMapper.selectById(dto.getOrderId()); if (order == null || Constants.equalsInteger(order.getDeleted(), Constants.ONE)) { throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "订åä¸åå¨"); } if (!Constants.equalsInteger(order.getMemberId(), memberId)) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "æ æè¯ä»·è¯¥è®¢å"); } if (!Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.finished.getStatus())) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "å½å订åç¶æä¸æ¯æè¯ä»·"); } if (Constants.equalsInteger(order.getCommentStatus(), Constants.ONE)) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "该订åå·²è¯ä»·"); } // 2. å¼å°å¯å订åï¼åä»¶é¨åºå叿ºè¯åæ ¡éª boolean isRemote = Constants.equalsInteger(order.getType(), Constants.ONE); if (isRemote) { if (dto.getDriverScore() == null) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "å¼å°å¯å订åå¿ é¡»è¯ä»·å¸æº"); } if (order.getTakeShopId() != null && dto.getTakeScore() == null) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "请è¯ä»·åä»¶é¨åº"); } } Date now = new Date(); // 3. æ´æ°è®¢åè¯ä»·ç¶æ order.setCommentStatus(Constants.ONE); order.setCommentInfo(dto.getContent()); order.setCommentDepositLevel(dto.getDepositScore()); order.setCommentTakeLevel(dto.getTakeScore()); order.setCommentDriverLevel(dto.getDriverScore()); order.setCommentTime(now); order.setUpdateTime(now); ordersMapper.updateById(order); // 4. å建è¯ä»·è®°å½ // 4.1 åä»¶é¨åº OrderComment depositComment = new OrderComment(); depositComment.setOrderId(order.getId()); depositComment.setOrderCode(order.getCode()); depositComment.setMemberId(memberId); depositComment.setTargetType(Constants.ONE); // 1=åä»¶é¨åº depositComment.setTargetId(order.getDepositShopId()); depositComment.setScore(dto.getDepositScore()); depositComment.setContent(dto.getContent()); depositComment.setDeleted(Constants.ZERO); depositComment.setCreateTime(now); orderCommentMapper.insert(depositComment); // 4.2 åä»¶é¨åºï¼å¼å°å¯å䏿åä»¶é¨åºï¼ if (isRemote && order.getTakeShopId() != null && dto.getTakeScore() != null) { OrderComment takeComment = new OrderComment(); takeComment.setOrderId(order.getId()); takeComment.setOrderCode(order.getCode()); takeComment.setMemberId(memberId); takeComment.setTargetType(Constants.TWO); // 2=åä»¶é¨åº takeComment.setTargetId(order.getTakeShopId()); takeComment.setScore(dto.getTakeScore()); takeComment.setContent(dto.getContent()); takeComment.setDeleted(Constants.ZERO); takeComment.setCreateTime(now); orderCommentMapper.insert(takeComment); } // 4.3 叿ºï¼å¼å°å¯åï¼ if (isRemote && order.getAcceptDriver() != null && dto.getDriverScore() != null) { OrderComment driverComment = new OrderComment(); driverComment.setOrderId(order.getId()); driverComment.setOrderCode(order.getCode()); driverComment.setMemberId(memberId); driverComment.setTargetType(Constants.THREE); // 3=叿º driverComment.setTargetId(order.getAcceptDriver()); driverComment.setScore(dto.getDriverScore()); driverComment.setContent(dto.getContent()); driverComment.setDeleted(Constants.ZERO); driverComment.setCreateTime(now); orderCommentMapper.insert(driverComment); } // 5. æ´æ°é¨åº/叿ºå¹³åè¯å updateTargetScore(Constants.ONE, order.getDepositShopId()); if (isRemote && order.getTakeShopId() != null) { updateTargetScore(Constants.TWO, order.getTakeShopId()); } if (isRemote && order.getAcceptDriver() != null) { updateTargetScore(Constants.THREE, order.getAcceptDriver()); } } /** * æ´æ°è¯ä»·å¯¹è±¡ï¼é¨åº/叿ºï¼çå¹³åè¯å */ private void updateTargetScore(Integer targetType, Integer targetId) { List<OrderComment> comments = orderCommentMapper.selectList(new QueryWrapper<OrderComment>().lambda() .eq(OrderComment::getDeleted, Constants.ZERO) .eq(OrderComment::getTargetType, targetType) .eq(OrderComment::getTargetId, targetId)); if (comments.isEmpty()) { return; } double avg = comments.stream() .mapToInt(OrderComment::getScore) .average() .orElse(0.0); BigDecimal score = BigDecimal.valueOf(avg).setScale(1, BigDecimal.ROUND_HALF_UP); Date now = new Date(); if (Constants.equalsInteger(targetType, Constants.ONE) || Constants.equalsInteger(targetType, Constants.TWO)) { ShopInfo shopInfo = shopInfoMapper.selectById(targetId); if (shopInfo != null) { shopInfo.setScore(score); shopInfo.setUpdateTime(now); shopInfoMapper.updateById(shopInfo); } } else if (Constants.equalsInteger(targetType, Constants.THREE)) { DriverInfo driverInfo = driverInfoMapper.selectById(targetId); if (driverInfo != null) { driverInfo.setScore(score); driverInfo.setUpdateTime(now); driverInfoMapper.updateById(driverInfo); } } } /** * å¤èµ·å¾®ä¿¡æ¯ä»ï¼å ¶ä»è®¢åï¼ */ private PayResponse wxPayForOtherOrder(OtherOrders otherOrders, String openid, Constants.OrdersAttach ordersAttach) { try { WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest(); request.setBody(ordersAttach.getName()); request.setAttach(ordersAttach.getKey()); request.setOutTradeNo(otherOrders.getOutTradeNo()); long totalFee = otherOrders.getPayAccount() != null ? otherOrders.getPayAccount() : 0L; request.setTotalFee((int) totalFee); request.setTimeStart(DateUtil.DateToString(new Date(), "yyyyMMddHHmmss")); request.setSpbillCreateIp(Constants.getIpAddr()); request.setOpenid(openid); Object response = WxMiniConfig.wxPayService.createOrder(request); PayResponse payResponse = new PayResponse(); payResponse.setResponse(response); payResponse.setOrderId(otherOrders.getId()); return payResponse; } catch (WxPayException e) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "æ¯ä»è°èµ·å¤±è´¥ï¼" + e.getMessage()); } } @Override @Transactional(rollbackFor = {Exception.class, BusinessException.class}) public void shopVerifyOrder(String verifyCode, Integer shopId, List<String> images, String remark) { if (StringUtils.isBlank(verifyCode)) { @@ -1663,11 +2211,217 @@ releaseVerifyCode(verifyCode); // ä¿ååºåºå¾çï¼obj_type=13 é¨åºåºåºå¾çï¼æå¤3å¼ ï¼ saveVerifyImages(order.getId(), images, Constants.FileType.STORE_OUT.getKey(), shopId); // çææ¶çè®°å½ calculateAndSaveOrderFees(order.getId()); generateRevenueRecords(order.getId()); // è®°å½è®¢åæ¥å¿ saveShopVerifyLog(order, "é¨åºç¡®è®¤åä»¶", "é¨åºã" + shopName + "ã确认åä»¶ï¼è®¢å宿", remark, shopId); } else { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "å½å订åç¶æä¸å è®¸æ ¸é"); } } @Override @Transactional(rollbackFor = {Exception.class, BusinessException.class}) public void confirmStoreOut(Integer orderId, Integer shopId, List<String> images, String remark) { // 1. æ¥è¯¢è®¢å Orders order = ordersMapper.selectById(orderId); if (order == null || Constants.equalsInteger(order.getDeleted(), Constants.ONE)) { throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "订åä¸åå¨"); } // 2. æ ¡éªç¶æï¼å¾ åä»¶(5) if (!Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.arrived.getStatus())) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "å½å订åç¶æä¸å 许åºåº"); } // 3. æ ¡éªé¾æç¶æï¼0=æªé¾æ æ 2=å·²æ¯ä» if (order.getOverdueStatus() != null && Constants.equalsInteger(order.getOverdueStatus(), Constants.ONE)) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "订ååå¨é¾ææªæ¯ä»è´¹ç¨ï¼è¯·å å®æé¾æè´¹ç¨æ¯ä»"); } // 4. æ ¡éªç¡®è®¤å°åºæ¶é´ä¸ä¸ºç©º if (order.getConfirmArriveTime() == null) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "订åå°æªç¡®è®¤å°åºï¼æ æ³åºåº"); } // 5. æ ¡éªé¨åºä¸è®¢åå ³ç³» if (Constants.equalsInteger(order.getType(), Constants.ZERO)) { // å°±å°å¯åï¼åä»¶é¨åºå³åä»¶é¨åº if (!shopId.equals(order.getDepositShopId())) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "该订åä¸å±äºå½åé¨åº"); } } else { // å¼å°å¯åï¼æ ¡éªåä»¶é¨åº if (order.getTakeShopId() == null) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "è¯¥è®¢åæ åä»¶é¨åºï¼æ æ³åºåº"); } if (!shopId.equals(order.getTakeShopId())) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "该订åä¸å±äºå½åé¨åº"); } } // 6. æ¥è¯¢é¨åºåç§° String shopName = ""; ShopInfo shopInfo = shopInfoMapper.selectById(shopId); if (shopInfo != null) { shopName = shopInfo.getName() != null ? shopInfo.getName() : ""; } // 7. æ´æ°è®¢åç¶æä¸ºå·²å®æ Date now = new Date(); order.setStatus(Constants.OrderStatus.finished.getStatus()); order.setFinishTime(now); order.setUpdateTime(now); ordersMapper.updateById(order); // 8. éæ¾æ ¸éç if (StringUtils.isNotBlank(order.getMemberVerifyCode())) { releaseVerifyCode(order.getMemberVerifyCode()); } // 9. ä¿ååºåºå¾çï¼obj_type=13 é¨åºåºåºå¾çï¼æå¤3å¼ ï¼ saveVerifyImages(order.getId(), images, Constants.FileType.STORE_OUT.getKey(), shopId); // 10. 妿åå¨é款éé¢ï¼å ä¿å鿬¾è®°å½åè°ç¨å¾®ä¿¡é款 // 鿬¾è®°å½å¨é款è°ç¨åè½åºï¼é¿å 鿬¾æå使¬å°å¼å¸¸å¯¼è´æ è®°å½ if (order.getRefundAmount() != null && order.getRefundAmount() > 0 && StringUtils.isNotBlank(order.getOutTradeNo()) && order.getPayAmount() != null && order.getPayAmount() > 0) { OrdersRefund refundRecord = new OrdersRefund(); refundRecord.setOrderId(orderId); refundRecord.setType(3); // åºåºé款 refundRecord.setCreateTime(now); refundRecord.setRefundRemark(remark); refundRecord.setDeleted(Constants.ZERO); ordersRefundMapper.insert(refundRecord); // è°ç¨å¾®ä¿¡éæ¬¾ï¼æ¾å¨æåï¼ç¡®ä¿åç½®æä½å ¨é¨æåï¼ String refundCode = wxMiniUtilService.wxRefund( order.getOutTradeNo(), order.getPayAmount(), order.getRefundAmount()); // 鿬¾æååå填鿬¾åå·åæ¶é´ refundRecord.setRefundCode(refundCode); refundRecord.setRefundTime(new Date()); ordersRefundMapper.updateById(refundRecord); } // 11. çææ¶çè®°å½ calculateAndSaveOrderFees(orderId); generateRevenueRecords(orderId); // 12. è®°å½è®¢åæ¥å¿ String logInfo = "é¨åºã" + shopName + "ã确认åºåºï¼è®¢å宿"; if (order.getRefundAmount() != null && order.getRefundAmount() > 0) { logInfo += "ï¼é款" + Constants.getFormatMoney(order.getRefundAmount()) + "å "; } saveShopVerifyLog(order, "é¨åºç¡®è®¤åºåº", logInfo, remark, shopId); } @Override public void calculateAndSaveOrderFees(Integer orderId) { Orders order = ordersMapper.selectById(orderId); if (order == null || Constants.equalsInteger(order.getDeleted(), Constants.ONE)) { throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "订åä¸åå¨"); } Long totalAmount = order.getTotalAmount() != null ? order.getTotalAmount() : 0L; // è´¹çï¼ä¸ºç©ºæ¶é»è®¤0ï¼ BigDecimal depositRate = order.getDepositShopFeeRata() != null ? order.getDepositShopFeeRata() : BigDecimal.ZERO; BigDecimal takeRate = order.getTakeShopFeeRata() != null ? order.getTakeShopFeeRata() : BigDecimal.ZERO; BigDecimal driverRate = order.getDriverFeeRata() != null ? order.getDriverFeeRata() : BigDecimal.ZERO; Long exceptionFeeVal = order.getExceptionFee() != null ? order.getExceptionFee() : 0L; //åä»¶é¨åºæ¶ç Long depositShopFee = new BigDecimal(totalAmount) .multiply(depositRate) .setScale(0, RoundingMode.HALF_UP) .longValue(); Long takeShopFee = 0L; Long driverFee = 0L; if (Constants.equalsInteger(order.getType(), Constants.TWO)) { // å¼å°å¯åï¼åä»¶é¨åº + 叿º driverFee = new BigDecimal(totalAmount) .multiply(driverRate) .setScale(0, RoundingMode.HALF_UP) .longValue() + exceptionFeeVal; // å¼å°å¯å䏿åä»¶é¨åºï¼å ä¸åä»¶é¨åºæ¶ç if (order.getTakeShopId() != null) { takeShopFee = new BigDecimal(totalAmount) .multiply(takeRate) .setScale(0, RoundingMode.HALF_UP) .longValue(); } } ordersMapper.update(new UpdateWrapper<Orders>().lambda() .eq(Orders::getId, orderId) .set(Orders::getDepositShopFee, depositShopFee) .set(Orders::getTakeShopFee, takeShopFee) .set(Orders::getDriverFee, driverFee) .set(Orders::getUpdateTime, new Date())); } /** * çæé¨åº/叿ºæ¶çè®°å½ï¼æªç»ç®ï¼ * 订å宿æ¶è°ç¨ï¼è¯»å订åä¸å·²è®¡ç®å¥½çè´¹ç¨å段 */ private void generateRevenueRecords(Integer orderId) { Orders order = ordersMapper.selectById(orderId); if (order == null) { return; } Date now = new Date(); Long depositShopFee = order.getDepositShopFee() != null ? order.getDepositShopFee() : 0L; Long takeShopFee = order.getTakeShopFee() != null ? order.getTakeShopFee() : 0L; Long driverFee = order.getDriverFee() != null ? order.getDriverFee() : 0L; // åä»¶é¨åºæ¶ç if (depositShopFee > 0 && order.getDepositShopId() != null) { ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId()); if (depositShop != null && depositShop.getRegionMemberId() != null) { revenueMapper.insert(buildRevenue(depositShop.getRegionMemberId(), Constants.TWO, depositShopFee, orderId, order.getCode())); } } // åä»¶é¨åºæ¶çï¼å¼å°å¯å䏿åä»¶é¨åºï¼ if (takeShopFee > 0 && order.getTakeShopId() != null) { ShopInfo takeShop = shopInfoMapper.selectById(order.getTakeShopId()); if (takeShop != null && takeShop.getRegionMemberId() != null) { revenueMapper.insert(buildRevenue(takeShop.getRegionMemberId(), Constants.TWO, takeShopFee, orderId, order.getCode())); } } // 叿ºæ¶çï¼å¼å°å¯åï¼ if (driverFee > 0 && order.getAcceptDriver() != null) { DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver()); if (driver != null && driver.getMemberId() != null) { revenueMapper.insert(buildRevenue(driver.getMemberId(), Constants.ONE, driverFee, orderId, order.getCode())); } } } /** * æå»ºæ¶çè®°å½ */ private Revenue buildRevenue(Integer memberId, Integer memberType, Long amount, Integer orderId, String orderNo) { Revenue revenue = new Revenue(); revenue.setMemberId(memberId); revenue.setMemberType(memberType); // 1=叿º, 2=é¨åº revenue.setType(Constants.ZERO); // 0=å®æè®¢å revenue.setOptType(Constants.ONE); // 1=æ¶å ¥ revenue.setAmount(amount); revenue.setVaildStatus(Constants.ZERO); // 0=å ¥è´¦ä¸ï¼æªç»ç®ï¼ revenue.setObjId(orderId); revenue.setObjType(Constants.ZERO); // 0=订åä¸å¡ revenue.setStatus(Constants.ZERO); // 0=æå revenue.setOrderNo(orderNo); revenue.setDeleted(Constants.ZERO); revenue.setCreateTime(new Date()); return revenue; } @Override @@ -1799,23 +2553,48 @@ + "天ï¼é¾æè´¹ç¨" + Constants.getFormatMoney(overdueInfo.getOverdueFee()) + "å ", null, shopId); } else { // æªé¾æï¼å®æè®¢å order.setStatus(Constants.OrderStatus.finished.getStatus()); // æªé¾æï¼æ è®°é¾æç¶æä¸º0ï¼è®¢åä¿æå½åç¶æ order.setConfirmArriveTime(now); order.setFinishTime(now); order.setOverdueStatus(Constants.ZERO); // å°±å°å¯åï¼è®¡ç®æ¯å¦éè¦é款 if (Constants.equalsInteger(order.getType(), Constants.ZERO) && !CollectionUtils.isEmpty(details)) { int actualDays = calcActualDepositDays(now, order.getDepositTime()); order.setDepositDays(actualDays); int estimatedDays = order.getEstimatedDepositDays() != null ? order.getEstimatedDepositDays() : 1; int refundDays = estimatedDays - actualDays; if (refundDays > 0) { // 鿬¾éé¢ = 鿬¾å¤©æ° à Σ(ç©ååä»· à æ°é) long dailyBaseFee = 0L; for (OrdersDetail d : details) { dailyBaseFee += (d.getUnitPrice() != null ? d.getUnitPrice() : 0L) * (d.getNum() != null ? d.getNum() : 0); } long refundAmount = (long) refundDays * dailyBaseFee; order.setRefundAmount(refundAmount); } } order.setUpdateTime(now); ordersMapper.updateById(order); // éæ¾æ ¸éç if (StringUtils.isNotBlank(order.getMemberVerifyCode())) { releaseVerifyCode(order.getMemberVerifyCode()); // 鿬¾å¯¼è´æ»éé¢ååï¼éç®ä¸æ¹æ¶ç if (order.getRefundAmount() != null && order.getRefundAmount() > 0) { long newTotal = (order.getTotalAmount() != null ? order.getTotalAmount() : 0L) - order.getRefundAmount(); order.setTotalAmount(newTotal); ordersMapper.update(new UpdateWrapper<Orders>().lambda() .eq(Orders::getId, orderId) .set(Orders::getTotalAmount, newTotal)); calculateAndSaveOrderFees(orderId); } // è®°å½è®¢åæ¥å¿ saveShopVerifyLog(order, "确认顾客å°åº", "é¨åºã" + shopName + "ã确认顾客å°åºï¼è®¢å宿", null, shopId); String logInfo = "é¨åºã" + shopName + "ã确认顾客å°åºï¼æªé¾æ"; if (order.getRefundAmount() != null && order.getRefundAmount() > 0) { logInfo += "ï¼é鿬¾" + Constants.getFormatMoney(order.getRefundAmount()) + "å "; } saveShopVerifyLog(order, "确认顾客å°åº", logInfo, null, shopId); } } @@ -1972,6 +2751,32 @@ } /** * 计ç®å®é å¯å天æ°ï¼depositTime å° now ç天æ°å·®ï¼æå°1å¤©ï¼ */ private int calcActualDepositDays(Date now, Date depositTime) { if (depositTime == null || now == null) { return 1; } Calendar depositCal = Calendar.getInstance(); depositCal.setTime(depositTime); depositCal.set(Calendar.HOUR_OF_DAY, 0); depositCal.set(Calendar.MINUTE, 0); depositCal.set(Calendar.SECOND, 0); depositCal.set(Calendar.MILLISECOND, 0); Calendar nowCal = Calendar.getInstance(); nowCal.setTime(now); nowCal.set(Calendar.HOUR_OF_DAY, 0); nowCal.set(Calendar.MINUTE, 0); nowCal.set(Calendar.SECOND, 0); nowCal.set(Calendar.MILLISECOND, 0); long diffMs = nowCal.getTimeInMillis() - depositCal.getTimeInMillis(); int days = (int) (diffMs / (1000 * 60 * 60 * 24)); return Math.max(days, 1); } /** * å°±å°å¯å龿天æ°è®¡ç® * è¿äºé¢è®¡åä»¶æ¶é´å½å¤©ç12ç¹åæç®ä¸å¤© */ server/services/src/main/java/com/doumee/service/business/impl/OtherOrdersServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,131 @@ package com.doumee.service.business.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.doumee.core.constants.Constants; import com.doumee.core.exception.BusinessException; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.core.utils.Utils; import com.doumee.dao.business.OtherOrdersMapper; import com.doumee.dao.business.model.OtherOrders; import com.doumee.service.business.OtherOrdersService; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Objects; /** * å ¶ä»è®¢åè®°å½Serviceå®ç° * @author rk * @date 2026/04/16 */ @Service public class OtherOrdersServiceImpl implements OtherOrdersService { @Autowired private OtherOrdersMapper otherOrdersMapper; @Override public Integer create(OtherOrders otherOrders) { otherOrdersMapper.insert(otherOrders); return otherOrders.getId(); } @Override public void deleteById(Integer id) { otherOrdersMapper.update(new UpdateWrapper<OtherOrders>().lambda() .set(OtherOrders::getDeleted, Constants.ONE) .eq(OtherOrders::getId, id)); } @Override public void delete(OtherOrders otherOrders) { UpdateWrapper<OtherOrders> deleteWrapper = new UpdateWrapper<>(otherOrders); otherOrdersMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List<Integer> ids) { if (ids == null || ids.isEmpty()) { return; } otherOrdersMapper.deleteBatchIds(ids); } @Override public void updateById(OtherOrders otherOrders) { otherOrdersMapper.updateById(otherOrders); } @Override public void updateByIdInBatch(List<OtherOrders> otherOrdersList) { if (otherOrdersList == null || otherOrdersList.isEmpty()) { return; } for (OtherOrders otherOrders : otherOrdersList) { this.updateById(otherOrders); } } @Override public OtherOrders findById(Integer id) { OtherOrders otherOrders = otherOrdersMapper.selectById(id); if (Objects.isNull(otherOrders)) { throw new BusinessException(com.doumee.core.constants.ResponseStatus.DATA_EMPTY); } return otherOrders; } @Override public OtherOrders findOne(OtherOrders otherOrders) { QueryWrapper<OtherOrders> wrapper = new QueryWrapper<>(otherOrders); return otherOrdersMapper.selectOne(wrapper); } @Override public List<OtherOrders> findList(OtherOrders otherOrders) { QueryWrapper<OtherOrders> wrapper = new QueryWrapper<>(otherOrders); return otherOrdersMapper.selectList(wrapper); } @Override public PageData<OtherOrders> findPage(PageWrap<OtherOrders> pageWrap) { IPage<OtherOrders> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper<OtherOrders> queryWrapper = new MPJLambdaWrapper<OtherOrders>() .selectAll(OtherOrders.class); Utils.MP.blankToNull(pageWrap.getModel()); pageWrap.getModel().setDeleted(Constants.ZERO); OtherOrders model = pageWrap.getModel(); if (model.getType() != null) { queryWrapper.eq(OtherOrders::getType, model.getType()); } if (model.getMemberId() != null) { queryWrapper.eq(OtherOrders::getMemberId, model.getMemberId()); } if (model.getPayStatus() != null) { queryWrapper.eq(OtherOrders::getPayStatus, model.getPayStatus()); } if (model.getOrderId() != null) { queryWrapper.eq(OtherOrders::getOrderId, model.getOrderId()); } for (PageWrap.SortData sortData : pageWrap.getSorts()) { if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) { queryWrapper.orderByDesc(sortData.getProperty()); } else { queryWrapper.orderByAsc(sortData.getProperty()); } } return PageData.from(otherOrdersMapper.selectJoinPage(page, OtherOrders.class, queryWrapper)); } @Override public long count(OtherOrders otherOrders) { QueryWrapper<OtherOrders> wrapper = new QueryWrapper<>(otherOrders); return otherOrdersMapper.selectCount(wrapper); } } server/services/src/main/java/com/doumee/service/business/impl/RevenueServiceImpl.java
@@ -11,13 +11,21 @@ import com.doumee.core.model.PageWrap; import com.doumee.core.utils.Utils; import com.doumee.dao.business.RevenueMapper; import com.doumee.dao.business.WithdrawalOrdersMapper; import com.doumee.dao.business.MemberMapper; import com.doumee.dao.business.ShopInfoMapper; import com.doumee.dao.business.model.Revenue; 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.vo.RevenueStatisticsVO; import com.doumee.service.business.RevenueService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; import java.util.Objects; /** @@ -30,6 +38,15 @@ @Autowired private RevenueMapper revenueMapper; @Autowired private WithdrawalOrdersMapper withdrawalOrdersMapper; @Autowired private ShopInfoMapper shopInfoMapper; @Autowired private MemberMapper memberMapper; @Override public Integer create(Revenue revenue) { @@ -148,4 +165,74 @@ return revenueMapper.selectCount(wrapper); } @Override public RevenueStatisticsVO getShopRevenueStatistics(Integer shopId) { ShopInfo shop = shopInfoMapper.selectById(shopId); if (shop == null || Constants.equalsInteger(shop.getDeleted(), Constants.ONE)) { throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "é¨åºä¸åå¨"); } Integer memberId = shop.getRegionMemberId(); return buildRevenueStatistics(memberId, Constants.TWO, shop.getBalance()); } @Override public RevenueStatisticsVO getDriverRevenueStatistics(Integer memberId) { Member member = memberMapper.selectById(memberId); if (member == null) { throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "ç¨æ·ä¸åå¨"); } return buildRevenueStatistics(memberId, Constants.ONE, member.getAmount()); } /** * æå»ºæ¶çç»è®¡ * * @param memberId ä¼åä¸»é® * @param memberType ä¼åç±»åï¼1=叿ºï¼2=é¨åº * @param balance å½åä½é¢ï¼åï¼ */ private RevenueStatisticsVO buildRevenueStatistics(Integer memberId, Integer memberType, Long balance) { RevenueStatisticsVO vo = new RevenueStatisticsVO(); vo.setBalance(balance != null ? balance : 0L); // å¾ ç»ç®éé¢ï¼revenueä¸ vaildStatus=0 ä¸ type=0ï¼å®æè®¢åï¼çæ¶å ¥ä¹å QueryWrapper<Revenue> pendingWrapper = new QueryWrapper<>(); pendingWrapper.select("IFNULL(SUM(AMOUNT), 0) as amount") .eq("MEMBER_ID", memberId) .eq("MEMBER_TYPE", memberType) .eq("VAILD_STATUS", Constants.ZERO) .eq("TYPE", Constants.ZERO) .eq("OPT_TYPE", Constants.ONE) .eq("DELETED", Constants.ZERO); Map<String, Object> pendingResult = revenueMapper.selectMaps(pendingWrapper).stream().findFirst().orElse(null); vo.setPendingAmount(pendingResult != null && pendingResult.get("amount") != null ? Long.parseLong(pendingResult.get("amount").toString()) : 0L); // 累计æç°éé¢ï¼withdrawal_ordersä¸ status=1ï¼æç°æåï¼ä¸ type=0ï¼æç°ï¼ QueryWrapper<WithdrawalOrders> successWrapper = new QueryWrapper<>(); successWrapper.select("IFNULL(SUM(AMOUNT), 0) as amount") .eq("MEMBER_ID", memberId) .eq("MEMBER_TYPE", memberType) .eq("STATUS", Constants.ONE) .eq("TYPE", Constants.ZERO) .eq("DELETED", Constants.ZERO); Map<String, Object> successResult = withdrawalOrdersMapper.selectMaps(successWrapper).stream().findFirst().orElse(null); vo.setTotalWithdrawn(successResult != null && successResult.get("amount") != null ? Long.parseLong(successResult.get("amount").toString()) : 0L); // æç°ä¸éé¢ï¼withdrawal_ordersä¸ status=0ï¼æç°ç³è¯·ä¸ï¼ä¸ type=0ï¼æç°ï¼ QueryWrapper<WithdrawalOrders> progressWrapper = new QueryWrapper<>(); progressWrapper.select("IFNULL(SUM(AMOUNT), 0) as amount") .eq("MEMBER_ID", memberId) .eq("MEMBER_TYPE", memberType) .eq("STATUS", Constants.ZERO) .eq("TYPE", Constants.ZERO) .eq("DELETED", Constants.ZERO); Map<String, Object> progressResult = withdrawalOrdersMapper.selectMaps(progressWrapper).stream().findFirst().orElse(null); vo.setWithdrawingAmount(progressResult != null && progressResult.get("amount") != null ? Long.parseLong(progressResult.get("amount").toString()) : 0L); return vo; } } server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java
@@ -16,18 +16,24 @@ import com.doumee.biz.system.SystemDictDataBiz; import com.doumee.dao.business.MemberMapper; import com.doumee.dao.business.MultifileMapper; import com.doumee.dao.business.OrdersMapper; import com.doumee.dao.business.PricingRuleMapper; import com.doumee.dao.business.ShopInfoMapper; import com.doumee.dao.business.model.Areas; import com.doumee.dao.business.model.Member; import com.doumee.dao.business.model.Multifile; import com.doumee.dao.business.model.Orders; import com.doumee.dao.business.model.PricingRule; import com.doumee.dao.business.model.ShopInfo; import com.doumee.dao.dto.*; import com.doumee.dao.system.SystemUserMapper; import com.doumee.dao.system.model.SystemUser; import com.doumee.dao.vo.ShopDetailVO; import com.doumee.dao.vo.ShopCenterVO; import com.doumee.dao.vo.ShopLoginVO; import com.doumee.dao.vo.ShopNearbyVO; import com.doumee.dao.vo.ShopWebDetailVO; import com.doumee.service.business.AreasService; import com.doumee.service.business.ShopInfoService; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -68,6 +74,15 @@ @Autowired private RedisTemplate<String,Object> redisTemplate; @Autowired private PricingRuleMapper pricingRuleMapper; @Autowired private OrdersMapper ordersMapper; @Autowired private AreasService areasService; @Override public Integer create(ShopInfo shopInfo) { shopInfoMapper.insert(shopInfo); @@ -299,6 +314,7 @@ existing.setLegalPersonCard(request.getLegalPersonCard()); existing.setPassword(encryptedPassword); existing.setSalt(salt); existing.setAliAccount(request.getAliAccount()); existing.setAuditStatus(Constants.ZERO); existing.setUpdateTime(now); existing.setUpdateUser(memberId); @@ -328,6 +344,7 @@ shopInfo.setLegalPersonCard(request.getLegalPersonCard()); shopInfo.setPassword(encryptedPassword); shopInfo.setSalt(salt); shopInfo.setAliAccount(request.getAliAccount()); shopInfo.setOpenid(member.getOpenid()); shopInfo.setAuditStatus(Constants.ZERO); shopInfo.setStatus(Constants.ZERO); @@ -407,6 +424,38 @@ shopInfo.setAuditRemark(auditDTO.getAuditRemark()); shopInfo.setAuditUserId(auditDTO.getAuditUser()); shopInfo.setUpdateTime(now); // 审æ¹éè¿æ¶ï¼æ ¡éªåå¸pricing_ruleé ç½®ï¼è¯»åæ¼ééé¢ if (Constants.equalsInteger(newAuditStatus, Constants.ONE)) { // 1. è§£æé¨åºæå¨åå¸ Areas area = areasBiz.resolveArea(shopInfo.getAreaId()); if (area == null || area.getParentId() == null) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "é¨åºåºåä¿¡æ¯å¼å¸¸ï¼æ æ³ç¡®å®æå¨åå¸"); } Integer cityId = area.getParentId(); // 2. æ ¡éª pricing_rule é ç½®ï¼åå¸å¼é卿¼éæ¯ä»å®æåå¤çï¼ Areas cityArea = areasService.findById(cityId, Constants.ONE); if (cityArea == null) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "åå¸ä¿¡æ¯ä¸åå¨"); } if (!Constants.equalsInteger(cityArea.getStatus(), Constants.ONE)) { List<String> errors = validateCityPricingRules(cityId); if (!errors.isEmpty()) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "åå¸[" + cityArea.getName() + "]å°æªå¼éï¼å®ä»·è§åæªé ç½®å®æ´ï¼" + String.join("ï¼", errors)); } } // 3. ä»PricingRuleè¯»åæ¼ééé¢ PricingRule pricingRule = pricingRuleMapper.selectOne(new QueryWrapper<PricingRule>().lambda() .eq(PricingRule::getDeleted, Constants.ZERO) .eq(PricingRule::getType, Constants.THREE) .eq(PricingRule::getFieldA, String.valueOf(shopInfo.getCompanyType())) .last("limit 1")); if (pricingRule != null && StringUtils.isNotBlank(pricingRule.getFieldB())) { shopInfo.setDepositAmount(Long.parseLong(pricingRule.getFieldB())); } } shopInfoMapper.updateById(shopInfo); } @@ -612,7 +661,7 @@ // æ¼æ¥å¾çåç¼ String imgPrefix = ""; try { imgPrefix = systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.RESOURCE_PATH).getCode() imgPrefix = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.SHOP_FILES).getCode(); } catch (Exception e) { // æªé ç½®æ¶å¿½ç¥ @@ -670,7 +719,7 @@ if (payMember != null && StringUtils.isNotBlank(payMember.getCoverImage())) { String memberPrefix = ""; try { memberPrefix = systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.RESOURCE_PATH).getCode() memberPrefix = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.MEMBER_FILES).getCode(); } catch (Exception e) { // æªé ç½®æ¶å¿½ç¥ @@ -861,7 +910,7 @@ */ private String getShopPrefix() { try { return systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.RESOURCE_PATH).getCode() return systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.SHOP_FILES).getCode(); } catch (Exception e) { return ""; @@ -903,7 +952,37 @@ return urls; } @Override public ShopCenterVO getShopCenterInfo(Integer shopId) { ShopInfo shop = shopInfoMapper.selectById(shopId); if (shop == null || Constants.equalsInteger(shop.getDeleted(), Constants.ONE)) { throw new BusinessException(ResponseStatus.DATA_EMPTY); } ShopCenterVO vo = new ShopCenterVO(); vo.setShopName(shop.getName()); vo.setLinkName(shop.getLinkName()); vo.setCompanyType(shop.getCompanyType()); 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(); vo.setFullCoverImg(path + shop.getCoverImg()); } vo.setHasMessage(false); // å¾ æ ¸éªè®¢åæ°éï¼åä»¶é¨åºï¼status=1ï¼ Long waitDepositCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda() .eq(Orders::getDepositShopId, shopId) .eq(Orders::getDeleted, Constants.ZERO) .eq(Orders::getStatus, Constants.OrderStatus.waitDeposit.getStatus())); vo.setWaitDepositCount(waitDepositCount.intValue()); // å¾ æ¶è´§è®¢åæ°éï¼åä»¶é¨åºï¼status IN 4,5ï¼ Long waitReceiveCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda() .eq(Orders::getTakeShopId, shopId) .eq(Orders::getDeleted, Constants.ZERO) .in(Orders::getStatus, Constants.OrderStatus.delivering.getStatus(), Constants.OrderStatus.arrived.getStatus())); vo.setWaitReceiveCount(waitReceiveCount.intValue()); return vo; } /** * åæ·è´¦å·å¯ç ç»å½ @@ -993,4 +1072,91 @@ return vo; } /** * æ ¡éªåå¸å®ä»·è§åé ç½®æ¯å¦å®æ´ * @param cityId åå¸ä¸»é® * @return é误信æ¯å表ï¼ç©ºè¡¨ç¤ºæ ¡éªéè¿ */ private List<String> validateCityPricingRules(Integer cityId) { List<String> errors = new ArrayList<>(); // type=0 å°±å°ååè§åï¼è³å°1æ¡ï¼fieldBä¸ä¸ºç©º List<PricingRule> type0 = pricingRuleMapper.selectList(new QueryWrapper<PricingRule>().lambda() .eq(PricingRule::getDeleted, Constants.ZERO) .eq(PricingRule::getType, Constants.ZERO) .eq(PricingRule::getCityId, cityId)); if (type0.isEmpty()) { errors.add("缺å°å°±å°ååè§å"); } else if (type0.stream().allMatch(r -> StringUtils.isBlank(r.getFieldB()))) { errors.add("å°±å°ååè§åæªé ç½®æ¶è´¹åä»·"); } // type=1 å¼å°å¯éè§åï¼è³å°1æ¡ï¼fieldB/C/D/Eä¸ä¸ºç©º List<PricingRule> type1 = pricingRuleMapper.selectList(new QueryWrapper<PricingRule>().lambda() .eq(PricingRule::getDeleted, Constants.ZERO) .eq(PricingRule::getType, Constants.ONE) .eq(PricingRule::getCityId, cityId)); if (type1.isEmpty()) { errors.add("缺å°å¼å°å¯éè§å"); } else if (type1.stream().allMatch(r -> StringUtils.isAnyBlank(r.getFieldB(), r.getFieldC(), r.getFieldD(), r.getFieldE()))) { errors.add("å¼å°å¯éè§åé ç½®ä¸å®æ´"); } // type=2 é¢è®¡æ¶æï¼fieldA=1(æ éè¾¾) å fieldA=2(æéè¾¾) å1æ¡ List<PricingRule> type2 = pricingRuleMapper.selectList(new QueryWrapper<PricingRule>().lambda() .eq(PricingRule::getDeleted, Constants.ZERO) .eq(PricingRule::getType, Constants.TWO) .eq(PricingRule::getCityId, cityId)); Map<String, PricingRule> type2Map = type2.stream() .collect(Collectors.toMap(PricingRule::getFieldA, r -> r, (a, b) -> a)); if (!type2Map.containsKey("1")) { errors.add("缺å°é¢è®¡æ¶æ-æ éè¾¾é ç½®"); } else if (StringUtils.isAnyBlank(type2Map.get("1").getFieldB(), type2Map.get("1").getFieldC(), type2Map.get("1").getFieldD(), type2Map.get("1").getFieldE())) { errors.add("é¢è®¡æ¶æ-æ éè¾¾é ç½®ä¸å®æ´"); } if (!type2Map.containsKey("2")) { errors.add("缺å°é¢è®¡æ¶æ-æéè¾¾é ç½®"); } else if (StringUtils.isAnyBlank(type2Map.get("2").getFieldB(), type2Map.get("2").getFieldC(), type2Map.get("2").getFieldD(), type2Map.get("2").getFieldE())) { errors.add("é¢è®¡æ¶æ-æéè¾¾é ç½®ä¸å®æ´"); } // type=3 é¨åºæ³¨åæ¼éï¼fieldA=0(ä¼ä¸) å fieldA=1(个人) å1æ¡ï¼fieldBä¸ä¸ºç©º List<PricingRule> type3 = pricingRuleMapper.selectList(new QueryWrapper<PricingRule>().lambda() .eq(PricingRule::getDeleted, Constants.ZERO) .eq(PricingRule::getType, Constants.THREE) .eq(PricingRule::getCityId, cityId)); Map<String, PricingRule> type3Map = type3.stream() .collect(Collectors.toMap(PricingRule::getFieldA, r -> r, (a, b) -> a)); String[] depositNames = {"ä¼ä¸", "个人"}; for (int i = 0; i <= 1; i++) { String key = String.valueOf(i); if (!type3Map.containsKey(key)) { errors.add("缺å°é¨åºæ³¨åæ¼é-" + depositNames[i] + "é ç½®"); } else if (StringUtils.isBlank(type3Map.get(key).getFieldB())) { errors.add("é¨åºæ³¨åæ¼é-" + depositNames[i] + "æªé ç½®æ¼ééé¢"); } } // type=4 åææ¯ä¾ï¼fieldA=0~4 å ±5æ¡ï¼fieldBä¸ä¸ºç©º List<PricingRule> type4 = pricingRuleMapper.selectList(new QueryWrapper<PricingRule>().lambda() .eq(PricingRule::getDeleted, Constants.ZERO) .eq(PricingRule::getType, Constants.FOUR) .eq(PricingRule::getCityId, cityId)); String[] shareNames = {"ä¼ä¸å¯", "个人å¯", "ä¼ä¸å", "个人å", "é éå"}; Map<String, PricingRule> type4Map = type4.stream() .collect(Collectors.toMap(PricingRule::getFieldA, r -> r, (a, b) -> a)); for (int i = 0; i <= 4; i++) { String key = String.valueOf(i); if (!type4Map.containsKey(key)) { errors.add("缺å°åææ¯ä¾-" + shareNames[i] + "é ç½®"); } else if (StringUtils.isBlank(type4Map.get(key).getFieldB())) { errors.add("åææ¯ä¾-" + shareNames[i] + "æªé ç½®åææ¯ä¾"); } } return errors; } } server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java
@@ -11,12 +11,15 @@ import com.doumee.core.model.PageWrap; import com.doumee.core.utils.Utils; import com.doumee.dao.business.DriverInfoMapper; import com.doumee.dao.business.RevenueMapper; import com.doumee.dao.business.ShopInfoMapper; import com.doumee.dao.business.WithdrawalOrdersMapper; import com.doumee.dao.business.model.DriverInfo; import com.doumee.dao.business.model.Revenue; import com.doumee.dao.business.model.ShopInfo; import com.doumee.dao.business.model.WithdrawalOrders; import com.doumee.dao.dto.WithdrawalApproveDTO; import com.doumee.dao.dto.WithdrawalDTO; import com.doumee.dao.system.SystemUserMapper; import com.doumee.dao.system.model.SystemUser; import com.doumee.service.business.WithdrawalOrdersService; @@ -25,10 +28,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.concurrent.ThreadLocalRandom; /** * æç°ç³è¯·è®°å½Serviceå®ç° @@ -49,6 +55,9 @@ @Autowired private DriverInfoMapper driverInfoMapper; @Autowired private RevenueMapper revenueMapper; @Override public Integer create(WithdrawalOrders withdrawalOrders) { @@ -238,15 +247,60 @@ // è·åå½åç»å½ç¨æ· Integer currentUserId = getCurrentUserId(); Date now = new Date(); WithdrawalOrders update = new WithdrawalOrders(); update.setId(dto.getId()); update.setStatus(dto.getStatus()); update.setUserId(currentUserId); update.setApproveTime(new Date()); update.setApproveTime(now); update.setApproveRemark(dto.getApproveRemark()); update.setUpdateTime(new Date()); update.setUpdateTime(now); withdrawalOrdersMapper.updateById(update); // 驳忶éåä½é¢ if (Constants.TWO.equals(dto.getStatus())) { Long amountFen = order.getAmount() != null ? order.getAmount() : 0L; if (amountFen > 0 && order.getMemberId() != null) { if (Constants.equalsInteger(order.getMemberType(), Constants.ONE)) { // 叿ºï¼éè¿ memberId æ¥ DriverInfoï¼éå balance DriverInfo driver = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda() .eq(DriverInfo::getMemberId, order.getMemberId()) .eq(DriverInfo::getDeleted, Constants.ZERO) .last("limit 1")); if (driver != null) { driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda() .setSql(" BALANCE = IFNULL(BALANCE, 0) + " + amountFen) .eq(DriverInfo::getId, driver.getId())); } } else if (Constants.equalsInteger(order.getMemberType(), Constants.TWO)) { // é¨åºï¼éè¿ memberId æ¥ ShopInfoï¼éå balance ShopInfo shop = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda() .eq(ShopInfo::getRegionMemberId, order.getMemberId()) .eq(ShopInfo::getDeleted, Constants.ZERO) .last("limit 1")); if (shop != null) { shopInfoMapper.update(new UpdateWrapper<ShopInfo>().lambda() .setSql(" BALANCE = IFNULL(BALANCE, 0) + " + amountFen) .eq(ShopInfo::getId, shop.getId())); } } // å建éå Revenue è®°å½ Revenue revenue = new Revenue(); revenue.setMemberId(order.getMemberId()); revenue.setMemberType(order.getMemberType()); revenue.setType(Constants.TWO); // 2=æç°éå revenue.setOptType(Constants.ONE); // 1=æ¶å ¥ revenue.setAmount(amountFen); revenue.setVaildStatus(Constants.ONE); // å·²å ¥è´¦ revenue.setObjId(order.getId()); revenue.setObjType(Constants.ONE); // 1=æç°ä¸å¡ revenue.setStatus(Constants.ZERO); revenue.setDeleted(Constants.ZERO); revenue.setCreateTime(now); revenueMapper.insert(revenue); } } } private Integer getCurrentUserId() { @@ -289,4 +343,113 @@ } } @Override public void applyDriverWithdrawal(WithdrawalDTO dto, 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(), "叿ºä¿¡æ¯ä¸åå¨"); } long amountFen = dto.getAmount().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue(); long balance = driver.getBalance() != null ? driver.getBalance() : 0L; if (amountFen <= 0) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "æç°éé¢å¿ 须大äº0"); } if (amountFen > balance) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "æç°éé¢ä¸è½è¶ è¿å¯ç¨ä½é¢"); } String billNo = generateBillNo(); Date now = new Date(); // æ£å叿ºä½é¢ driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda() .setSql(" BALANCE = IFNULL(BALANCE, 0) - " + amountFen) .eq(DriverInfo::getId, driver.getId())); // å建æç°è®°å½ WithdrawalOrders order = new WithdrawalOrders(); order.setMemberId(memberId); order.setMemberType(Constants.ONE); order.setAmount(amountFen); order.setStatus(Constants.ZERO); order.setType(Constants.ZERO); order.setOutBillNo(billNo); order.setAliAccount(dto.getAliAccount()); order.setDeleted(Constants.ZERO); order.setCreateTime(now); order.setUpdateTime(now); order.setCreateUser(memberId); withdrawalOrdersMapper.insert(order); // å建æ¯åº Revenue è®°å½ Revenue revenue = new Revenue(); revenue.setMemberId(memberId); revenue.setMemberType(Constants.ONE); revenue.setType(Constants.ONE); revenue.setOptType(-Constants.ONE); revenue.setAmount(amountFen); revenue.setVaildStatus(Constants.ONE); revenue.setObjId(order.getId()); revenue.setObjType(Constants.ONE); revenue.setStatus(Constants.ZERO); revenue.setDeleted(Constants.ZERO); revenue.setCreateTime(now); revenueMapper.insert(revenue); } @Override public void applyShopWithdrawal(WithdrawalDTO dto, Integer shopId) { ShopInfo shop = shopInfoMapper.selectById(shopId); if (shop == null) { throw new BusinessException(ResponseStatus.DATA_EMPTY); } long amountFen = dto.getAmount().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue(); long balance = shop.getBalance() != null ? shop.getBalance() : 0L; if (amountFen <= 0) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "æç°éé¢å¿ 须大äº0"); } if (amountFen > balance) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "æç°éé¢ä¸è½è¶ è¿å¯ç¨ä½é¢"); } String billNo = generateBillNo(); Date now = new Date(); // æ£åé¨åºä½é¢ shopInfoMapper.update(new UpdateWrapper<ShopInfo>().lambda() .setSql(" BALANCE = IFNULL(BALANCE, 0) - " + amountFen) .eq(ShopInfo::getId, shopId)); // å建æç°è®°å½ WithdrawalOrders order = new WithdrawalOrders(); order.setMemberId(shop.getRegionMemberId()); order.setMemberType(Constants.TWO); order.setAmount(amountFen); order.setStatus(Constants.ZERO); order.setType(Constants.ZERO); order.setOutBillNo(billNo); order.setAliAccount(dto.getAliAccount()); order.setDeleted(Constants.ZERO); order.setCreateTime(now); order.setUpdateTime(now); order.setCreateUser(shop.getRegionMemberId()); withdrawalOrdersMapper.insert(order); // å建æ¯åº Revenue è®°å½ Revenue revenue = new Revenue(); revenue.setMemberId(shop.getRegionMemberId()); revenue.setMemberType(Constants.TWO); revenue.setType(Constants.ONE); // 1=æç°æ¯åº revenue.setOptType(-Constants.ONE); // -1=æ¯åº revenue.setAmount(amountFen); revenue.setVaildStatus(Constants.ONE); // å·²å ¥è´¦ revenue.setObjId(order.getId()); revenue.setObjType(Constants.ONE); // 1=æç°ä¸å¡ revenue.setStatus(Constants.ZERO); revenue.setDeleted(Constants.ZERO); revenue.setCreateTime(now); revenueMapper.insert(revenue); } private String generateBillNo() { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); String random = String.valueOf(ThreadLocalRandom.current().nextInt(100000, 999999)); return "TX" + sdf.format(new Date()) + random; } } server/web/src/main/java/com/doumee/api/web/AccountApi.java
@@ -61,6 +61,7 @@ return ApiResponse.success("æä½æå",memberService.wxAuthPhone(wxPhoneRequest)); } @ApiOperation(value = "é¨åºè´¦å·å¯ç ç»å½", notes = "å°ç¨åºç«¯ï¼é¨åºç¨æ·éè¿ææºå·+å¯ç ç»å½") @PostMapping("/shopLogin") public ApiResponse<ShopLoginVO> shopLogin(@RequestBody @Validated ShopLoginDTO dto) { server/web/src/main/java/com/doumee/api/web/ConfigApi.java
@@ -10,7 +10,7 @@ import com.doumee.dao.dto.CalculateRemotePriceDTO; import com.doumee.dao.vo.AccountResponse; import com.doumee.dao.vo.PriceCalculateVO; import com.doumee.dao.vo.UserCenterVO; import com.doumee.dao.vo.PlatformAboutVO; import com.doumee.service.business.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -89,12 +89,9 @@ @ApiOperation(value = "è·åç³»ç»é ç½®", notes = "å°ç¨åºç«¯") @GetMapping("/getPlatformAboutUs") public ApiResponse<UserCenterVO> getPlatformAboutUs() { public ApiResponse<PlatformAboutVO> getPlatformAboutUs() { return ApiResponse.success("æ¥è¯¢æå",memberService.getPlatformAboutUs()); } @LoginRequired @ApiOperation(value = "计ç®ä¿ä»·è´¹ç¨", notes = "æ ¹æ®æ¥ä»·éé¢è®¡ç®ä¿ä»·è´¹ç¨") server/web/src/main/java/com/doumee/api/web/MemberApi.java
@@ -42,7 +42,7 @@ @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true), }) public ApiResponse<Member> getMemberInfo() { public ApiResponse<UserCenterVO> getMemberInfo() { return ApiResponse.success("æ¥è¯¢æå",memberService.getMemberInfo(getMemberId())); } server/web/src/main/java/com/doumee/api/web/OrdersApi.java
@@ -7,9 +7,12 @@ import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.dao.dto.CancelOrderDTO; import com.doumee.dao.dto.CommentOrderDTO; import com.doumee.dao.dto.ConfirmArriveDTO; import com.doumee.dao.dto.CreateOrderDTO; import com.doumee.dao.dto.DriverVerifyDTO; import com.doumee.dao.dto.ShopVerifyDTO; import com.doumee.dao.dto.StoreOutDTO; import com.doumee.dao.dto.MyOrderDTO; import com.doumee.dao.vo.MyOrderDetailVO; import com.doumee.dao.vo.MyOrderVO; @@ -77,6 +80,16 @@ return ApiResponse.success("æ¥è¯¢æå", ordersService.findMyOrderPage(pageWrap, getMemberId())); } @LoginShopRequired @ApiOperation(value = "é¨åºè®¢åå页", notes = "é¨åºç«¯ï¼æ¥è¯¢åä»¶/åä»¶é¨åºä¸ºå½åé¨åºç订å") @PostMapping("/shopPage") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "é¨åºtokenå¼", required = true) }) public ApiResponse<PageData<MyOrderVO>> shopPage(@RequestBody @Validated PageWrap<MyOrderDTO> pageWrap) { return ApiResponse.success("æ¥è¯¢æå", ordersService.findShopOrderPage(pageWrap, getShopId())); } @LoginRequired @ApiOperation(value = "ä¼å订å详æ ", notes = "å°ç¨åºç«¯ï¼æ¥è¯¢å½åä¼åç订å详æ ") @GetMapping("/detail/{orderId}") @@ -108,6 +121,29 @@ }) public ApiResponse<OverdueFeeVO> overdueFee(@PathVariable Integer orderId) { return ApiResponse.success("æ¥è¯¢æå", ordersService.calculateOverdueFee(orderId)); } @LoginRequired @ApiOperation(value = "é¾æè´¹ç¨æ¯ä»", notes = "é¾æè®¢åå¤èµ·å¾®ä¿¡æ¯ä»") @PostMapping("/payOverdueFee/{orderId}") @ApiImplicitParams({ @ApiImplicitParam(paramType = "path", dataType = "Integer", name = "orderId", value = "订å主é®", required = true), @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true) }) public ApiResponse<PayResponse> payOverdueFee(@PathVariable Integer orderId) { return ApiResponse.success("æä½æå", ordersService.payOverdueFee(orderId, getMemberId())); } @LoginRequired @ApiOperation(value = "ä¼åå é¤è®¢å", notes = "ä» å·²å®æ/已忶/已鿬¾è®¢åå¯å é¤ï¼é»è¾å é¤") @PostMapping("/delete/{orderId}") @ApiImplicitParams({ @ApiImplicitParam(paramType = "path", dataType = "Integer", name = "orderId", value = "订å主é®", required = true), @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true) }) public ApiResponse deleteOrder(@PathVariable Integer orderId) { ordersService.deleteMyOrder(orderId, getMemberId()); return ApiResponse.success("å 餿å"); } @LoginShopRequired @@ -145,5 +181,38 @@ return ApiResponse.success("æ¥è¯¢æå", ordersService.findShopOrderDetail(orderId, verifyCode)); } @LoginShopRequired @ApiOperation(value = "é¨åºç¡®è®¤åºåº", notes = "åä»¶é¨åºç¡®è®¤åºåºï¼è®¢å宿") @PostMapping("/storeOut") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "é¨åºtokenå¼", required = true) }) public ApiResponse storeOut(@RequestBody @Validated StoreOutDTO dto) { ordersService.confirmStoreOut(dto.getOrderId(), getShopId(), dto.getImages(), dto.getRemark()); return ApiResponse.success("åºåºæå"); } @LoginShopRequired @ApiOperation(value = "确认顾客å°åº", notes = "é¨åºç¡®è®¤é¡¾å®¢å·²å°åºåä»¶ï¼æ£æ¥é¾æ/鿬¾") @PostMapping("/confirmArrived") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "é¨åºtokenå¼", required = true) }) public ApiResponse confirmArrived(@RequestBody @Validated ConfirmArriveDTO dto) { ordersService.confirmCustomerArrived(dto.getOrderId(), getShopId()); return ApiResponse.success("æä½æå"); } @LoginRequired @ApiOperation(value = "订åè¯ä»·", notes = "已宿䏿ªè¯ä»·ç订åå¯è¿è¡è¯ä»·") @PostMapping("/comment") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true) }) public ApiResponse comment(@RequestBody @Validated CommentOrderDTO dto) { ordersService.commentOrder(dto, getMemberId()); return ApiResponse.success("è¯ä»·æå"); } } server/web/src/main/java/com/doumee/api/web/PaymentCallback.java
@@ -58,12 +58,12 @@ } //åºéºæ¼é订å case "shopDeposit": { ordersService.handleShopDepositPayNotify(outTradeNo, paymentNo); break; } //é¾æè´¹ç¨è®¢å case "overdueFee": { ordersService.handleOverdueFeePayNotify(outTradeNo, paymentNo); break; } } server/web/src/main/java/com/doumee/api/web/ShopInfoApi.java
@@ -11,10 +11,15 @@ import com.doumee.dao.dto.ShopInfoMaintainDTO; import com.doumee.dao.dto.ShopNearbyDTO; import com.doumee.dao.vo.ShopDetailVO; import com.doumee.dao.vo.ShopCenterVO; import com.doumee.dao.vo.ShopNearbyVO; import com.doumee.dao.vo.ShopWebDetailVO; import com.doumee.dao.vo.PayResponse; import com.doumee.service.business.OrdersService; import com.doumee.service.business.ShopInfoService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; @@ -32,6 +37,9 @@ @Autowired private ShopInfoService shopInfoService; @Autowired private OrdersService ordersService; @LoginRequired @ApiOperation("é¨åºå ¥é©»ç³è¯·/ä¿®æ¹") @@ -62,6 +70,16 @@ } @LoginShopRequired @ApiOperation("è·åé¨åºç»å½åä¿¡æ¯") @GetMapping("/getShopInfo") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "é¨åºtokenå¼", required = true) }) public ApiResponse<ShopCenterVO> getShopInfo() { return ApiResponse.success("æ¥è¯¢æå", shopInfoService.getShopCenterInfo(getShopId())); } @LoginShopRequired @ApiOperation("ç»´æ¤é¨åºä¿¡æ¯ï¼æ¯ä»æ¼éåï¼") @PostMapping("/maintain") public ApiResponse maintain(@RequestBody ShopInfoMaintainDTO dto) { @@ -76,4 +94,14 @@ return ApiResponse.success(shopInfoService.getShopMaintainInfo(this.getMemberId())); } @LoginShopRequired @ApiOperation("é¨åºæ¯ä»æ¼é") @PostMapping("/payDeposit") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "é¨åºtokenå¼", required = true) }) public ApiResponse<PayResponse> payDeposit() { return ApiResponse.success("æä½æå", ordersService.payShopDeposit(getShopId())); } } server/web/src/main/java/com/doumee/api/web/WalletApi.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,6 @@ package com.doumee.api.web;/** * Created by IntelliJ IDEA. * @Author : Rk * @create 2026/4/16 18:05 */public class WalletApi { }