Pu Zhibing
2024-09-30 f541eaa5c92cb112af6d3f656275105606d31b39
Merge remote-tracking branch 'origin/master'
1 文件已重命名
1个文件已添加
42个文件已修改
607 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TChargingGun.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/query/SiteQuery.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/SiteVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/StrategyPriceVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/AcquisitionBillingModeReply.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoice.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/TEvaluationTagFallbackFactory.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/TEvaluationTagClient.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/FileUploadUtils.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/MinioSysFileServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AlipayOpenAppQrcodeCreate.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WxLoginController.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/filter/AuthFilter.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxAppletTools.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TAccountingStrategyDetailService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java 79 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/SiteMapper.xml 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderInvoiceController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java 65 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TVipOrderController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | 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/TOrderEvaluateServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TVipOrderServiceImpl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TAdvertisingController.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TEvaluationTagController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/TEvaluationTagMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TEvaluationTagService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TCouponServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TEvaluationTagServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TEvaluationTagMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TChargingGun.java
@@ -111,4 +111,8 @@
    @TableField("remark")
    private String remark;
    @ApiModelProperty(value = "已充电百分比")
    @TableField(exist = false)
    private Integer soc;
}
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/query/SiteQuery.java
@@ -26,4 +26,7 @@
    @NotNull(message = "地址纬度不能为空")
    private String lat;
    @ApiModelProperty(value = "城市code")
    private String cityCode;
}
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/SiteVO.java
@@ -23,6 +23,10 @@
    private Integer fastFreeCount;
    @ApiModelProperty(value = "慢充空闲数量")
    private Integer slowFreeCount;
    @ApiModelProperty(value = "原始电价")
    private BigDecimal electrovalenceOriginal;
    @ApiModelProperty(value = "服务费")
    private BigDecimal serviceCharge;
    @ApiModelProperty(value = "普通电价")
    private BigDecimal electrovalence;
    @ApiModelProperty(value = "会员电价")
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/StrategyPriceVO.java
@@ -23,4 +23,7 @@
    @ApiModelProperty(value = "服务费折扣")
    private BigDecimal serviceFeeDiscount;
    @ApiModelProperty(value = "折扣")
    private BigDecimal discount;
}
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/AcquisitionBillingModeReply.java
@@ -27,6 +27,7 @@
    private BigDecimal low_peak_electricity_rate;// 谷电费费率(精确到五位小数)
    private BigDecimal low_peak_service_rate;// 谷服务费费率(精确到五位小数)
    private BigDecimal loss_ratio;// 计损比例
