Pu Zhibing
2024-09-26 35601b1455ec05ece1414bd288fa38944c03bfdd
修改bug
1个文件已添加
8个文件已修改
312 ■■■■■ 已修改文件
ruoyi-auth/src/main/resources/bootstrap.yml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/resources/bootstrap.yml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/resources/bootstrap.yml 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/RedisLock.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
    }
}