李天标 3 vuotta sitten
vanhempi
commit
3ae1e5e600
38 muutettua tiedostoa jossa 4648 lisäystä ja 6 poistoa
  1. 44 0
      pom.xml
  2. 21 0
      src/main/java/com/szwl/controller/TCoinOrderController.java
  3. 1396 0
      src/main/java/com/szwl/controller/TOrderController.java
  4. 18 0
      src/main/java/com/szwl/feign/bean/SzwlFeign.java
  5. 16 0
      src/main/java/com/szwl/mapper/TCoinOrderMapper.java
  6. 16 0
      src/main/java/com/szwl/mapper/TJoinpayMchMapper.java
  7. 16 0
      src/main/java/com/szwl/mapper/TOrderMapper.java
  8. 16 0
      src/main/java/com/szwl/mapper/TShandeMchMapper.java
  9. 26 0
      src/main/java/com/szwl/mapper/xml/TCoinOrderMapper.xml
  10. 52 0
      src/main/java/com/szwl/mapper/xml/TJoinpayMchMapper.xml
  11. 45 0
      src/main/java/com/szwl/mapper/xml/TOrderMapper.xml
  12. 28 0
      src/main/java/com/szwl/mapper/xml/TShandeMchMapper.xml
  13. 321 0
      src/main/java/com/szwl/model/bo/JsonMessage.java
  14. 15 0
      src/main/java/com/szwl/model/bo/R.java
  15. 14 4
      src/main/java/com/szwl/model/entity/TAdmin.java
  16. 51 0
      src/main/java/com/szwl/model/entity/TCoinOrder.java
  17. 176 0
      src/main/java/com/szwl/model/entity/TEquipment.java
  18. 141 0
      src/main/java/com/szwl/model/entity/TJoinpayMch.java
  19. 89 0
      src/main/java/com/szwl/model/entity/TOrder.java
  20. 58 0
      src/main/java/com/szwl/model/entity/TProduct.java
  21. 62 0
      src/main/java/com/szwl/model/entity/TPromoCode.java
  22. 79 0
      src/main/java/com/szwl/model/entity/TProportion.java
  23. 70 0
      src/main/java/com/szwl/model/entity/TShandeMch.java
  24. 80 0
      src/main/java/com/szwl/model/utils/AESUtil.java
  25. 57 0
      src/main/java/com/szwl/model/utils/AdminUtils.java
  26. 74 0
      src/main/java/com/szwl/model/utils/Constant.java
  27. 332 0
      src/main/java/com/szwl/model/utils/HttpClientUtils.java
  28. 269 0
      src/main/java/com/szwl/model/utils/JoinpayConstant.java
  29. 187 0
      src/main/java/com/szwl/model/utils/RSAUtil.java
  30. 16 0
      src/main/java/com/szwl/service/TCoinOrderService.java
  31. 61 0
      src/main/java/com/szwl/service/TJoinpayMchService.java
  32. 25 0
      src/main/java/com/szwl/service/TOrderService.java
  33. 22 0
      src/main/java/com/szwl/service/TShandeMchService.java
  34. 20 0
      src/main/java/com/szwl/service/impl/TCoinOrderServiceImpl.java
  35. 438 0
      src/main/java/com/szwl/service/impl/TJoinpayMchServiceImpl.java
  36. 56 0
      src/main/java/com/szwl/service/impl/TOrderServiceImpl.java
  37. 239 0
      src/main/java/com/szwl/service/impl/TShandeMchServiceImpl.java
  38. 2 2
      src/test/java/com/szwl/AutoGeneratorTests.java

+ 44 - 0
pom.xml

@@ -57,6 +57,7 @@
 <!--				<artifactId>mybatis-spring-boot-starter</artifactId>-->
 <!--				<version>${mybatis-spring-boot-starter.version}</version>-->
 <!--			</dependency>-->
+
 		</dependencies>
 	</dependencyManagement>
 
@@ -140,6 +141,49 @@
 			<artifactId>hutool-core</artifactId>
 			<version>5.7.16</version>
 		</dependency>
+		<!--生成二维码-->
+		<dependency>
+			<groupId>com.google.zxing</groupId>
+			<artifactId>core</artifactId>
+			<version>3.3.0</version>
+		</dependency>
+		<dependency>
+			<groupId>com.google.zxing</groupId>
+			<artifactId>javase</artifactId>
+			<version>3.3.0</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-beanutils</groupId>
+			<artifactId>commons-beanutils</artifactId>
+			<version>1.8.3</version>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate-core</artifactId>
+			<version>3.6.10.Final</version>
+		</dependency>
+		<!-- 引入org.json所需依赖 -->
+		<dependency>
+			<groupId>org.json</groupId>
+			<artifactId>json</artifactId>
+			<version>20200518</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-httpclient</groupId>
+			<artifactId>commons-httpclient</artifactId>
+			<version>3.1</version>
+		</dependency>
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <version>1.2.16</version>
+        </dependency>
+		<!--杉德支付-->
+		<dependency>
+			<groupId>cn.com.sand</groupId>
+			<artifactId>hmpay-sdk</artifactId>
+			<version>1.1.4</version>
+		</dependency>
 	</dependencies>
 
 	<build>

+ 21 - 0
src/main/java/com/szwl/controller/TCoinOrderController.java

@@ -0,0 +1,21 @@
+package com.szwl.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author wuhs
+ * @since 2022-06-17
+ */
+@RestController
+@RequestMapping("/tCoinOrder")
+public class TCoinOrderController {
+
+}
+

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1396 - 0
src/main/java/com/szwl/controller/TOrderController.java


+ 18 - 0
src/main/java/com/szwl/feign/bean/SzwlFeign.java

@@ -2,7 +2,9 @@ package com.szwl.feign.bean;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.szwl.model.bo.ResponseModel;
+import com.szwl.model.entity.*;
 import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.GetMapping;
 
 
@@ -11,4 +13,20 @@ public interface SzwlFeign {
 
     @GetMapping("/test/testPay")
     ResponseModel<IPage<?>> testPay(String id);
+
+    @GetMapping("/tEquipment/findEquipmentByClientId")
+    ResponseModel<IPage<TEquipment>> findEquipmentByClientId(String clientId);
+
+    @GetMapping("/tPromoCode/getTPromoCode")
+    ResponseModel<IPage<TPromoCode>> getTPromoCode(String code);
+    @GetMapping("/tPromoCode/updatePromoCode")
+    void updatePromoCode(String id, String type);
+    @GetMapping("/tProduct/getProduct")
+    ResponseModel<IPage<TProduct>> getProduct(String equipmentId, String productName);
+    @GetMapping("/tProportion/getProportion")
+    ResponseModel<IPage<TProportion>> getProportion(String equipmentId);
+    @GetMapping("/tAdmin/getAdmin")
+    ResponseModel<IPage<TAdmin>>  getAdmin(String id);
+    @GetMapping("/tJoinpayMch/getMch")
+    ResponseModel<IPage<TJoinpayMch>>  getMch(String id);
 }

+ 16 - 0
src/main/java/com/szwl/mapper/TCoinOrderMapper.java

@@ -0,0 +1,16 @@
+package com.szwl.mapper;
+
+import com.szwl.model.entity.TCoinOrder;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author wuhs
+ * @since 2022-06-17
+ */
+public interface TCoinOrderMapper extends BaseMapper<TCoinOrder> {
+
+}

+ 16 - 0
src/main/java/com/szwl/mapper/TJoinpayMchMapper.java

@@ -0,0 +1,16 @@
+package com.szwl.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.szwl.model.entity.TJoinpayMch;
+
+/**
+ * <p>
+ * 汇聚支付用户收款信息表 Mapper 接口
+ * </p>
+ *
+ * @author wuhs
+ * @since 2022-04-29
+ */
+public interface TJoinpayMchMapper extends BaseMapper<TJoinpayMch> {
+
+}

+ 16 - 0
src/main/java/com/szwl/mapper/TOrderMapper.java

@@ -0,0 +1,16 @@
+package com.szwl.mapper;
+
+import com.szwl.model.entity.TOrder;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author wuhs
+ * @since 2022-06-17
+ */
+public interface TOrderMapper extends BaseMapper<TOrder> {
+
+}

+ 16 - 0
src/main/java/com/szwl/mapper/TShandeMchMapper.java

@@ -0,0 +1,16 @@
+package com.szwl.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.szwl.model.entity.TShandeMch;
+
+/**
+ * <p>
+ * 杉德支付收款信息 Mapper 接口
+ * </p>
+ *
+ * @author wuhs
+ * @since 2022-04-29
+ */
+public interface TShandeMchMapper extends BaseMapper<TShandeMch> {
+
+}

+ 26 - 0
src/main/java/com/szwl/mapper/xml/TCoinOrderMapper.xml

@@ -0,0 +1,26 @@
+<?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.szwl.mapper.TCoinOrderMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.szwl.model.entity.TCoinOrder">
+        <result column="id" property="id" />
+        <result column="create_date" property="createDate" />
+        <result column="modify_date" property="modifyDate" />
+        <result column="admin_id" property="adminId" />
+        <result column="client_id" property="clientId" />
+        <result column="pay_type" property="payType" />
+        <result column="price" property="price" />
+        <result column="sn" property="sn" />
+        <result column="type" property="type" />
+        <result column="product_name" property="productName" />
+        <result column="es" property="es" />
+        <result column="pay_date" property="payDate" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, create_date, modify_date, admin_id, client_id, pay_type, price, sn, type, product_name, es, pay_date
+    </sql>
+
+</mapper>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 52 - 0
src/main/java/com/szwl/mapper/xml/TJoinpayMchMapper.xml


+ 45 - 0
src/main/java/com/szwl/mapper/xml/TOrderMapper.xml

@@ -0,0 +1,45 @@
+<?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.szwl.mapper.TOrderMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.szwl.model.entity.TOrder">
+        <result column="id" property="id" />
+        <result column="create_date" property="createDate" />
+        <result column="modify_date" property="modifyDate" />
+        <result column="admin_id" property="adminId" />
+        <result column="admin_proportion" property="adminProportion" />
+        <result column="agency_id" property="agencyId" />
+        <result column="agency_proportion" property="agencyProportion" />
+        <result column="alt_info" property="altInfo" />
+        <result column="client_id" property="clientId" />
+        <result column="equipment_id" property="equipmentId" />
+        <result column="frp_code" property="frpCode" />
+        <result column="merchant_id" property="merchantId" />
+        <result column="merchant_proportion" property="merchantProportion" />
+        <result column="pay_date" property="payDate" />
+        <result column="personage_id" property="personageId" />
+        <result column="personage_proportion" property="personageProportion" />
+        <result column="price" property="price" />
+        <result column="product_id" property="productId" />
+        <result column="product_name" property="productName" />
+        <result column="refund_date" property="refundDate" />
+        <result column="sn" property="sn" />
+        <result column="status" property="status" />
+        <result column="type" property="type" />
+        <result column="trx_no" property="trxNo" />
+        <result column="refund_trx_no" property="refundTrxNo" />
+        <result column="es" property="es" />
+        <result column="refund_amount" property="refundAmount" />
+        <result column="note" property="note" />
+        <result column="pay_platform" property="payPlatform" />
+        <result column="is_settlement" property="isSettlement" />
+        <result column="proportion_desc" property="proportionDesc" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, create_date, modify_date, admin_id, admin_proportion, agency_id, agency_proportion, alt_info, client_id, equipment_id, frp_code, merchant_id, merchant_proportion, pay_date, personage_id, personage_proportion, price, product_id, product_name, refund_date, sn, status, type, trx_no, refund_trx_no, es, refund_amount, note, pay_platform, is_settlement, proportion_desc
+    </sql>
+
+</mapper>

+ 28 - 0
src/main/java/com/szwl/mapper/xml/TShandeMchMapper.xml

@@ -0,0 +1,28 @@
+<?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.szwl.mapper.TShandeMchMapper">
+
+    <!--&lt;!&ndash; 通用查询映射结果 &ndash;&gt;-->
+    <!--<resultMap id="BaseResultMap" type="com.szwl.model.entity.TShandeMch">-->
+        <!--<id column="id" property="id" />-->
+        <!--<result column="create_date" property="createDate" />-->
+        <!--<result column="modify_date" property="modifyDate" />-->
+        <!--<result column="bank_name" property="bankName" />-->
+        <!--<result column="bank_no" property="bankNo" />-->
+        <!--<result column="type" property="type" />-->
+        <!--<result column="admin_id" property="adminId" />-->
+        <!--<result column="settleable_balance" property="settleableBalance" />-->
+        <!--<result column="today_balance" property="todayBalance" />-->
+        <!--<result column="total_settleable_balance" property="totalSettleableBalance" />-->
+        <!--<result column="settleable_date" property="settleableDate" />-->
+        <!--<result column="last_settleable_balance" property="lastSettleableBalance" />-->
+        <!--<result column="bank_channel_no" property="bankChannelNo" />-->
+        <!--<result column="bank_channel_name" property="bankChannelName" />-->
+    <!--</resultMap>-->
+
+    <!--&lt;!&ndash; 通用查询结果列 &ndash;&gt;-->
+    <!--<sql id="Base_Column_List">-->
+        <!--id, create_date, modify_date, bank_name, bank_no, type, admin_id, settleable_balance, today_balance, total_settleable_balance, settleable_date, last_settleable_balance, bank_channel_no, bank_channel_name-->
+    <!--</sql>-->
+
+</mapper>

