2021与蓝度共同重构项目,服务端
liuhaonan
2022-03-16 661f9562fb07d8fd0fc8740238eaed2b5d1faa56
支付相关
已添加22个文件
已修改1个文件
1416 ■■■■■ 文件已修改
dao/src/main/java/com/sandu/ximon/dao/domain/AlipayConfigEntity.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/domain/WxConfigEntity.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/enums/C3mRedisConstant.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/enums/OrderStatus.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/enums/OrderType.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/mapper/UsrAlipayConfigMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/mapper/UsrWxConfigMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/resources/mapper/UsrAlipayConfigMapper.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/resources/mapper/UsrWxConfigMapper.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/config/AlipayConfig.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/config/ServerConfig.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/UsrPayConfigCollector.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/XiXunController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/param/AlipayConfigParam.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/param/WxpayConfigParam.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/pay/alipay/UsrAlipayConfigService.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mChargingChargeService.java 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mOrderService.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/AliPayUtils.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/ConfigCheckUtils.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/DateUtils.java 260 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/OrderUtils.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/vo/C3mOrderVO.java 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/domain/AlipayConfigEntity.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package com.sandu.ximon.dao.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;
/**
 *
 * @TableName alipay_config
 */
@TableName(value ="alipay_config")
@Data
public class AlipayConfigEntity implements Serializable {
    /**
     * ç´¢å¼•id
     */
    @TableId(type = IdType.AUTO)
    private Integer configId;
    /**
     * åº”用APPID
     */
    private String appId;
    /**
     * å•†æˆ·ç§é’¥/PKCS8格式RSA2私钥
     */
    private String privateKey;
    /**
     * æ”¯ä»˜å®å…¬é’¥/查看地址:https://openhome.alipay.com/platform/keyManage.htm å¯¹åº”APPID下的支付宝公钥
     */
    private String publicKey;
    /**
     * åˆä½œä¼™ä¼´èº«ä»½ï¼ˆPID)
     */
    private String pid;
    /**
     * å®¢æˆ·id
     */
    private Long clientId;
    /**
     * åˆ›å»ºé…ç½®çš„用户id
     */
    private Long createUserId;
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}
dao/src/main/java/com/sandu/ximon/dao/domain/WxConfigEntity.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package com.sandu.ximon.dao.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;
/**
 *
 * @TableName wx_config
 */
@TableName(value ="wx_config")
@Data
public class WxConfigEntity implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Long configId;
    /**
     * appid
     */
    private String appid;
    /**
     * app端appid
     */
    private String appappid;
    /**
     *
     */
    private String mchId;
    /**
     *
     */
    private String privateKey;
    /**
     *
     */
    private Long clientId;
    /**
     *
     */
    private Long createUserId;
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}
dao/src/main/java/com/sandu/ximon/dao/enums/C3mRedisConstant.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.sandu.ximon.dao.enums;
public enum C3mRedisConstant {
    //  å……电桩心跳包存储(mac-list(充电桩口状态))
    C3_STATUS("m_c3_port_status:"),
    //  å……电桩订单
    C3_NO_PAY_ORDER("m_c3_no_pay_order:"),
    //  å……电桩进行中订单
    C3_CHARGING_ORDER("m_c3_charging_order:"),
    //  å……电桩故障码
    C3_ERROR("m_c3_error:"),
    ;
    private String code;
    public String getCode() {
        return code;
    }
    C3mRedisConstant(String code) {
        this.code = code;
    }
}
dao/src/main/java/com/sandu/ximon/dao/enums/OrderStatus.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.sandu.ximon.dao.enums;
public enum OrderStatus {
    //  æœªæ”¯ä»˜
    NO_PAY(0),
    //  å·²æ”¯ä»˜
    PAYED(1),
    //  å·²é€€æ¬¾
    REFUND(2),
    //  é€€æ¬¾ä¸­
    REFUNDING(3),
    //  é€€æ¬¾å¤±è´¥
    REFUND_FAILED(4),
    //  å·²å®Œæˆ
    COMPLETE(5),
    ;
    private Integer status;
    public Integer getStatus() {
        return status;
    }
    OrderStatus (Integer status) {
        this.status = status;
    }
}
dao/src/main/java/com/sandu/ximon/dao/enums/OrderType.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.sandu.ximon.dao.enums;
/**
 * è®¢å•类型
 */
public enum OrderType {
    ALIPAY("alipay"),
    WXPAY("wxpay"),
    ERROR("error");
    private String code;
    public String getCode() {
        return code;
    }
    public static OrderType getOrderType(String type){
        if(type.equals(OrderType.ALIPAY.getCode())) {
            return OrderType.ALIPAY;
        }else if(type.equals(OrderType.WXPAY.getCode())) {
            return OrderType.WXPAY;
        }else {
            return OrderType.ERROR;
        }
    }
    OrderType(String code) {
        this.code = code;
    }
}
dao/src/main/java/com/sandu/ximon/dao/mapper/UsrAlipayConfigMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.sandu.ximon.dao.mapper;
import com.sandu.ximon.dao.domain.AlipayConfigEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
 * @Entity com.sandu.ximon.dao.domain.UsrAlipayConfig
 */
@Mapper
public interface UsrAlipayConfigMapper extends BaseMapper<AlipayConfigEntity> {
}
dao/src/main/java/com/sandu/ximon/dao/mapper/UsrWxConfigMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.sandu.ximon.dao.mapper;
import com.sandu.ximon.dao.domain.WxConfigEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
 * @Entity com.sandu.ximon.dao.domain.WxConfigEntity
 */
@Mapper
public interface UsrWxConfigMapper extends BaseMapper<WxConfigEntity> {
}
dao/src/main/resources/mapper/UsrAlipayConfigMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sandu.ximon.dao.mapper.UsrAlipayConfigMapper">
    <resultMap id="BaseResultMap" type="com.sandu.ximon.dao.domain.AlipayConfigEntity">
            <id property="configId" column="config_id" jdbcType="INTEGER"/>
            <result property="appId" column="app_id" jdbcType="VARCHAR"/>
            <result property="privateKey" column="private_key" jdbcType="VARCHAR"/>
            <result property="publicKey" column="public_key" jdbcType="VARCHAR"/>
            <result property="pid" column="pid" jdbcType="VARCHAR"/>
            <result property="clientId" column="client_id" jdbcType="BIGINT"/>
            <result property="createUserId" column="create_user_id" jdbcType="BIGINT"/>
    </resultMap>
    <sql id="Base_Column_List">
        config_id,app_id,private_key,
        public_key,pid,client_id,
        create_user_id
    </sql>
