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; @@ -60,6 +61,16 @@ 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") @@ -84,8 +95,7 @@ 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) { @@ -111,20 +121,14 @@ } 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) { @@ -179,6 +183,7 @@ shoppingOrderService.updateById(byId); return AjaxResult.success(); } @GetMapping("/consignerShoppingOrder") @ApiOperation(value = "发货", tags = {"管理后台-购物订单"}) public AjaxResult consignerShoppingOrder(String id,String companyName,String code) { @@ -192,6 +197,7 @@ shoppingOrderService.updateById(byId); return AjaxResult.success(); } @GetMapping("/getMyShoppingOrderList") @ApiOperation(value = "获取购买订单列表", tags = {"小程序-商城购买订单"}) public AjaxResult<Map<String, Object>> getMyShoppingOrderList(GetMyShoppingOrderList query){ @@ -217,14 +223,12 @@ } @GetMapping("/getMyShoppingOrderInfo/{id}") @ApiOperation(value = "获取购买订单详情", tags = {"小程序-商城购买订单","管理后台-支付订单-订单信息"}) public AjaxResult<MyShoppingOrderInfo> getMyShoppingOrderInfo(@PathVariable String id){ MyShoppingOrderInfo info = shoppingOrderService.getMyShoppingOrderInfo(id); return AjaxResult.success(info); } @PutMapping("/confirmReceipt/{id}") @@ -266,7 +270,6 @@ shoppingOrderService.cancelShoppingOrderWxRefund(out_refund_no, refund_id, tradeState, success_time); } } @ResponseBody ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -621,7 +621,6 @@ 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; @@ -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锁 和支付使用同一个锁 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锁 //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; } }