//    private DayTimeBase day_time_base;
    private Integer time1;// 0:00~0:30 时段费率号(0:尖费率,1:峰费率,2:平费率,3:谷费率)
    private Integer time2;// 0:30~1:00 时段费率号(0:尖费率,1:峰费率,2:平费率,3:谷费率)
    private Integer time3;// 0:30~1:00 时段费率号(0:尖费率,1:峰费率,2:平费率,3:谷费率)
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
@@ -128,6 +128,12 @@
            public void chargingOrderStartupFailureWxRefund(String out_refund_no, String refund_id, String tradeState, String success_time) {
                log.error("远程启动失败后退款通知失败:" + throwable.getMessage());
            }
            @Override
            public void shoppingOrderWxRefund(String out_refund_no, String refund_id, String tradeState, String success_time) {
                log.error("购物订单退款回调通知失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
@@ -163,4 +163,16 @@
                                             @RequestParam("out_trade_no") String refund_id,
                                             @RequestParam("out_trade_no") String tradeState,
                                             @RequestParam("out_trade_no") String success_time);
    /**
     * 管理后台取消购物订单后退款回调
     * @param out_refund_no
     * @param refund_id
     * @param tradeState
     * @param success_time
     */
    @PostMapping("/t-shopping-order/shoppingOrderWxRefund")
    void shoppingOrderWxRefund(@RequestParam("out_trade_no") String out_refund_no,
                                             @RequestParam("out_trade_no") String refund_id,
                                             @RequestParam("out_trade_no") String tradeState,
                                             @RequestParam("out_trade_no") String success_time);
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoice.java
@@ -112,6 +112,7 @@
    
    @ApiModelProperty(value = "添加时间")
    @TableField("create_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime createTime;
    
    @ApiModelProperty(value = "开票时间")
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/TEvaluationTagFallbackFactory.java
@@ -31,6 +31,11 @@
                return R.fail("获取标签列表:" + throwable.getMessage());
            }
    
            @Override
            public R<List<TEvaluationTagVO>> getList() {
                return R.fail("获取标签列表失败:" + throwable.getMessage());
            }
            @Override
            public R<List<TEvaluationTag>> getListByIds(List<Integer> tagIds) {
                return R.fail("根据id集合获取数据失败:" + throwable.getMessage());
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/TEvaluationTagClient.java
@@ -27,6 +27,12 @@
     */
    @PostMapping("/t-evaluation-tag/getTagList")
    R<List<TEvaluationTagVO>> getTagList(Integer type);
    /**
     * 获取标签列表
     * @return
     */
    @PostMapping("/t-evaluation-tag/getList")
    R<List<TEvaluationTagVO>> getList();
    
    
    /**
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/FileUploadUtils.java
File was renamed from ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/utils/FileUploadUtils.java
@@ -1,4 +1,4 @@
package com.ruoyi.file.utils;
package com.ruoyi.common.core.utils;
import java.io.File;
import java.io.IOException;
@@ -10,8 +10,6 @@
import com.ruoyi.common.core.exception.file.FileNameLengthLimitExceededException;
import com.ruoyi.common.core.exception.file.FileSizeLimitExceededException;
import com.ruoyi.common.core.exception.file.InvalidExtensionException;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.file.FileTypeUtils;
import com.ruoyi.common.core.utils.file.MimeTypeUtils;
import com.ruoyi.common.core.utils.uuid.Seq;
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java
@@ -4,7 +4,7 @@
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.file.utils.FileUploadUtils;
import com.ruoyi.common.core.utils.FileUploadUtils;
/**
 * 本地文件存储
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/MinioSysFileServiceImpl.java
@@ -6,7 +6,7 @@
import org.springframework.web.multipart.MultipartFile;
import com.alibaba.nacos.common.utils.IoUtils;
import com.ruoyi.file.config.MinioConfig;
import com.ruoyi.file.utils.FileUploadUtils;
import com.ruoyi.common.core.utils.FileUploadUtils;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -160,6 +160,7 @@
        select
            user_id AS userId,
            nick_name AS nickName,
            user_name AS userName,
            create_time AS createTime,
            remark AS remark
        from sys_user
@@ -168,6 +169,7 @@
                AND nick_name LIKE concat('%',#{query.nickName},'%')
            </if>
            AND del_flag = '0'
            AND roleType = 1
        </where>
        ORDER BY create_time DESC
    </select>
ruoyi-service/ruoyi-account/pom.xml
@@ -16,6 +16,11 @@
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-mock</artifactId>
            <version>2.0.8</version>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-api-order</artifactId>
        </dependency>
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AlipayOpenAppQrcodeCreate.java
New file
@@ -0,0 +1,59 @@
package com.ruoyi.account.controller;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.AlipayConfig;
import com.alipay.api.response.AlipayOpenAppQrcodeCreateResponse;
import com.alipay.api.request.AlipayOpenAppQrcodeCreateRequest;
import com.alipay.api.domain.AlipayOpenAppQrcodeCreateModel;
import com.alipay.api.FileItem;
import java.util.Base64;
import java.util.ArrayList;
import java.util.List;
/**
 * 生成支付宝小程序二维码
 */
public class AlipayOpenAppQrcodeCreate {
    public static void main(String[] args) throws AlipayApiException {
        // 初始化SDK
        AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig());
        // 构造请求参数以调用接口
        AlipayOpenAppQrcodeCreateRequest request = new AlipayOpenAppQrcodeCreateRequest();
        AlipayOpenAppQrcodeCreateModel model = new AlipayOpenAppQrcodeCreateModel();
        // 设置跳转小程序的页面路径
        model.setUrlParam("pages/index/index");
        // 设置小程序的启动参数
        model.setQueryParam("x=1");
        // 设置码描述
        model.setDescribe("二维码描述");
        request.setBizModel(model);
        AlipayOpenAppQrcodeCreateResponse response = alipayClient.execute(request);
        System.out.println(response.getBody());
        String qrCodeUrl = response.getQrCodeUrl();
        System.err.println(qrCodeUrl);
        if (response.isSuccess()) {
            System.out.println("调用成功");
        } else {
            System.out.println("调用失败");
        }
    }
    private static AlipayConfig getAlipayConfig() {
        String privateKey  = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCxWgLykkSXsj6zz5kVohKb6yAaOK8d4wnbWLrabBQSHZg+UZj9HknzQvgrSdfiMd6Dlv70OYQBRynWb2OSGaIKpWLbDKQDT+hDBcbZQ3nVTKExC7w8t/5mUc0CH4DkMsMMDcDW2synh9Lv4fmw7eNnRgd6g6csGIZyOUgt34eMcmCUBP58bEkYhuPm9rLBMw7fCRl9zZbKNAiE5j9FNL1/oAWhET6BCHRqKpiDHvKLQDZdXUwI+sA/JSolNlU+x052YBPGxjH9zqD8mpRLZRTPCb5pV5wCG+EqQkiCauyhAJSCVo2Dx3uXe4nP/6UDlQmgxyiZ+uuMtPsDFjKd7EIXAgMBAAECggEBAKXBfufAFSPCkB/2cxlo9QOM6eAYAnNocxnzABCM2uVji5sTIG3SFUOq3891oLPj8BgE1BzmdJ3NKSklymYOVwikMpSQZ+pAkM+zYnpFOmVEzZLNaQ1G2ho/cd/+GbUuTGXDpOwqawRZSaiyB3B5pgQry2mSCniII4A2UWOuez2jR7R6kXh2UL4DGDPYjDj2Gx3WfYEeuarjdbaeKU6ngdArkYqNtsbpmaR9aOUhNyo6ltOWh7pKjdjApAEtoEqqYjr1uQ4E0wfF4noiU1hR7gTG8FjvWHy1/piPWM4CihUbhJemC5xKuVKltI0zMtR+uAx609sz6gOYlZkrYAXL0uECgYEA8Gqq/Jc1w6I5FTGImnoadKr1VWXBFKdU00p6EMX6FaY9uD41+YtaOtfBeNyAUZ20UlP+t9EsUbHunaMVb64N2wYMbSwy9ibNAse/KxT3XCT659lsyFyVPtbGxALXLu6sNH7VIljJv7KRm6slBqLKSdac2qZX/LwVvjIGjNz7p8MCgYEAvNjhFEn9KE8eOCK+qGEITVoR8k26lFGG0XsjRoinkgAUeUL2R6HFscOqUT31DvvQ7lNfopM+Sksmi/c64wXjcT49iHZwqCs6FNYHvY9HS0StVckLGliUg0U7FNWX0dwZyehpYamV4Eh9O/yZN+p07zAmDohTYmdsMWyqoieJqx0CgYEA6iiKZ0CDbgrXnCvFh+e7Uryb/NQBjbM4rB6S6zlYTbO/025MNcQjWsJ/vs7M8DEwyyriIXjKuLsb1E9d9otJFXU7ry1oaVT7QmT4beaa0hV2h1C+YhvChRS9PXYizaRK90o9HpnpzhsHNN4pTuBJNEeiOFfhxNgQOVISDSrCtO8CgYBMCnRPLB/A3GLJrcvhlvi11N/HFl9bm5xSu2eP3jTDSD72OO1cGJq3IpdxESac+u69GFs45ls9pRcHYuyWP2e+0JYMXcytGoLPowMI5CmL+EJneYV7/VEHrpfEouD4As1rjKbqSVPtNKMgxWyYpFKjgVrBnUkeJZDeMehfVNZNTQKBgAfhnhQgDk61C3KmgzKJ0hCogjTUL6AdjgC5bfV1AsV9yesh0q1bgHDrlMkS2aKYSF9wNeKYCYl2/ZYhilom4Mst/uxAl/8aLwDM9Cg29KfmMakst521IXv2Jrk2MiXXJMV5wowE8kbdb4Hkzsn1km2tBnng7Jyyek2HH737Jd1R";
        String alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAh+tCVKqUmlHDL8Ki1TUJtzE5IKV1irJuoHWZTvndJCKJJ8bdWxL9mu5xsy8KkfrnS6wJIKBMLTxMoYQHG7l2Gt07YyUCYHS5+yvbHtTkyFFy2KRPeUEWXz1Tm4juvInDvvr+n7v9ETepToGhC+UDlQcBvuSppw8N+463E+1GRrC4APwXYGLzaIvYvDHcQAULkWhXsjzxJSmeSi12kqWKlgnVJC1y0FT8xQtvhwShfaIqKwzErn9S2z7JjdXboJMUYQHoqF1A4SmWY8c0qawqvx2hGP36W3RDQ4cczzFwUHS1Cylhsbgh1COc4OdANCX4Np2NUzaRDCNzN0WVFKtK+QIDAQAB";
        AlipayConfig alipayConfig = new AlipayConfig();
        alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do");
        alipayConfig.setAppId("2021004173610331");
        alipayConfig.setPrivateKey(privateKey);
        alipayConfig.setFormat("json");
        alipayConfig.setAlipayPublicKey(alipayPublicKey);
        alipayConfig.setCharset("UTF-8");
        alipayConfig.setSignType("RSA2");
        return alipayConfig;
    }
}
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java
@@ -39,10 +39,7 @@
import java.math.BigDecimal;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -212,8 +209,12 @@
    @ApiOperation(value = "优惠卷可用数量", tags = {"小程序-站点管理-站点详情"})
    @GetMapping(value = "/couponCount")
    public R<Long> couponCount() {
        LocalDateTime now = LocalDateTime.now();
        return R.ok(tAppCouponService.lambdaQuery().le(TAppCoupon::getStartTime, now).ge(TAppCoupon::getEndTime, now).eq(TAppCoupon::getStatus, 1).count());
        Long userId = tokenService.getLoginUserApplet().getUserId();
        Long count = tAppCouponService.lambdaQuery().eq(TAppCoupon::getAppUserId, userId).ge(TAppCoupon::getEndTime, LocalDateTime.now()).eq(TAppCoupon::getStatus, 1).count();
        if(Objects.isNull(count)){
            count = 0L;
        }
        return R.ok(count);
    }
    
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
@@ -349,7 +349,6 @@
        Page<TAppUser> page = appUserService.lambdaQuery()
                .like(userListQueryDto.getUserPhone() != null && !"".equals(userListQueryDto.getUserPhone()), TAppUser::getPhone, userListQueryDto.getUserPhone())
                .eq(userListQueryDto.getCityCode() != null && !"".equals(userListQueryDto.getCityCode()), TAppUser::getCityCode, userListQueryDto.getCityCode())
                .eq(userListQueryDto.getProvinceCode() != null && !"".equals(userListQueryDto.getProvinceCode()), TAppUser::getProvinceCode, userListQueryDto.getProvinceCode())
                .in(!userIds.isEmpty(),TAppUser::getId,userIds)
                .eq(TAppUser::getStatus,1)
                .page(Page.of(userListQueryDto.getPageCurr(), userListQueryDto.getPageSize()));
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WxLoginController.java
@@ -1,6 +1,7 @@
package com.ruoyi.account.controller;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.internal.util.codec.Base64;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
@@ -15,6 +16,7 @@
import com.ruoyi.account.wx.tools.WxAppletTools;
import com.ruoyi.account.wx.tools.WxUtils;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.FileUploadUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.redis.service.RedisService;
@@ -24,12 +26,25 @@
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.SecureRandom;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * <p>
 *  微信小程序登录 前端控制器
@@ -48,6 +63,11 @@
    private WeixinProperties wxConfig;
    @Autowired
    private RestTemplate wxRestTemplate;
    /**
     * 上传文件存储在本地的根路径
     */
    @Value("${file.path}")
    private String localFilePath;
    @ApiOperation(value = "通过code获得openid,获取用户信息",tags = {"微信小程序登录"})
    @PostMapping("/openIdByJsCode")
    public AjaxResult<Map<String, Object>> openIdByJsCode(@RequestBody AppletUserEncrypteData data) {
@@ -79,4 +99,62 @@
    public AjaxResult<Map<String, Object>> openIdByJsCode(@RequestBody AppletUserDecodeData appletUserDecodeData) {
        return AjaxResult.success(appUserService.wxLogin(appletUserDecodeData, null));
    }
    public static MultipartFile convertInputStreamToMultipartFile(InputStream inputStream, String fileName, String contentType) throws IOException {
        return new MockMultipartFile(fileName, fileName, contentType, inputStream);
    }
    @ApiOperation(value = "获取微信小程序二维码",tags = {"获取微信小程序二维码"})
    @PostMapping("/getQRCode")
    public AjaxResult getQRCode() {
        InputStream inputStream = null;
        OutputStream outputStream = null;
        WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig);
        String accessToken = appletTools.getAccessToken("");
        try {
            String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken;
            Map<String, Object> param = new HashMap<>();
//            param.put("page", "pageA/houseDetail");
            param.put("check_path", false);
            param.put("env_version", "trial");
            param.put("width", 200); //二维码尺寸
            param.put("is_hyaline", true); // 是否需要透明底色, is_hyaline 为true时,生成透明底色的小程序码 参数仅对小程序码生效
            param.put("auto_color", true); // 自动配置线条颜色,如果颜色依然是黑色,则说明不建议配置主色调 参数仅对小程序码生效
            Map<String, Object> line_color = new HashMap<>();
            line_color.put("r", 0);
            line_color.put("g", 0);
            line_color.put("b", 0);
            param.put("line_color", line_color);
            System.err.println("调用生成微信URL接口传参:" + param);
            MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
            HttpEntity requestEntity = new HttpEntity(param, headers);
            ResponseEntity<byte[]> entity = wxRestTemplate.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]);
            System.err.println("调用小程序生成微信永久小程序码URL接口返回结果:" + entity.getBody());
            byte[] result = entity.getBody();
            System.err.println(Base64.encodeBase64String(result));
            inputStream = new ByteArrayInputStream(result);
            String finalFileName = System.currentTimeMillis() + "" + new SecureRandom().nextInt(0x0400) + ".jpeg";
            MultipartFile multipartFile = convertInputStreamToMultipartFile(inputStream, finalFileName, "image/jpeg");
            String name = FileUploadUtils.upload(localFilePath, multipartFile);
            System.err.println(name);
            return AjaxResult.success(name);
        } catch (Exception e) {
            System.err.println("调用小程序生成微信永久小程序码URL接口异常" + e);
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return AjaxResult.success();
    }
}
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/filter/AuthFilter.java
@@ -44,6 +44,11 @@
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
@@ -84,6 +89,10 @@
        filterChain.doFilter(request, response);
    }
    
    @Override
    public void destroy() {
    }
    
    
    private void unauthorizedResponse(HttpServletResponse response, String msg) {
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxAppletTools.java
@@ -5,6 +5,7 @@
import com.ruoyi.account.wx.body.resq.Code2SessionResqBody;
import com.ruoyi.account.wx.model.WeixinProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
@@ -284,7 +284,7 @@
        return AjaxResult.success(siteService.getSiteListGun());
    }
    @PostMapping("/getSiteListParkLot")
    @GetMapping("/getSiteListParkLot")
    @ApiOperation(value = "获取站点列表不分页", tags = {"管理后台-停车场绑定"})
    public AjaxResult<List<Site>> getSiteListParkLot(){
        return AjaxResult.success(siteService.getSiteListParkLot());
@@ -311,8 +311,8 @@
            siteDetailVO.setPartnerName(partner.getName());
        }
        // 计算距离
        Map<String, Double> distance = GeodesyUtil.getDistance(query.getLat() + "," + query.getLon(), siteDetailVO.getLat() + "," + siteDetailVO.getLon());
        siteDetailVO.setDistance(distance.get("WGS84"));
