Pu Zhibing
2024-09-26 35601b1455ec05ece1414bd288fa38944c03bfdd
修改bug
1个文件已添加
8个文件已修改
424 ■■■■■ 已修改文件
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 113 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java 89 ●●●● 补丁 | 查看 | 原始文档 | 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;
@@ -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;
    }
}