From 4417f5fb274f517b917a52fd57bce0802abedfd6 Mon Sep 17 00:00:00 2001 From: quyixiao <2621048238@qq.com> Date: Wed, 11 Feb 2026 18:44:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/controller/vv/AppOrderController.java | 85 +++++++++++++---- .../controller/vv/AppUserLoginController.java | 93 ++++++++++++++++--- 2 files changed, 146 insertions(+), 32 deletions(-) diff --git a/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppOrderController.java b/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppOrderController.java index 8f8523e..050a87e 100644 --- a/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppOrderController.java +++ b/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppOrderController.java @@ -46,7 +46,12 @@ import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; - +/** + * App订单控制器 + * 提供订单的创建、查询、支付、发货、确认收货、退款等完整的订单生命周期管理功能 + * + * @author heyu + */ @Slf4j @RestController @RequestMapping("/app/order") @@ -130,18 +135,21 @@ public class AppOrderController { private VvActivityDao vvActivityDao; - /*** - * https://api.1024api.com/api-interface/app/order/list + /** + * 订单列表查询 + * 支持按状态、时间、商品名称等多维度查询订单 + * 支持分页查询,返回订单包裹信息 * - * http://localhost:8888/app/order/list - * - * 列表 - * todo quyixiao + * @param vvOrderRequest 订单查询请求参数 + * @return 订单列表,包含订单详情和物流信息 */ @Describe("订单列表") @RequestMapping("/list") @AppRealyLogin public R list(@RequestBody AppOrderRequest vvOrderRequest) { + log.info("[订单列表查询] 开始查询, buyerId={}, status={}, pageNum={}, pageSize={}", + vvOrderRequest.getBuyerId(), vvOrderRequest.getStatus(), + vvOrderRequest.getPageNum(), vvOrderRequest.getPageSize()); Integer commentStatus = null; if(ApiConstants.WAIT_COMMENT.equals(vvOrderRequest.getStatus())){ commentStatus = 0; @@ -187,19 +195,25 @@ public class AppOrderController { List appPackageDTOList = vvTradeOrderConvertService.buildAppPackageDTO(vvOrderListResps); + log.info("[订单列表查询] 查询完成, buyerId={}, 订单数量={}, 包裹数量={}", + vvOrderRequest.getBuyerId(), tradeOrderEntities.size(), appPackageDTOList.size()); + return R.ok().setData(appPackageDTOList); } - /*** + /** + * 订单数量统计 + * 统计用户各个状态的订单数量(待支付、待发货、配送中) * - * - * http://localhost:8888/app/order/count + * @param appCountRequest 统计请求参数 + * @return 各状态订单数量统计 */ @Describe("订单数量") @RequestMapping("/count") @AppRealyLogin public R list(@RequestBody AppCountRequest appCountRequest) { + log.info("[订单数量统计] 开始统计, buyerId={}", appCountRequest.getBuyerId()); PPageUtils waitPayCount = PPageUtils.startPage(appCountRequest.getPageNum(), appCountRequest.getPageSize()) .doSelect(new ISelect() { @Override @@ -242,20 +256,27 @@ public class AppOrderController { orderCountDTO.setWaitPayCount(waitPayCount.getTotal()); orderCountDTO.setWaitShippingCount(waitShippingCount.getTotal()); + log.info("[订单数量统计] 统计完成, buyerId={}, 待支付={}, 待发货={}, 配送中={}", + appCountRequest.getBuyerId(), orderCountDTO.getWaitPayCount(), + orderCountDTO.getWaitShippingCount(), orderCountDTO.getShippingCount()); + return R.ok().setData(orderCountDTO); } - /*** - * 订单详情 + /** + * 订单详情查询 + * 根据订单明细ID列表查询订单完整信息,包括物流信息 * - * http://localhost:8888/app/order/detail + * @param vvOrderRequest 订单详情请求参数 + * @return 订单详细信息 */ @Describe("订单详情") @RequestMapping("/detail") @AppRealyLogin public R detail(@RequestBody AppTradeOrderDetailDTO vvOrderRequest) { + log.info("[订单详情查询] 开始查询, tradeOrderLineIds={}", vvOrderRequest.getTradeOrderLineIdList()); List vvTradeOrderLineEntities = vvTradeOrderLineDao.selectVvTradeOrderLineByIds(vvOrderRequest.getTradeOrderLineIdList()); List trackNumbers = SanUtils.getDistinctFiledList(vvTradeOrderLineEntities, VvTradeOrderLineEntity::getTrackNumber); if (CollectionUtils.isNotEmpty(trackNumbers)) { @@ -270,35 +291,53 @@ public class AppOrderController { List vvOrderListResps = vvTradeOrderConvertService.convertTradeOrderLineResp(tradeOrderEntities, vvTradeOrderLineEntities, true); List appPackageDTOList = vvTradeOrderConvertService.buildAppPackageDTO(vvOrderListResps); + log.info("[订单详情查询] 查询完成, tradeOrderLineIds={}, 包裹数量={}", + vvOrderRequest.getTradeOrderLineIdList(), appPackageDTOList.size()); return R.ok().setData(appPackageDTOList); } - /*** - * 订单添加 + /** + * 添加订单 + * 创建订单并发起微信支付,支持活动优惠和推广奖励 + * 主要流程: + * 1. 校验库存 + * 2. 创建订单和订单明细 + * 3. 处理活动优惠和推广奖励 + * 4. 调用微信支付预下单 + * 5. 发送延迟关单消息 * - * http://localhost:8888/app/order/add + * @param vvOrderRequest 订单创建请求参数 + * @return 微信支付参数 */ @Describe("添加订单") @RequestMapping("/add") @AppRealyLogin public R add(@RequestBody VvTradeOrderDTO vvOrderRequest) { + log.info("[添加订单] 开始创建订单, buyerId={}, skuIds={}, buyerAddressId={}", + vvOrderRequest.getBuyerId(), + SanUtils.getFieldList(vvOrderRequest.getVvTradeOrderLineDTOList(), VvTradeOrderLineDTO::getSkuId), + vvOrderRequest.getBuyerAddressId()); List vvTradeOrderLineEntityList = new ArrayList<>(); List skuIds = SanUtils.getFieldList(vvOrderRequest.getVvTradeOrderLineDTOList(), VvTradeOrderLineDTO::getSkuId); List vvSkuPropertyValueList = vvSkuPropertyValueDao.selectVvSkuPropertyValueBySkuIds(skuIds); Map vvTradeOrderLineMap = SanUtils.groupByFiled2Map(vvOrderRequest.getVvTradeOrderLineDTOList(), VvTradeOrderLineDTO::getSkuId); List vvSkuEntities = vvSkuDao.selectVvSkuBySkuIds(skuIds); + // 校验库存 for (VvSkuEntity vvSkuEntity : vvSkuEntities) { VvTradeOrderLineDTO vvTradeOrderLineDTO = vvTradeOrderLineMap.get(vvSkuEntity.getId()); // 如果库存少于 0 ,则显示库存不足 if (vvSkuEntity.getStock() - vvTradeOrderLineDTO.getNum() < 0) { + log.warn("[添加订单] 库存不足, skuId={}, 当前库存={}, 购买数量={}", + vvSkuEntity.getId(), vvSkuEntity.getStock(), vvTradeOrderLineDTO.getNum()); OrderSkuDTO orderSkuDTO = new OrderSkuDTO(); orderSkuDTO.setSkuId(vvSkuEntity.getId()); orderSkuDTO.setMessage("库存不足"); return R.error().setData(orderSkuDTO); } } + log.info("[添加订单] 库存校验通过, skuIds={}", skuIds); Map skuEntityMap = SanUtils.groupByFiled2Map(vvSkuEntities, VvSkuEntity::getId); @@ -317,10 +356,13 @@ public class AppOrderController { VvActivityEntity vvActivityEntity = null; if (StringUtils.isNotEmpty(activityInfo)) { vvActivityDTO = JSONObject.parseObject(activityInfo, VvActivityDTO.class); - vvActivityEntity =vvActivityDao.selectVvActivityById(vvActivityDTO.getActivityId()); + vvActivityEntity = vvActivityDao.selectVvActivityById(vvActivityDTO.getActivityId()); + log.info("[添加订单] 检测到活动信息, activityId={}, discountAmount={}, awardAmount={}", + vvActivityDTO.getActivityId(), vvActivityEntity.getDiscountAmount(), vvActivityEntity.getAwardAmount()); } Integer batchNum = SanUtils.sum(vvOrderRequest.getVvTradeOrderLineDTOList(), VvTradeOrderLineDTO::getNum); + log.info("[添加订单] 订单总数量={}", batchNum); for (VvTradeOrderLineDTO vvTradeOrderLineDTO : vvOrderRequest.getVvTradeOrderLineDTOList()) { VvSkuEntity vvSkuEntity = skuEntityMap.get(vvTradeOrderLineDTO.getSkuId()); @@ -409,6 +451,10 @@ public class AppOrderController { BigDecimal tradePayAmount = SanUtils.sum(vvTradeOrderLineEntityList, VvTradeOrderLineEntity::getPayAmount); vvTradeOrderEntity.setPayAmount(tradePayAmount); vvTradeOrderDao.insertVvTradeOrder(vvTradeOrderEntity); + + log.info("[添加订单] 创建主订单成功, tradeOrderId={}, 订单金额={}, 明细数量={}", + vvTradeOrderEntity.getId(), tradePayAmount, vvTradeOrderLineEntityList.size()); + List vvPromoterTradeOrderLineAwardEntityList = new ArrayList<>(); for (VvTradeOrderLineEntity tradeOrderLineEntity : vvTradeOrderLineEntityList) { @@ -520,6 +566,8 @@ public class AppOrderController { vvBuyerEntity.getOpenid() ); + log.info("[添加订单] 微信预下单成功, tradeOrderId={}, outTradeNo={}, prepayId={}", + vvTradeOrderEntity.getId(), vvTradeOrderEntity.getOutTradeNo(), jsapiPrepayResponse.getPrepayId()); String prepay_id = jsapiPrepayResponse.getPrepayId(); @@ -549,6 +597,9 @@ public class AppOrderController { message.getMessageProperties().setDelay((second) * 1000); // 毫秒为单位,指定此消息的延时时长 ,+ 1 尽量保证机器人跑完了,再发送消息 return message; }); + + log.info("[添加订单] 发送延迟关单消息成功, tradeOrderId={}, delayTime={}秒", + vvTradeOrderEntity.getId(), second); } WxPayVO vo = new WxPayVO(); diff --git a/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppUserLoginController.java b/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppUserLoginController.java index f7eea92..a716d4a 100644 --- a/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppUserLoginController.java +++ b/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppUserLoginController.java @@ -170,42 +170,65 @@ public class AppUserLoginController { } - public void insertPromoter(String requestToken ,BuyerDTO buyerDTO) { + /** + * 处理推广关系 + * 当用户通过推广链接登录时,建立推广者与被推广者的关系 + * + * @param requestToken 请求中的原始token,可能包含活动信息 + * @param buyerDTO 登录后的买家信息 + */ + public void insertPromoter(String requestToken, BuyerDTO buyerDTO) { + log.info("[处理推广关系] 开始处理, requestToken={}, buyerId={}", requestToken, buyerDTO.getBuyerId()); + + // 从Redis获取活动信息 String activityInfo = redisUtils.get(ApiConstants.token_activity + requestToken); if (StringUtils.isNotEmpty(activityInfo)) { - VvActivityDTO vvActivityDTO = JSONObject.parseObject(activityInfo, VvActivityDTO.class); + VvActivityDTO vvActivityDTO = JSONObject.parseObject(activityInfo, VvActivityDTO.class); + log.info("[处理推广关系] 获取到活动信息, activityId={}, promoterId={}", + vvActivityDTO.getActivityId(), vvActivityDTO.getBuyerId()); + + // 获取被推广买家信息 VvBuyerEntity wasBuyerEntity = vvBuyerDao.selectVvBuyerById(buyerDTO.getBuyerId()); - if(wasBuyerEntity ==null ){ - wasBuyerEntity = new VvBuyerEntity(); + if (wasBuyerEntity == null) { + log.warn("[处理推广关系] 被推广买家不存在,使用默认值, buyerId={}", buyerDTO.getBuyerId()); + wasBuyerEntity = new VvBuyerEntity(); wasBuyerEntity.setId(0L); wasBuyerEntity.setBuyerName("0"); wasBuyerEntity.setBuyerPhone("0"); wasBuyerEntity.setBuyerWeixin("0"); } + // 获取活动信息 VvActivityEntity vvActivityEntity = vvActivityDao.selectVvActivityById(vvActivityDTO.getActivityId()); - // 换token + + // 计算活动剩余时间,将活动信息关联到新token Date endTime = new Date(vvActivityDTO.getActivityExpiredTime()); - int second = DateUtils.betweenSecond(new Date(),endTime); + int second = DateUtils.betweenSecond(new Date(), endTime); - log.info("AppUserLoginController insertPromoter " + - "requestToken:{}," + - "loginToken:{}," + - "vvActivityDTO:{}," + - "second:{}",requestToken,buyerDTO.getToken(),JSON.toJSONString(vvActivityDTO),second); + log.info("[处理推广关系] 活动信息转移, requestToken={}, loginToken={}, activityId={}, remainSeconds={}", + requestToken, buyerDTO.getToken(), vvActivityDTO.getActivityId(), second); - redisUtils.set(ApiConstants.token_activity + buyerDTO.getToken(), JSON.toJSONString(vvActivityDTO),second); + // 将活动信息关联到新的登录token + redisUtils.set(ApiConstants.token_activity + buyerDTO.getToken(), JSON.toJSONString(vvActivityDTO), second); + + // 查询推广者信息 List promoterBuyerIdList = new LinkedList<>(); promoterBuyerIdList.add(vvActivityDTO.getBuyerId()); - List promoterBuyerList = vvBuyerDao.selectVvBuyerByIdList(promoterBuyerIdList); - VvPromoterEntity vvPromoter = new VvPromoterEntity(); + + // 创建推广记录 + VvPromoterEntity vvPromoter = new VvPromoterEntity(); vvPromoter.setActivityId(vvActivityDTO.getActivityId()); vvPromoter.setPromoterCode(vvActivityDTO.getPromoterCode()); vvPromoter.setCreateTimestamp(System.currentTimeMillis()); vvPromoter.setActivityName(vvActivityEntity.getActivityName()); vvPromoter.setBuyerInfo(JSONObject.toJSONString(vvActivityDTO)); vvPromoterDao.insertVvPromoter(vvPromoter); + + log.info("[处理推广关系] 创建推广记录成功, promoterId={}, activityId={}, promoterCode={}", + vvPromoter.getId(), vvActivityDTO.getActivityId(), vvActivityDTO.getPromoterCode()); + + // 建立推广者与被推广者的关系 for (VvBuyerEntity promoterBuyerEntity : promoterBuyerList) { VvPromoterBuyerEntity vvPromoterBuyerEntity = new VvPromoterBuyerEntity(); vvPromoterBuyerEntity.setPromoterId(vvPromoter.getId()); @@ -220,28 +243,62 @@ public class AppUserLoginController { vvPromoterBuyerEntity.setWasBuyerPhone(wasBuyerEntity.getBuyerPhone()); vvPromoterBuyerEntity.setWasBuyerWeixin(wasBuyerEntity.getBuyerWeixin()); vvPromoterBuyerDao.insertOrUpdateVvPromoterBuyer(vvPromoterBuyerEntity); + + log.info("[处理推广关系] 建立推广关系成功, promoterId={}, promoterBuyerId={}, wasBuyerId={}", + vvPromoter.getId(), promoterBuyerEntity.getId(), wasBuyerEntity.getId()); } + } else { + log.info("[处理推广关系] 无活动信息,跳过推广关系处理, requestToken={}", requestToken); } } + /** + * 更新用户信息 + * 允许用户修改昵称和头像 + * + * @param request 更新请求参数,包含买家ID、昵称、头像 + * @return 更新结果,包含更新后的买家信息 + */ // http://localhost:8888/app/buyer/info/update @RequestMapping("/buyer/info/update") @Describe("更新用户信息") @AppRealyLogin public R buyerInfoUpdate(@RequestBody VvAppBuyerInfoRequest request) { + log.info("[更新用户信息] 开始处理, buyerId={}, buyerName={}", request.getBuyerId(), request.getBuyerName()); + VvBuyerEntity vvBuyerEntity = vvBuyerDao.selectVvBuyerById(request.getBuyerId()); if (vvBuyerEntity == null) { + log.warn("[更新用户信息] 用户不存在, buyerId={}", request.getBuyerId()); return R.error("你不是内部用户"); } + + // 更新用户信息 vvBuyerEntity.setBuyerName(request.getBuyerName()); vvBuyerEntity.setAvatar(request.getAvatar()); vvBuyerDao.insertOrUpdateVvBuyer(vvBuyerEntity); + + log.info("[更新用户信息] 更新成功, buyerId={}, buyerName={}, avatar={}", + vvBuyerEntity.getId(), vvBuyerEntity.getBuyerName(), vvBuyerEntity.getAvatar()); + return R.ok().put("buyer", vvBuyerEntity); } - public BuyerDTO buildBuyerLoginInfoCacheRedisDB(VvBuyerEntity target, Long expireTime, String deviceId,Integer loginType) { + /** + * 构建买家登录信息并缓存到Redis + * 生成token并将买家信息存储到Redis中 + * + * @param target 买家实体信息 + * @param expireTime token过期时间(秒) + * @param deviceId 设备ID,用于匿名登录 + * @param loginType 登录类型(0:匿名登录, 1:微信登录) + * @return 买家DTO,包含token等信息 + */ + public BuyerDTO buildBuyerLoginInfoCacheRedisDB(VvBuyerEntity target, Long expireTime, String deviceId, Integer loginType) { + log.info("[构建登录信息] 开始构建, buyerId={}, loginType={}, expireTime={}秒", + target.getId(), loginType, expireTime); + BuyerDTO buyerDTO = new BuyerDTO(); buyerDTO.setBuyerId(target.getId()); buyerDTO.setBuyerName(target.getBuyerName()); @@ -250,9 +307,15 @@ public class AppUserLoginController { buyerDTO.setLoginType(loginType); buyerDTO.setBuyerPhone(target.getBuyerPhone()); buyerDTO.setBuyerWeixin(target.getBuyerWeixin()); + + // 生成token并缓存到Redis String token = TokenUtils.generateToken(target.getId() + deviceId); redisUtils.set(token, JSON.toJSONString(buyerDTO), expireTime); buyerDTO.setToken(token); + + log.info("[构建登录信息] 构建完成, buyerId={}, token={}, expireTime={}秒", + target.getId(), token, expireTime); + return buyerDTO; }