//        Map<String, Double> distance = GeodesyUtil.getDistance(query.getLat() + "," + query.getLon(), siteDetailVO.getLat() + "," + siteDetailVO.getLon());
//        siteDetailVO.setDistance(distance.get("WGS84"));
        // 查询绑定车牌提示文案
        TParkingLot parkingLot = parkingLotService.getOne(Wrappers.lambdaQuery(TParkingLot.class)
                .eq(TParkingLot::getSiteId, query.getSiteId()));
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
@@ -155,8 +155,8 @@
                Long userId = SecurityUtils.getLoginUser().getUserid();
                dto.setUserId(userId);
                dto.setAuditStatus(1);
                dto.setId(null);
                dto.setParentId(dto.getId());
                dto.setId(null);
                accountingStrategyService.save(dto);
                // 添加明细
                List<TAccountingStrategyDetail> accountingStrategyDetails = dto.getAccountingStrategyDetails();
@@ -223,6 +223,10 @@
                String twoUserName = sysUserClient.getSysUser(children.getTwoUserId()).getData().getNickName();
                accountingStrategyVO.setTwoUserName(twoUserName);
            }
            if(null != children.getUserId()){
                String userName = sysUserClient.getSysUser(children.getUserId()).getData().getNickName();
                accountingStrategyVO.setUserName(userName);
            }
            accountingStrategyVO.setAccountingStrategyDetailList(accountingStrategyDetailService.list(Wrappers.lambdaQuery(TAccountingStrategyDetail.class)
                    .eq(TAccountingStrategyDetail::getAccountingStrategyId, children.getId())));
        }else {
@@ -237,6 +241,10 @@
                String twoUserName = sysUserClient.getSysUser(accountingStrategy.getTwoUserId()).getData().getNickName();
                accountingStrategyVO.setTwoUserName(twoUserName);
            }
            if(null != children.getUserId()){
                String userName = sysUserClient.getSysUser(children.getUserId()).getData().getNickName();
                accountingStrategyVO.setUserName(userName);
            }
            accountingStrategyVO.setAccountingStrategyDetailList(accountingStrategyDetailService.list(Wrappers.lambdaQuery(TAccountingStrategyDetail.class)
                    .eq(TAccountingStrategyDetail::getAccountingStrategyId, id)));
        }
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java
@@ -75,6 +75,15 @@
    }
    /**
     * 通过站点id查询当前时间段计费策略展示
     */
    @ApiOperation(tags = {"小程序-站点管理-站点详情"},value = "通过枪id查询当前时间段计费策略展示")
    @GetMapping(value = "/queryStrategyByGunIdAndTime")
    public AjaxResult<List<TAccountingStrategyDetailVO>> queryStrategyByGunIdAndTime(@RequestParam("gunId") Integer gunId) {
        return AjaxResult.ok(accountingStrategyDetailService.queryStrategyByGunIdAndTime(gunId));
    }
    /**
     * 价格说明金额返回,会员开通金额说明
     */
    @ApiOperation(tags = {"小程序-站点管理-站点详情"},value = "价格说明金额返回,会员开通金额说明")
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TAccountingStrategyDetailService.java
@@ -52,4 +52,10 @@
     */
    Boolean isStrategyPriceConsistent(List<TAccountingStrategyDetail> accountingStrategyDetails);
    /**
     * 通过枪id查询当前时间段计费策略展示
     * @param gunId
     * @return
     */
    List<TAccountingStrategyDetailVO> queryStrategyByGunIdAndTime(Integer gunId);
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java
@@ -8,6 +8,7 @@
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.chargingPile.api.model.TChargingGun;
import com.ruoyi.chargingPile.api.model.TChargingPile;
import com.ruoyi.chargingPile.api.model.TParkingLot;
import com.ruoyi.chargingPile.api.query.GetSiteList;
import com.ruoyi.chargingPile.api.query.SiteQuery;
import com.ruoyi.chargingPile.api.vo.SiteDetailVO;
@@ -15,10 +16,7 @@
import com.ruoyi.chargingPile.api.vo.TAccountingStrategyVO;
import com.ruoyi.chargingPile.domain.SiteMenu;
import com.ruoyi.chargingPile.mapper.SiteMapper;
import com.ruoyi.chargingPile.service.IPartnerService;
import com.ruoyi.chargingPile.service.ISiteService;
import com.ruoyi.chargingPile.service.TChargingGunService;
import com.ruoyi.chargingPile.service.TChargingPileService;
import com.ruoyi.chargingPile.service.*;
import com.ruoyi.common.core.utils.ServletUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.web.domain.AjaxResult;
@@ -36,9 +34,11 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
 * @author zhibing.pu