+ 321 - 0
src/main/java/com/szwl/model/bo/JsonMessage.java

@@ -0,0 +1,321 @@
+package com.szwl.model.bo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.commons.beanutils.BeanUtils;
+import org.apache.commons.lang.StringUtils;
+import org.hibernate.collection.AbstractPersistentCollection;
+
+import java.lang.reflect.Method;
+import java.util.*;
+
+/**
+ * Created by study on 9/2/2015.
+ */
+public final class JsonMessage {
+    /**
+     * 用户未登录
+     */
+    public static final JsonMessage USER_NOT_LOGIN = JsonMessage.error(2, "用户未登录");
+    /**
+     * 未知错误
+     */
+    public static final JsonMessage UNKNOWN_ERROR = JsonMessage.error(4, "未知错误");
+
+    /**
+     * 成功代码
+     */
+    public static final int CODE_SUCCESS = 0;
+
+    /**
+     * 基本错误代码
+     */
+    public static final int CODE_ERROR = 1;
+
+    /**
+     * 返回码
+     */
+    @JsonProperty
+    private int code;
+
+    /**
+     * 错误信息
+     */
+    @JsonProperty
+    private Object errmsg;
+
+    /**
+     * 返回数据
+     */
+    @JsonProperty
+    private Object data;
+
+    // 禁止创建对象
+    private JsonMessage(int code, Object data) {
+        this.code = code;
+        if ( code== 0 ){
+            this.data = data;
+        } else {
+            this.errmsg = data;
+        }
+    }
+
+    /**
+     * /**
+     * 成功消息(code=0)<br>
+     * 单参数返回格式为:{code:0,data:<Object>}<br>
+     * 多参数格式:参数名1,参数值1,参数名2,参数值2...<br>
+     * 返回Json格式{code:0,data:{'参数1':参数值1(Object),'参数2':参数值2(Object)}}
+     *
+     * @param data 数据组
+     * @return
+     */
+    public static JsonMessage success(Object... data) {
+        return message(CODE_SUCCESS, data);
+    }
+
+    /**
+     * 失败消息(code=1)<br>
+     * 单参数返回格式为:{code:1,data:<Object>}<br>
+     * 多参数格式:参数名1,参数值1,参数名2,参数值2...<br>
+     * 返回Json格式{code:1,data:{'参数1':参数值1(Object),'参数2':参数值2(Object)}}
+     *
+     * @param data 失败消息
+     * @return
+     */
+    public static JsonMessage error(Object data) {
+        return message(CODE_ERROR, data);
+    }
+
+    /**
+     * 失败消息(code=1)<br>
+     * 单参数返回格式为:{code:1,data:<Object>}<br>
+     * 多参数格式:参数名1,参数值1,参数名2,参数值2...<br>
+     * 返回Json格式{code:1,data:{'参数1':参数值1(Object),'参数2':参数值2(Object)}}
+     *
+     * @param data 失败消息
+     * @return
+     */
+    public static JsonMessage error(int code, Object data) {
+        return message(code, data);
+    }
+
+    /**
+     * 通用消息消息<br>
+     * 单参数返回格式为:{code:code(int),data:<Object>}<br>
+     * 多参数格式:参数名1,参数值1,参数名2,参数值2...<br>
+     * 返回Json格式{code:code(int),data:{'参数1':参数值1(Object),'参数2':参数值2(Object)}}
+     *
+     * @param code 返回码
+     * @param data 返回数据,支持多数据返回,多数据参数格式:参数名1(String),参数值1(Object),参数名2(String),参数值2(Object)...
+     * @return
+     */
+    private static JsonMessage message(int code, Object... data) {
+        if (data == null) data = new Object[]{new Object()};
+        if (data.length == 1) {
+            // 单一数据
+            return new JsonMessage(code, data[0]);
+        } else {
+            Map<String, Object> map = new LinkedHashMap<>();
+
+            for (int i = 0; i < data.length; i++) {
+                String key = data[i++].toString();
+                map.put(key, data[i]);
+            }
+            return new JsonMessage(code, map);
+        }
+    }
+
+    /**
+     * 优化对象数据
+     *
+     * @param bean
+     * @param properties
+     * @return
+     */
+    public static Object optimiseObj(Object bean, String... properties) {
+        Map<String, Object> map = new HashMap<>();
+        if (bean == null) {
+            //TODO 前端需要null
+            return null;
+            // TODO 前端需要空对象
+//            return map;
+        }
+        // 判断是否列表
+        if (isCollection(bean.getClass())) {
+            Collection list = (Collection) bean;
+            return optimiseList(list, properties);
+        }
+        // 2. 循环每一个属性
+        for (String string : properties) {
+            if (StringUtils.isEmpty(string)) continue;
+            // 处理级联属性
+            String[] names = string.split("\\.");
+            Map<String, Object> tmp = map;
+            Map<String, Object> field;
+            // 3. 循环每一个级联属性
+            StringBuilder prefix = new StringBuilder();
+            for (int i = 0; i < names.length; i++) {
+                if (i == (names.length - 1)) {
+                    // 最后一个field
+                    tmp.put(names[i], getPropertyValue(bean, string));
+                } else {
+                    field = (Map<String, Object>) tmp.get(names[i]);
+                    if (field == null) {
+                        field = new HashMap<>();
+                        tmp.put(names[i], field);
+                    }
+                    prefix.append(names[i]);
+                    // 处理list
+                    Class type = getPropertyType(bean, prefix.toString());
+                    Object obj = getPropertyObject(bean, prefix.toString());
+                    prefix.append(".");//必须在这里添加
+                    if (obj == null) {
+                        tmp.put(names[i], null);
+                        break;
+                    } else if (isCollection(type)) {
+                        String suffix = string.replace(prefix.toString(), "");
+                        tmp.put(names[i], optimiseList((Collection) getPropertyObject(bean, prefix.substring(0, prefix.length() - 1)), suffix.split("#")));
+                        break;
+                    }
+
+                    tmp = field; // 必须在处理list之后修改
+                }
+            }
+        }
+
+        return map;
+    }
+
+    /**
+     * 优化列表数据
+     *
+     * @param list       列表
+     * @param properties 需要的属性
+     * @return
+     */
+    private static Object optimiseList(Collection list, String... properties) {
+        List<Object> newList = new ArrayList<>();
+        if (list != null && properties != null) {
+            // 1. 循环每一个list item
+            for (Object bean : list) {
+                newList.add(optimiseObj(bean, properties));
+            }
+        }
+
+        return newList;
+    }
+
+    /**
+     * 反射获取字段值,支持级联
+     *
+     * @param bean
+     * @param property
+     * @return
+     */
+    private static Object getPropertyValue(Object bean, String property) {
+        try {
+            Class type = getPropertyType(bean, property);
+            if (isCollection(type)) {
+                return BeanUtils.getArrayProperty(bean, property);
+            } else {
+                return BeanUtils.getProperty(bean, property);
+            }
+        } catch (Exception e) {
+        }
+
+        return null;
+    }
+
+    /**
+     * 获取属性类型,支持级联
+     *
+     * @param bean
+     * @param property
+     * @return
+     */
+    private static Class getPropertyType(Object bean, String property) {
+        try {
+            String[] names = property.split("\\.");
+            Object obj = bean;
+            Method method = null;
+            for (String name : names) {
+                method = obj.getClass().getMethod("get" + toUpperCaseFirstOne(name));
+                obj = method.invoke(obj);
+            }
+
+            return method.getReturnType();
+        } catch (Exception e) {
+        }
+
+        return null;
+    }
+
+    /**
+     * 获取属性对象,支持级联
+     *
+     * @param bean
+     * @param property
+     * @return
+     */
+    private static Object getPropertyObject(Object bean, String property) {
+        try {
+            String[] names = property.split("\\.");
+            Object obj = bean;
+            Method method;
+            for (String name : names) {
+                method = obj.getClass().getMethod("get" + toUpperCaseFirstOne(name));
+                obj = method.invoke(obj);
+            }
+
+            return obj;
+        } catch (Exception e) {
+        }
+
+        return null;
+    }
+
+    /**
+     * 判断类型是否是集合
+     *
+     * @param type
+     * @return
+     */
+    private static boolean isCollection(Class type) {
+//        System.out.println(type);
+        while (type != null && !Object.class.equals(type)) {
+            Class[] classes = type.getInterfaces();
+            for (Class c : classes) {
+                if (Collection.class.equals(c)) {
+                    return true;
+                }
+            }
+
+            if (AbstractCollection.class.equals(type) || AbstractPersistentCollection.class.equals(type)) {
+                return true;
+            } else {
+                type = type.getSuperclass();
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * 首字母转大写
+     *
+     * @param s
+     * @return
+     */
+    private static String toUpperCaseFirstOne(String s) {
+        if (StringUtils.isEmpty(s)) {
+            return "";
+        }
+
+        if (Character.isUpperCase(s.charAt(0))) {
+            return s;
+        } else {
+            return (new StringBuilder()).append(Character.toUpperCase(s.charAt(0))).append(s.substring(1)).toString();
+        }
+    }
+
+}

+ 15 - 0
src/main/java/com/szwl/model/bo/R.java

@@ -2,6 +2,7 @@ package com.szwl.model.bo;
 
 
 import com.szwl.constant.ResponseCodesEnum;
+import com.szwl.exception.MyException;
 
 public class R<T> {
 
@@ -34,4 +35,18 @@ public class R<T> {
     public static <T> ResponseModel<T> fail(ResponseCodesEnum code, String formatter, Object... obj) {
         return ResponseModel.fail(code, String.format(formatter, obj));
     }
+
+    /**
+     * 获取feign结果,如果成功获取data,失败抛出异常
+     *
+     * @param resp
+     * @param <T>
+     * @return
+     */
+    public static <T> T getDataIfSuccess(ResponseModel<T> resp) {
+        if (!resp.isSuccess()) {
+            throw new MyException(resp.getMessage());
+        }
+        return resp.getData();
+    }
 }

+ 14 - 4
src/main/java/com/szwl/model/entity/TAdmin.java

@@ -1,14 +1,17 @@
 package com.szwl.model.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
-import java.util.Date;
 import com.baomidou.mybatisplus.annotation.TableId;
-import java.io.Serializable;
+import com.szwl.model.utils.AdminUtils;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.beans.Transient;
+import java.io.Serializable;
+import java.util.Date;
+
 /**
  * <p>
  * 
@@ -69,7 +72,7 @@ public class TAdmin implements Serializable {
     @ApiModelProperty(value = "当前查看过公告的id;")
     private Long noticeId;
 
-    @ApiModelProperty(value = "类型(暂时作废);")
+    @ApiModelProperty(value = "类型,0:超管,1,公司人员;2:商家,3:商家子账户")
     private Integer type;
 
     @ApiModelProperty(value = "登录名;")
@@ -81,7 +84,7 @@ public class TAdmin implements Serializable {
     @ApiModelProperty(value = "是否退款;")
     private String isRefund;
 
-    @ApiModelProperty(value = "是否国外;")
+    @ApiModelProperty(value = "是否国外;0:国内,1:国外")
     private String ifForeign;
 
     @ApiModelProperty(value = "是否开启远程开关机")
@@ -104,6 +107,13 @@ public class TAdmin implements Serializable {
 
     @ApiModelProperty(value = "关联商家,相当于以前的parent_id")
     private String relationAdminId;
+    @Transient
+    public String getManagerId() {
+
+        String managerId = "";
 
+        managerId = AdminUtils.encrypt(false, this.getId());
+        return managerId;
+    }
 
 }

+ 51 - 0
src/main/java/com/szwl/model/entity/TCoinOrder.java

@@ -0,0 +1,51 @@
+package com.szwl.model.entity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author wuhs
+ * @since 2022-06-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="TCoinOrder对象", description="")
+public class TCoinOrder implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private Date createDate;
+
+    private Date modifyDate;
+
+    private Long adminId;
+
+    private String clientId;
+
+    private Integer payType;
+
+    private BigDecimal price;
+
+    private String sn;
+
+    private Integer type;
+
+    private String productName;
+
+    private String es;
+
+    private Date payDate;
+
+
+}

+ 176 - 0
src/main/java/com/szwl/model/entity/TEquipment.java

@@ -0,0 +1,176 @@
+package com.szwl.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 设备表
+ * </p>
+ *
+ * @author wuhs
+ * @since 2022-04-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="TEquipment对象", description="设备表")
+public class TEquipment implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    private Date createDate;
+
+    private Date modifyDate;
+
+    @ApiModelProperty(value = "用户id;")
+    private Long adminId;
+
+    @ApiModelProperty(value = "用户等级;")
+    private String adminLevel;
+
+    @ApiModelProperty(value = "机器超级管理员admin密码;")
+    private String adminPwd;
+
+    private Long areaId;
+
+    @ApiModelProperty(value = "柜内湿度;")
+    private String cabinetHd;
+
+    @ApiModelProperty(value = "炉头温度;")
+    private String cabinetTm;
+
+    @ApiModelProperty(value = "设备编号;")
+    private String clientId;
+
+    @ApiModelProperty(value = "机器联系人名称;")
+    private String contactName;
+
+    @ApiModelProperty(value = "联系人电话;")
+    private String contactPhone;
+
+    @ApiModelProperty(value = "运营者电话;")
+    private String operationalPhone;
+
+    @ApiModelProperty(value = "机器运营者")
+    private String operationalName;
+
+    @ApiModelProperty(value = "炉头转速;")
+    private String furnaceSp;
+
+    @ApiModelProperty(value = "炉头温度;")
+    private String furnaceTm;
+
+    @ApiModelProperty(value = "机器guest密码;")
+    private String guestPwd;
+
+    @ApiModelProperty(value = "true 代表 强制联网使用 ,false 代表 可不联网使用;")
+    private Boolean isNetWork;
+
+    @ApiModelProperty(value = "机器启用状态,true:启用;")
+    private Boolean isUsing;
+
+    @ApiModelProperty(value = "最近刷新时间;")
+    private Date lastUpdateTime;
+
+    @ApiModelProperty(value = "经度;")
+    private Double latitude;
+
+    @ApiModelProperty(value = "纬度;")
+    private Double longitude;
+
+    @ApiModelProperty(value = "管理系统ID;")
+    private String managerId;
+
+    @ApiModelProperty(value = "客户自命名")
+    private String selfName;
+
+    @ApiModelProperty(value = "通信方式; 1:个推,2:Mq 如果为null,那么用个推")
+    private String channel;
+
+    @ApiModelProperty(value = "机器名称;")
+    private String name;
+
+    @ApiModelProperty(value = "联网方式;")
+    private String netWorkingMode;
+
+    @ApiModelProperty(value = "运营商;")
+    private String operator;
+
+    @ApiModelProperty(value = "支付方式;")
+    private Integer payType;
+
+    @ApiModelProperty(value = "销售总数;")
+    private Integer productTotal;
+
+    @ApiModelProperty(value = "SIM卡卡号;")
+    private String simNo;
+
+    @ApiModelProperty(value = "设备编号自命名;")
+    private String sn;
+
+    @ApiModelProperty(value = "所属商家;")
+    private String adminUserName;
+
+    @ApiModelProperty(value = "公司电话;")
+    private String companyPhone;
+
+    @ApiModelProperty(value = "0:分账方2个,1:分账方3个,3:分账方4个,3:分账方超4个;")
+    private Integer type;
+
+    @ApiModelProperty(value = "地址全名;")
+    private String fullName;
+
+    @ApiModelProperty(value = "最后推送时间;")
+    private Date pushUpdateTime;
+
+    @ApiModelProperty(value = "广告规则id;")
+    private Long timeRuleId;
+
+    @ApiModelProperty(value = "实际上的设备id;")
+    private String gtClientId;
+
+    @ApiModelProperty(value = "设备状态 开机为1,关机为0;")
+    private Integer eqeStatus;
+
+    @ApiModelProperty(value = "锁机状态;")
+    private Boolean isBlocked;
+
+    @ApiModelProperty(value = "短信接收者;")
+    private String messageReceiver;
+
+    @ApiModelProperty(value = "睡眠状态,睡眠为true,不睡眠false;")
+    private Boolean isSleep;
+
+    @ApiModelProperty(value = "音量;")
+    private String volume;
+
+    @ApiModelProperty(value = "远程开关机的时间戳")
+    private String network;
+
+    @ApiModelProperty(value = "PLC版本;")
+    private String plcVersion;
+
+    @ApiModelProperty(value = "棉花糖机器类型,mg320,mg301;")
+    private String equimentType;
+
+    @ApiModelProperty(value = "mg280机器到期时间;")
+    private Date endDate;
+
+    @ApiModelProperty(value = "花型数量;")
+    private String flowers;
+
+    @ApiModelProperty(value = "设备类型,0:棉花糖,1,爆米花")
+    private String machineType;
+
+
+}

+ 141 - 0
src/main/java/com/szwl/model/entity/TJoinpayMch.java

@@ -0,0 +1,141 @@
+package com.szwl.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 汇聚支付用户收款信息表
+ * </p>
+ *
+ * @author wuhs
+ * @since 2022-04-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="TJoinpayMch对象", description="汇聚支付用户收款信息表")
+public class TJoinpayMch implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    private Date createDate;
+
+    private Date modifyDate;
+
+    @ApiModelProperty(value = "商家id;")
+    private Long adminId;
+
+    @ApiModelProperty(value = "可取余额账户;")
+    private BigDecimal altAvilBalance;
+
+    @ApiModelProperty(value = "担保账户 : 担保账户里面得担保余额,金额以分为单位;")
+    private BigDecimal altGuarBalance;
+
+    @ApiModelProperty(value = "主账户余额;")
+    private BigDecimal altMainBalance;
+
+    @ApiModelProperty(value = "分账方名称;")
+    private String altMchName;
+
+    @ApiModelProperty(value = "分账方账号;")
+    private String altMchNo;
+
+    @ApiModelProperty(value = "分账方商户简称;")
+    private String altMchShortName;
+
+    @ApiModelProperty(value = "分账方商户类型,10:个人,11:个体工商户,12:企业;")
+    private Integer altMerchantType;
+
+    @ApiModelProperty(value = "银行账户名称,分账方结算银行账户名称;")
+    private String bankAccountName;
+
+    @ApiModelProperty(value = "银行账号;")
+    private String bankAccountNo;
+
+    @ApiModelProperty(value = "账户类型      * 1 借记卡,4 对公账户;")
+    private Integer bankAccountType;
+
+    @ApiModelProperty(value = "联行号;")
+    private String bankChannelNo;
+
+    @ApiModelProperty(value = "业务响应码;")
+    private String bizCode;
+
+    @ApiModelProperty(value = "业务联系人手机;")
+    private String busiContactMobileNo;
+
+    @ApiModelProperty(value = "业务联系人姓名;")
+    private String busiContactName;
+
+    @ApiModelProperty(value = "身份证有效期;")
+    private String idCardExpiry;
+
+    @ApiModelProperty(value = "身份证;")
+    private String idCardNo;
+
+    @ApiModelProperty(value = "法人;")
+    private String legalPerson;
+
+    @ApiModelProperty(value = "营业执照有效期;")
+    private String licenseExpiry;
+
+    @ApiModelProperty(value = "营业执照编号;")
+    private String licenseNo;
+
+    @ApiModelProperty(value = "分账方登录名,即邮箱;")
+    private String loginName;
+
+    @ApiModelProperty(value = "经营地址;")
+    private String manageAddr;
+
+    @ApiModelProperty(value = "经营范围;")
+    private String manageScope;
+
+    @ApiModelProperty(value = "商户状态;")
+    private String orderStatus;
+
+    @ApiModelProperty(value = "电话;")
+    private String phoneNo;
+
+    @ApiModelProperty(value = "受理响应码;")
+    private String respCode;
+
+    @ApiModelProperty(value = "结算周期;")
+    private Integer riskDay;
+
+    @ApiModelProperty(value = "结算周期类型      * 1 工作日,2 自然日,3 月结日;")
+    private Integer settDateType;
+
+    @ApiModelProperty(value = "结算方式      * 1 由汇聚自动结算      * 2 由商户平台手工结算(结算接口);")
+    private Integer settMode;
+
+    @ApiModelProperty(value = "开通状态;")
+    private String status;
+
+    @ApiModelProperty(value = "签约状态;")
+    private String signStatus;
+
+    @ApiModelProperty(value = "签约流水号;")
+    private String signTrxNo;
+
+    @ApiModelProperty(value = "图片审核备注;")
+    private String approveNote;
+
+    @ApiModelProperty(value = "图片审核状态;")
+    private String approveStatus;
+
+    private String type;
+
+
+}

+ 89 - 0
src/main/java/com/szwl/model/entity/TOrder.java

@@ -0,0 +1,89 @@
+package com.szwl.model.entity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author wuhs
+ * @since 2022-06-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="TOrder对象", description="")
+public class TOrder implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private Date createDate;
+
+    private Date modifyDate;
+
+    private Long adminId;
+
+    private BigDecimal adminProportion;
+
+    private Long agencyId;
+
+    private BigDecimal agencyProportion;
+
+    private String altInfo;
+
+    private String clientId;
+
+    private Long equipmentId;
+
+    private String frpCode;
+
+    private Long merchantId;
+
+    private BigDecimal merchantProportion;
+
+    private Date payDate;
+
+    private Long personageId;
+
+    private BigDecimal personageProportion;
+
+    private BigDecimal price;
+
+    private Long productId;
+
+    private String productName;
+
+    private Date refundDate;
+
+    private String sn;
+
+    private Integer status;
+
+    private Integer type;
+
+    private String trxNo;
+
+    private String refundTrxNo;
+
+    private String es;
+
+    private BigDecimal refundAmount;
+
+    private String note;
+
+    private String payPlatform;
+
+    private String isSettlement;
+
+    private String proportionDesc;
+
+
+}

+ 58 - 0
src/main/java/com/szwl/model/entity/TProduct.java

@@ -0,0 +1,58 @@
+package com.szwl.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 商品价格表
+ * </p>
+ *
+ * @author wuhs
+ * @since 2022-04-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="TProduct对象", description="商品价格表")
+public class TProduct implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    private Date createDate;
+
+    private Date modifyDate;
+
+    @ApiModelProperty(value = "投币价格;")
+    private BigDecimal codePrice;
+
+    @ApiModelProperty(value = "机器id;")
+    private Long equipmentId;
+
+    @ApiModelProperty(value = "产品名称;")
+    private String productName;
+
+    @ApiModelProperty(value = "人名币价格;")
+    private BigDecimal rmbPrice;
+
+    @ApiModelProperty(value = "销售状态;")
+    private Boolean sellStatus;
+
+    @ApiModelProperty(value = "是否显示")
+    private String showType;
+
+    @ApiModelProperty(value = "编号")
+    private String no;
+
+
+}

+ 62 - 0
src/main/java/com/szwl/model/entity/TPromoCode.java

@@ -0,0 +1,62 @@
+package com.szwl.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 优惠码列表
+ * </p>
+ *
+ * @author wuhs
+ * @since 2022-06-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="TPromoCode对象", description="优惠码列表")
+public class TPromoCode implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "所属商家;")
+    private String adminId;
+
+    private Date createDate;
+
+    private String userName;
+
+    private Date modifyDate;
+
+    @ApiModelProperty(value = "优惠码编号;")
+    private Long code;
+
+    @ApiModelProperty(value = "是否使用;")
+    private String isUse;
+
+    @ApiModelProperty(value = "使用时间;")
+    private String useDate;
+
+    @ApiModelProperty(value = "被那个机器使用;")
+    private String useBy;
+
+    @ApiModelProperty(value = "到期时间;")
+    private Date lastUseDate;
+
+    @ApiModelProperty(value = "优惠码折扣;")
+    private Float discount;
+
+    @ApiModelProperty(value = "类型,0或null:折扣优惠码;1:抵扣价优惠码")
+    private String type;
+
+
+}

+ 79 - 0
src/main/java/com/szwl/model/entity/TProportion.java

@@ -0,0 +1,79 @@
+package com.szwl.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 分账表
+ * </p>
+ *
+ * @author wuhs
+ * @since 2022-05-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="TProportion对象", description="分账表")
+public class TProportion implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    private Date createDate;
+
+    private Date modifyDate;
+
+    private Long adminId;
+
+    private String clientId;
+
+    private Long equipmentId;
+
+    @ApiModelProperty(value = "平台分销;")
+    private BigDecimal adminProportion;
+
+    @ApiModelProperty(value = "一级分销;")
+    private BigDecimal agencyProportion;
+
+    @ApiModelProperty(value = "二级分销;")
+    private BigDecimal merchantProportion;
+
+    @ApiModelProperty(value = "三级分销;")
+    private BigDecimal personageProportion;
+
+    @ApiModelProperty(value = "商家自己的分销")
+    private BigDecimal proportion;
+
+    @ApiModelProperty(value = "当分账方超过4个时启用,分销详情(adminId1:分销1,adminId2:分销2.。。。)")
+    private String proportionDesc;
+
+    @ApiModelProperty(value = "一级分销商家id")
+    private Long agencyId;
+
+    @ApiModelProperty(value = "二级分销商家id")
+    private Long merchantId;
+
+    @ApiModelProperty(value = "三级分销商家id")
+    private Long personageId;
+
+    private String agencyName;
+
+    private String merchantName;
+
+    private String personageName;
+
+    @ApiModelProperty(value = "0:分账方2个,1:分账方3个,2:分账方4个,3:分账方超4个;")
+    private Integer type;
+
+
+}

+ 70 - 0
src/main/java/com/szwl/model/entity/TShandeMch.java

@@ -0,0 +1,70 @@
+package com.szwl.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 杉德支付收款信息
+ * </p>
+ *
+ * @author wuhs
+ * @since 2022-04-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="TShandeMch对象", description="杉德支付收款信息")
+public class TShandeMch implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    private Date createDate;
+
+    private Date modifyDate;
+
+    @ApiModelProperty(value = "收款人名称;")
+    private String bankName;
+
+    @ApiModelProperty(value = "收款人账号;")
+    private String bankNo;
+
+    @ApiModelProperty(value = "0:企业杉德宝;1:个人杉德宝")
+    private String type;
+
+    @ApiModelProperty(value = "商家id;")
+    private Long adminId;
+
+    @ApiModelProperty(value = "待清算余额;")
+    private BigDecimal settleableBalance;
+
+    @ApiModelProperty(value = "今日收款余额;")
+    private BigDecimal todayBalance;
+
+    @ApiModelProperty(value = "已清算余额;")
+    private BigDecimal totalSettleableBalance;
+
+    @ApiModelProperty(value = "上一次结算时间;")
+    private Date settleableDate;
+
+    @ApiModelProperty(value = "上一次清算余额;")
+    private BigDecimal lastSettleableBalance;
+
+    @ApiModelProperty(value = "联行号")
+    private String bankChannelNo;
+
+    @ApiModelProperty(value = "开户行名称")
+    private String bankChannelName;
+
+
+}

+ 80 - 0
src/main/java/com/szwl/model/utils/AESUtil.java

@@ -0,0 +1,80 @@
+package com.szwl.model.utils;
+
+
+
+import com.szwl.model.utils.constants.Algorithm;
+import com.szwl.model.utils.constants.CommonConst;
+import com.szwl.model.utils.exceptions.JPException;
+
+import javax.crypto.Cipher;
+import javax.crypto.KeyGenerator;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.security.SecureRandom;
+
+/**
+ * AES加解密工具类
+ * @author chenyf
+ * @date 2018-12-15
+ */
+public class AESUtil {
+    private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";//算法/模式/补码方式
+
+    public static String encrypt(String content, String password, String ivParam){
+        try {
+            SecretKeySpec secSpec = genSecretKeySpec(password);
+            Cipher cipher = Cipher.getInstance(TRANSFORMATION);
+            IvParameterSpec ivp = new IvParameterSpec(ivParam.getBytes(CommonConst.ENCODING_UTF_8));
+            cipher.init(Cipher.ENCRYPT_MODE, secSpec, ivp);
+            byte[] encrypted = cipher.doFinal(content.getBytes(CommonConst.ENCODING_UTF_8));
+            return HEXUtil.encode(CodeUtil.base64Encode(encrypted));
+        }catch(Throwable e){
+            throw new JPException("AES加密异常", e);
+        }
+    }
+
+    public static String decrypt(String content, String password, String ivParam){
+        try {
+            SecretKeySpec secSpec = genSecretKeySpec(password);
+            Cipher cipher = Cipher.getInstance(TRANSFORMATION);
+            IvParameterSpec ivp = new IvParameterSpec(ivParam.getBytes(CommonConst.ENCODING_UTF_8));
+            cipher.init(Cipher.DECRYPT_MODE, secSpec, ivp);
+            byte[] encrypted1 = CodeUtil.base64Decode(HEXUtil.decode(content));
+            byte[] original = cipher.doFinal(encrypted1);
+            return new String(original, CommonConst.ENCODING_UTF_8);
+        }catch(Throwable e){
+            throw new JPException("AES解密异常", e);
+        }
+    }
+
+    /**
+     * 生成密钥对象 密钥可支持16位或32位(32位是否支持取决于JDK)
+     * @param password
+     * @return
+     * @throws Exception
+     */
+    public static SecretKeySpec genSecretKeySpec(String password) throws Exception{
+        if (password == null || (password.length() != 16 && password.length() != 32)) {
+            throw new JPException("password长度须为16或32位");
+        }
+        KeyGenerator kGen = KeyGenerator.getInstance(Algorithm.AES);
+        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
+        secureRandom.setSeed(password.getBytes());
+        kGen.init(password.length()==16 ? 128 : 256, secureRandom);
+        SecretKey secretKey = kGen.generateKey();
+        byte[] enCodeFormat = secretKey.getEncoded();
+        return new SecretKeySpec(enCodeFormat, Algorithm.AES);
+    }
+
+    public static void main(String[] args){
+        String key = "28E9B48CBCC4E5DB";
+        String iv = "B1177108BAB2BAB3";
+
+        String content1 = "31454E38597073356A6B7778564A54656B374B734B513D3D";
+        String content2 = "626E4B7049662F435A697164766E4D4E5577374C6B773D3D";
+
+        System.out.println("content1 = " + decrypt(content1, key, iv));
+        System.out.println("content2 = " + decrypt(content2, key, iv));
+    }
+}

+ 57 - 0
src/main/java/com/szwl/model/utils/AdminUtils.java

@@ -0,0 +1,57 @@
+/*
+ *
+ *
+ *
+ */
+package com.szwl.model.utils;
+
+/**
+ * 处理id
+ */
+public final class AdminUtils {
+
+    private static final Long base1 = 2452l;
+
+    private static final Long base2 = 13l;
+
+    private static final String prefix = "u";
+
+
+    /**
+     * 将id转成加密样式
+     */
+    public static String encrypt(boolean isPrefix , Long id) {
+        id = id * base2 + base1;
+        if(isPrefix){
+            return prefix + id.toString();
+        }else{
+            return id.toString();
+        }
+
+    }
+
+
+    /**
+     * 解密id
+     */
+    public static Long decrypt(boolean isPrefix , String uid) {
+        try {
+            if(isPrefix){
+                uid = uid.substring(1, uid.length());
+            }
+
+            Long id = Long.valueOf(uid);
+            id = id - base1;
+            id = id / base2;
+            return id;
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+
+    public static void main(String[] args) {
+        System.out.println(encrypt(false, 3L));
+        System.out.println(decrypt(false, "2478"));
+    }
+}

+ 74 - 0
src/main/java/com/szwl/model/utils/Constant.java

@@ -0,0 +1,74 @@
+package com.szwl.model.utils;
+
+/**
+ * Created by dinfeng 
+ */
+public class Constant {
+
+    private static double EARTH_RADIUS = 6371.393;
+    private static double rad(double d)
+    {
+        return d * Math.PI / 180.0;
+    }
+
+    /**
+     * 计算两个经纬度之间的距离
+     * @param lat1
+     * @param lng1
+     * @param lat2
+     * @param lng2
+     * @return
+     */
+    public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
+    {
+        double radLat1 = rad(lat1);
+        double radLat2 = rad(lat2);
+        double a = radLat1 - radLat2;
+        double b = rad(lng1) - rad(lng2);
+        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) +
+                Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));
+        s = s * EARTH_RADIUS;
+        s = Math.round(s * 1000);
+        return s;
+    }
+
+    /**
+     * admin 默认role id 1
+     */
+    public final static Long ROLE_ID_ADMIN = 1l;
+
+    /**
+     * 代理商 默认role id 2
+     */
+    public final static Long ROLE_ID_AGENCY= 2l;
+
+    /**
+     * 经销商 默认role id 3
+     */
+    public final static Long ROLE_ID_MERCHANT= 3l;
+
+    /**
+     * 个人商家 默认role id 4
+     */
+    public final static Long ROLE_ID_PERSONAGE= 4l;
+
+    /**
+     * 正确结果
+     */
+    public final static String correct_code = "ok";
+
+    /**
+     *
+     *
+     *
+     *      GlobalConfig
+     *
+     *
+     *
+     */
+
+    /**
+     * admin 访问码
+     */
+    public final static String ACCESS_CODE = "8";
+}

+ 332 - 0
src/main/java/com/szwl/model/utils/HttpClientUtils.java

@@ -0,0 +1,332 @@
+package com.szwl.model.utils;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.config.ConnectionConfig;
+import org.apache.http.config.Registry;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.config.SocketConfig;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLContexts;
+import org.apache.http.conn.ssl.TrustStrategy;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+import org.apache.log4j.Logger;
+import org.dom4j.Document;
+import org.dom4j.io.SAXReader;
+import org.json.JSONObject;
+import org.json.JSONTokener;
+
+import javax.net.ssl.SSLContext;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by study on 6/26/2015 11:30.
+ */
+public final class HttpClientUtils {
+    private static Logger logger = Logger.getLogger("HttpClientUtils");
+    public final static String Order_Url = "http://app.sunzee.com.cn/ShenzeeServer/EsApi/getOrder";
+    public final static String Update_Order_Url = "http://app.sunzee.com.cn/ShenzeeServer/EsApi/updateOrder";
+//    public final static String Es_Order_Url = "http://app.sunzee.com.cn/ShenzeeServer/EsApi/getOrder";
+    public final static String CoinOrder_Url = "http://app.sunzee.com.cn/ShenzeeServer/EsApi/getCoinOrder";
+//    public final static String Es_CoinOrder_Url = "http://app.sunzee.com.cn/ShenzeeServer/EsApi/getCoinOrder";
+public final static String Equipment_Url = "http://app.sunzee.com.cn/ShenzeeServer/EsApi/getEquipment";
+    public final static String Update_Equipment_Url = "http://app.sunzee.com.cn/ShenzeeServer/EsApi/updateEquipment";
+    private HttpClientUtils() {
+    }
+
+    /**
+     * post xml
+     *
+     * @param url
+     * @param xml
+     * @return
+     */
+    public static String postXml(String url, String xml) throws IOException {
+        HttpClient client = HttpClientBuilder.create().build();
+        client = WebClientDevWrapper.wrapClient(client);
+        HttpPost post = new HttpPost(url);
+        String response = null;
+        InputStream instream = null;
+        try {
+            StringEntity s = new StringEntity(xml, "UTF-8");
+            s.setContentEncoding("UTF-8");
+            s.setContentType("application/xml");
+            post.setEntity(s);
+            HttpResponse res = null;
+            if (client != null) {
+                res = client.execute(post);
+            }
+            if (res != null && res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
+                HttpEntity entity = res.getEntity();
+                SAXReader reader = new SAXReader();
+                instream = entity.getContent();
+                Document document = reader.read(new InputStreamReader(instream, "utf-8"));
+                response = document.asXML();
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        } finally {
+            if (instream != null) {
+                instream.close();
+            }
+        }
+        return response;
+    }
+
+    /**
+     * post json
+     *
+     * @param url
+     * @param json
+     * @return
+     */
+    public static JSONObject postJson(String url, String json) throws IOException {
+        HttpClient client = HttpClientBuilder.create().build();
+        client = WebClientDevWrapper.wrapClient(client);
+        HttpPost post = new HttpPost(url);
+        JSONObject response = null;
+        InputStream instream = null;
+        try {
+            StringEntity s = new StringEntity(json, "UTF-8");
+            s.setContentEncoding("UTF-8");
+            s.setContentType("application/json");
+            post.setEntity(s);
+            HttpResponse res = null;
+            if (client != null) {
+                res = client.execute(post);
+            }
+            if (res != null && res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
+                HttpEntity entity = res.getEntity();
+                String charset = "utf-8";
+                instream = entity.getContent();
+                response = new JSONObject(new JSONTokener(new InputStreamReader(instream, charset)));
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        } finally {
+            if (instream != null) {
+                instream.close();
+            }
+        }
+        return response;
+    }
+
+
+    /**
+     * java httpClient4.5 post请求
+     */
+    @SuppressWarnings("unchecked")
+    public static String sendPost(String sendMsg, String sendUrl) {
+        HttpPost httpPost = new HttpPost(sendUrl);
+        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
+        CloseableHttpClient closeableHttpClient = httpClientBuilder.build();
+        StringEntity entity;
+        String status = "false";
+        Map<String,Object> mres = new HashMap<String, Object>();
+        try {
+            entity = new StringEntity(sendMsg, "UTF-8"); //解决参数中文乱码问题
+            entity.setContentEncoding("UTF-8");//设置编码格式
+            entity.setContentType("application/json");
+            httpPost.setEntity(entity);
+            // 发起请求
+            HttpResponse httpResponse = closeableHttpClient.execute(httpPost);
+            // 请求结束,返回结果。并解析json。
+            String resData = EntityUtils.toString(httpResponse.getEntity(),"UTF-8");
+            status = resData;
+//            Map map = JSON.parseObject(JSON.toJSONString(resData), Map.class);
+//            mres = (Map<String, Object>) JSON.parseObject(JSON.toJSONString(resData), Map.class);
+//            mres = (Map<String, Object>) JSONObject.toBean(JSONObject.fromObject(resData), Map.class);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (null != closeableHttpClient) {
+                try {
+                    closeableHttpClient.close();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return status;
+//        return mres;
+    }
+    /**
+     * post 键值对
+     *
+     * @param url
+     * @param data 键值对内容
+     * @return
+     */
+    public static String sentData(String url, String data) {
+        if(!StringUtils.isEmpty(url)&&!StringUtils.isEmpty(data)){
+            String result = sendPost(data, url);
+            return result;
+        }
+        return "400";
+    }
+
+    /**
+     * post 键值对
+     *
+     * @param url
+     * @param data 键值对内容
+     * @return
+     */
+    public static String postKeyValue(String url, List<BasicNameValuePair> data) {
+
+
+        CloseableHttpClient httpClient = getHttpClient();
+        try {
+            HttpPost post = new HttpPost(url);
+
+
+            //url格式编码
+            UrlEncodedFormEntity uefEntity = new UrlEncodedFormEntity(data, "UTF-8");
+            post.setEntity(uefEntity);
+            CloseableHttpResponse httpResponse = httpClient.execute(post);
+            HttpEntity entity = httpResponse.getEntity();
+            try {
+                if (null != entity) {
+                    String result = EntityUtils.toString(entity);
+                    return result;
+                }
+            } finally {
+                httpResponse.close();
+            }
+
+
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        } catch (ClientProtocolException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                closeHttpClient(httpClient);
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return null;
+    }
+
+
+    /**
+     * get json
+     *
+     * @param url
+     * @return
+     */
+    public static JSONObject get(String url) throws IOException {
+        HttpClient client = HttpClientBuilder.create().build();
+        client = WebClientDevWrapper.wrapClient(client);
+        HttpGet get = new HttpGet(url);
+        JSONObject response = null;
+        InputStream instream = null;
+        try {
+            HttpResponse res = null;
+            if (client != null) {
+                res = client.execute(get);
+            }
+            if (res != null && res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
+                HttpEntity entity = res.getEntity();
+                instream = entity.getContent();
+                response = new JSONObject(new JSONTokener(new InputStreamReader(instream, "utf-8")));
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        } finally {
+            if (instream != null) {
+                instream.close();
+            }
+        }
+        return response;
+    }
+
+    private static class WebClientDevWrapper {
+        public static HttpClient wrapClient(HttpClient base) {
+            try {
+                RegistryBuilder<ConnectionSocketFactory> registryBuilder = RegistryBuilder.create();
+                ConnectionSocketFactory plainSF = new PlainConnectionSocketFactory();
+                registryBuilder.register("http", plainSF);
+                //指定信任密钥存储对象和连接套接字工厂
+                try {
+                    KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
+                    SSLContext sslContext = SSLContexts.custom().useTLS().loadTrustMaterial(trustStore, new AnyTrustStrategy()).build();
+                    LayeredConnectionSocketFactory sslSF = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
+                    registryBuilder.register("https", sslSF);
+                } catch (KeyStoreException e) {
+                    throw new RuntimeException(e);
+                } catch (KeyManagementException e) {
+                    throw new RuntimeException(e);
+                } catch (NoSuchAlgorithmException e) {
+                    throw new RuntimeException(e);
+                }
+                Registry<ConnectionSocketFactory> registry = registryBuilder.build();
+                //设置连接管理器
+                PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(registry);
+                connManager.setDefaultConnectionConfig(ConnectionConfig.custom().setCharset(Charset.forName("UTF-8")).build());
+                connManager.setDefaultSocketConfig(SocketConfig.custom().setSoTimeout(100000).build());
+                //构建客户端
+                return HttpClientBuilder.create().setConnectionManager(connManager).build();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+            return null;
+        }
+
+        private static class AnyTrustStrategy implements TrustStrategy {
+            @Override
+            public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+                return true;
+            }
+        }
+
+
+    }
+
+
+    private static CloseableHttpClient getHttpClient() {
+        return HttpClients.createDefault();
+    }
+
+    private static void closeHttpClient(CloseableHttpClient client) throws IOException {
+        if (client != null) {
+            client.close();
+        }
+    }
+
+}

+ 269 - 0
src/main/java/com/szwl/model/utils/JoinpayConstant.java

@@ -0,0 +1,269 @@
+package com.szwl.model.utils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 汇聚支付 常量
+ */
+public class JoinpayConstant {
+
+
+    /**
+     * 商户编码
+     */
+    public final static String mch_no = "888106600000003";
+
+
+    /**
+     * 商户密钥 : MD5
+     */
+    public final static String key = "8cb1d25eba7d4f3caecf1f0569150e04";
+
+
+    /**
+     * 汇聚公钥
+     */
+    public final static String publickey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCLgawJlQ3O8/O9YmJt6mi0pzh9JiDGp2G6IW3p8NTZXE5tIBZRbQAkHnr/zaLh0kDHMtIGAcGUtgXilRxXeUIuc0/j561YLsxAORma2XerniRCLWrXS4yM8F1/813Rv21JoNFkDZWHdTgEpKTH8GaGYOHiEytIN0LvPzEvNsimWQIDAQAB";
+
+    /**
+     * >>>>>>>>>>>>> 币种 >>>>>>>>>>>>>
+     *
+     */
+    /**
+     * 人民币
+     */
+    public final static String Cur_RMB = "1";
+
+
+    /**
+     *  支付成功回调
+     */
+    public final static String Notify_Url = "http://app.sunzee.com.cn/api/order/notify.htm";
+//    public final static String Notify_Url = "http://slb.sunzee.com.cn/api/order/notify.htm";
+
+    public final static String mg280Notify_Url = "http://app.sunzee.com.cn/api/order/mg280Notify.htm";
+//    public final static String mg280Notify_Url = "http://slb.sunzee.com.cn/api/order/mg280Notify.htm";
+
+    public final static String Notify_Url_PromoCode = "http://app.sunzee.com.cn/api/order/promoCodeNotify.htm";
+//    public final static String Notify_Url_PromoCode = "http://slb.sunzee.com.cn/api/order/promoCodeNotify.htm";
+
+    public final static String Jiesuan_Url = "http://app.sunzee.com.cn/api/order/jiesuan.htm";
+//    public final static String Jiesuan_Url = "http://slb.sunzee.com.cn/api/order/jiesuan.htm";
+
+    public final static Map<String,String> Result_status = new HashMap<>();
+    /**
+     *  退款成功回调
+     */
+    public final static String Notify_Refund_Url = "http://app.sunzee.com.cn/api/order/notifyRefund.htm";
+    public final static String Admin_Notify_Refund_Url = "http://app.sunzee.com.cn/api/order/adminNotifyRefund.htm";
+
+
+    /**
+     * 支付回调支付状态代码
+     */
+    public final static String r6_Status_100 = "100";
+    public final static String r6_Status_101 = "101";
+
+    /**
+     * >>>>>>>>>>>>> 签名类型 >>>>>>>>>>>>>
+     * 1=MD5,2=RSA
+     */
+    public final static String sign_type_MD5 = "1";
+    public final static String sign_type_RSA = "2";
+
+
+    /**
+     * >>>>>>>>>>>>> 分账方商户类型 >>>>>>>>>>>>>
+     * 10:个人,11:个体工商户,12:企业
+     */
+    public final static Integer alt_merchant_type1 = 10;
+    public final static Integer alt_merchant_type2 = 11;
+    public final static Integer alt_merchant_type3 = 12;
+
+    /**
+     * >>>>>>>>>>>>> 分账方结算方式 >>>>>>>>>>>>>
+     * 1 由汇聚自动结算
+     * 2 由商户平台手工结算(结算接口)
+     */
+    public final static Integer sett_mode1 = 1;
+    public final static Integer sett_mode2 = 2;
+
+
+    /**
+     * >>>>>>>>>>>>> 结算周期类型 >>>>>>>>>>>>>
+     * 1 工作日,2 自然日,3 月结日
+     */
+    public final static Integer sett_date_type1 = 1;
+    public final static Integer sett_date_type2 = 2;
+    public final static Integer sett_date_type3 = 3;
+
+
+    /**
+     * >>>>>>>>>>>>> 账户类型 >>>>>>>>>>>>>
+     * 1 借记卡,4 对公账户
+     */
+    public final static Integer bank_account_type1 = 1;
+    public final static Integer bank_account_type4 = 4;
+
+
+    /**
+     *
+     *
+     *  >>>>>>>>>>>>> 响应码 >>>>>>>>>>>>>
+     *
+     *
+     */
+
+    /**
+     * 受理响应码
+     */
+    public static final Map<String, String> resp_code = new HashMap<>();
+    public static final String resp_code1 = "A1000";
+    public static final String resp_code2 = "A2000";
+    public static final String resp_code3 = "A3000";
+
+    static {
+        resp_code.put(resp_code1, "受理成功");
+        resp_code.put(resp_code2, "受理失败,具体失败原因查看业务响应码");
+        resp_code.put(resp_code3, "受理未知(如:接口调用超时)");
+    }
+
+    /**
+     * 商户状态
+     */
+    public static final Map<String, String> order_status = new HashMap<>();
+    public static final String order_status1 = "P0001";
+    public static final String order_status2 = "P1000";
+    public static final String order_status3 = "P2000";
+    public static final String order_status4 = "P3000";
+    public static final String order_status5 = "P3001";
+    public static final String order_status6 = "P3002";
+    public static final String order_status7 = "P3003";
+
+    static {
+        order_status.put(order_status1, "待处理中(受理中)");
+        order_status.put(order_status2, "交易成功");
+        order_status.put(order_status3, "交易失败");
+        order_status.put(order_status4, "结果未知");
+        order_status.put(order_status5, "处理中");
+        order_status.put(order_status6, "激活");
+        order_status.put(order_status7, "冻结");
+    }
+
+    /**
+     * 业务响应码
+     */
+    public static final Map<String, String> biz_code = new HashMap<>();
+    public static final String biz_code1 = "B100000";
+    public static final String biz_code2 = "B100001";
+    public static final String biz_code3 = "B100002";
+    public static final String biz_code4 = "B100003";
+    public static final String biz_code5 = "B101001";
+    public static final String biz_code6 = "B101002";
+    public static final String biz_code7 = "B101003";
+    public static final String biz_code8 = "B101004";
+    public static final String biz_code9 = "B101005";
+    public static final String biz_code10 = "B103012";
+    public static final String biz_code11 = "B103013";
+    public static final String biz_code12 = "B102001";
+
+    static {
+        biz_code.put(biz_code1, "受理成功");
+        biz_code.put(biz_code2, "验签失败");
+        biz_code.put(biz_code3, "验参失败");
+        biz_code.put(biz_code4, "结果未知,SYS_ERROR");
+        biz_code.put(biz_code5, "登录名已存在");
+        biz_code.put(biz_code6, "找不到卡bin");
+        biz_code.put(biz_code7, "联行号有误");
+        biz_code.put(biz_code8, "查找不到银行信息");
+        biz_code.put(biz_code9, "不支持的结算卡类型");
+        biz_code.put(biz_code10, "担保账户不存在");
+        biz_code.put(biz_code11, "担保账户余额不足");
+        biz_code.put(biz_code12, "分账方不存在");
+    }
+
+
+    /**
+     * >>>>>>>>>>>>> 支付交易类型 >>>>>>>>>>>>>
+     */
+    public static final Map<String, String> frp_code = new HashMap<>();
+    public static final String frp_code_ALIPAY_NATIVE = "ALIPAY_NATIVE";
+    public static final String frp_code_ALIPAY_CARD = "ALIPAY_CARD";
+    public static final String frp_code_ALIPAY_APP = "ALIPAY_APP";
+    public static final String frp_code_ALIPAY_H5 = "ALIPAY_H5";
+    public static final String frp_code_ALIPAY_FWC = "ALIPAY_FWC";
+    public static final String frp_code_ALIPAY_SYT = "ALIPAY_SYT";
+    public static final String frp_code_WEIXIN_NATIVE = "WEIXIN_NATIVE";
+    public static final String frp_code_WEIXIN_CARD = "WEIXIN_CARD";
+    public static final String frp_code_WEIXIN_APP = "WEIXIN_APP";
+    public static final String frp_code_WEIXIN_APP2 = "WEIXIN_APP2";
+    public static final String frp_code_WEIXIN_H5 = "WEIXIN_H5";
+    public static final String frp_code_WEIXIN_GZH = "WEIXIN_GZH";
+    public static final String frp_code_WEIXIN_XCX = "WEIXIN_XCX";
+    public static final String frp_code_JD_NATIVE = "JD_NATIVE";
+    public static final String frp_code_JD_CARD = "JD_CARD";
+    public static final String frp_code_JD_APP = "JD_APP";
+    public static final String frp_code_JD_H5 = "JD_H5";
+    public static final String frp_code_QQ_NATIVE = "QQ_NATIVE";
+    public static final String frp_code_QQ_CARD = "QQ_CARD";
+    public static final String frp_code_QQ_APP = "QQ_APP";
+    public static final String frp_code_QQ_H5 = "QQ_H5";
+    public static final String frp_code_QQ_GZH = "QQ_GZH";
+    public static final String frp_code_UNIONPAY_NATIVE = "UNIONPAY_NATIVE";
+    public static final String frp_code_UNIONPAY_CARD = "UNIONPAY_CARD";
+    public static final String frp_code_UNIONPAY_APP = "UNIONPAY_APP";
+    public static final String frp_code_UNIONPAY_H5 = "UNIONPAY_H5";
+    public static final String frp_code_BAIDU_NATIVE = "BAIDU_NATIVE";
+    public static final String frp_code_SUNING_NATIVE = "SUNING_NATIVE";
+
+
+    static {
+        biz_code.put(frp_code_ALIPAY_NATIVE, "支付宝扫码(主扫)");
+        biz_code.put(frp_code_ALIPAY_CARD, "支付宝刷卡(被扫)");
+        biz_code.put(frp_code_ALIPAY_APP, "支付宝APP 支付");
+        biz_code.put(frp_code_ALIPAY_H5, "支付宝H5");
+        biz_code.put(frp_code_ALIPAY_FWC, "支付宝服务窗");
+        biz_code.put(frp_code_ALIPAY_SYT, "支付宝收银台");
+        biz_code.put(frp_code_WEIXIN_NATIVE, "微信扫码(主扫)");
+        biz_code.put(frp_code_WEIXIN_CARD, "微信刷卡(被扫)");
+        biz_code.put(frp_code_WEIXIN_APP, "微信APP 支付");
+        biz_code.put(frp_code_WEIXIN_APP2, "微信APP2 支付");
+        biz_code.put(frp_code_WEIXIN_H5, "微信H5 支付");
+        biz_code.put(frp_code_WEIXIN_GZH, "微信公众号支付");
+        biz_code.put(frp_code_WEIXIN_XCX, "微信小程序支付");
+        biz_code.put(frp_code_JD_NATIVE, "京东扫码(主扫)");
+        biz_code.put(frp_code_JD_CARD, "京东刷卡(被扫)");
+        biz_code.put(frp_code_JD_APP, "京东APP 支付");
+        biz_code.put(frp_code_JD_H5, "京东H5 支付");
+        biz_code.put(frp_code_QQ_NATIVE, "QQ 扫码(主扫)");
+        biz_code.put(frp_code_QQ_CARD, "QQ 刷卡(被扫)");
+        biz_code.put(frp_code_QQ_APP, "QQ APP 支付");
+        biz_code.put(frp_code_QQ_H5, "QQH5 支付");
+        biz_code.put(frp_code_QQ_GZH, "QQ 公众号支付");
+        biz_code.put(frp_code_UNIONPAY_NATIVE, "银联扫码(主扫)");
+        biz_code.put(frp_code_UNIONPAY_CARD, "银联刷卡(被扫)");
+        biz_code.put(frp_code_UNIONPAY_APP, "银联APP 支付");
+        biz_code.put(frp_code_UNIONPAY_H5, "银联H5");
+        biz_code.put(frp_code_BAIDU_NATIVE, "百度扫码(主扫)");
+        biz_code.put(frp_code_SUNING_NATIVE, "苏宁扫码(主扫)");
+    }
+
+
+    /**
+     *
+     *
+     *  >>>>>>>>>>>>> 汇聚支付接口 >>>>>>>>>>>>>
+     *
+     *
+     */
+
+    /**
+     * 版本
+     */
+    public static final String pay_version = "1.0";
+
+
+
+
+}

+ 187 - 0
src/main/java/com/szwl/model/utils/RSAUtil.java

@@ -0,0 +1,187 @@
+package com.szwl.model.utils;
+
+
+import com.szwl.model.utils.constants.Algorithm;
+import com.szwl.model.utils.constants.CommonConst;
+import com.szwl.model.utils.exceptions.JPException;
+
+import javax.crypto.Cipher;
+import java.io.ByteArrayOutputStream;
+import java.security.*;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * RSA加解密的工具类
+ * @author chenyf
+ * @date 2018-12-15
+ */
+public class RSAUtil {
+    public static final String DEFAULT_ENCRYPT_ALGORITHM = "RSA/ECB/PKCS1Padding";
+    public static final String SIGNATURE_ALGORITHM_SHA1 = "SHA1withRSA";
+    public static final String SIGNATURE_ALGORITHM_MD5 = "MD5withRSA";
+
+    public static final int KEY_SIZE = 1024;
+    public static final String PUBLIC_KEY = "publicKey";
+    public static final String PRIVATE_KEY = "privateKey";
+
+
+    /**
+    /**
+     * RSA最大加密明文大小
+     */
+    private static final int MAX_ENCRYPT_BLOCK = 116;
+
+    /**
+    /**
+     * RSA最大解密密文大小
+     */
+    private static final int MAX_DECRYPT_BLOCK = 128;
+
+    /**
+     * 生成公私密钥对
+     * @return
+     * @throws Exception
+     */
+    public static Map<String, String> genKeyPair() throws Exception {
+        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(Algorithm.RSA);
+        keyPairGen.initialize(KEY_SIZE);
+        KeyPair keyPair = keyPairGen.generateKeyPair();
+
+        final Map<String, String> keyMap = new HashMap<String, String>(2);
+        keyMap.put(PUBLIC_KEY, CodeUtil.base64Encode(keyPair.getPublic().getEncoded()));
+        keyMap.put(PRIVATE_KEY, CodeUtil.base64Encode(keyPair.getPrivate().getEncoded()));
+        return keyMap;
+    }
+
+    /**
+     * 生成RSA签名串
+     * @param data             需要生成签名串的数据
+     * @param mchPrivateKey    商户私钥
+     * @return
+     * @throws JPException
+     */
+    public static String sign(String data, String mchPrivateKey, boolean isSha) throws JPException {
+        try {
+            byte[] dataBytes = data.getBytes(CommonConst.ENCODING_UTF_8);
+            byte[] keyBytes = CodeUtil.base64Decode(mchPrivateKey);
+            String algorithm = isSha ? SIGNATURE_ALGORITHM_SHA1 : SIGNATURE_ALGORITHM_MD5;
+
+            PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
+            PrivateKey priKey = KeyFactory.getInstance(Algorithm.RSA).generatePrivate(pkcs8KeySpec);
+            Signature signature = Signature.getInstance(algorithm);
+            signature.initSign(priKey);
+            signature.update(dataBytes);
+            return HEXUtil.encode(CodeUtil.base64Encode(signature.sign()));
+        }catch (Throwable e){
+            throw new JPException("生成RSA签名失败", e);
+        }
+    }
+
+    /**
+     * 验证RSA签名串
+     * @param data          需要验签的数据
+     * @param jpPublicKey   汇聚公钥
+     * @param sign          汇聚返回的签名串
+     * @return
+     * @throws JPException
+     */
+    public static boolean verify(String data, String jpPublicKey, String sign, boolean isSha) throws JPException {
+        try {
+            byte[] dataBytes = data.getBytes(CommonConst.ENCODING_UTF_8);
+            byte[] signBytes = CodeUtil.base64Decode(HEXUtil.decode(sign));
+            String algorithm = isSha ? SIGNATURE_ALGORITHM_SHA1 : SIGNATURE_ALGORITHM_MD5;
+            PublicKey publicK = getPublicKey(jpPublicKey);
+
+            Signature signature = Signature.getInstance(algorithm);
+            signature.initVerify(publicK);
+            signature.update(dataBytes);
+            return signature.verify(signBytes);
+        }catch (Throwable e){
+            throw new JPException("RSA验签失败", e);
+        }
+    }
+
+    /**
+     * 使用RSA进行加密
+     * @param data          需要加密的数据
+     * @param jpPublicKey   汇聚公钥
+     * @return
+     */
+    public static String encrypt(String data, String jpPublicKey) throws JPException {
+        try{
+            byte[] dataBytes = data.getBytes(CommonConst.ENCODING_UTF_8);
+            dataBytes = doCipher(dataBytes, jpPublicKey, true);
+            return HEXUtil.encode(CodeUtil.base64Encode(dataBytes));
+        }catch(Throwable e){
+            throw new JPException("RSA加密失败", e);
+        }
+    }
+
+    /**
+     * 使用RSA进行解密
+     * @param data              需要解密的数据
+     * @param mchPrivateKey     商户私钥
+     * @return
+     */
+    public static String decrypt(String data, String mchPrivateKey) throws JPException {
+        try{
+            byte[] dataBytes = CodeUtil.base64Decode(HEXUtil.decode(data));
+            dataBytes = doCipher(dataBytes, mchPrivateKey, false);
+            return new String(dataBytes, CommonConst.ENCODING_UTF_8);
+        }catch(Throwable e){
+            throw new JPException("RSA解密失败", e);
+        }
+    }
+
+    private static byte[] doCipher(byte[] dataBytes, String keyStr, boolean isEncrypt) throws Exception{
+        Key key;
+        Cipher cipher;
+        int maxBlock;
+
+        if(isEncrypt){
+            maxBlock = MAX_ENCRYPT_BLOCK;
+            key = getPublicKey(keyStr);
+            cipher = Cipher.getInstance(DEFAULT_ENCRYPT_ALGORITHM);
+            cipher.init(Cipher.ENCRYPT_MODE, key);
+        }else{
+            maxBlock = MAX_DECRYPT_BLOCK;
+            byte[] keyBytes = CodeUtil.base64Decode(keyStr);
+            PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
+            KeyFactory keyFactory = KeyFactory.getInstance(Algorithm.RSA);
+            Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
+            cipher = Cipher.getInstance(keyFactory.getAlgorithm());
+            cipher.init(Cipher.DECRYPT_MODE, privateK);
+        }
+
+        int offSet = 0, i = 0, inputLen = dataBytes.length;
+        byte[] cache;
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+        try{
+            // 对数据分段加密/解密
+            while (inputLen - offSet > 0) {
+                if (inputLen - offSet > maxBlock) {
+                    cache = cipher.doFinal(dataBytes, offSet, maxBlock);
+                } else {
+                    cache = cipher.doFinal(dataBytes, offSet, inputLen - offSet);
+                }
+                out.write(cache, 0, cache.length);
+                i++;
+                offSet = i * maxBlock;
+            }
+            return out.toByteArray();
+        } finally {
+            out.close();
+        }
+    }
+
+    private static PublicKey getPublicKey(String publicKey) throws Exception{
+        byte[] keyBytes = CodeUtil.base64Decode(publicKey);
+        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
+        KeyFactory keyFactory = KeyFactory.getInstance(Algorithm.RSA);
+        return keyFactory.generatePublic(x509KeySpec);
+    }
+}

+ 16 - 0
src/main/java/com/szwl/service/TCoinOrderService.java

@@ -0,0 +1,16 @@
+package com.szwl.service;
+
+import com.szwl.model.entity.TCoinOrder;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2022-06-17
+ */
+public interface TCoinOrderService extends IService<TCoinOrder> {
+
+}

+ 61 - 0
src/main/java/com/szwl/service/TJoinpayMchService.java

@@ -0,0 +1,61 @@
+package com.szwl.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.szwl.model.entity.TJoinpayMch;
+
+import java.io.UnsupportedEncodingException;
+import java.math.BigDecimal;
+
+/**
+ * <p>
+ * 汇聚支付用户收款信息表 服务类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2022-04-29
+ */
+public interface TJoinpayMchService extends IService<TJoinpayMch> {
+
+    String createMch(TJoinpayMch tJoinpayMch);
+
+    String updateMch(TJoinpayMch mch);
+
+    /**
+     * 请求交易
+     *
+     * <br />
+     * <br />
+     * <b style='font-size:16px'>请求时中文参数需进行url-encode 编码</b>
+     *
+     * @param sn <b style='color:red'>必填</b> 编号 X(50)
+     * @param amount <b style='color:red'>必填</b> 金额 单位:元,精确到分,保留两位小数。例如:10.23。 D(16,2)
+     * @param productName  <b style='color:red'>必填</b> 商品名称 X(60)
+     * @param productDesc <b style='color:blue'>选填</b> 商品描述 X(300)
+     * @param commonParameter <b style='color:blue'>选填</b> 公用回传参数,如果商户请求时传递了该参数,则返回给商户时会原值传回。X(200)
+     * @param returnUrl <b style='color:blue'>选填</b> 商户页面通知地址,汇聚支付处理完请求后,处理结果页面跳转到商户网站里指定的http地址。(微信H5、支付宝收银台可选填,本接口其他业务留空)X(300)
+     * @param notifyUrl <b style='color:red'>必填</b> 汇聚支付系统主动通知商户网站里指定的http 地址。 X(300)
+     * @param frpCode <b style='color:red'>必填</b> 交易类型:JoinpayConstant.frp_code X(50)
+     * @param isShowPic <b style='color:blue'>选填</b> 默认为空,不输出图片; 填1 表示输出图片,仅交易类型为主扫时可用(即当 q1_FrpCode=ALIPAY_NATIVE 、WEIXIN_NATIVE、JD_NATIVE、QQ_NATIVE、UNIONPAY_NATIVE、BAIDU_NATIVE、SUNING_NATIVE)
+     * @param openId <b style='color:blue'>选填</b> 公众号获取用户Openid,公众号支付实名商户及微信小程序商户必填(即当q1_FrpCode=WEIXIN_GZH、WEIXIN_XCX);
+     * @param authCode <b style='color:blue'>选填</b> 付款码数字  被扫支付必填(即当q1_FrpCode= ALIPAY_CARD、WEIXIN_CARD、JD_CARD、QQ_CARD、UNIONPAY_CARD)
+     * @param appid <b style='color:blue'>选填</b> 微信公众号、微信小程序、微信App 支付必填(即当q1_FrpCode= WEIXIN_GZH、WEIXIN_XCX、WEIXIN_APP)
+     * @param transactionModel <b style='color:blue'>选填</b> 微信/支付宝H5 选填,默认为空。1.模式一:当q9_TransactionModel =MODEL1 或为空时,有应答参数返回,rc_Result 中返回html,需进行重定向跳转;2.模式二:当q9_TransactionModel =MODEL2 时,
+     *                         直接跳转链接,不返回应答参数。X(10)
+     * @param tradeMerchantNo <b style='color:blue'>选填</b> 交易商户号,非必填 X(50)
+     * @param buyerId <b style='color:blue'>选填</b> 买家的支付宝 , 唯一用户号支付宝服务窗支付必填(即当q1_FrpCode=ALIPAY_FWC )(买家的支付宝唯一用户号(2088 开头16 位纯数字)) X(20)
+     * @param isAlt <b style='color:blue'>选填</b> 是否分账交易 分账交易传1,不传或传其他值则是非分账交易 X(1)
+     * @param altType <b style='color:blue'>选填</b> 分账类型  当qc_IsAlt 取值1 时必传,11 表示实时分账 X(2)
+     * @param altInfo <b style='color:blue'>选填</b> 分账信息 当qc_IsAlt 取值1 时必传,json数组格式,具体如下:[{"altMchNo":"333100000006528", "altAmount":"88","isGuar":"11"},{"altMchNo":"333100000006529","altAmount":"99","isGuar":"12"}],
+     *                其中altMchNo表示分账方编号,altAmount 表示分账金额(单位为元),isGuar取值11 表示担保交易,isGuar取值12 表示非担保交易   (~)
+     * @param altUrl <b style='color:blue'>选填</b> 分账通知地址  汇聚支付系统主动通知商户网 站里指定的http 地址。 X(300)
+     * @param marketingAmount  <b style='color:blue'>选填</b> 营销金额 支付请求的营销金额  D(16,2)
+     * @return
+     */
+    public String uniPay(String sn , BigDecimal amount , String productName , String productDesc ,
+                              String commonParameter , String returnUrl , String notifyUrl , String frpCode ,
+                              String isShowPic , String openId , String authCode , String appid , String transactionModel , String tradeMerchantNo ,
+                              String buyerId , String isAlt , String altType , JSONArray altInfo , String altUrl , BigDecimal marketingAmount) throws UnsupportedEncodingException;
+
+
+}

+ 25 - 0
src/main/java/com/szwl/service/TOrderService.java

@@ -0,0 +1,25 @@
+package com.szwl.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.szwl.model.entity.TOrder;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.io.UnsupportedEncodingException;
+import java.math.BigDecimal;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2022-06-17
+ */
+public interface TOrderService extends IService<TOrder> {
+    /**
+     * 生成订单号
+     */
+    String initSn(Long equipmentId);
+
+
+}

+ 22 - 0
src/main/java/com/szwl/service/TShandeMchService.java

@@ -0,0 +1,22 @@
+package com.szwl.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.szwl.model.entity.TShandeMch;
+
+import java.math.BigDecimal;
+
+/**
+ * <p>
+ * 杉德支付收款信息 服务类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2022-04-29
+ */
+public interface TShandeMchService extends IService<TShandeMch> {
+    String uniPay(String orderNo, BigDecimal amount, String productName, String productDesc, String commonParameter, String returnUrl, String notifyUrl, String frpCode, String isShowPic, String openId, String authCode, String appid, String transactionModel, String tradeMerchantNo, String buyerId, String isAlt, String altType, JSONArray altInfo, String altUrl, BigDecimal marketingAmount);
+
+    String cardPay(String orderNo, BigDecimal amount, String productName1, String productDesc, String commonParameter, String returnUrl, String notifyUrl, String frpCode, String isShowPic, String openId, String authCode, String appid, String transactionModel, String tradeMerchantNo, String buyerId, String isAlt, String altType, JSONArray altInfo, String altUrl, BigDecimal marketingAmount);
+
+}

+ 20 - 0
src/main/java/com/szwl/service/impl/TCoinOrderServiceImpl.java

@@ -0,0 +1,20 @@
+package com.szwl.service.impl;
+
+import com.szwl.model.entity.TCoinOrder;
+import com.szwl.mapper.TCoinOrderMapper;
+import com.szwl.service.TCoinOrderService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2022-06-17
+ */
+@Service
+public class TCoinOrderServiceImpl extends ServiceImpl<TCoinOrderMapper, TCoinOrder> implements TCoinOrderService {
+
+}

+ 438 - 0
src/main/java/com/szwl/service/impl/TJoinpayMchServiceImpl.java

@@ -0,0 +1,438 @@
+package com.szwl.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.szwl.mapper.TJoinpayMchMapper;
+import com.szwl.model.entity.TJoinpayMch;
+import com.szwl.model.utils.AESUtil;
+import com.szwl.model.utils.Constant;
+import com.szwl.model.utils.HttpClientUtils;
+import com.szwl.model.utils.JoinpayConstant;
+import com.szwl.model.utils.RSAUtil;
+import com.szwl.service.TJoinpayMchService;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.http.message.BasicNameValuePair;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.util.*;
+
+/**
+ * <p>
+ * 汇聚支付用户收款信息表 服务实现类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2022-04-29
+ */
+@Service
+public class TJoinpayMchServiceImpl extends ServiceImpl<TJoinpayMchMapper, TJoinpayMch> implements TJoinpayMchService {
+
+    @Override
+    public String createMch(TJoinpayMch mch) {
+
+
+        Long adminId = mch.getAdminId();
+        if(null == adminId){
+            return "找不到对应的管理员";
+        }
+
+        Integer alt_merchant_type = mch.getAltMerchantType();
+        String url = "https://www.joinpay.com/allocFunds";
+
+        JSONObject requestData = new JSONObject(new LinkedHashMap());
+
+        String login_name = "test1_" + adminId + "@mianhuatang.com";
+//        String login_name = mch.getLegal_person();
+        mch.setLoginName(login_name);
+
+//        String alt_mch_name = "test1_" + adminId  + "@mianhuatang.com";
+//        String alt_mch_name = mch.getLegal_person();
+        String alt_mch_name = mch.getBankAccountName();
+        mch.setAltMchName(alt_mch_name);
+        mch.setAltMchShortName("");
+//        mch.setAlt_mch_short_name("");
+
+        // 格式为16 位随机字符串:16 位随机字符串
+        String aes_key1 = getRandomString(16);
+        String aes_key2 = getRandomString(16);
+
+        requestData.put("login_name", login_name);
+        requestData.put("alt_mch_name", alt_mch_name);
+        requestData.put("alt_mch_short_name",  "");
+        requestData.put("alt_merchant_type",  mch.getAltMerchantType());
+        requestData.put("busi_contact_name",  mch.getBusiContactName());
+        requestData.put("busi_contact_mobile_no",  mch.getBusiContactMobileNo());
+        requestData.put("phone_no",  mch.getPhoneNo());
+        requestData.put("manage_scope",  mch.getManageScope());
+        requestData.put("manage_addr",  mch.getManageAddr());
+        requestData.put("legal_person", AESUtil.encrypt(mch.getLegalPerson() , aes_key1 ,  aes_key2 ));
+        requestData.put("id_card_no",  AESUtil.encrypt(mch.getIdCardNo(), aes_key1 , aes_key2 ));
+        requestData.put("id_card_expiry",  mch.getIdCardExpiry());
+        // 个体工商户和企业必填:营业执照编号 / 营业执照有效期
+        if(JoinpayConstant.alt_merchant_type2== alt_merchant_type || JoinpayConstant.alt_merchant_type3== alt_merchant_type){
+            requestData.put("license_no",  mch.getLicenseNo());
+            requestData.put("license_expiry",  mch.getLicenseExpiry());
+        }
+        if(mch.getSettMode()!=null){
+            requestData.put("sett_mode",  mch.getSettMode());
+        }else {
+            // 由汇聚自动结算
+            requestData.put("sett_mode",  JoinpayConstant.sett_mode1);
+        }
+
+        // 结算周期类型:自然日
+        requestData.put("sett_date_type",  JoinpayConstant.sett_date_type2);
+        if(mch.getRiskDay()!=null){
+            requestData.put("risk_day", mch.getRiskDay());
+        }else{
+            // 结算周期:1
+            requestData.put("risk_day",  1);
+        }
+
+        if(JoinpayConstant.alt_merchant_type2== alt_merchant_type || JoinpayConstant.alt_merchant_type3== alt_merchant_type){
+            // 企业用对公账户
+            requestData.put("bank_account_type",  JoinpayConstant.bank_account_type4);
+        }else if(JoinpayConstant.alt_merchant_type1== alt_merchant_type){
+            // 个人用借记卡
+            requestData.put("bank_account_type",  JoinpayConstant.bank_account_type1);
+        }
+        requestData.put("bank_account_name",  AESUtil.encrypt(mch.getBankAccountName(), aes_key1 ,  aes_key2 ));
+        requestData.put("bank_account_no",  AESUtil.encrypt(mch.getBankAccountNo(), aes_key1 ,  aes_key2 ));
+        requestData.put("bank_channel_no",  mch.getBankChannelNo());
+
+
+
+        JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
+        requestJson.put("method", "altmch.add");
+        requestJson.put("version", "2.0");
+        requestJson.put("data", requestData);
+        // 32位随机字符串
+        String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
+        requestJson.put("rand_str", uuid);
+        requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
+        requestJson.put("mch_no", JoinpayConstant.mch_no);
+
+        String sign = createMD5Sign(requestJson , JoinpayConstant.key);
+        requestJson.put("sign", sign.toUpperCase());
+
+        requestJson.put("aes_key", RSAUtil.encrypt(aes_key1+":"+aes_key2 , JoinpayConstant.publickey ));
+
+//        logger.info("请求参数:" + requestJson);
+
+        org.json.JSONObject jsonObject;
+        try {
+            jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
+//            logger.info("响应参数:" + jsonObject);
+
+            if(jsonObject.has("resp_code")){
+                mch.setRespCode(jsonObject.getString("resp_code"));
+            }
+
+            if(jsonObject.has("data")){
+                org.json.JSONObject data = jsonObject.getJSONObject("data");
+                if(data.has("biz_code")){
+                    mch.setBizCode(data.getString("biz_code"));
+                }
+
+                if (data.has("alt_mch_no")){
+                    mch.setAltMchName(data.getString("alt_mch_no"));
+                }
+
+                if(data.has("order_status")){
+                    mch.setOrderStatus(data.getString("order_status"));
+                }
+
+            }
+
+
+            /**
+             * 更新一下分销商户的  各种响应码 & login_name
+             */
+            mch.setCreateDate(new Date());
+            mch.setModifyDate(new Date());
+            save(mch);
+
+            if(jsonObject.has("resp_code")){
+                String resp_code = jsonObject.getString("resp_code");
+                mch.setRespCode(resp_code);
+                if(JoinpayConstant.resp_code2.equals(resp_code)){
+                    org.json.JSONObject data = jsonObject.getJSONObject("data");
+                    if(data.has("biz_msg")){
+                        return data.getString("biz_msg");
+                    }
+                }
+            }
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        return Constant.correct_code;
+    }
+
+    @Override
+    public String updateMch(TJoinpayMch mch) {
+        Long adminId = mch.getAdminId();
+        if(null == adminId){
+            return "找不到对应的管理员";
+        }
+
+        if(JoinpayConstant.alt_merchant_type1!=mch.getAltMerchantType()
+                && JoinpayConstant.alt_merchant_type2!= mch.getAltMerchantType()
+                && JoinpayConstant.alt_merchant_type3!= mch.getAltMerchantType()){
+            return "商家类型不正确";
+        }
+
+        String url = "https://www.joinpay.com/allocFunds";
+
+        JSONObject requestData = new JSONObject(new LinkedHashMap());
+
+
+        // 格式为16 位随机字符串:16 位随机字符串
+        String aes_key1 = getRandomString(16);
+        String aes_key2 = getRandomString(16);
+
+        requestData.put("alt_mch_no", mch.getAltMchNo());
+
+//        requestData.put("legal_person", AESUtil.encrypt(legal_person, aes_key1 ,  aes_key2 ));
+        requestData.put("legal_person", mch.getLegalPerson());
+//        requestData.put("id_card_no",  AESUtil.encrypt(id_card_no, aes_key1 , aes_key2 ));
+        requestData.put("id_card_no",  mch.getIdCardNo());
+
+        if(JoinpayConstant.alt_merchant_type2== mch.getAltMerchantType() || JoinpayConstant.alt_merchant_type3== mch.getAltMerchantType()){
+            // 企业用对公账户
+            requestData.put("bank_account_type",  JoinpayConstant.bank_account_type4);
+            mch.setBankAccountType(JoinpayConstant.bank_account_type4);
+            String alt_mch_name = mch.getBankAccountName();
+            requestData.put("alt_mch_name", alt_mch_name);
+            requestData.put("license_no",  mch.getLicenseNo());
+//            requestData.put("alt_mch_name", AESUtil.encrypt(alt_mch_name, aes_key1 ,  aes_key2 ));/**/
+
+        }else if(JoinpayConstant.alt_merchant_type1== mch.getAltMerchantType()){
+            // 个人用借记卡
+            requestData.put("bank_account_type",  JoinpayConstant.bank_account_type1);
+            mch.setBankAccountType(JoinpayConstant.bank_account_type1);
+        }
+
+        requestData.put("bank_account_name",  mch.getBankAccountName());
+//        requestData.put("bank_account_name",  AESUtil.encrypt(bank_account_name, aes_key1 ,  aes_key2 ));
+        requestData.put("bank_account_no",  mch.getBankAccountNo());
+//        requestData.put("bank_account_no",  AESUtil.encrypt(bank_account_no, aes_key1 ,  aes_key2 ));
+//        requestData.put("bank_channel_no",  AESUtil.encrypt(bank_channel_no, aes_key1 ,  aes_key2 ));
+        requestData.put("bank_channel_no",  mch.getBankChannelNo());
+        if(mch.getSettMode()!=null){
+            requestData.put("sett_mode",  mch.getSettMode());
+        }else {
+            // 由汇聚自动结算
+            requestData.put("sett_mode",  JoinpayConstant.sett_mode1);
+        }
+
+        // 结算周期类型:自然日
+        requestData.put("sett_date_type",  JoinpayConstant.sett_date_type2);
+        if(mch.getRiskDay()!=null){
+            requestData.put("risk_day", mch.getRiskDay());
+        }else{
+            // 结算周期:1
+            requestData.put("risk_day",  1);
+        }
+//        mch.setLegal_person(legal_person);
+//        mch.setId_card_no(id_card_no);
+//        mch.setAlt_merchant_type(alt_merchant_type);
+//        mch.setBank_account_name(bank_account_name);
+//        mch.setBank_account_no(bank_account_no);
+//        mch.setBank_channel_no(bank_channel_no);
+        if(mch.getAltMerchantType()==12){
+            String alt_mch_name = mch.getBankAccountName();
+//            mch.setAlt_mch_name(alt_mch_name);
+        }
+        JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
+        requestJson.put("method", "altmch.modify");
+        requestJson.put("version", "1.1");
+        requestJson.put("data", requestData);
+        // 32位随机字符串
+        String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
+        requestJson.put("rand_str", uuid);
+        requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
+        requestJson.put("mch_no", JoinpayConstant.mch_no);
+
+        String sign = createMD5Sign(requestJson , JoinpayConstant.key);
+        requestJson.put("sign", sign.toUpperCase());
+        requestJson.put("aes_key", RSAUtil.encrypt(aes_key1+":"+aes_key2 , JoinpayConstant.publickey ));
+
+//        logger.info("请求参数:" + requestJson);
+
+        org.json.JSONObject jsonObject;
+        try {
+            jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
+//            logger.info("响应参数:" + jsonObject);
+
+            if(jsonObject.has("resp_code")){
+                mch.setRespCode(jsonObject.getString("resp_code"));
+            }
+
+            if(jsonObject.has("data")){
+                org.json.JSONObject data = jsonObject.getJSONObject("data");
+                if(data.has("biz_code")){
+                    mch.setBizCode(data.getString("biz_code"));
+                }
+
+                if (data.has("alt_mch_no")){
+                    mch.setAltMchNo(data.getString("alt_mch_no"));
+                }
+
+                if(data.has("order_status")){
+                    mch.setOrderStatus(data.getString("order_status"));
+                }
+
+            }
+
+            if(jsonObject.has("resp_code")){
+                String resp_code = jsonObject.getString("resp_code");
+                mch.setRespCode(resp_code);
+                if(JoinpayConstant.resp_code2.equals(resp_code)){
+                    org.json.JSONObject data = jsonObject.getJSONObject("data");
+                    if(data.has("biz_msg")){
+                        return data.getString("biz_msg");
+                    }
+                }
+            }
+
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+
+        return Constant.correct_code;
+    }
+
+    /**
+     * 获取随机字符串
+     * @return
+     */
+    public static String getRandomString(int length){
+        String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+        Random random=new Random();
+        StringBuffer sb=new StringBuffer();
+        for(int i=0;i<length;i++){
+            int number=random.nextInt(62);
+            sb.append(str.charAt(number));
+        }
+        return sb.toString();
+    }
+    /**
+     * 签名算法sign , MD5 签名
+     * @param requestJson
+     * @return
+     */
+    public static String createMD5Sign(JSONObject requestJson , String key){
+
+        StringBuffer sb = new StringBuffer();
+        Set es = requestJson.entrySet();
+        Iterator it = es.iterator();
+        while(it.hasNext()) {
+            Map.Entry entry = (Map.Entry)it.next();
+            String k = (String)entry.getKey();
+            Object v = entry.getValue();
+            if(null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
+                sb.append(k + "=" + v + "&");
+            }
+        }
+
+        sb.append("key=" + key);
+//        logger.info("签名字符串:"+sb.toString());
+        String sign = DigestUtils.md5Hex(sb.toString());
+        return sign;
+    }
+
+    @Override
+    public String uniPay(String sn, BigDecimal amount, String productName, String productDesc, String commonParameter,
+                              String returnUrl, String notifyUrl, String frpCode, String isShowPic, String openId, String authCode,
+                              String appid, String transactionModel, String tradeMerchantNo, String buyerId, String isAlt, String altType,
+                              JSONArray altInfo, String altUrl, BigDecimal marketingAmount) throws UnsupportedEncodingException {
+
+        String url = "https://www.joinpay.com/trade/uniPayApi.action";
+
+
+        List<BasicNameValuePair> data = new ArrayList<BasicNameValuePair>();
+
+
+
+        data.add(new BasicNameValuePair("p0_Version", JoinpayConstant.pay_version));
+        data.add(new BasicNameValuePair("p1_MerchantNo", JoinpayConstant.mch_no));
+        data.add(new BasicNameValuePair("p2_OrderNo", sn));
+        data.add(new BasicNameValuePair("p3_Amount", amount.setScale(2, RoundingMode.HALF_DOWN).toString()));
+        data.add(new BasicNameValuePair("p4_Cur", JoinpayConstant.Cur_RMB));
+        data.add(new BasicNameValuePair("p5_ProductName", URLEncoder.encode(productName, "utf-8")));
+        data.add(new BasicNameValuePair("p6_ProductDesc", URLEncoder.encode(productDesc, "utf-8")));
+        data.add(new BasicNameValuePair("p7_Mp", URLEncoder.encode(commonParameter, "utf-8")));
+        data.add(new BasicNameValuePair("p8_ReturnUrl", returnUrl));
+        data.add(new BasicNameValuePair("p9_NotifyUrl", notifyUrl));
+        data.add(new BasicNameValuePair("q1_FrpCode", frpCode));
+        data.add(new BasicNameValuePair("q2_MerchantBankCode", ""));
+        data.add(new BasicNameValuePair("q4_IsShowPic", isShowPic));
+        data.add(new BasicNameValuePair("q5_OpenId", openId));
+        data.add(new BasicNameValuePair("q6_AuthCode", authCode));
+        data.add(new BasicNameValuePair("q7_AppId", appid));
+        data.add(new BasicNameValuePair("q8_TerminalNo", ""));
+        data.add(new BasicNameValuePair("q9_TransactionModel", transactionModel));
+        if(!StringUtils.isEmpty(tradeMerchantNo)){
+            data.add(new BasicNameValuePair("qa_TradeMerchantNo",tradeMerchantNo));
+        }
+//        data.add(new BasicNameValuePair("qa_TradeMerchantNo", tradeMerchantNo));
+        data.add(new BasicNameValuePair("qb_buyerId", buyerId));
+        data.add(new BasicNameValuePair("qc_IsAlt", isAlt));
+        data.add(new BasicNameValuePair("qd_AltType", altType));
+        data.add(new BasicNameValuePair("qe_AltInfo", altInfo==null?null:altInfo.toString()));
+        data.add(new BasicNameValuePair("qf_AltUrl", altUrl));
+
+        data.add(new BasicNameValuePair("qg_MarketingAmount", marketingAmount==null?null:marketingAmount.setScale(2, RoundingMode.HALF_DOWN).toString()));
+
+        // TODO: 2019-04-01  空值不参与签名!!!!!!!!!!!!!!!!!!
+
+
+        String hmac = createHmacSign(data, JoinpayConstant.key);
+        data.add(new BasicNameValuePair("hmac", hmac));
+//        logger.info("请求参数:" + data);
+
+        String result = HttpClientUtils.postKeyValue(url, data);
+//        logger.info("响应参数:" + result);
+
+
+        return result;
+    }
+
+    /**
+     * 签名算法sign , hmac 签名
+     *
+     * @param data
+     * @return
+     */
+    public static String createHmacSign( List<BasicNameValuePair> data , String key) throws UnsupportedEncodingException {
+
+        StringBuffer sb = new StringBuffer();
+        Iterator<BasicNameValuePair> es = data.iterator();
+        while (es.hasNext()) {
+            BasicNameValuePair entry = (BasicNameValuePair) es.next();
+            String k = (String) entry.getName();
+            String v = (String) entry.getValue();
+            if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
+                sb.append(URLDecoder.decode(String.valueOf(v), "utf-8"));
+            }
+        }
+
+        sb.append(key);
+//        logger.info("签名字符串:" + sb.toString());
+        String sign = DigestUtils.md5Hex(sb.toString());
+        return sign;
+    }
+
+}

+ 56 - 0
src/main/java/com/szwl/service/impl/TOrderServiceImpl.java

@@ -0,0 +1,56 @@
+package com.szwl.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.szwl.model.entity.TOrder;
+import com.szwl.mapper.TOrderMapper;
+import com.szwl.model.utils.HttpClientUtils;
+import com.szwl.model.utils.JoinpayConstant;
+import com.szwl.service.TOrderService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.http.message.BasicNameValuePair;
+import org.springframework.stereotype.Service;
+
+import java.io.UnsupportedEncodingException;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2022-06-17
+ */
+@Service
+public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> implements TOrderService {
+    public synchronized String initSn(Long equipmentId) {
+        StringBuilder number = new StringBuilder();
+        if (equipmentId != null) {
+            Random random = new Random();
+            /**
+             * 6位随机
+             */
+            for (int i = 0; i < 6; i++) {
+                number.append(String.valueOf(random.nextInt(10)));
+            }
+            /**
+             * 设备id
+             */
+            number.append(equipmentId.toString());
+            /**
+             * 日期
+             */
+            number.append(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()));
+        }
+        return number.toString();
+    }
+
+
+}

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 239 - 0
src/main/java/com/szwl/service/impl/TShandeMchServiceImpl.java


+ 2 - 2
src/test/java/com/szwl/AutoGeneratorTests.java

@@ -39,7 +39,7 @@ class AutoGeneratorTests {
 		//配置数据源
 		DataSourceConfig dataSourceConfig = new DataSourceConfig();
 		dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver")
-				.setUrl("jdbc:mysql://rm-wz995mu26a1479kz0so.mysql.rds.aliyuncs.com:3306/szwl")
+				.setUrl("jdbc:mysql://rm-wz995mu26a1479kz0so.mysql.rds.aliyuncs.com:3306/orderdb")
 				.setUsername("root").setPassword("sunzee@020");
 
 		//策略配置
@@ -47,7 +47,7 @@ class AutoGeneratorTests {
 		strategyConfig
 //				.setCapitalMode(true)//设置全局大写命名
 				.setInclude(new String[]{
-						"t_admin"
+						""
 				})//只会生成该表
 				.setEntityLombokModel(true)//实体类生成之后自动添加lombok注解
 				.setNaming(NamingStrategy.underline_to_camel)//数据库表映射到实体的命名策略