diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/MemberPointsController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/MemberPointsController.java index 15a11aaf..a5c6f12a 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/admin/MemberPointsController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/MemberPointsController.java @@ -1,15 +1,18 @@ package com.czg.controller.admin; +import com.czg.account.dto.points.OrderDeductionPointsDTO; import com.czg.account.entity.MemberPoints; +import com.czg.account.param.ConsumeAwardPointsParam; import com.czg.account.param.MemberPointsParam; +import com.czg.account.param.PayedDeductPointsParam; import com.czg.account.service.MemberPointsService; import com.czg.log.annotation.OperationLog; import com.czg.resp.CzgResult; import com.mybatisflex.core.paginate.Page; import lombok.AllArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.math.BigDecimal; /** @@ -36,4 +39,65 @@ public class MemberPointsController { return CzgResult.success(page); } + /** + * 001-会员积分账户信息 + */ + @GetMapping("user-points") + public CzgResult getMemberPoints(@RequestParam Long userId) { + MemberPoints data = memberPointsService.getMemberPoints(userId); + return CzgResult.success(data); + } + + /** + * 002-获取订单可用积分及抵扣金额(支付页面使用) + * + * @param userId 用户id + * @param orderAmount 订单金额 + */ + @GetMapping("calc-usable-points") + public CzgResult getMemberUsablePoints(@RequestParam Long userId, @RequestParam BigDecimal orderAmount) { + OrderDeductionPointsDTO usablePoints = memberPointsService.getMemberUsablePoints(userId, orderAmount); + return CzgResult.success(usablePoints); + } + + /** + * 004-根据抵扣金额计算所需积分 + * + * @param userId 用户id + * @param orderAmount 订单金额 + * @param deductionAmount 抵扣金额 + */ + @GetMapping("calc-used-points") + public CzgResult calcUsedPoints(@RequestParam Long userId, @RequestParam BigDecimal orderAmount, @RequestParam BigDecimal deductionAmount) { + int points = memberPointsService.calcUsedPoints(userId, orderAmount, deductionAmount); + return CzgResult.success(points); + } + + /** + * 003-根据积分计算可抵扣金额 + */ + @GetMapping("calc-deduction-amount") + public CzgResult calcDeductionAmount(@RequestParam Long userId, @RequestParam BigDecimal orderAmount, @RequestParam Integer points) { + BigDecimal deductionAmount = memberPointsService.calcDeductionAmount(userId, orderAmount, points); + return CzgResult.success(deductionAmount); + } + + /** + * 005-支付完成扣减积分(支付成功回调中使用) + */ + @PostMapping("payed-deduct-points") + public CzgResult deductPoints(@RequestBody PayedDeductPointsParam param) { + boolean ret = memberPointsService.deductPoints(param.getUserId(), param.getPoints(), param.getContent(), param.getOrderId()); + return CzgResult.success(ret); + } + + /** + * 006-消费赠送积分(支付成功回调中使用) + */ + @PostMapping("consume-award-points") + public CzgResult consumeAwardPoints(@RequestBody ConsumeAwardPointsParam param) { + memberPointsService.consumeAwardPoints(param.getUserId(), param.getOrderId()); + return CzgResult.success(); + } + } \ No newline at end of file diff --git a/cash-api/account-server/src/main/java/com/czg/controller/user/UMemberPointsController.java b/cash-api/account-server/src/main/java/com/czg/controller/user/UMemberPointsController.java index cae03b18..45cc24c5 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/user/UMemberPointsController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/user/UMemberPointsController.java @@ -62,10 +62,13 @@ public class UMemberPointsController { /** * 003-根据积分计算可抵扣金额 + * @param userId 用户id + * @param orderAmount 订单金额 + * @param points 使用积分 */ @GetMapping("calc-deduction-amount") - public CzgResult calcDeductionAmount(@RequestParam Long memberId, @RequestParam BigDecimal orderAmount, @RequestParam Integer points) { - BigDecimal deductionAmount = memberPointsService.calcDeductionAmount(memberId, orderAmount, points); + public CzgResult calcDeductionAmount(@RequestParam Long userId, @RequestParam BigDecimal orderAmount, @RequestParam Integer points) { + BigDecimal deductionAmount = memberPointsService.calcDeductionAmount(userId, orderAmount, points); return CzgResult.success(deductionAmount); } diff --git a/cash-api/order-server/src/main/java/com/czg/mq/OrderMqListener.java b/cash-api/order-server/src/main/java/com/czg/mq/OrderMqListener.java index 03c90c84..d4f35a45 100644 --- a/cash-api/order-server/src/main/java/com/czg/mq/OrderMqListener.java +++ b/cash-api/order-server/src/main/java/com/czg/mq/OrderMqListener.java @@ -2,6 +2,8 @@ package com.czg.mq; import cn.hutool.core.date.DateUtil; import cn.hutool.core.exceptions.ExceptionUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; import com.czg.config.RabbitConstants; import com.czg.order.entity.MqLog; import com.czg.order.service.MqLogService; @@ -58,4 +60,24 @@ public class OrderMqListener { mqLogService.save(mqLog); } } + + @RabbitListener(queues = {"${spring.profiles.active}-" + RabbitConstants.Queue.ORDER_REFUND_QUEUE}) + public void orderStockReturn(String jsonObjStr) { + long startTime = DateUtil.date().getTime(); + log.info("接收到订单退款返还库存消息:{}", jsonObjStr); + MqLog mqLog = new MqLog().setQueue(RabbitConstants.Queue.ORDER_REFUND_QUEUE).setMsg(jsonObjStr).setType("orderStockReturn").setPlat("java.order").setCreateTime(DateUtil.date().toLocalDateTime()); + try { + JSONObject data = JSON.parseObject(jsonObjStr); + orderInfoRpcService.orderRefundCallback(data); + } catch (Exception e) { + log.error("订单退款返还库存失败", e); + String errorInfo = ExceptionUtil.stacktraceToString(e); + mqLog.setErrInfo(errorInfo); + mqLog.setDuration(DateUtil.date().getTime() - startTime); + mqLog.setFailTime(DateUtil.date().toLocalDateTime()); + mqLogService.save(mqLog); + } + } + + } diff --git a/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitPublisher.java b/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitPublisher.java index f0fb70e7..15233bed 100644 --- a/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitPublisher.java +++ b/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitPublisher.java @@ -39,7 +39,7 @@ public class RabbitPublisher { * @param refundMap Map 商品Id,退单数量 */ public void sendOrderRefundMsg(String refundMap) { - sendMsg(RabbitConstants.Queue.ORDER_STOCK_QUEUE, refundMap); + sendMsg(RabbitConstants.Queue.ORDER_REFUND_QUEUE, refundMap); } /** diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderInfoRpcService.java b/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderInfoRpcService.java index f1259c33..d857b3f3 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderInfoRpcService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderInfoRpcService.java @@ -1,5 +1,6 @@ package com.czg.order.service; +import com.alibaba.fastjson2.JSONObject; import com.czg.account.vo.HandoverCategoryListVo; import com.czg.account.vo.HandoverProductListVo; @@ -148,6 +149,13 @@ public interface OrderInfoRpcService { */ void orderCancelCallback(Long orderId); + /** + * 订单退款回调 返还商品库存及耗材库存 + * + * @param data k-商品id v-数量 + */ + void orderRefundCallback(JSONObject data); + /** * 订单交班回调 发送答应交班小票消息至MQ * diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductRpcService.java b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductRpcService.java index 9c1e2109..8449acfa 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductRpcService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductRpcService.java @@ -28,4 +28,11 @@ public interface ProductRpcService { * @param dataList 库存恢复数据 */ void orderCancelRecoverStock(Long shopId, Long orderId, List> dataList); + + /** + * 订单退菜或退款后回退库存 + * + * @param dataList 库存恢复数据 + */ + void orderRefundReturnStock(List> dataList); } diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoRpcServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoRpcServiceImpl.java index 7f189067..f0c2875a 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoRpcServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoRpcServiceImpl.java @@ -3,6 +3,7 @@ package com.czg.service.order.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.NumberUtil; +import com.alibaba.fastjson2.JSONObject; import com.czg.account.vo.HandoverCategoryListVo; import com.czg.account.vo.HandoverProductListVo; import com.czg.config.RabbitPublisher; @@ -23,10 +24,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * 订单Rpc ServiceImpl @@ -182,6 +180,28 @@ public class OrderInfoRpcServiceImpl implements OrderInfoRpcService { } } + @Override + public void orderRefundCallback(JSONObject data) { + Set keys = data.keySet(); + // 封装扣减库存数据 + List> dataList = new ArrayList<>(); + for (String key : keys) { + Long productId = Convert.toLong(key); + BigDecimal num = data.getBigDecimal(key); + Map row = new HashMap<>(2); + data.put("productId", productId); + data.put("num", num); + dataList.add(row); + } + try { + // 调用商品服务回退库存 + productRpcService.orderRefundReturnStock(dataList); + } catch (Exception e) { + log.error("调用商品服务回退库存", e); + throw e; + } + } + @Override public void sendHandoverReceiptPrintMsgToMq(Long handoverRecordId) { rabbitPublisher.sendHandoverPrintMsg(Convert.toStr(handoverRecordId)); diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductRpcServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductRpcServiceImpl.java index 282a7b0c..a3a51018 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductRpcServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductRpcServiceImpl.java @@ -163,4 +163,60 @@ public class ProductRpcServiceImpl implements ProductRpcService { } rabbitPublisher.sendProductInfoChangeMsg(Convert.toStr(shopId)); } + + @Override + public void orderRefundReturnStock(List> dataList) { + List list = BeanUtil.copyToList(dataList, ProductStockSubtractDTO.class); + if (CollUtil.isEmpty(list)) { + return; + } + Long shopId = null; + for (ProductStockSubtractDTO dto : list) { + productMapper.updateProductStockNum(dto.getProductId(), dto.getShopId(), "add", dto.getNum()); + // 查询商品绑定耗材信息 + List relationList = prodConsRelationMapper.selectListByQuery(QueryWrapper.create().eq(ProdConsRelation::getProductId, dto.getProductId())); + if (CollUtil.isEmpty(relationList)) { + continue; + } + for (ProdConsRelation prodConsRelation : relationList) { + // 耗材id + Long consInfoId = prodConsRelation.getConsInfoId(); + // 耗材消耗数量 + BigDecimal surplusStock = prodConsRelation.getSurplusStock(); + if (surplusStock == null) { + continue; + } + // 实际消耗数量 = 耗材消耗数量 * 商品购买数量 + surplusStock = NumberUtil.mul(surplusStock, dto.getNum()); + ConsInfo consInfo = consInfoMapper.selectOneById(consInfoId); + if (consInfo == null) { + continue; + } + BigDecimal stockNumber = consInfo.getStockNumber(); + consInfo.setStockNumber(NumberUtil.add(stockNumber, surplusStock)); + // 更新耗材库存数量 + consInfoMapper.update(consInfo); + // 插入耗材流水记录 + ConsStockFlow consStockFlow = new ConsStockFlow(); + consStockFlow.setShopId(consInfo.getShopId()); + consStockFlow.setInOutType(InOutTypeEnum.IN.value()); + consStockFlow.setInOutItem(InOutItemEnum.ORDER_IN.value()); + consStockFlow.setInOutDate(LocalDate.now()); + consStockFlow.setConId(consInfo.getId()); + consStockFlow.setConName(consInfo.getConName()); + consStockFlow.setUnitName(consInfo.getConUnit()); + consStockFlow.setBeforeNumber(stockNumber); + consStockFlow.setInOutNumber(surplusStock); + consStockFlow.setAfterNumber(consInfo.getStockNumber()); + consStockFlow.setSubTotal(NumberUtil.mul(surplusStock, consInfo.getPrice())); + consStockFlow.setProductId(dto.getProductId()); + // consStockFlow.setSkuId(0L); + // TODO 需要订单id + // consStockFlow.setOrderId(orderId); + shopId = consInfo.getShopId(); + consStockFlowMapper.insert(consStockFlow); + } + } + rabbitPublisher.sendProductInfoChangeMsg(Convert.toStr(shopId)); + } }