ruoyi-auth/src/main/resources/bootstrap.yml
@@ -22,24 +22,18 @@ nacos: discovery: # 服务注册地址 # server-addr: 192.168.110.169:8848 server-addr: 192.168.110.169:8848 service: ${spring.application.name} group: DEFAULT_GROUP # namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb # username: nacos # password: nacos server-addr: 127.0.0.1:8848 namespace: 9e80b38d-9abb-4602-b4da-174f6f79d8d1 namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb username: nacos password: nacos config: # 配置中心地址 # server-addr: 192.168.110.169:8848 # namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb # username: nacos # password: nacos server-addr: 127.0.0.1:8848 namespace: 9e80b38d-9abb-4602-b4da-174f6f79d8d1 server-addr: 192.168.110.169:8848 namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb username: nacos password: nacos group: DEFAULT_GROUP name: ${spring.application.name} # 配置文件格式 ruoyi-gateway/src/main/resources/bootstrap.yml
@@ -22,25 +22,19 @@ nacos: discovery: # 服务注册地址 # server-addr: 192.168.110.169:8848 server-addr: 192.168.110.169:8848 service: ${spring.application.name} group: DEFAULT_GROUP # namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb # username: nacos # password: nacos server-addr: 127.0.0.1:8848 namespace: 9e80b38d-9abb-4602-b4da-174f6f79d8d1 namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb username: nacos password: nacos config: # 配置中心地址 # server-addr: 192.168.110.169:8848 # namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb # username: nacos # password: nacos server-addr: 192.168.110.169:8848 namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb username: nacos password: nacos group: DEFAULT_GROUP server-addr: 127.0.0.1:8848 namespace: 9e80b38d-9abb-4602-b4da-174f6f79d8d1 name: ${spring.application.name} # 配置文件格式 file-extension: yml ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml
@@ -21,25 +21,19 @@ nacos: discovery: # 服务注册地址 # server-addr: 192.168.110.169:8848 server-addr: 192.168.110.169:8848 service: ${spring.application.name} group: DEFAULT_GROUP # namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb # username: nacos # password: nacos server-addr: 127.0.0.1:8848 namespace: 9e80b38d-9abb-4602-b4da-174f6f79d8d1 namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb username: nacos password: nacos config: # 配置中心地址 # server-addr: 192.168.110.169:8848 # namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb server-addr: 192.168.110.169:8848 namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb group: DEFAULT_GROUP # username: nacos # password: nacos server-addr: 127.0.0.1:8848 namespace: 9e80b38d-9abb-4602-b4da-174f6f79d8d1 username: nacos password: nacos name: ${spring.application.name} # 配置文件格式 file-extension: yml @@ -60,15 +54,12 @@ type: nacos nacos: # 开发环境 # server-addr: 192.168.110.169:8848 # namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb server-addr: 192.168.110.169:8848 namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb group: DEFAULT_GROUP data-id: seata-server.properties # username: nacos # password: nacos server-addr: 127.0.0.1:8848 namespace: 9e80b38d-9abb-4602-b4da-174f6f79d8d1 username: nacos password: nacos # 生产环境 # server-addr: 192.168.0.137:8848,192.168.0.123:8848 # namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a @@ -81,14 +72,11 @@ nacos: application: seata-server # 开发环境 # server-addr: 192.168.110.169:8848 # namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb server-addr: 192.168.110.169:8848 namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb group: DEFAULT_GROUP # username: nacos # password: nacos server-addr: 127.0.0.1:8848 namespace: 9e80b38d-9abb-4602-b4da-174f6f79d8d1 username: nacos password: nacos # 生产环境 # server-addr: 192.168.0.137:8848,192.168.0.123:8848 # namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a @@ -99,15 +87,12 @@ nacos: discovery: # 开发环境 # server-addr: 192.168.110.169:8848 # nacos注册中心地址 # namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb # 命名空间 server-addr: 192.168.110.169:8848 # nacos注册中心地址 namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb # 命名空间 group: DEFAULT_GROUP application: seata-server #Nacos 中 Seata 名称 # username: nacos # password: nacos server-addr: 127.0.0.1:8848 namespace: 9e80b38d-9abb-4602-b4da-174f6f79d8d1 username: nacos password: nacos # 生产环境 # server-addr: 192.168.0.137:8848,192.168.0.123:8848 # namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java
@@ -14,6 +14,7 @@ import com.ruoyi.chargingPile.api.vo.GunStatusStatisticsVO; import com.ruoyi.chargingPile.api.vo.SiteNameVO; import com.ruoyi.chargingPile.api.vo.TChargingGunVO; import com.ruoyi.chargingPile.config.FileUploadConfig; import com.ruoyi.chargingPile.service.ISiteService; import com.ruoyi.chargingPile.service.TChargingGunService; import com.ruoyi.chargingPile.service.TChargingPileService; @@ -63,13 +64,16 @@ @Autowired private TChargingGunService chargingGunService; @Autowired @Resource private ChargingOrderClient chargingOrderClient; @Resource private TChargingPileService chargingPileService; @Resource private ISiteService siteService; @Autowired private FileUploadConfig fileUploadConfig; /** * 查询充电枪列表 @@ -152,11 +156,13 @@ public void downloadQRCode(@PathVariable Integer id, HttpServletResponse response){ try { TChargingGun chargingGun = chargingGunService.getById(id); String fileName = URLEncoder.encode(chargingGun.getCode(), "UTF-8") + ".jpg"; TChargingPile chargingPile = chargingPileService.getById(chargingGun.getId()); String code = chargingPile.getCode() + chargingGun.getCode(); String fileName = URLEncoder.encode(code, "UTF-8") + ".jpg"; response.setContentType("application/force-download"); response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); String url = "https://www.baidu.com?id=" + id; String filePath = "D:/Program Files/nginx-1.20.2/html"; String url = "https://mxcd.zhinenganguan.com?No=" + code; String filePath = fileUploadConfig.getLocation(); QRCodeUtils.encode(url, filePath); FileInputStream inputStream = new FileInputStream(filePath); ServletOutputStream out = response.getOutputStream(); ruoyi-service/ruoyi-chargingPile/src/main/resources/bootstrap.yml
@@ -22,26 +22,20 @@ nacos: discovery: # 服务注册地址 # server-addr: 192.168.110.169:8848 server-addr: 192.168.110.169:8848 service: ${spring.application.name} group: DEFAULT_GROUP # namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb # username: nacos # password: nacos server-addr: 127.0.0.1:8848 namespace: 9e80b38d-9abb-4602-b4da-174f6f79d8d1 namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb username: nacos password: nacos config: # 配置中心地址 # server-addr: 192.168.110.169:8848 # namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb server-addr: 192.168.110.169:8848 namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb group: DEFAULT_GROUP name: ${spring.application.name} # username: nacos # password: nacos server-addr: 127.0.0.1:8848 namespace: 9e80b38d-9abb-4602-b4da-174f6f79d8d1 username: nacos password: nacos # 配置文件格式 file-extension: yml # 共享配置 @@ -61,15 +55,12 @@ type: nacos nacos: # 开发环境 # server-addr: 192.168.110.169:8848 # namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb server-addr: 192.168.110.169:8848 namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb group: DEFAULT_GROUP data-id: seata-server.properties # username: nacos # password: nacos server-addr: 127.0.0.1:8848 namespace: 9e80b38d-9abb-4602-b4da-174f6f79d8d1 username: nacos password: nacos # 生产环境 # server-addr: 192.168.0.137:8848,192.168.0.123:8848 # namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a @@ -82,14 +73,11 @@ nacos: application: seata-server # 开发环境 # server-addr: 192.168.110.169:8848 # namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb server-addr: 192.168.110.169:8848 namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb group: DEFAULT_GROUP # username: nacos # password: nacos server-addr: 127.0.0.1:8848 namespace: 9e80b38d-9abb-4602-b4da-174f6f79d8d1 username: nacos password: nacos # 生产环境 # server-addr: 192.168.0.137:8848,192.168.0.123:8848 # namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a @@ -100,15 +88,12 @@ nacos: discovery: # 开发环境 # server-addr: 192.168.110.169:8848 # nacos注册中心地址 # namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb # 命名空间 server-addr: 192.168.110.169:8848 # nacos注册中心地址 namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb # 命名空间 group: DEFAULT_GROUP application: seata-server #Nacos 中 Seata 名称 # username: nacos # password: nacos server-addr: 127.0.0.1:8848 namespace: 9e80b38d-9abb-4602-b4da-174f6f79d8d1 username: nacos password: nacos # 生产环境 # server-addr: 192.168.0.137:8848,192.168.0.123:8848 # namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java
@@ -1,4 +1,5 @@ package com.ruoyi.order.controller; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -41,7 +42,7 @@ /** * <p> * 前端控制器 * 前端控制器 * </p> * * @author xiaochen @@ -60,14 +61,24 @@ private GoodsClient goodsClient; @Resource private CouponClient couponClient; @Resource private TokenService tokenService; @Resource private AliPaymentClient aliPaymentClient; @Resource private WxPaymentClient wxPaymentClient; @Resource private AppCouponClient appCouponClient; @Resource private SysUserClient sysUserClient; @PostMapping("/getShoppingOrderList") @ApiOperation(value = "列表查询", tags = {"管理后台-购物订单"}) public AjaxResult<PageInfo<TShoppingOrder>> getShoppingOrderList(@RequestBody ShoppingOrderQuery query) { if (StringUtils.hasLength(query.getPhone())) { List<Long> data = appUserClient.getUserIdsByPhone(query.getPhone()).getData(); if (data.isEmpty()){ if (data.isEmpty()) { return AjaxResult.success(new PageInfo<TShoppingOrder>()); } query.setUserIds(data); @@ -77,54 +88,47 @@ query.setGoodsIds(data); List<Integer> data1 = couponClient.getCouponIdsByName(query.getName()).getData(); query.setCouponIds(data1); if (data.isEmpty() && data1.isEmpty()){ if (data.isEmpty() && data1.isEmpty()) { return AjaxResult.success(new PageInfo<TShoppingOrder>()); } } PageInfo<TShoppingOrder> res = shoppingOrderService.pageList(query); return AjaxResult.success(res); } @Resource private SysUserClient sysUserClient; @GetMapping("/getShoppingOrderInfoById") @ApiOperation(value = "根据订单id查看订单详情", tags = {"管理后台-购物订单"}) public AjaxResult<TShoppingOrder> getShoppingOrderList(String id) { TShoppingOrder byId = shoppingOrderService.getById(id); if (byId.getConsignerId()!=null){ if (byId.getConsignerId() != null) { SysUser data = sysUserClient.getSysUser(byId.getConsignerId()).getData(); if (data!=null){ if (data != null) { byId.setConsignerName(data.getUserName()); } } if (byId.getCancellationId()!=null){ if (byId.getCancellationId() != null) { SysUser data = sysUserClient.getSysUser(byId.getCancellationId()).getData(); if (data!=null){ if (data != null) { byId.setCancellationName(data.getUserName()); } } if (byId.getAppUserAddressId()!=null){ if (byId.getAppUserAddressId() != null) { TAppUserAddress data = appUserClient.getAddressById(byId.getAppUserAddressId()).getData(); if (data!=null){ byId.setReceivingName(data.getName()+"-"+data.getPhone()); if (data != null) { byId.setReceivingName(data.getName() + "-" + data.getPhone()); byId.setReceivingAddress(data.getAddress()); } } return AjaxResult.success(byId); } @GetMapping("/deleteShoppingOrder") @ApiOperation(value = "批量删除订单", tags = {"管理后台-购物订单"}) public AjaxResult<TShoppingOrder> deleteShoppingOrder(String ids) { shoppingOrderService.removeBatchByIds(Arrays.asList(ids.split(","))); return AjaxResult.success(); } @Resource private TokenService tokenService; @Resource private AliPaymentClient aliPaymentClient; @Resource private WxPaymentClient wxPaymentClient; @Resource private AppCouponClient appCouponClient; @GetMapping("/cancelShoppingOrder") @ApiOperation(value = "取消订单", tags = {"管理后台-购物订单"}) public AjaxResult cancelShoppingOrder(String id) { @@ -134,7 +138,7 @@ byId.setCancellationId(userid); byId.setCancellationTime(LocalDateTime.now()); byId.setStatus(4); switch (byId.getPaymentType()){ switch (byId.getPaymentType()) { case 1: // 微信 WxPaymentRefundModel wxPaymentRefundModel = new WxPaymentRefundModel(); @@ -144,8 +148,8 @@ // todo 部署到线上之后写回调地址 // wxPaymentRefundModel.setNotify_url(""); String string = byId.getPaymentAmount().multiply(new BigDecimal("100")).toString(); if (string.contains(".")){ string = string.substring(0,string.indexOf(".")); if (string.contains(".")) { string = string.substring(0, string.indexOf(".")); } int i = Integer.parseInt(string); WxPaymentRefundModel.RefundAmount refundAmount = new WxPaymentRefundModel.RefundAmount(); @@ -163,10 +167,10 @@ refundReq.setRefundAmount(byId.getPaymentAmount().toString()); refundReq.setRefundReason("后台退款"); RefundResp data = aliPaymentClient.refund(refundReq).getData(); if (data!=null){ if (data != null) { // 退款成功 回退优惠券 // byId.setStatus(4); if (byId.getAppCouponId()!=null){ if (byId.getAppCouponId() != null) { appCouponClient.refund(byId.getAppCouponId().toString()); byId.setRefundCode(gw); byId.setRefundAmount(byId.getPaymentAmount()); @@ -179,9 +183,10 @@ shoppingOrderService.updateById(byId); return AjaxResult.success(); } @GetMapping("/consignerShoppingOrder") @ApiOperation(value = "发货", tags = {"管理后台-购物订单"}) public AjaxResult consignerShoppingOrder(String id,String companyName,String code) { public AjaxResult consignerShoppingOrder(String id, String companyName, String code) { TShoppingOrder byId = shoppingOrderService.getById(id); byId.setExpressCompany(companyName); byId.setExpressNumber(code); @@ -192,16 +197,17 @@ shoppingOrderService.updateById(byId); return AjaxResult.success(); } @GetMapping("/getMyShoppingOrderList") @ApiOperation(value = "获取购买订单列表", tags = {"小程序-商城购买订单"}) public AjaxResult<Map<String, Object>> getMyShoppingOrderList(GetMyShoppingOrderList query){ public AjaxResult<Map<String, Object>> getMyShoppingOrderList(GetMyShoppingOrderList query) { Map<String, Object> list = shoppingOrderService.getMyShoppingOrderList(query); return AjaxResult.success(list); } @GetMapping("/getMyShoppingOrderListNum") @ApiOperation(value = "获取购买订单列表数量", tags = {"小程序-商城购买订单"}) public AjaxResult<Map<String, Object>> getMyShoppingOrderListNum(){ public AjaxResult<Map<String, Object>> getMyShoppingOrderListNum() { Long userId = tokenService.getLoginUserApplet().getUserId(); long dfh = shoppingOrderService.count(new LambdaQueryWrapper<TShoppingOrder>().eq(TShoppingOrder::getDelFlag, 0) .eq(TShoppingOrder::getStatus, 1).eq(TShoppingOrder::getAppUserId, userId)); @@ -215,29 +221,27 @@ map.put("ywc", ywc); return AjaxResult.success(map); } @GetMapping("/getMyShoppingOrderInfo/{id}") @ApiOperation(value = "获取购买订单详情", tags = {"小程序-商城购买订单","管理后台-支付订单-订单信息"}) public AjaxResult<MyShoppingOrderInfo> getMyShoppingOrderInfo(@PathVariable String id){ @ApiOperation(value = "获取购买订单详情", tags = {"小程序-商城购买订单", "管理后台-支付订单-订单信息"}) public AjaxResult<MyShoppingOrderInfo> getMyShoppingOrderInfo(@PathVariable String id) { MyShoppingOrderInfo info = shoppingOrderService.getMyShoppingOrderInfo(id); return AjaxResult.success(info); } @PutMapping("/confirmReceipt/{id}") @ApiOperation(value = "确认收货操作", tags = {"小程序-商城购买订单"}) public AjaxResult confirmReceipt(@PathVariable String id){ public AjaxResult confirmReceipt(@PathVariable String id) { TShoppingOrder shoppingOrder = shoppingOrderService.getById(id); if(shoppingOrder.getStatus() == 3){ if (shoppingOrder.getStatus() == 3) { return AjaxResult.error("不能重复确认收货"); } if(shoppingOrder.getStatus() == 1){ if (shoppingOrder.getStatus() == 1) { return AjaxResult.error("订单还未发货呢"); } if(shoppingOrder.getStatus() == 4){ if (shoppingOrder.getStatus() == 4) { return AjaxResult.error("订单已取消,不允许操作。"); } shoppingOrder.setStatus(3); @@ -248,7 +252,7 @@ @PutMapping("/cancelOrder/{id}") @ApiOperation(value = "取消订单操作", tags = {"小程序-商城购买订单"}) public AjaxResult cancelOrder(@PathVariable String id){ public AjaxResult cancelOrder(@PathVariable String id) { return shoppingOrderService.cancelOrder(id); } @@ -256,9 +260,9 @@ * 商城订单取消微信退款回调 */ @PostMapping("/cancelShoppingOrderWxRefund") public void cancelShoppingOrderWxRefund(HttpServletRequest request){ public void cancelShoppingOrderWxRefund(HttpServletRequest request) { WxRefundNotifyResp data = wxPaymentClient.refundNotify(request).getData(); if(null != data){ if (null != data) { String out_refund_no = data.getOut_refund_no(); String refund_id = data.getRefund_id(); String tradeState = data.getTradeState(); @@ -268,31 +272,30 @@ } @ResponseBody @GetMapping(value = "/getNoInvoicedOrder") @ApiOperation(value = "获取未开票的订单数据", tags = {"小程序-充电发票"}) public AjaxResult<List<MyShoppingOrderList>> getNoInvoicedOrder(GetNoInvoicedOrder query){ public AjaxResult<List<MyShoppingOrderList>> getNoInvoicedOrder(GetNoInvoicedOrder query) { List<MyShoppingOrderList> list = shoppingOrderService.getNoInvoicedOrder(query); return AjaxResult.success(list); } @PostMapping("/create") public R<TShoppingOrder> shopCreate(@RequestBody ExchangeDto exchangeDto){ public R<TShoppingOrder> shopCreate(@RequestBody ExchangeDto exchangeDto) { TShoppingOrder shoppingOrder = new TShoppingOrder(); shoppingOrder.setTitle(exchangeDto.getTitle()); shoppingOrder.setCode(OrderCodeUtil.getOrderCode("GW")); shoppingOrder.setAppUserId(exchangeDto.getUserId()); shoppingOrder.setOrderType(exchangeDto.getGoodType()); if (exchangeDto.getGoodType()==1) { if (exchangeDto.getGoodType() == 1) { shoppingOrder.setGoodsId(exchangeDto.getGoodId()); }else { } else { shoppingOrder.setCouponId(exchangeDto.getGoodId()); } shoppingOrder.setPurchaseQuantity(exchangeDto.getNum()); shoppingOrder.setAppUserAddressId(exchangeDto.getAddressId()); shoppingOrder.setOrderAmount(exchangeDto.getOrderPrice()); if (exchangeDto.getCouponId()!=null) { if (exchangeDto.getCouponId() != null) { shoppingOrder.setAppCouponId(exchangeDto.getCouponId()); } shoppingOrder.setCouponDiscountAmount(exchangeDto.getDiscountPrice()); @@ -307,16 +310,16 @@ shoppingOrder.setCreateTime(LocalDateTime.now()); shoppingOrder.setDelFlag(false); shoppingOrderService.save(shoppingOrder); return R.ok(shoppingOrder); } @PostMapping("/callBack") public R callBack(@RequestParam("code")String code,@RequestParam("outTradeNo")String outTradeNo){ shoppingOrderService.callBack(code,outTradeNo); public R callBack(@RequestParam("code") String code, @RequestParam("outTradeNo") String outTradeNo) { shoppingOrderService.callBack(code, outTradeNo); return R.ok(); } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -620,8 +620,7 @@ chargingOrder.setChargeAmount(electrovalence); chargingOrder.setVipDiscountAmount(discountAmount); this.updateById(chargingOrder); TChargingPile chargingPile = chargingPileClient.getChargingPileById(tChargingGun.getChargingPileId()).getData(); //调用远程启动充电消息 PlatformStartCharging platformStartCharging = new PlatformStartCharging(); ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java
@@ -25,6 +25,7 @@ import com.ruoyi.order.mapper.TShoppingOrderMapper; import com.ruoyi.order.service.TShoppingOrderRefundService; import com.ruoyi.order.service.TShoppingOrderService; import com.ruoyi.order.util.RedisLock; import com.ruoyi.other.api.domain.TCoupon; import com.ruoyi.other.api.domain.TGoods; import com.ruoyi.other.api.feignClient.CouponClient; @@ -37,6 +38,8 @@ import com.ruoyi.payment.api.vo.AliQueryOrder; import com.ruoyi.payment.api.vo.NotifyV3PayDecodeRespBody; import io.seata.spring.annotation.GlobalTransactional; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; @@ -85,6 +88,9 @@ @Resource private TShoppingOrderRefundService shoppingOrderRefundService; @Autowired public RedisTemplate redisTemplate; @@ -309,7 +315,7 @@ //退款金额 BigDecimal refundAmount = shoppingOrder.getPaymentAmount().subtract(bigDecimal); //先查询第三方订单状态订单是否退款 //支付方式(1=微信,2=支付宝) Integer paymentType = shoppingOrder.getPaymentType(); @@ -387,6 +393,44 @@ AjaxResult success = cancelShoppingOrderWxRefund(resp.getOutTradeNo(), resp.getTradeNo(), "SUCCESS", sdf1.format(new Date())); if(success.isSuccess()){ shoppingOrderRefundService.save(shoppingOrderRefund); //商品 if(shoppingOrder.getOrderType() == 1){ //redis锁 和支付使用同一个锁 RedisLock redisLock = new RedisLock(redisTemplate, "SHOPPING_GOODS_LOCK", 5, 30000); try { redisLock.lock(); TGoods goods = goodsClient.getGoodsById(shoppingOrder.getGoodsId()).getData(); Integer inventory = goods.getInventory(); if(-1 != inventory){ goods.setInventory(inventory + shoppingOrder.getPurchaseQuantity()); goodsClient.updateGoods(goods); } }catch (Exception e){ e.printStackTrace(); }finally { //解锁 redisLock.unlock(); } } //优惠券 if(shoppingOrder.getOrderType() == 2){ //redis锁 和支付使用同一个锁 RedisLock redisLock = new RedisLock(redisTemplate, "SHOPPING_COUPON_LOCK", 5, 30000); try { redisLock.lock(); TCoupon coupon = couponClient.getCouponById1(shoppingOrder.getCouponId()).getData(); Integer inventory = coupon.getInventoryQuantity(); if(-1 != inventory){ coupon.setInventoryQuantity(inventory + shoppingOrder.getPurchaseQuantity()); couponClient.updateCoupon(coupon); } }catch (Exception e){ e.printStackTrace(); }finally { //解锁 redisLock.unlock(); } } } } } @@ -415,26 +459,41 @@ TShoppingOrder shoppingOrder = this.getById(one.getShoppingOrderId()); //商品 if(shoppingOrder.getOrderType() == 1){ // todo 需完善redis锁 //redis锁 和支付使用同一个锁 TGoods goods = goodsClient.getGoodsById(shoppingOrder.getGoodsId()).getData(); Integer inventory = goods.getInventory(); if(-1 != inventory){ goods.setInventory(inventory + shoppingOrder.getPurchaseQuantity()); goodsClient.updateGoods(goods); RedisLock redisLock = new RedisLock(redisTemplate, "SHOPPING_GOODS_LOCK", 5, 30000); try { redisLock.lock(); TGoods goods = goodsClient.getGoodsById(shoppingOrder.getGoodsId()).getData(); Integer inventory = goods.getInventory(); if(-1 != inventory){ goods.setInventory(inventory + shoppingOrder.getPurchaseQuantity()); goodsClient.updateGoods(goods); } }catch (Exception e){ e.printStackTrace(); }finally { //解锁 redisLock.unlock(); } //解锁 } //优惠券 if(shoppingOrder.getOrderType() == 2){ //redis锁 TCoupon coupon = couponClient.getCouponById1(shoppingOrder.getCouponId()).getData(); Integer inventory = coupon.getInventoryQuantity(); if(-1 != inventory){ coupon.setInventoryQuantity(inventory + shoppingOrder.getPurchaseQuantity()); couponClient.updateCoupon(coupon); //redis锁 和支付使用同一个锁 RedisLock redisLock = new RedisLock(redisTemplate, "SHOPPING_COUPON_LOCK", 5, 30000); try { redisLock.lock(); TCoupon coupon = couponClient.getCouponById1(shoppingOrder.getCouponId()).getData(); Integer inventory = coupon.getInventoryQuantity(); if(-1 != inventory){ coupon.setInventoryQuantity(inventory + shoppingOrder.getPurchaseQuantity()); couponClient.updateCoupon(coupon); } }catch (Exception e){ e.printStackTrace(); }finally { //解锁 redisLock.unlock(); } //解锁 } } return AjaxResult.success(); ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/RedisLock.java
New file @@ -0,0 +1,51 @@ package com.ruoyi.order.util; import org.springframework.data.redis.core.RedisTemplate; import java.util.UUID; import java.util.concurrent.TimeUnit; /** * @author zhibing.pu * @Date 2024/9/26 18:43 */ public class RedisLock { private RedisTemplate<String, String> redisTemplate; private String lockKey; private int expireTime; // 锁的超时时间 private int timeout; // 获取锁的超时时间 public RedisLock(RedisTemplate<String, String> redisTemplate, String lockKey, int expireTime, int timeout) { this.redisTemplate = redisTemplate; this.lockKey = lockKey; this.expireTime = expireTime; this.timeout = timeout; } public boolean lock() { String identifier = UUID.randomUUID().toString(); long end = System.currentTimeMillis() + timeout; while (System.currentTimeMillis() < end) { if (redisTemplate.opsForValue().setIfAbsent(lockKey, identifier, expireTime, TimeUnit.SECONDS)) { return true; } // 可以使用延时来减少CPU占用 try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } return false; } public boolean unlock() { String identifier = redisTemplate.opsForValue().get(lockKey); if (identifier != null && identifier.equals(UUID.randomUUID().toString())) { redisTemplate.delete(lockKey); return true; } return false; } }