</mapper>
dao/src/main/resources/mapper/UsrWxConfigMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sandu.ximon.dao.mapper.UsrWxConfigMapper">
    <resultMap id="BaseResultMap" type="com.sandu.ximon.dao.domain.WxConfigEntity">
            <id property="configId" column="config_id" jdbcType="BIGINT"/>
            <result property="appid" column="appid" jdbcType="VARCHAR"/>
            <result property="appappid" column="appappid" jdbcType="VARCHAR"/>
            <result property="mchId" column="mch_id" jdbcType="VARCHAR"/>
            <result property="privateKey" column="private_key" jdbcType="VARCHAR"/>
            <result property="clientId" column="client_id" jdbcType="BIGINT"/>
            <result property="createUserId" column="create_user_id" jdbcType="BIGINT"/>
    </resultMap>
    <sql id="Base_Column_List">
        config_id,appid,appappid,
        mch_id,private_key,client_id,
        create_user_id
    </sql>
</mapper>
ximon-admin/src/main/java/com/sandu/ximon/admin/config/AlipayConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
package com.sandu.ximon.admin.config;
/* *
 *类名:AlipayConfig
 *功能:基础配置类
 *详细:设置帐户有关信息及返回路径
 *修改日期:2017-04-05
 *说明:
 *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
 */