@@ -72,6 +72,8 @@
    private VipClient vipClient;
    @Resource
    private SysUserRoleClient sysUserRoleClient;
    @Resource
    private TParkingLotService parkingLotService;
    
    
@@ -285,7 +287,7 @@
            TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
            if(Objects.nonNull(vip) && vip.getType() == 2){
                list.forEach(item -> {
                    item.setVipElectrovalence(vip.getDiscount().multiply(item.getElectrovalence()));
                    item.setVipElectrovalence(vip.getDiscount().multiply(item.getServiceCharge()).add(item.getElectrovalenceOriginal()));
                });
            }
        }
@@ -318,6 +320,12 @@
                ids = new HashSet<>(data);
            }
        }
        // 查询所有的停车场的站点id
        List<TParkingLot> list = parkingLotService.list();
        List<Integer> siteIds = list.stream().map(TParkingLot::getSiteId).collect(Collectors.toList());
        if(!CollectionUtils.isEmpty(ids) && !CollectionUtils.isEmpty(siteIds)){
            ids.addAll(siteIds);
        }
        return this.baseMapper.getSiteListParkLot(ids);
    }
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java
@@ -7,12 +7,14 @@
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.chargingPile.api.model.TAccountingStrategy;
import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
import com.ruoyi.chargingPile.api.model.TChargingGun;
import com.ruoyi.chargingPile.api.vo.StrategyPriceVO;
import com.ruoyi.chargingPile.api.vo.TAccountingStrategyDetailVO;
import com.ruoyi.chargingPile.mapper.TAccountingStrategyDetailMapper;
import com.ruoyi.chargingPile.mapper.TAccountingStrategyMapper;
import com.ruoyi.chargingPile.service.ISiteService;
import com.ruoyi.chargingPile.service.TAccountingStrategyDetailService;
import com.ruoyi.chargingPile.service.TChargingGunService;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.security.service.TokenService;
@@ -46,6 +48,8 @@
    private TokenService tokenService;
    @Autowired
    private ISiteService siteService;
    @Autowired
    private TChargingGunService chargingGunService;
    @Autowired
    private AppUserClient appUserClient;
    @Override
@@ -81,11 +85,11 @@
                    .findFirst().orElseThrow(() -> new ServiceException("未查询到下一时间段的计费策略明细"));
            if(Objects.nonNull(vip)) {
                if (vip.getType() == 2) {
                    accountingStrategyDetailVO.setTotalPrice(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge()).multiply(vip.getDiscount()));
                    accountingStrategyDetailNext.setTotalPrice(accountingStrategyDetailNext.getElectrovalence().add(accountingStrategyDetailNext.getServiceCharge()).multiply(vip.getDiscount()));
                    accountingStrategyDetailVO.setTotalPrice(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge().multiply(vip.getDiscount())));
                    accountingStrategyDetailNext.setTotalPrice(accountingStrategyDetailNext.getElectrovalence().add(accountingStrategyDetailNext.getServiceCharge().multiply(vip.getDiscount())));
                } else {
                    accountingStrategyDetailVO.setTotalPrice(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge()).multiply(accountingStrategy.getDiscount()));
                    accountingStrategyDetailNext.setTotalPrice(accountingStrategyDetailNext.getElectrovalence().add(accountingStrategyDetailNext.getServiceCharge()).multiply(accountingStrategy.getDiscount()));
                    accountingStrategyDetailVO.setTotalPrice(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge().multiply(accountingStrategy.getDiscount())));
                    accountingStrategyDetailNext.setTotalPrice(accountingStrategyDetailNext.getElectrovalence().add(accountingStrategyDetailNext.getServiceCharge().multiply(accountingStrategy.getDiscount())));
                }
            }else {
                accountingStrategyDetailVO.setTotalPrice(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge()));
@@ -115,17 +119,21 @@
        TAccountingStrategyDetailVO accountingStrategyDetailVO = list.stream().filter(detail -> DateUtils.string2LocalTime(detail.getStartTime() + ":00").compareTo(LocalTime.now()) <= 0
                        && DateUtils.string2LocalTime(detail.getEndTime() + ("23:59:59".equals(detail.getEndTime())?"":":00")).compareTo(LocalTime.now()) > 0)
                .findFirst().orElseThrow(() -> new ServiceException("当前时间段未查询到计费策略明细"));
        strategyPriceVO.setDiscountAmount(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge())
