From 661f9562fb07d8fd0fc8740238eaed2b5d1faa56 Mon Sep 17 00:00:00 2001
From: liuhaonan <konodioda2333@vip.qq.com>
Date: 星期三, 16 三月 2022 16:20:33 +0800
Subject: [PATCH] 支付相关

---
 dao/src/main/java/com/sandu/ximon/dao/enums/C3mRedisConstant.java                      |   24 +
 dao/src/main/java/com/sandu/ximon/dao/domain/WxConfigEntity.java                       |   55 ++
 ximon-admin/src/main/java/com/sandu/ximon/admin/param/AlipayConfigParam.java           |   30 +
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mChargingChargeService.java  |  109 ++++
 ximon-admin/src/main/java/com/sandu/ximon/admin/utils/ConfigCheckUtils.java            |   18 
 ximon-admin/src/main/java/com/sandu/ximon/admin/utils/OrderUtils.java                  |   15 
 dao/src/main/java/com/sandu/ximon/dao/enums/OrderStatus.java                           |   29 +
 ximon-admin/src/main/java/com/sandu/ximon/admin/controller/XiXunController.java        |    2 
 ximon-admin/src/main/java/com/sandu/ximon/admin/vo/C3mOrderVO.java                     |  161 ++++++
 dao/src/main/java/com/sandu/ximon/dao/domain/AlipayConfigEntity.java                   |   55 ++
 ximon-admin/src/main/java/com/sandu/ximon/admin/utils/AliPayUtils.java                 |  124 +++++
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mOrderService.java           |   87 +++
 ximon-admin/src/main/java/com/sandu/ximon/admin/utils/DateUtils.java                   |  260 ++++++++++
 dao/src/main/java/com/sandu/ximon/dao/mapper/UsrAlipayConfigMapper.java                |   17 
 ximon-admin/src/main/java/com/sandu/ximon/admin/param/WxpayConfigParam.java            |   33 +
 dao/src/main/resources/mapper/UsrWxConfigMapper.xml                                    |   22 
 ximon-admin/src/main/java/com/sandu/ximon/admin/config/ServerConfig.java               |   53 ++
 dao/src/main/resources/mapper/UsrAlipayConfigMapper.xml                                |   22 
 dao/src/main/java/com/sandu/ximon/dao/enums/OrderType.java                             |   34 +
 dao/src/main/java/com/sandu/ximon/dao/mapper/UsrWxConfigMapper.java                    |   17 
 ximon-admin/src/main/java/com/sandu/ximon/admin/config/AlipayConfig.java               |   47 +
 ximon-admin/src/main/java/com/sandu/ximon/admin/controller/UsrPayConfigCollector.java  |   96 ++++
 ximon-admin/src/main/java/com/sandu/ximon/admin/pay/alipay/UsrAlipayConfigService.java |  106 ++++
 23 files changed, 1,415 insertions(+), 1 deletions(-)