public class AlipayConfig {
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    // åº”用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
//    public String app_id = "2019070665741774";
    // å•†æˆ·ç§é’¥ï¼Œæ‚¨çš„PKCS8格式RSA2私钥
//    public String merchant_private_key = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCume3EzEBKw8T2Xs0dBEDwTi8g7AR/c7Gy0sE9XciSVPoKpeHaaqShH7L+ws6pYE7SnXYNKM3diZ6S0vKxt5XhuOpg9yfueWw85BCbTYzOYQwrK/qZIgQC5c6S5b9aar9PowaupqYSFWDFvDOr6zaCr1OhjT/lYJV46D2t5e5/yACUQXGo0evvpbSvC6+zp2ZhUoJiXKvqPxC2F/dKGzyY4e9WnBSzaraLT09GLNwzLzSKItjKXHO/ameLhIiqacbOydKOmsEC1XzsNkeHXYLRFF4EAGZt4KDkuwiKjrz1r8Wz1a0Fr4jrE0F7dj9cIq+lhUjqUSydNYETJtKq5XOHAgMBAAECggEBAJ6W9A/H0jHWpeV98GKFxZJAAbCuj9tQM7yQj7L0p0S66K6ZQ47HRKeRCl06hsnzz0Sgf2SuhmbOJHmKH6Tqcrom4sSWWe/S3ExmfusBQn8GSS5BcQp8ihYztDFbezZeNUzZcC1c8wUD4/VW37wtFkMXiyf3C22GD95VXAjDC6GFfv6GIytCbAKw1HbgmU/JMDjnzSi0IKnmoBu5tVNZtwWRu8qkEC2LiejoQpxi12jRZQptkSa8iokk2eFx3i9BBDljx1qfzlFyAOtwICiy6HnxBTMBfzLAy9nI5//wzcY4X4fK0d/XatDNxDN4f/5Wp/VKFyz7BLFQTfkyQv8fofkCgYEA7HmF8Qk/qRumHX3UYuEENPge4EwYOzWcQ12kJBo93xbIcMlZ5Qrzpm6IRj8RMqpwcCEtrvvIsDtMO4o8+nNnOO8SMBk8KJj7nsZtigrAEor8HVj63IDDHX/zLt51cvs0x1jNXUD3/tZvw4PnDcblXpMYM1qR/bBuvHVGx1VTz6sCgYEAvQSO4YxAKXnMh338Nrh0FaRKmirewYn7TbLk6rPFh6goCHPGJC1fAOu+9xVALMn8VJrDpfrzqTTg0eKifh8i+5Rlqra95W+DdYr+WThB1NWs+59O5aKCT8wYI3dlaiI5xa+wCzkdasNO3YzrXr5y9wtJdepb5b/Re9uF1+KHv5UCgYEA2PNM3SydCSriph/xIJ5MW8Rfn2xwtrGioXNhyfWBWhDu5/ryzF3V15WE1N27i34vFdB6txUss/JTKDTVaPlDdEpxp0sflCd2gd6OVJ00Rk7Yqpwd2vsPBxuCIjfaDRlG/LUOBEY8v8JAW2HCMzOM782H4GVxlwutLJ1zyCESeW0CgYAWNrDsBOWNekj1K3M2oxrRaEt0LtGbATJNgVax1orCVJrP03tXyRU/MHVy6EZwfRRwhPe1S/bSzeoWAIKEO/iKhHgmRe+vRRm3+KvHpHroHmyD7ccB6cVSx3OWx3Nds8QCXZFc4Et6vpVIKEWJDuzH58WsW+yM5awi2Du0kWTOuQKBgCt7QqYDD0k8ahkKL/q2atMkNdJAYlLVWukHTRf8EQ8Uq5xEnLONGtrnYC0gjJCIdbIO4jkP10hOqDufyQqk4DUsk7m1waCmMjGPDTrv8gyVK+48gS6+Jmroi51GDOQTb/T35a3HJt2bflFbaEJzYnHHvkensAUX6DeEMIowE4Qg";
    // æ”¯ä»˜å®å…¬é’¥,查看地址:https://openhome.alipay.com/platform/keyManage.htm å¯¹åº”APPID下的支付宝公钥。
//    public String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhnER1VMBe7yuHI5P5NtsM0Nitaq8cHnobB7KwYDw/V9t/DCiBAbJnuBbOHyS4zkffiZ905dsQycIqu9PRk4J9j6nE9YZVLMPIHXIAOn4J6ZAGmznpuQ9es+fblw+nr/v00X9ZQpR0zYpULEEHaU9lXE8JMoKElawNYRpibArwrnWcizOFbFiwmq8Jq3m07Ri/L7/gogOZshE3WE9UuBIR/czputhq0py0F+yddASy08F0jt3/wm4Cgx/qUpMH/4KwIRwxSKp+Kk7rCRrKmnOm3iMt9QmQ1yX2ht9To5ph3gPBtfR5VyhA8Dasnls9XYEUzsrnWOd1v9javYPgE4vdQIDAQAB";
    // æœåŠ¡å™¨å¼‚æ­¥é€šçŸ¥é¡µé¢è·¯å¾„  éœ€http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
//    public static String notify_url = "http://192.168.0.199:8080/machine-fast/serv/c2charging/alipayNotifyReturn";
    public static String notify_url = "http://"+ServerConfig.getServerIP()+":8888/machine-fast/serv/c2charging/alipayNotifyReturn";
    // é¡µé¢è·³è½¬åŒæ­¥é€šçŸ¥é¡µé¢è·¯å¾„ éœ€http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
//    public static String return_url = "http://192.168.0.199:8080/machine-fast/serv/c2charging/alipayReturn";
    public static String return_url = "http://"+ServerConfig.getServerIP()+":8888/machine-fast/serv/c2charging/alipayReturn";
    // è¿”回格式
    public static String format = "json";
    // ç­¾åæ–¹å¼
    public static String sign_type = "RSA2";
    // å­—符编码格式
    public static String charset = "utf-8";
//    public String pid = "2088531531858351";
    public static String target_id = "";
    // æ”¯ä»˜å®ç½‘å…³
    public static String gatewayUrl = "https://openapi.alipay.com/gateway.do";
//    public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
}
ximon-admin/src/main/java/com/sandu/ximon/admin/config/ServerConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
package com.sandu.ximon.admin.config;
import com.sandu.ximon.admin.utils.LogUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class ServerConfig {
    @Value("${server-conf.ip}")
    public String SIP;
    @Value("${nginx.port}")
    public String nginxPort;
    @Value("${nginx.cameraSaveUrl}")
    public String saveUrl;
//    @Value("${broadcast.file-save-url}")
//    private String fileSaveUrl;
    private static String ServerIP;
    private static String NginxPort;
    private static String CameraSaveUrl;
    private static String BroadcastFileSaveUrl;
    private static boolean O2OServer;
    public static String getNginxCameraSaveUrl() {
        return CameraSaveUrl;
    }
    @PostConstruct
    private void loadIP(){
        ServerIP = SIP;
        NginxPort = nginxPort;
        CameraSaveUrl = saveUrl;
       // BroadcastFileSaveUrl = fileSaveUrl;
        LogUtils.print("Server IP ï¼š" +SIP);
        LogUtils.print("NignX Port ï¼š" +nginxPort);
        LogUtils.print("Camera Save Url ï¼š" +CameraSaveUrl);
        LogUtils.print("Broadcast File Save Url ï¼š" +BroadcastFileSaveUrl);
    }
    public static String getServerIP(){
        return ServerIP;
    }
    public static String getNignxPort(){
        return NginxPort;
    }
    public static String getBroadcastFileSaveUrl(){
        return BroadcastFileSaveUrl;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/UsrPayConfigCollector.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
package com.sandu.ximon.admin.controller;
import com.sandu.common.domain.ResponseVO;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.object.BaseConditionVO;
import com.sandu.common.util.ResponseUtil;
import com.sandu.ximon.admin.param.AlipayConfigParam;
import com.sandu.ximon.admin.pay.alipay.UsrAlipayConfigService;
import com.sandu.ximon.dao.domain.AlipayConfigEntity;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
/**
 * @Author liuhaonan
 * @Date 2022/3/16 10:32
 * @Version 1.0
 */
@RestController
@AllArgsConstructor
@RequestMapping("/v1/payconfig")
public class UsrPayConfigCollector {
    private final UsrAlipayConfigService alipayConfigService;
    /**
     * æ”¯ä»˜å®é…ç½®æ·»åŠ 
     * @param configParam
     * @return
     */
    @PostMapping("/addAliPayConfig")
    public ResponseVO<Object> addAliPayConfig(@RequestBody AlipayConfigParam configParam) {
        return ResponseUtil.success(alipayConfigService.addAliPayConfig(configParam));
    }
    /**
     * æ”¯ä»˜å®é…ç½®æ›´æ”¹
     * @param configId
     * @param configParam
     * @return
     */
    @PostMapping("/updateAliPayConfig/{configId}")
    public ResponseVO<Object> updateAliPayConfig(@PathVariable Integer configId, @RequestBody AlipayConfigParam configParam) {
        return ResponseUtil.success(alipayConfigService.updateAliPayConfig(configId,configParam));
    }
    /**
     * æ”¯ä»˜å®é…ç½®åˆ é™¤
     * @param configId
     * @return
     */
    @PostMapping("/deleteAliPayConfig/{configId}")
    public ResponseVO<Object> deleteAliPayConfig(@PathVariable Integer configId) {
        return ResponseUtil.success(alipayConfigService.deleteAliPayConfig(configId));
    }
    /**
     *
     * @param poleId
     * @return
     */
    @GetMapping("/getAliPayConfigByPoleId/{poleId}")
    public ResponseVO<Object> getAliPayConfigByPoleId(@PathVariable Long poleId) {
        return ResponseUtil.success(alipayConfigService.getConfigByPoleId(poleId));
    }
    /**
     *配置详情
     * @param configId
     * @return
     */
    @GetMapping("/getAliPayConfigById/{configId}")
    public ResponseVO<Object> getAliPayConfigById(@PathVariable Integer configId) {
        if(configId==null){
            throw new BusinessException("id能为空");
        }
        AlipayConfigEntity byId = alipayConfigService.getById(configId);
        if(byId==null){
            throw new BusinessException("配置id错误或配置不存在");
        }
        return ResponseUtil.success(byId);
    }
    @GetMapping("/aliConfigList")
    public ResponseVO<Object> aliConfigList(BaseConditionVO baseConditionVO) {
        return ResponseUtil.success(alipayConfigService.configList(baseConditionVO));
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/XiXunController.java
@@ -145,7 +145,7 @@
     * @return
     */
    @PostMapping("/pushToXixun/{pid}")
    public ResponseVO<Object> getByPid(@PathVariable Long pid, @RequestBody List<Long> lightemitIds) {
    public ResponseVO<Object> pushByPid(@PathVariable Long pid, @RequestBody List<Long> lightemitIds) {
        xiXunPlayerService.videoXixunPlayer(pid, lightemitIds);
        return ResponseUtil.success("推送成功");
    }
ximon-admin/src/main/java/com/sandu/ximon/admin/param/AlipayConfigParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.sandu.ximon.admin.param;
import lombok.Data;
/**
 * @Author liuhaonan
 * @Date 2022/3/16 9:46
 * @Version 1.0
 */
@Data
public class AlipayConfigParam {
    private String appId;
    /**
     * å•†æˆ·ç§é’¥/PKCS8格式RSA2私钥
     */
    private String privateKey;
    /**
     *
     */
    private String publicKey;
    /**
     * åˆä½œä¼™ä¼´èº«ä»½ï¼ˆPID)
     */
    private String pid;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/param/WxpayConfigParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.sandu.ximon.admin.param;
import lombok.Data;
/**
 * @Author liuhaonan
 * @Date 2022/3/16 9:46
 * @Version 1.0
 */
@Data
public class WxpayConfigParam {
    /**
     * appid
     */
    private String appid;
    /**
     * app端appid
     */
    private String appappid;
    /**
     *
     */
    private String mchId;
    /**
     *
     */
    private String privateKey;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/pay/alipay/UsrAlipayConfigService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,106 @@
package com.sandu.ximon.admin.pay.alipay;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.PageHelper;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.object.BaseConditionVO;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.ximon.admin.param.AlipayConfigParam;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.service.ClientService;
import com.sandu.ximon.admin.service.PoleService;
import com.sandu.ximon.admin.utils.SpringContextUtil;
import com.sandu.ximon.dao.domain.AlipayConfigEntity;
import com.sandu.ximon.dao.domain.Pole;
import com.sandu.ximon.dao.mapper.UsrAlipayConfigMapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * @Author liuhaonan
 * @Date 2022/3/15
 * @Version 1.0
 */
@Service
@AllArgsConstructor
public class UsrAlipayConfigService extends BaseServiceImpl<UsrAlipayConfigMapper, AlipayConfigEntity> {
    private final UsrAlipayConfigMapper usrAlipayConfigMapper;
    private final ClientService clientService;
    private final PoleService poleService;
    public AlipayConfigEntity getConfigByPoleId(Long poleId) {
        Pole pole = poleService.getById(poleId);
        if (pole == null) {
            throw new BusinessException("灯杆id错误或灯杆不存在");
        }
        AlipayConfigEntity config;
        if (pole.getClientId() == null) {
            config = getById(0);
        }
        config = getOne(Wrappers.lambdaQuery(AlipayConfigEntity.class).eq(AlipayConfigEntity::getCreateUserId, SecurityUtils.getUserId()));
        if(config==null){
            throw new BusinessException("用户未配置支付配置,请配置后重试");
        }
        return config;
    }
    public static UsrAlipayConfigService getBean(){
        return (UsrAlipayConfigService) SpringContextUtil.getBean("UsrAlipayConfigService");
    }
    public boolean addAliPayConfig(AlipayConfigParam configParam){
        AlipayConfigEntity config =new AlipayConfigEntity();
        BeanUtil.copyProperties(configParam,config);
        return save(config);
    }
    public boolean updateAliPayConfig(Integer id,AlipayConfigParam configParam){
        AlipayConfigEntity byId = getById(id);
        if(byId==null){
            throw new BusinessException("配置id错误或配置不存在");
        }
        AlipayConfigEntity config =new AlipayConfigEntity();
        BeanUtil.copyProperties(configParam,config);
        config.setConfigId(id);
        return updateById(config);
    }
    public boolean deleteAliPayConfig(Integer id){
        AlipayConfigEntity byId = getById(id);
        if(byId==null){
            throw new BusinessException("配置id错误或配置不存在");
        }
        return removeById(id);
    }
    public List<AlipayConfigEntity> configList(BaseConditionVO baseConditionVO){
        LambdaQueryWrapper<AlipayConfigEntity> wrapper =new LambdaQueryWrapper<>();
        System.out.println("----------------------------"+clientService.findClientId());
        PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
        if(SecurityUtils.getClientId()!=null){//客户
            if(clientService.findClientId()){//二级客户
                PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
                wrapper= Wrappers.lambdaQuery(AlipayConfigEntity.class).eq(AlipayConfigEntity::getCreateUserId,SecurityUtils.getUserId());
            }else if(!clientService.findClientId()){//一级客户
                PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
                wrapper= Wrappers.lambdaQuery(AlipayConfigEntity.class).eq(AlipayConfigEntity::getClientId,SecurityUtils.getUserId());
            }
        } else {//管理
            PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
            wrapper= Wrappers.lambdaQuery(AlipayConfigEntity.class);
        }
        return list(wrapper);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mChargingChargeService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,109 @@
package com.sandu.ximon.admin.service;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.ximon.dao.domain.C3mChargingCharge;
import com.sandu.ximon.dao.mapper.C3mChargingChargeMapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
/**
 * @Author liuhaonan
 * @Date 2022/3/10 13:58
 * @Version 1.0
 * c3充电桩费率相关
 */
@Service
@AllArgsConstructor
public class C3mChargingChargeService extends BaseServiceImpl<C3mChargingChargeMapper, C3mChargingCharge> {
    private final C3mChargingChargeMapper c3mChargingChargeMapper;
    /**
     * ä¿®æ”¹è´¹çއ
     * @param chargeEntities
     * @param userId
     * @param username
     * @return
     */
    public boolean updateCharge(List<C3mChargingCharge> chargeEntities, Long userId, String username) {
        //  åˆ é™¤åŽŸæœ¬å­˜åœ¨çš„è´¹çŽ‡
        c3mChargingChargeMapper.deleteCharge(chargeEntities.get(0).getC3Id());
        Long timestamp = new Date().getTime();
        //  å°†è´¹çŽ‡æ·»åŠ è‡³æ•°æ®åº“
        for (C3mChargingCharge c3m : chargeEntities) {
            c3m.setTimestamp(timestamp);
            save(c3m);
        }
//        LogService.getBean().log(userId,username,"修改C3m费率",null,
//                "{ "+ JSON.toJSONString(chargeEntities)+" }");
        return true;
    }
    public void initCharge(Integer c3Id) {
        List<C3mChargingCharge> chargeList = getChargeByC3Id(c3Id);
        if(chargeList.size() == 0) {
            //  ä¸å­˜åœ¨è´¹çŽ‡æ—¶ï¼Œç”Ÿæˆå•ä¸ªè´¹çŽ‡å¹¶æ’å…¥æ•°æ®åº“
            C3mChargingCharge c3mChargeEntity = C3mChargingCharge.getInitInstance(c3Id);
            c3mChargingChargeMapper.insertCharge(c3mChargeEntity);
        }
    }
    public List<C3mChargingCharge> getChargeByC3Id(Integer c3Id) {
        //  æŸ¥æ‰¾æ•°æ®åº“所有费率
        List<C3mChargingCharge> list = c3mChargingChargeMapper.getChargeByC3Id(c3Id);
        //  åˆ¤æ–­list为单条直接返回
        if(list.size()<2){
            return list;
        }
        //  å°†æ—¶åˆ†è¿›è¡ŒæŽ’序
        Collections.sort(list, new Comparator<C3mChargingCharge>() {
            @Override
            public int compare(C3mChargingCharge o1, C3mChargingCharge o2) {
                int i = o2.getHour().compareTo(o1.getHour());
                if(i == 0){
                    return o2.getMin().compareTo(o1.getMin());
                }
                return i;
            }
            @Override
            public boolean equals(Object obj) {
                return false;
            }
        });
        //  list翻转
        Collections.reverse(list);
        //  æ—¶é—´æ®µå­—符拼接
        for(int i=1;i<list.size();i++){
            C3mChargingCharge pre = list.get(i - 1);
            C3mChargingCharge now = list.get(i);
            pre.setStrTime(
                    pre.getHour()+"点"+pre.getMin()+"分 åˆ° "+
                            now.getHour()+"点"+now.getMin()+"分"
            );
            if(i==list.size()-1){
                pre = now;
                now = list.get(0);
                if(now.getHour() < pre.getHour()){
                    pre.setStrTime(
                            pre.getHour() + "点" + pre.getMin() + "分 åˆ° " +
                                    "隔日"+now.getHour() + "点" + now.getMin() + "分"
                    );
                }else {
                    pre.setStrTime(
                            pre.getHour() + "点" + pre.getMin() + "分 åˆ° " +
                                    now.getHour() + "点" + now.getMin() + "分"
                    );
                }
            }
        }
        return list;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mOrderService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
package com.sandu.ximon.admin.service;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.common.third.pay.wx.WxFastPayService;
import com.sandu.ximon.admin.utils.AliPayUtils;
import com.sandu.ximon.dao.domain.C3mOrder;
import com.sandu.ximon.dao.enums.OrderStatus;
import com.sandu.ximon.dao.enums.OrderType;
import com.sandu.ximon.dao.mapper.C3mOrderMapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
 * @Author liuhaonan
 * @Date 2022/3/10 14:24
 * @Version 1.0
 */
@Service
@AllArgsConstructor
public class C3mOrderService extends BaseServiceImpl<C3mOrderMapper, C3mOrder> {
    private final C3mOrderMapper c3mOrderMapper;
    private final WxFastPayService fastPayService;
    public boolean orderRefund(String outTradeNo, Double refundAmount, Long userId, String username) {
        C3mOrder orderByOutTradeNo = c3mOrderMapper.getOrderByOutTradeNo(outTradeNo);
        if (null == orderByOutTradeNo) {
            return false;
        } else {
            orderByOutTradeNo.setRefundAmount(refundAmount);
            return c3mOrderRefund(orderByOutTradeNo, "页面API退款", userId, username);
        }
    }
    private boolean c3mOrderRefund(C3mOrder C3mOrder, String msg, Long userId, String username) {
        //  è¿›è¡Œé€€æ¬¾ï¼Œè®¾ç½®è®¢å•状态为已退款
        boolean b = false;
        if (C3mOrder.getOrderType().equals(OrderType.ALIPAY.getCode())) {
            b = AliPayUtils.alipayrefund(
                    C3mOrder.getPoleId(),
                    C3mOrder.getOutTradeNo(),
                    C3mOrder.getRefundAmount());
        } else if (C3mOrder.getOrderType().equals(OrderType.WXPAY.getCode())) {
            //  è¿›è¡Œå¾®ä¿¡é€€æ¬¾
//            b = WxPayUtils.getBean().wxRefund(
//                    C3mOrder.getTotalAmount(),
//                    C3mOrder.getRefundAmount(),
//                    C3mOrder.getOutTradeNo(),
//                    C3mOrder.getPoleId()
//            );
        }
        C3mOrder.setRefundTimestamp(new Date().getTime());
        C3mOrder.setRefundMsg(msg);
        if (b) {
            C3mOrder.setOrderStatus(OrderStatus.REFUND.getStatus());
            c3mOrderMapper.updateRefundOrder(C3mOrder);
           /* logService.log(
                    userId,
                    ServerTask.SERVER_TASK,
                    "C3m订单处理",
                    null,
                    "{ æ“ä½œè€…("+username+")" +
                            "订单退款: "+C3mOrder.getOutTradeNo()
                            +",订单总金额:"+C3mOrder.getTotalAmount()
                            +",退款金额: "+C3mOrder.getTotalAmount()+"}");*/
            return true;
        } else {
            C3mOrder.setOrderStatus(OrderStatus.REFUND_FAILED.getStatus());
            c3mOrderMapper.updateRefundOrder(C3mOrder);
           /* logService.log(
                    userId,
                    ServerTask.SERVER_TASK,
                    "C3m订单处理",
                    null,
                    "{ æ“ä½œè€…("+username+")" +
                            "订单退款(失败): "+C3mOrder.getOutTradeNo()
                            +",订单总金额:"+C3mOrder.getTotalAmount()
                            +",退款金额: "+C3mOrder.getTotalAmount()+"}");*/
            return false;
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/AliPayUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,124 @@
package com.sandu.ximon.admin.utils;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeRefundModel;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradeRefundResponse;
import com.google.gson.Gson;
import com.sandu.ximon.admin.config.AlipayConfig;
import com.sandu.ximon.admin.pay.alipay.UsrAlipayConfigService;
import com.sandu.ximon.dao.domain.AlipayConfigEntity;
import lombok.AllArgsConstructor;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
@AllArgsConstructor
public class AliPayUtils {
    public static boolean alipayQuery(String out_trade_no, Long streetlightId) {
        AlipayConfigEntity alipayConfigEntity = UsrAlipayConfigService.getBean().getConfigByPoleId(streetlightId);// èŽ·å–å®¢æˆ·çš„æ”¯ä»˜å®é…ç½®
        String checkStr = ConfigCheckUtils.checkAlipayConfig(alipayConfigEntity);
        if( checkStr != null){
            LogUtils.error("查询失败");
            return false;
        }
        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl,
                alipayConfigEntity.getAppId(), alipayConfigEntity.getPrivateKey(),
                AlipayConfig.format, AlipayConfig.charset, alipayConfigEntity.
                getPublicKey(), AlipayConfig.sign_type);
        //设置请求参数
        AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();
        //商户订单号,商户网站订单系统中唯一订单号
        alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\"}");
        //请求
        String result = null;
        try {
            result = alipayClient.execute(alipayRequest).getBody();
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        Map map = (Map) new Gson().fromJson(result,Map.class).get("alipay_trade_query_response");
        if (map.get("sub_msg") != null) {
            if ("交易不存在".equals(map.get("sub_msg"))) {
                return false;
            }
        }
        if(map.get("trade_status")==null){
            return false;
        }
        if("TRADE_SUCCESS".equals(map.get("trade_status"))){
//            String payTime = (String) map.get("send_pay_date");
            return true;
        }else if("TRADE_CLOSED".equals(map.get("trade_status"))){
            LogUtils.error("交易已关闭(支付宝)");
            return false;
        }
        return false;
    }
    /**
     * æ”¯ä»˜å®é€€æ¬¾æŽ¥å£
     * @return
     */
    public static boolean alipayrefund(Long streetlightId,
                                String out_trade_no,
                                Double refundAmount) {
        //LogService.getBean().log((long)0, ServerTask.SERVER_TASK,"退款操作",null,"{ è¿›è¡Œæ”¯ä»˜å®é€€æ¬¾:"+out_trade_no+" }");
        //退款金额,不能大于订单总金额
        String refund_amount = refundAmount+"";
        //退款的原因说明
        String refund_reason = "充电桩退款";
        //标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传。
        String  out_request_no = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
        AlipayConfigEntity alipayConfigEntity = UsrAlipayConfigService.getBean().getConfigByPoleId(streetlightId);   //找到是哪个客户的充电桩  å°±é€€æ¬¾ç»™è°
        String checkStr = ConfigCheckUtils.checkAlipayConfig(alipayConfigEntity);
        if( checkStr != null){
            return false;
        }
        // SDK å…¬å…±è¯·æ±‚类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签
        AlipayClient client = new DefaultAlipayClient(AlipayConfig.gatewayUrl, alipayConfigEntity.getAppId(),
                alipayConfigEntity.getPrivateKey(), AlipayConfig.format,
                AlipayConfig.charset, alipayConfigEntity.getPublicKey(), AlipayConfig.sign_type);
        AlipayTradeRefundRequest alipay_request = new AlipayTradeRefundRequest();
        AlipayTradeRefundModel model = new AlipayTradeRefundModel();
        model.setOutTradeNo(out_trade_no);
//        model.setTradeNo(out_trade_no);
        model.setRefundAmount(refund_amount);
        model.setRefundReason(refund_reason);
        model.setOutRequestNo(out_request_no);
        alipay_request.setBizModel(model);
        AlipayTradeRefundResponse alipay_response = null;
        try {
            alipay_response = client.execute(alipay_request);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
//        System.out.println(alipay_response.getBody());
        if("10000".equals(alipay_response.getCode())){
            //  é€€æ¬¾æˆåŠŸ
         //   LogService.getBean().log((long)0, ServerTask.SERVER_TASK,"退款操作",null,"{ è¿›è¡Œæ”¯ä»˜å®é€€æ¬¾(成功):"+out_trade_no+",退款金额:"+refundAmount+" }");
            return true;
        }
        //保存退款金额和退款单号,将订单状态置为完成(RFERROR),保存到数据库
      //  LogService.getBean().log((long)0, ServerTask.SERVER_TASK,"退款操作",null,"{ è¿›è¡Œæ”¯ä»˜å®é€€æ¬¾(失败):"+out_trade_no+",退款金额:"+refundAmount+",reason: "+ JSON.toJSONString(alipay_response)+" }");
        return false;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/ConfigCheckUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.sandu.ximon.admin.utils;
import com.sandu.ximon.dao.domain.AlipayConfigEntity;
import org.springframework.stereotype.Component;
@Component
public class ConfigCheckUtils {
    public static String checkAlipayConfig(AlipayConfigEntity alipayConfigEntity) {
        if(alipayConfigEntity == null) {
            return "下单失败!请联系管理员处理!错误码:100";
        } else if (alipayConfigEntity.getAppId() == null || alipayConfigEntity.getPrivateKey() == null || alipayConfigEntity.getPublicKey() == null) {
            return "下单失败!请联系管理员处理!错误码:101";
        }
        return null;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/DateUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,260 @@
package com.sandu.ximon.admin.utils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import javax.validation.constraints.NotNull;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
 * æ—¥æœŸå¤„理
 *
 * @author Mark sunlightcs@gmail.com
 */
public class DateUtils {
    /**
     * æ—¶é—´æ ¼å¼(yyyy-MM-dd)
     */
    public final static String DATE_PATTERN = "yyyy-MM-dd";
    /**
     * æ—¶é—´æ ¼å¼(yyyy-MM-dd HH:mm:ss)
     */
    public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
    public final static String ORDER_DATE = "yyyyMMddHHmmss";
    public final static String DATE_TIME_SEC_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS";
    public static Date timestamp2DateTimePattern(Long timestamp) {
        return stringToDate(timestamp + "", DATE_TIME_SEC_PATTERN);
    }
    /**
     * æ—¥æœŸæ ¼å¼åŒ– æ—¥æœŸæ ¼å¼ä¸ºï¼šyyyy-MM-dd
     *
     * @param date æ—¥æœŸ
     * @return è¿”回yyyy-MM-dd格式日期
     */
    public static String format(Date date) {
        return format(date, DATE_PATTERN);
    }
    public static String orderFormat(Date date) {
        return format(date, ORDER_DATE);
    }
    public static String dateFormat(Date date) {
        return format(date, DATE_TIME_PATTERN);
    }
    public static String dateFormatSec(Date date) {
        return format(date, DATE_TIME_SEC_PATTERN);
    }
    /**
     * æ—¥æœŸæ ¼å¼åŒ– æ—¥æœŸæ ¼å¼ä¸ºï¼šyyyy-MM-dd
     *
     * @param date    æ—¥æœŸ
     * @param pattern æ ¼å¼ï¼Œå¦‚:DateUtils.DATE_TIME_PATTERN
     * @return è¿”回yyyy-MM-dd格式日期
     */
    public static String format(Date date, String pattern) {
        if (date != null) {
            SimpleDateFormat df = new SimpleDateFormat(pattern);
            return df.format(date);
        }
        return null;
    }
    /**
     * å­—符串转换成日期
     *
     * @param strDate æ—¥æœŸå­—符串
     * @param pattern æ—¥æœŸçš„æ ¼å¼ï¼Œå¦‚:DateUtils.DATE_TIME_PATTERN
     */
    public static Date stringToDate(String strDate, String pattern) {
        if (StringUtils.isBlank(strDate)) {
            return null;
        }
        DateTimeFormatter fmt = DateTimeFormat.forPattern(pattern);
        return fmt.parseLocalDateTime(strDate).toDate();
    }
    /**
     * æ ¹æ®å‘¨æ•°ï¼ŒèŽ·å–å¼€å§‹æ—¥æœŸã€ç»“æŸæ—¥æœŸ
     *
     * @param week å‘¨æœŸ  0本周,-1上周,-2上上周,1下周,2下下周
     * @return è¿”回date[0]开始日期、date[1]结束日期
     */
    public static Date[] getWeekStartAndEnd(int week) {
        DateTime dateTime = new DateTime();
        LocalDate date = new LocalDate(dateTime.plusWeeks(week));
        date = date.dayOfWeek().withMinimumValue();
        Date beginDate = date.toDate();
        Date endDate = date.plusDays(6).toDate();
        return new Date[]{beginDate, endDate};
    }
    /**
     * å¯¹æ—¥æœŸçš„【秒】进行加/减
     *
     * @param date    æ—¥æœŸ
     * @param seconds ç§’数,负数为减
     * @return åŠ /减几秒后的日期
     */
    public static Date addDateSeconds(Date date, int seconds) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusSeconds(seconds).toDate();
    }
    /**
     * å¯¹æ—¥æœŸçš„【分钟】进行加/减
     *
     * @param date    æ—¥æœŸ
     * @param minutes åˆ†é’Ÿæ•°ï¼Œè´Ÿæ•°ä¸ºå‡
     * @return åŠ /减几分钟后的日期
     */
    public static Date addDateMinutes(Date date, int minutes) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusMinutes(minutes).toDate();
    }
    /**
     * å¯¹æ—¥æœŸçš„【小时】进行加/减
     *
     * @param date  æ—¥æœŸ
     * @param hours å°æ—¶æ•°ï¼Œè´Ÿæ•°ä¸ºå‡
     * @return åŠ /减几小时后的日期
     */
    public static Date addDateHours(Date date, int hours) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusHours(hours).toDate();
    }
    /**
     * å¯¹æ—¥æœŸçš„【天】进行加/减
     *
     * @param date æ—¥æœŸ
     * @param days å¤©æ•°ï¼Œè´Ÿæ•°ä¸ºå‡
     * @return åŠ /减几天后的日期
     */
    public static Date addDateDays(Date date, int days) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusDays(days).toDate();
    }
    /**
     * å¯¹æ—¥æœŸçš„【周】进行加/减
     *
     * @param date  æ—¥æœŸ
     * @param weeks å‘¨æ•°ï¼Œè´Ÿæ•°ä¸ºå‡
     * @return åŠ /减几周后的日期
     */
    public static Date addDateWeeks(Date date, int weeks) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusWeeks(weeks).toDate();
    }
    /**
     * å¯¹æ—¥æœŸçš„【月】进行加/减
     *
     * @param date   æ—¥æœŸ
     * @param months æœˆæ•°ï¼Œè´Ÿæ•°ä¸ºå‡
     * @return åŠ /减几月后的日期
     */
    public static Date addDateMonths(Date date, int months) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusMonths(months).toDate();
    }
    /**
     * å¯¹æ—¥æœŸçš„【年】进行加/减
     *
     * @param date  æ—¥æœŸ
     * @param years å¹´æ•°ï¼Œè´Ÿæ•°ä¸ºå‡
     * @return åŠ /减几年后的日期
     */
    public static Date addDateYears(Date date, int years) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusYears(years).toDate();
    }
    /**
     * èŽ·å–ä¸¤ä¸ªæ—¶é—´å¤©æ•°å·®
     *
     * @param oDate
     * @param nDate
     * @return
     */
    public static Long betweenDateDay(@NotNull Date oDate, @NotNull Date nDate) {
        return Long.valueOf((nDate.getTime() - nDate.getTime())) / (1000 * 60 * 60 * 24);
    }
    /**
     * èŽ·å–ä¸¤ä¸ªæ—¶é—´å°æ—¶å·®
     *
     * @param oDate
     * @param nDate
     * @return
     */
    public static Long betweenDateHours(@NotNull Date oDate, @NotNull Date nDate) {
        return Long.valueOf((nDate.getTime() - oDate.getTime())) / (1000 * 60 * 60);
    }
    /**
     * èŽ·å–æœ¬æœˆç¬¬ä¸€å¤©
     *
     * @return
     */
    public static Date getMonthFirstDay() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_MONTH,
                calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
        return calendar.getTime();
    }
    /**
     * èŽ·å–æœ¬æœˆæœ€åŽä¸€å¤©
     *
     * @return
     */
    public static Date getMonthLastDay() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_MONTH,
                calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        return calendar.getTime();
    }
    public static String toChineseDateStr(long ms) {
        StringBuffer sb = new StringBuffer();
        //  èŽ·å–æ€»ç§’æ•°
        Long sec = ms / 1000;
        ms = ms % 1000;
        String msStr = "";//SuppDataUtils.SuppData(ms+"",3);
        //  ç§’数大于60时
        if (sec > 60) {
            long min = sec / 60;
            sec = sec % 60;
            if (min > 60) {
                long hour = min / 60;
                min = min % 60;
                sb.append(hour + "时" + min + "分" + sec + "." + msStr + "秒");
            } else {
                sb.append(min + "分" + sec + "." + msStr + "秒");
            }
        } else {
            sb.append(sec + "." + msStr + "秒");
        }
        return sb.toString();
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/OrderUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.sandu.ximon.admin.utils;
import java.util.Date;
import java.util.UUID;
public class OrderUtils {
    public static String generateOutTradeNo () {
        String outTradeNo = DateUtils.orderFormat(new Date());
        String uuid = UUID.randomUUID().toString().substring(0, 2);
        outTradeNo = outTradeNo + uuid;
        return outTradeNo;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/vo/C3mOrderVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,161 @@
package com.sandu.ximon.admin.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.sandu.ximon.admin.utils.OrderUtils;
import com.sandu.ximon.dao.domain.C3mOrder;
import com.sandu.ximon.dao.enums.OrderStatus;
import com.sandu.ximon.dao.enums.OrderType;
import lombok.Data;
import java.util.Date;
/**
 * @Author liuhaonan
 * @Date 2022/3/10 11:48
 * @Version 1.0
 */
@Data
public class C3mOrderVO extends C3mOrder{
    public static String REQUEST_URL = "http://www.ximonsmart.com/charge/#/charge/";
    /**
     * è®¢å•ID
     */
    @TableId
    private Long orderId;
    /**
     * ç¯æ†ID
     */
    private Long poleId;
    /**
     * å……电桩MAC
     */
    private String c3Mac;
    /**
     * å¯¹åº”的灯杆设备mac
     */
    private String poleMac;
    /**
     * è®¢å•商户号
     */
    private String outTradeNo;
    /**
     * è®¢å•类型(C3mOrderType)
     */
    private String orderType;
    /**
     * è®¢å•总金额
     */
    private Double totalAmount;
    /**
     * å®žæ”¶é‡‘额
     */
    private Double receiptAmount;
    /**
     * é€€æ¬¾
     */
    private Double refundAmount;
    /**
     * ä¹°å®¶å¸å·(支付宝)
     */
    private String aliBuyerLogonId;
    /**
     * é¢„约电量
     */
    private Integer subscribeChargingCapacity;
    /**
     * å®žå……电量
     */
    private Double actualChargingCapacity;
    /**
     * è®¢å•创建时间戳
     */
    private Long createTimestamp;
    /**
     * è®¢å•支付时间戳
     */
    private Long payTimestamp;
    /**
     * è®¢å•退款时间戳
     */
    private Long refundTimestamp;
    /**
     * è®¢å•退款说明
     */
    private String refundMsg;
    /**
     * å¼€å§‹å……电时间戳
     */
    private Long startChargingTimestamp;
    /**
     * ç»“束充电时间戳
     */
    private Long stopChargingTimestamp;
    /**
     * è®¢å•状态:// æœªæ”¯ä»˜(0),已支付(1),已退款(2),退款中(3),退款失败(4),订单完成(5)
     */
    private Integer orderStatus;
    /**
     * å……电桩名称
     */
    private String c3Name;
    /**
     * ç¯æ†åç§°
     */
    private String poleName;
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
    /**
     * ç”Ÿæˆæ–°è®¢å•
     * @param c3Mac C3物理地址
     * @param orderType è®¢å•类型
     * @param totalAmount   æ€»é‡‘额
     * @param subscribeChargingCapacity é¢„充电量
     */
    public C3mOrder generateOrder(Long poleId, String poleMac, String c3Mac, OrderType orderType, Double totalAmount,
                                  Integer subscribeChargingCapacity) {
        this.poleId = poleId;
        this.poleMac = poleMac;
        this.orderId = -1L;
        this.c3Mac = c3Mac;
        this.outTradeNo = OrderUtils.generateOutTradeNo();
        this.orderType = orderType.getCode();
        this.totalAmount = totalAmount;
        this.receiptAmount = 0d;
        this.refundAmount = 0d;
        this.aliBuyerLogonId = "";
        this.subscribeChargingCapacity = subscribeChargingCapacity;
        this.actualChargingCapacity = 0d;
        this.createTimestamp = new Date().getTime();
        this.payTimestamp = 0L;
        this.startChargingTimestamp = 0L;
        this.stopChargingTimestamp = 0L;
        this.refundTimestamp = 0L;
        this.refundMsg = "";
        this.orderStatus = OrderStatus.NO_PAY.getStatus();
        return this;
    }
}