//        strategyPriceVO.setDiscountAmount(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge())
//                .subtract(accountingStrategyDetailVO.getServiceCharge().multiply(accountingStrategy.getDiscount())).setScale(2, BigDecimal.ROUND_HALF_UP));
        strategyPriceVO.setDiscountAmount(accountingStrategyDetailVO.getServiceCharge()
                .subtract(accountingStrategyDetailVO.getServiceCharge().multiply(accountingStrategy.getDiscount())).setScale(2, BigDecimal.ROUND_HALF_UP));
        // 查询最高折扣的会员
        TVip monthlyCardDiscount = vipClient.getVipInfoByType(3).getData();
        strategyPriceVO.setServiceFeeDiscount(monthlyCardDiscount.getMonthlyCardDiscount());
        // 查询最高抵扣的会员
        TVip maximumDeduction = vipClient.getVipInfoByType(1).getData();
        strategyPriceVO.setMaxDiscountAmount(maximumDeduction.getMaximumDeduction());
        // 查询最低起步价会员
        TVip monthlyCard = vipClient.getVipInfoByType(2).getData();
        strategyPriceVO.setVipStartPrice(monthlyCard.getMonthlyCard());
        // 查询最高折扣的会员
        TVip monthlyCardDiscount = vipClient.getVipInfoByType(3).getData();
        strategyPriceVO.setServiceFeeDiscount(monthlyCardDiscount.getMonthlyCardDiscount());
        // 模板折扣
        strategyPriceVO.setDiscount(accountingStrategy.getDiscount());
        return strategyPriceVO;
    }