diff --git a/dao/src/main/java/com/sandu/ximon/dao/domain/AlipayConfigEntity.java b/dao/src/main/java/com/sandu/ximon/dao/domain/AlipayConfigEntity.java
new file mode 100644
index 0000000..e70557a
--- /dev/null
+++ b/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;
+
+    /**
+     * 鏀粯瀹濆叕閽�/鏌ョ湅鍦板潃锛歨ttps://openhome.alipay.com/platform/keyManage.htm 瀵瑰簲APPID涓嬬殑鏀粯瀹濆叕閽�
+     */
+    private String publicKey;
+
+    /**
+     * 鍚堜綔浼欎即韬唤锛圥ID锛�
+     */
+    private String pid;
+
+    /**
+     * 瀹㈡埛id
+     */
+    private Long clientId;
+
+    /**
+     * 鍒涘缓閰嶇疆鐨勭敤鎴穒d
+     */
+    private Long createUserId;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/dao/src/main/java/com/sandu/ximon/dao/domain/WxConfigEntity.java b/dao/src/main/java/com/sandu/ximon/dao/domain/WxConfigEntity.java
new file mode 100644
index 0000000..7424a30
--- /dev/null
+++ b/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绔痑ppid
+     */
+    private String appappid;
+
+    /**
+     * 
+     */
+    private String mchId;
+
+    /**
+     * 
+     */
+    private String privateKey;
+
+    /**
+     * 
+     */
+    private Long clientId;
+
+    /**
+     * 
+     */
+    private Long createUserId;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/dao/src/main/java/com/sandu/ximon/dao/enums/C3mRedisConstant.java b/dao/src/main/java/com/sandu/ximon/dao/enums/C3mRedisConstant.java
new file mode 100644
index 0000000..39e7a19
--- /dev/null
+++ b/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;
+    }
+}
diff --git a/dao/src/main/java/com/sandu/ximon/dao/enums/OrderStatus.java b/dao/src/main/java/com/sandu/ximon/dao/enums/OrderStatus.java
new file mode 100644
index 0000000..72c96dd
--- /dev/null
+++ b/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;
+    }
+
+}
diff --git a/dao/src/main/java/com/sandu/ximon/dao/enums/OrderType.java b/dao/src/main/java/com/sandu/ximon/dao/enums/OrderType.java
new file mode 100644
index 0000000..ad2531b
--- /dev/null
+++ b/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;
+    }
+
+}
\ No newline at end of file
diff --git a/dao/src/main/java/com/sandu/ximon/dao/mapper/UsrAlipayConfigMapper.java b/dao/src/main/java/com/sandu/ximon/dao/mapper/UsrAlipayConfigMapper.java
new file mode 100644
index 0000000..6da7a86
--- /dev/null
+++ b/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> {
+
+}
+
+
+
+
diff --git a/dao/src/main/java/com/sandu/ximon/dao/mapper/UsrWxConfigMapper.java b/dao/src/main/java/com/sandu/ximon/dao/mapper/UsrWxConfigMapper.java
new file mode 100644
index 0000000..6d3383f
--- /dev/null
+++ b/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> {
+
+}
+
+
+
+
diff --git a/dao/src/main/resources/mapper/UsrAlipayConfigMapper.xml b/dao/src/main/resources/mapper/UsrAlipayConfigMapper.xml
new file mode 100644
index 0000000..4eaa704
--- /dev/null
+++ b/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>
diff --git a/dao/src/main/resources/mapper/UsrWxConfigMapper.xml b/dao/src/main/resources/mapper/UsrWxConfigMapper.xml
new file mode 100644
index 0000000..762874e
--- /dev/null
+++ b/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>
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/config/AlipayConfig.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/config/AlipayConfig.java
new file mode 100644
index 0000000..e86c1dc
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/config/AlipayConfig.java
@@ -0,0 +1,47 @@
+package com.sandu.ximon.admin.config;
+
+/* *
+ *绫诲悕锛欰lipayConfig
+ *鍔熻兘锛氬熀纭�閰嶇疆绫�
+ *璇︾粏锛氳缃笎鎴锋湁鍏充俊鎭強杩斿洖璺緞
+ *淇敼鏃ユ湡锛�2017-04-05
+ *璇存槑锛�
+ *浠ヤ笅浠g爜鍙槸涓轰簡鏂逛究鍟嗘埛娴嬭瘯鑰屾彁渚涚殑鏍蜂緥浠g爜锛屽晢鎴峰彲浠ユ牴鎹嚜宸辩綉绔欑殑闇�瑕侊紝鎸夌収鎶�鏈枃妗g紪鍐�,骞堕潪涓�瀹氳浣跨敤璇ヤ唬鐮併��
+ *璇ヤ唬鐮佷粎渚涘涔犲拰鐮旂┒鏀粯瀹濇帴鍙d娇鐢紝鍙槸鎻愪緵涓�涓弬鑰冦��
+ */
+public class AlipayConfig {
+//鈫撯啌鈫撯啌鈫撯啌鈫撯啌鈫撯啌璇峰湪杩欓噷閰嶇疆鎮ㄧ殑鍩烘湰淇℃伅鈫撯啌鈫撯啌鈫撯啌鈫撯啌鈫撯啌鈫撯啌鈫撯啌鈫�
+
+    // 搴旂敤ID,鎮ㄧ殑APPID锛屾敹娆捐处鍙锋棦鏄偍鐨凙PPID瀵瑰簲鏀粯瀹濊处鍙�
+//    public String app_id = "2019070665741774";
+
+    // 鍟嗘埛绉侀挜锛屾偍鐨凱KCS8鏍煎紡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";
+
+    // 鏀粯瀹濆叕閽�,鏌ョ湅鍦板潃锛歨ttps://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杩欑被鑷畾涔夊弬鏁帮紝蹇呴』澶栫綉鍙互姝e父璁块棶
+//    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杩欑被鑷畾涔夊弬鏁帮紝蹇呴』澶栫綉鍙互姝e父璁块棶
+//    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";
+}
+
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/config/ServerConfig.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/config/ServerConfig.java
new file mode 100644
index 0000000..ff05e1c
--- /dev/null
+++ b/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;
+    }
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/UsrPayConfigCollector.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/UsrPayConfigCollector.java
new file mode 100644
index 0000000..f9c88f1
--- /dev/null
+++ b/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));
+    }
+
+
+
+
+
+
+
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/XiXunController.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/XiXunController.java
index 6854663..9f946e2 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/XiXunController.java
+++ b/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("鎺ㄩ�佹垚鍔�");
     }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/param/AlipayConfigParam.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/param/AlipayConfigParam.java
new file mode 100644
index 0000000..3f79407
--- /dev/null
+++ b/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;
+
+    /**
+     * 鍚堜綔浼欎即韬唤锛圥ID锛�
+     */
+    private String pid;
+
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/param/WxpayConfigParam.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/param/WxpayConfigParam.java
new file mode 100644
index 0000000..5633440
--- /dev/null
+++ b/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绔痑ppid
+     */
+    private String appappid;
+
+    /**
+     *
+     */
+    private String mchId;
+
+    /**
+     *
+     */
+    private String privateKey;
+
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/pay/alipay/UsrAlipayConfigService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/pay/alipay/UsrAlipayConfigService.java
new file mode 100644
index 0000000..9158cd1
--- /dev/null
+++ b/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);
+    }
+
+
+
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mChargingChargeService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mChargingChargeService.java
new file mode 100644
index 0000000..785a3f7
--- /dev/null
+++ b/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;
+
+    }
+
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mOrderService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mOrderService.java
new file mode 100644
index 0000000..23a1a8f
--- /dev/null
+++ b/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;
+        }
+    }
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/utils/AliPayUtils.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/utils/AliPayUtils.java
new file mode 100644
index 0000000..6a98c18
--- /dev/null
+++ b/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;
+    }
+
+
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/utils/ConfigCheckUtils.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/utils/ConfigCheckUtils.java
new file mode 100644
index 0000000..40297c4
--- /dev/null
+++ b/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;
+    }
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/utils/DateUtils.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/utils/DateUtils.java
new file mode 100644
index 0000000..c8691eb
--- /dev/null
+++ b/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 鏍煎紡锛屽锛欴ateUtils.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]寮�濮嬫棩鏈熴�乨ate[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();
+    }
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/utils/OrderUtils.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/utils/OrderUtils.java
new file mode 100644
index 0000000..5a27643
--- /dev/null
+++ b/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;
+    }
+
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/vo/C3mOrderVO.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/vo/C3mOrderVO.java
new file mode 100644
index 0000000..a7428c9
--- /dev/null
+++ b/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;
+
+    /**
+     * 鍏呯數妗㎝AC
+     */
+    private String c3Mac;
+
+    /**
+     * 瀵瑰簲鐨勭伅鏉嗚澶噈ac
+     */
+    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;
+    }
+}

--
Gitblit v1.9.3