@@ -147,19 +155,72 @@
    @Override
    public Boolean isStrategyPriceConsistent(List<TAccountingStrategyDetail> accountingStrategyDetails) {
        Map<Integer, BigDecimal> phaseToServiceFee = new HashMap<>();
        Map<Integer, BigDecimal> phaseToCostServiceFee = new HashMap<>();
        for (TAccountingStrategyDetail detail : accountingStrategyDetails) {
            Integer type = detail.getType();
            BigDecimal serviceFee = detail.getServiceCharge();
            BigDecimal costServiceCharge = detail.getCostServiceCharge();
            if (phaseToServiceFee.containsKey(type)) {
                BigDecimal existingFee = phaseToServiceFee.get(type);
                if (!existingFee.equals(serviceFee)) {
                BigDecimal existingCostServiceCharge = phaseToCostServiceFee.get(type);
                if (existingFee.compareTo(serviceFee) != 0) {
                    return false; // 发现不一致的服务费
                }
                if (existingCostServiceCharge.compareTo(costServiceCharge) != 0) {
                    return false; // 发现不一致的原价服务费
                }
            } else {
                phaseToServiceFee.put(type, serviceFee);
                phaseToCostServiceFee.put(type, costServiceCharge);
            }
        }
        return true; // 所有相同阶段的服务费一致
    }
    @Override
    public List<TAccountingStrategyDetailVO> queryStrategyByGunIdAndTime(Integer gunId) {
        TChargingGun chargingGun = chargingGunService.getById(gunId);
        TAccountingStrategy accountingStrategy = accountingStrategyMapper.selectById(chargingGun.getAccountingStrategyId());
        if(Objects.isNull(accountingStrategy)){
            throw new ServiceException("未查询到计费策略");
        }
        List<TAccountingStrategyDetailVO> list = this.queryAccountingStrategyDetailByStrategyId(accountingStrategy.getId());
        list.stream().filter(item -> "00:00".equals(item.getEndTime())).forEach(item -> item.setEndTime("23:59:59"));
        // 获取当前登录用户id
        Long userId = tokenService.getLoginUserApplet().getUserId();
        // 根据id查询用户信息
        TAppUser appUser = appUserClient.getUserById(userId).getData();
        if(Objects.nonNull(appUser)){
            // 查询会员信息
            TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
            TAccountingStrategyDetailVO accountingStrategyDetailVO;
            TAccountingStrategyDetailVO accountingStrategyDetailNext;
            // 获取当前时间段的计费策略明细
            accountingStrategyDetailVO = list.stream().filter(detail -> DateUtils.string2LocalTime(detail.getStartTime() + ":00").compareTo(LocalTime.now()) <= 0
                            && DateUtils.string2LocalTime(detail.getEndTime() + ("23:59:59".equals(detail.getEndTime())?"":":00")).compareTo(LocalTime.now()) > 0)
                    .findFirst().orElseThrow(() -> new ServiceException("当前时间段未查询到计费策略明细"));
            // 获取后一次的计费策略明细
            accountingStrategyDetailVO.setEndTime("23:59:59".equals(accountingStrategyDetailVO.getEndTime())? "00:00":accountingStrategyDetailVO.getEndTime());
            accountingStrategyDetailNext = list.stream().filter(detail -> detail.getStartTime().compareTo(accountingStrategyDetailVO.getEndTime()) == 0)
                    .findFirst().orElseThrow(() -> new ServiceException("未查询到下一时间段的计费策略明细"));
            if(Objects.nonNull(vip)) {
                if (vip.getType() == 2) {
                    accountingStrategyDetailVO.setTotalPrice(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge().multiply(vip.getDiscount())));
                    accountingStrategyDetailNext.setTotalPrice(accountingStrategyDetailNext.getElectrovalence().add(accountingStrategyDetailNext.getServiceCharge().multiply(vip.getDiscount())));
                } else {
                    accountingStrategyDetailVO.setTotalPrice(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge().multiply(accountingStrategy.getDiscount())));
                    accountingStrategyDetailNext.setTotalPrice(accountingStrategyDetailNext.getElectrovalence().add(accountingStrategyDetailNext.getServiceCharge().multiply(accountingStrategy.getDiscount())));
                }
            }else {
                accountingStrategyDetailVO.setTotalPrice(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge()));
                accountingStrategyDetailNext.setTotalPrice(accountingStrategyDetailNext.getElectrovalence().add(accountingStrategyDetailNext.getServiceCharge()));
            }
            list = new ArrayList<>();
            list.add(accountingStrategyDetailVO);
            list.add(accountingStrategyDetailNext);
            return list;
        }
        return new ArrayList<>();
    }
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java
@@ -265,7 +265,17 @@
        List<TChargingGun> chargingGuns = chargingGunService.list(wrapper);
        // 查询充电枪信息
        chargingPileVOS.forEach(item -> {
            item.setChargingGunList(chargingGuns.stream().filter(gun -> gun.getChargingPileId().equals(item.getId())).collect(Collectors.toList()));
            List<TChargingGun> chargingGunList = chargingGuns.stream().filter(gun -> gun.getChargingPileId().equals(item.getId())).collect(Collectors.toList());
            for (TChargingGun chargingGun : chargingGunList) {
                if(chargingGun.getStatus().equals(4)){
                    // TODO 查询正在充电的单子的实时记录
                    chargingGun.setSoc(100);
                }
                if(chargingGun.getStatus().equals(5)){
                    chargingGun.setSoc(100);
                }
            }
            item.setChargingGunList(chargingGunList);
        });
        return chargingPileVOS;
    }
ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/SiteMapper.xml
@@ -109,7 +109,7 @@
        ts.id, ts.partner_id, ts.code, ts.`name`, ts.site_type, ts.business_category, ts.status, ts.construction_site, ts.img_url,
        ts.lon, ts.lat, ts.address, ts.country_code, ts.phone,ts.guide, ts.service_description, ts.vehicle_description,
        ts.parking_space, ts.rate_description, ts.space_charge_explain, ts.accounting_strategy_id,ts.del_flag,tcg.fastCount,
        tcg.slowCount,tcg.superCount,tasd.electrovalence,tasd.vipElectrovalence,tcg.superFreeCount,tcg.fastFreeCount,tcg.slowFreeCount,
        tcg.slowCount,tcg.superCount,tasd.electrovalence,tasd.vipElectrovalence,tasd.serviceCharge,tasd.electrovalenceOriginal,tcg.superFreeCount,tcg.fastFreeCount,tcg.slowFreeCount,
        ROUND(
        6378.138 * 2 * ASIN(
        SQRT(
@@ -149,8 +149,10 @@
        left join (
        select
            a.accounting_strategy_id,
            a.service_charge AS serviceCharge,
            a.electrovalence AS electrovalenceOriginal,
            (a.electrovalence+a.service_charge) AS electrovalence,
            ((a.electrovalence+a.service_charge)*b.discount) AS vipElectrovalence
            (a.electrovalence + (a.service_charge*b.discount)) AS vipElectrovalence
        from
            t_accounting_strategy_detail a
        left join
@@ -160,6 +162,9 @@
        <where>
            <if test="null != query.name and '' != query.name">
                and ts.`name` like CONCAT('%', #{query.name}, '%')
            </if>
            <if test="null != query.cityCode and '' != query.cityCode">
                and ts.cityCode = #{query.cityCode}
            </if>
            AND ts.del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()}
            AND ts.status = ${@com.ruoyi.common.core.enums.status.SiteStatusEnum@NORMAL_USE.getCode()}
@@ -180,13 +185,36 @@
        </if>
    </select>
    <select id="getDetailById" resultType="com.ruoyi.chargingPile.api.vo.SiteDetailVO">
        SELECT <include refid="Base_Column_List"></include>
        SELECT id, partner_id, code, `name`, site_type, business_category, status, construction_site, img_url, province, province_code,
               city, city_code, districts, districts_code, lon, lat, address, country_code, phone, service_phone, guide, start_service_time,
               end_service_time, service_description, vehicle_description, parking_space, rate_description, space_charge_explain,
               accounting_strategy_id, establishment_time, sort, remark, create_time, del_flag, mark,
            ROUND(
        6378.138 * 2 * ASIN(
        SQRT(
        POW(
        SIN(
        (
        #{query.lat} * PI() / 180 - ts.lat * PI() / 180
        ) / 2
        ),
        2
        ) + COS(#{query.lat} * PI() / 180) * COS(ts.lat * PI() / 180) * POW(
        SIN(
        (
        #{query.lon} * PI() / 180 - ts.lon * PI() / 180
        ) / 2
        ),
        2
        )
        )
        ) * 1000
        ) AS distance
        FROM t_site WHERE id = #{siteId} AND del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()}
    </select>
    <select id="getSiteListParkLot" resultType="com.ruoyi.chargingPile.api.model.Site">
        select ts.id, ts.partner_id, ts.code, ts.`name`, ts.site_type, ts.business_category, ts.status,tpl.id AS parkingLotId
        select ts.id, ts.partner_id, ts.code, ts.`name`, ts.site_type, ts.business_category, ts.status
        from t_site ts
        left join t_parking_lot tpl on (ts.id = tpl.site_id)
        <where>
            <if test="null != ids and ids.size()>0">
                AND ts.id IN
@@ -195,7 +223,6 @@
                </foreach>
            </if>
            AND ts.del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()}
            AND tpl.id IS NULL
        </where>
    </select>
    <select id="getSiteListGun" resultType="com.ruoyi.chargingPile.api.model.Site">
@@ -268,6 +295,9 @@
            <if test="null != query.name and '' != query.name">
                and ts.`name` like CONCAT('%', #{query.name}, '%')
            </if>
            <if test="null != query.cityCode and '' != query.cityCode">
                and ts.cityCode = #{query.cityCode}
            </if>
            AND ts.del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()}
            AND ts.status = ${@com.ruoyi.common.core.enums.status.SiteStatusEnum@NORMAL_USE.getCode()}
        </where>
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java
@@ -23,12 +23,12 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.*;
/**
 * iotda消息监听
@@ -62,6 +62,11 @@
        String productId = header.getString("product_id"); // 产品id
        String service_id = content.getString("service_id");
        log.info("服务id:{}",service_id);
        // 写入文件
        FileWriter writer = new FileWriter("D:/sample.txt",true);
        writer.write("接收到消息中转:"+jsonObject+"\n");
        writer.write("服务id:"+service_id+"\n");
        writer.close();
        SendResult sendResult;
        // 设备消息下发
        String result;
@@ -76,6 +81,11 @@
                onlineReply.setOnline_result(0);
                result = iotMessageProduce.sendMessage(deviceId, ServiceIdMenu.ONLINE_REPLY.getKey(), messageUtil.onlineReply(onlineReply));
                log.info("充电桩登录认证-返回结果:{}",result);
                // 响应硬件 对时设置应答
                TimingSettingReply timingSettingReplyOnline = new TimingSettingReply();
                timingSettingReplyOnline.setCharging_pile_code(onlineMessage.getCharging_pile_code());
                timingSettingReplyOnline.setCurrent_time(CP56Time2aConverter.convertToCP56Time2a(new Date()));
                iotMessageProduce.sendMessage(deviceId, ServiceIdMenu.TIMING_SETTING_REPLY.getKey(),messageUtil.timingSettingReply(timingSettingReplyOnline));
                break;
            case SendTagConstant.PING:
                PingMessage pingMessage = JSON.parseObject(content.toJSONString(),PingMessage.class);
@@ -129,14 +139,14 @@
                AcquisitionBillingModeMessage acquisitionBillingModeMessage = JSON.parseObject(content.toJSONString(),AcquisitionBillingModeMessage.class);
                sendResult = enhanceProduce.acquisitionBillingModeMessage(acquisitionBillingModeMessage);
                // 响应硬件   计费模型请求应答  1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段
                List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailClient.getDetailListByCode(acquisitionBillingModeMessage.getCharging_pile_code()).getData();
                List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailClient.getDetailListByCode(acquisitionBillingModeMessage.getCharging_pile_code().substring(0,14)).getData();
                Map<Integer, TAccountingStrategyDetail> strategyPrice = StrategyUtil.getStrategyPrice(accountingStrategyDetails);
                // 价格设置
                AcquisitionBillingModeReply acquisitionBillingModeReply = new AcquisitionBillingModeReply();
                StrategyUtil.setStrategyPrice(strategyPrice,acquisitionBillingModeReply);
                // 时段设置
                StrategyUtil.setTime(accountingStrategyDetails,acquisitionBillingModeReply);
                TAccountingStrategyDetail accountingStrategyDetail = accountingStrategyDetailClient.getDetailByCode(acquisitionBillingModeMessage.getCharging_pile_code()).getData();
                TAccountingStrategyDetail accountingStrategyDetail = accountingStrategyDetailClient.getDetailByCode(acquisitionBillingModeMessage.getCharging_pile_code().substring(0,14)).getData();
                acquisitionBillingModeReply.setBilling_model_code(accountingStrategyDetail.getId().toString());
                acquisitionBillingModeReply.setCharging_pile_code(acquisitionBillingModeMessage.getCharging_pile_code());
                acquisitionBillingModeReply.setLoss_ratio(BigDecimal.ZERO);
@@ -364,4 +374,32 @@
        return R.ok(message);
    }
    @ApiOperation(value = "测试",tags = {"硬件接口"})
    @GetMapping(value = "/test")
    public R test() {
        String orderNum = "2024092646526785213546";
        String deviceId = "3401231001200202";
        Long orderId = 2024065544L;
        BigDecimal money = new BigDecimal(50);
        PlatformStartCharging platformStartCharging = new PlatformStartCharging();
        platformStartCharging.setTransaction_serial_number(orderNum);
        platformStartCharging.setCharging_pile_code(deviceId);
        platformStartCharging.setCharging_gun_code("02");
        platformStartCharging.setCard_number(orderId.toString());
        platformStartCharging.setAccount_balance(money);
        String message = iotMessageProduce.sendMessage(platformStartCharging.getCharging_pile_code(), ServiceIdMenu.PLATFORM_START_CHARGING.getKey(), messageUtil.platformStartCharging(platformStartCharging));
        System.err.println(platformStartCharging);
        return R.ok(message);
    }
    @ApiOperation(value = "测试",tags = {"硬件接口"})
    @GetMapping(value = "/stop")
    public R test1() {
        PlatformStopCharging platformStopCharging = new PlatformStopCharging();
        platformStopCharging.setCharging_pile_code("3401231001200202");
        platformStopCharging.setCharging_gun_code("02");
        String message = iotMessageProduce.sendMessage(platformStopCharging.getCharging_pile_code(), ServiceIdMenu.PLATFORM_STOP_CHARGING.getKey(),messageUtil.platformStopCharging(platformStopCharging));
        return R.ok(message);
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderInvoiceController.java
@@ -75,6 +75,7 @@
                                        @RequestParam("invoiceUrl") String invoiceUrl){
        TOrderInvoice orderInvoice = orderInvoiceService.getById(id);
        orderInvoice.setInvoiceUrl(invoiceUrl);
        orderInvoice.setStatus(3);
        orderInvoiceService.updateById(orderInvoice);
        // 发送邮箱
        // 收件人电子邮箱,TODO 换成自己的收件箱
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java
@@ -1,6 +1,7 @@
package com.ruoyi.order.controller;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
@@ -15,10 +16,13 @@
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.order.api.model.TChargingOrderRefund;
import com.ruoyi.order.api.model.TExchangeOrder;
import com.ruoyi.order.api.model.TShoppingOrder;
import com.ruoyi.order.api.model.TShoppingOrderRefund;
import com.ruoyi.order.api.query.ShoppingOrderQuery;
import com.ruoyi.order.dto.*;
import com.ruoyi.order.service.TShoppingOrderRefundService;
import com.ruoyi.order.service.TShoppingOrderService;
import com.ruoyi.other.api.domain.TCoupon;
import com.ruoyi.other.api.domain.TGoods;
@@ -40,6 +44,7 @@
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.time.format.DateTimeFormatter;
import java.util.*;
/**
@@ -73,7 +78,31 @@
    private AppCouponClient appCouponClient;
    @Resource
    private SysUserClient sysUserClient;
    @Resource
    private TShoppingOrderRefundService shoppingOrderRefundService;
    /**
     * 远程管理后台取消订单后退款回调
     */
    @ResponseBody
    @PostMapping(value = "/shoppingOrderWxRefund")
    public void shoppingOrderWxRefund(@RequestParam("out_trade_no") String out_refund_no,
                                                    @RequestParam("out_trade_no") String refund_id,
                                                    @RequestParam("out_trade_no") String tradeState,
                                                    @RequestParam("out_trade_no") String success_time){
        if("SUCCESS".equals(tradeState)){
            TShoppingOrderRefund one = shoppingOrderRefundService.getOne(new LambdaQueryWrapper<TShoppingOrderRefund>().eq(TShoppingOrderRefund::getRefundCode, out_refund_no));
            one.setRefundSerialNumber(refund_id);
            one.setRefundStatus(2);
            one.setRefundTime(LocalDateTime.parse(success_time, DateTimeFormatter.ofPattern("yyyy-MM-DDTHH:mm:ss+TIMEZONE")));
            shoppingOrderRefundService.updateById(one);
            TShoppingOrder byId = shoppingOrderService.getById(one.getShoppingOrderId());
            byId.setStatus(4);
            shoppingOrderService.updateById(byId);
            if (byId.getAppCouponId() != null) {
                appCouponClient.refund(byId.getAppCouponId().toString());
            }
        }
    }
    
    @PostMapping("/getShoppingOrderList")
    @ApiOperation(value = "列表查询", tags = {"管理后台-购物订单"})
@@ -154,6 +183,21 @@
        byId.setCancellationId(userid);
        byId.setCancellationTime(LocalDateTime.now());
        byId.setStatus(4);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        TShoppingOrderRefund tShoppingOrderRefund = new TShoppingOrderRefund();
        tShoppingOrderRefund.setPayTime(byId.getPayTime());
        tShoppingOrderRefund.setPayCode(byId.getSerialNumber());
        tShoppingOrderRefund.setPayAmount(byId.getPaymentAmount());
        tShoppingOrderRefund.setPayType(1);
        tShoppingOrderRefund.setShoppingOrderId(byId.getId());
        tShoppingOrderRefund.setRefundAmount(byId.getPaymentAmount());
        tShoppingOrderRefund.setRefundStatus(1);
        tShoppingOrderRefund.setCode("GWF" + sdf.format(new Date()) + Double.valueOf(Math.random() * 1000).intValue());
        tShoppingOrderRefund.setRefundTitle("后台取消订单");
        tShoppingOrderRefund.setRefundContent("后台取消订单");
        tShoppingOrderRefund.setRefundReason("后台取消订单");
        tShoppingOrderRefund.setRefundRemark("全额退款");
        tShoppingOrderRefund.setRefundTotalAmount(byId.getPaymentAmount());
        switch (byId.getPaymentType()) {
            case 1:
                // 微信
@@ -163,8 +207,6 @@
                wxPaymentRefundModel.setOut_refund_no(OrderCodeUtil.getOrderCode("GWTK"));
                wxPaymentRefundModel.setReason("后台购物订单退款");
                wxPaymentRefundModel.setNotify_url("/payment/wx/refund/notify");
                // todo 部署到线上之后写回调地址
                String string = byId.getPaymentAmount().multiply(new BigDecimal("100")).toString();
                if (string.contains(".")) {
                    string = string.substring(0, string.indexOf("."));
@@ -175,28 +217,37 @@
                refundAmount.setCurrency("CNY");
                refundAmount.setRefund(i);
                wxPaymentRefundModel.setAmount(refundAmount);
                wxPaymentClient.refundOrderR(wxPaymentRefundModel);
                R<String> stringR = wxPaymentClient.refundOrderR(wxPaymentRefundModel);
                if(200 == stringR.getCode()){
                    shoppingOrderRefundService.save(tShoppingOrderRefund);
                }
                break;
            case 2:
                // 支付宝
                RefundReq refundReq = new RefundReq();
                refundReq.setOutTradeNo(byId.getSerialNumber());
                String gw = OrderCodeUtil.getOrderCode("GWTK");
                String gw = OrderCodeUtil.getOrderCode("GWF");
                refundReq.setOutRequestNo(gw);
                refundReq.setRefundAmount(byId.getPaymentAmount().toString());
                refundReq.setRefundReason("后台购物订单退款");
                RefundResp data = aliPaymentClient.refund(refundReq).getData();
                if (data != null) {
                    // 退款成功 回退优惠券
                    byId.setStatus(4);
                    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
                    TShoppingOrderRefund one = shoppingOrderRefundService.getOne(new LambdaQueryWrapper<TShoppingOrderRefund>().eq(TShoppingOrderRefund::getRefundCode, data.getOutTradeNo()));
                    one.setRefundSerialNumber(data.getTradeNo());
                    one.setRefundStatus(2);
                    one.setRefundTime(LocalDateTime.parse(sdf1.format(new Date()), DateTimeFormatter.ofPattern("yyyy-MM-DDTHH:mm:ss+TIMEZONE")));
                    shoppingOrderRefundService.updateById(one);
                    if (byId.getAppCouponId() != null) {
                        // 退款成功 回退优惠券
                        appCouponClient.refund(byId.getAppCouponId().toString());
                    }
                        byId.setRefundCode(gw);
                        byId.setRefundAmount(byId.getPaymentAmount());
                        byId.setRefundStatus(2);
                        byId.setRefundSerialNumber(data.getTradeNo());
                        shoppingOrderService.updateById(byId);
                    }
                }
                break;
        }
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TVipOrderController.java
@@ -70,8 +70,14 @@
    @PostMapping("/addVipOrder")
    @ApiOperation(value = "添加会员订单", tags = {"管理后台-会员订单"})
    public R<Long> addVipOrder(@RequestBody TVipOrder dto) {
        if (dto.getId()!=null){
            List<TVipOrder> list = vipOrderService.lambdaQuery().eq(TVipOrder::getCode, dto.getCode())
                    .ne(TVipOrder::getId, dto.getId()).list();
            if (!list.isEmpty())return R.fail("订单编号已存在");
        }else{
        List<TVipOrder> list = vipOrderService.lambdaQuery().eq(TVipOrder::getCode, dto.getCode()).list();
        if (!list.isEmpty())return R.fail("订单编号已存在");
        }
        vipOrderService.saveOrUpdate(dto);
        return R.ok(dto.getId());
    }
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -948,6 +948,9 @@
                    throw new RuntimeException(failure_cause);
                }
                // 将枪状态重置为空闲
                chargingGun.setStatus(2);
                chargingGunClient.updateChargingGunById(chargingGun);
                //计算费用,处理退款
                endCharge(chargingOrder);
                break;
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderEvaluateServiceImpl.java
@@ -115,7 +115,7 @@
    @Override
    public List<TEvaluationTagVO> getTagCount() {
        // 查询标签列表
        R<List<TEvaluationTagVO>> r = evaluationTagClient.getTagList(null);
        R<List<TEvaluationTagVO>> r = evaluationTagClient.getList();
        List<TEvaluationTagVO> tagList = r.getData();
        List<Integer> tagIds = tagList.stream().map(TEvaluationTagVO::getId).collect(Collectors.toList());
        // 统计标签使用数量
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TVipOrderServiceImpl.java
@@ -54,10 +54,14 @@
            tVipOrder.setUid(tVipOrder.getId().toString());
            tVipOrder.setUserUid(tVipOrder.getAppUserId().toString());
            TVip data = vipClient.getInfo(tVipOrder.getVipId()).getData();
            if (data!=null){
                tVipOrder.setName(data.getName());
            }
            if (StringUtils.hasLength(tVipOrder.getTitle()))
            {
                // 去除最后两个字符
                tVipOrder.setName(tVipOrder.getTitle().substring(0, tVipOrder.getTitle().length() - 2));
            }
            TAppUser data1 = appUserClient.getUserById(tVipOrder.getAppUserId()).getData();
            if (data1!=null)tVipOrder.setUserPhone(data1.getPhone());
        }
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TAdvertisingController.java
@@ -1,6 +1,7 @@
package com.ruoyi.other.controller;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.core.enums.status.AdvertisingStatusEnum;
import com.ruoyi.common.core.web.domain.AjaxResult;
@@ -17,10 +18,23 @@
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.SecureRandom;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * <p>
@@ -54,7 +68,16 @@
    @ApiOperation(tags = {"管理后台-广告管理"},value = "广告修改")
    @Log(title = "【广告管理】修改广告", businessType = BusinessType.UPDATE,operatorType = OperatorType.MANAGE)
    public AjaxResult updateVip(@RequestBody TAdvertising dto) {
        if (dto.getJumpType() == 2){
            // 清空跳转地址
        advertisingService.updateById(dto);
            LambdaUpdateWrapper<TAdvertising> tAdvertisingLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
            tAdvertisingLambdaUpdateWrapper.eq(TAdvertising::getId,dto.getId())
                    .set(TAdvertising::getJumpUrl,null);
            advertisingService.update(tAdvertisingLambdaUpdateWrapper);
        }else{
            advertisingService.updateById(dto);
        }
        return AjaxResult.success();
    }
    @GetMapping("/getInfo")
@@ -76,7 +99,9 @@
    public AjaxResult<List<TAdvertising>> list(@RequestParam("position") Integer position) {
        return AjaxResult.ok(advertisingService.list(Wrappers.lambdaQuery(TAdvertising.class)
                .eq(TAdvertising::getStatus, AdvertisingStatusEnum.YES.getCode())
                .eq(TAdvertising::getPosition,position)));
                .eq(TAdvertising::getPosition,position)
                .le(TAdvertising::getStartTime, LocalDateTime.now())
                .ge(TAdvertising::getEndTime,LocalDateTime.now())));
    }
}
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TEvaluationTagController.java
@@ -43,6 +43,10 @@
    public R<List<TEvaluationTagVO>> getTagList(@RequestParam("type") Integer type) {
        return R.ok(evaluationTagService.getTagList(type));
    }
    @GetMapping("/getList")
    public R<List<TEvaluationTagVO>> getList() {
        return R.ok(evaluationTagService.getList());
    }
    
    
    
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/TEvaluationTagMapper.java
@@ -32,4 +32,11 @@
     * @return
     */
    List<TEvaluationTag> pageList(PageInfo<TEvaluationTag> pageInfo, @Param("name") String name);
    /**
     * 获取列表数据
     * @return
     */
    List<TEvaluationTagVO> getList();
}
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TEvaluationTagService.java
@@ -32,4 +32,10 @@
     * @return
     */
    PageInfo<TEvaluationTag> pageList(String name, BasePage basePage);
    /**
     * 查询标签列表
     * @return
     */
    List<TEvaluationTagVO> getList();
}
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TCouponServiceImpl.java
@@ -34,6 +34,13 @@
        StringBuilder couponIds = new StringBuilder();
        for (TCoupon tCoupon : list) {
            couponIds.append(tCoupon.getId()).append(",");
            // 如果优惠券库存为0 那么将优惠券状态改为下架 不启用
            if (tCoupon.getInventoryQuantity()==0){
                tCoupon.setStatus(2);
                this.baseMapper.updateById(tCoupon);
            }
        }
        if (!list.isEmpty()){
            if (StringUtils.hasLength(couponIds)){
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TEvaluationTagServiceImpl.java
@@ -40,4 +40,9 @@
        List<TEvaluationTag> list = this.baseMapper.pageList(pageInfo, name);
        return pageInfo.setRecords(list);
    }
    @Override
    public List<TEvaluationTagVO> getList() {
        return this.baseMapper.getList();
    }
}
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TEvaluationTagMapper.xml
@@ -33,4 +33,8 @@
        </if>
        order by create_time desc
    </select>
    <select id="getList" resultType="com.ruoyi.other.api.vo.TEvaluationTagVO">
        select <include refid="Base_Column_List"></include>
        from t_evaluation_tag where del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()}
    </select>
</mapper>
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java
@@ -203,6 +203,11 @@
                    case "GDF":
                        shoppingOrderClient.cancelShoppingOrderWxRefund(out_refund_no, refund_id, tradeState, success_time);
                        System.err.println("----商城订单取消退款回调通知");
                        break;
                    //充电订单
                    case "GWF":
                        chargingOrderClient.shoppingOrderWxRefund(out_refund_no, refund_id, tradeState, success_time);
                        System.err.println("----管理后台取消购物订单退款回调通知");
                        break;
                }