提交 62fe9cb6 authored 作者: inroi's avatar inroi

调整

上级 46c8f10c
package com.system.controller; package com.system.controller;
import com.system.serivce.IDockingDistributionService; import com.system.serivce.IDockingService;
import com.system.serivce.IDockingShoppingMallService; import com.system.transfer.docking.DockingDistributionMemberCreateInVo;
import com.system.transfer.response.RestResponse; import com.system.transfer.response.RestResponse;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
...@@ -17,24 +18,13 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -17,24 +18,13 @@ import org.springframework.web.bind.annotation.RestController;
public class DockingController { public class DockingController {
@Autowired @Autowired
private IDockingDistributionService dockingDistributionService; private IDockingService dockingService;
@Autowired
private IDockingShoppingMallService dockingShoppingMallService;
@ApiOperation("对接分销会员创建")
@GetMapping("/docking/distribution/member/create")
public RestResponse dockingDistributionMemberCreate() {
dockingDistributionService.dockingDistributionMemberCreate();
return RestResponse.success();
}
@ApiOperation("查询商城订单列表") @ApiOperation("分销会员创建")
@GetMapping("/shopping/mall/order/List") @PostMapping("/docking/distribution/member/create")
public RestResponse shoppingMallOrderList() { public RestResponse dockingDistributionMemberCreate(@RequestBody DockingDistributionMemberCreateInVo inVo) {
dockingShoppingMallService.shoppingMallOrderList(); return dockingService.dockingDistributionMemberCreate(inVo);
return RestResponse.success();
} }
......
package com.system.dao;
import com.system.transfer.log.ThirdPartyLogCreateInVo;
/**
* @author Inori
*/
public interface ThirdPartyLogMapper {
/**
* 第三方日志创建
*
* @param inVo 条件
*/
void thirdPartyLogCreate(ThirdPartyLogCreateInVo inVo);
}
<?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.system.dao.ThirdPartyLogMapper">
<insert id="thirdPartyLogCreate" parameterType="com.system.transfer.log.ThirdPartyLogCreateInVo" useGeneratedKeys="true" keyProperty="id">
INSERT INTO tb_third_party_log (
`name`, code, queue_id, direction, request, flag, response, message
) VALUES (
#{name}, #{code}, #{queueId}, #{direction}, #{request}, #{flag}, #{response}, #{message}
)
</insert>
</mapper>
package com.system.quartz.job; package com.system.quartz.job;
import com.system.serivce.ISynchronizationService;
import org.apache.commons.lang.time.DateFormatUtils; import org.apache.commons.lang.time.DateFormatUtils;
import org.quartz.Job; import org.quartz.Job;
import org.quartz.JobExecutionContext; import org.quartz.JobExecutionContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Date; import java.util.Date;
...@@ -13,6 +15,10 @@ import java.util.Date; ...@@ -13,6 +15,10 @@ import java.util.Date;
@Component @Component
public class SynchronizationJob implements Job { public class SynchronizationJob implements Job {
@Autowired
private ISynchronizationService synchronizationService;
@Override @Override
public void execute(JobExecutionContext jobExecutionContext) { public void execute(JobExecutionContext jobExecutionContext) {
System.out.println("开启自动同步定时任务,开始时间: " + DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss")); System.out.println("开启自动同步定时任务,开始时间: " + DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
...@@ -22,6 +28,8 @@ public class SynchronizationJob implements Job { ...@@ -22,6 +28,8 @@ public class SynchronizationJob implements Job {
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }
synchronizationService.synchronization();
} }
......
package com.system.scheduler;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
/**
* @author Inori
*/
@Configuration
@EnableScheduling
public class KingDeeLoginScheduler {
@Scheduled(fixedRate = 1000 * 60 * 10)
public void configureTasks() {
}
}
...@@ -2,6 +2,8 @@ package com.system.serivce; ...@@ -2,6 +2,8 @@ package com.system.serivce;
import com.system.transfer.response.RestResponse; import com.system.transfer.response.RestResponse;
import java.util.Map;
/** /**
* @author Inori * @author Inori
*/ */
...@@ -10,18 +12,27 @@ public interface IDockingDistributionService { ...@@ -10,18 +12,27 @@ public interface IDockingDistributionService {
/** /**
* 对接分销会员创建 * 对接分销会员创建
* *
* @param data 参数
* @param queueId 唯一标识
* @return 结果 * @return 结果
*/ */
RestResponse dockingDistributionMemberCreate(); String dockingDistributionMemberCreate(Map<String, Object> data, String queueId);
/** /**
* 对接订单交易信息 * 对接订单交易创建
* *
* @return 结果 * @return 结果
*/ */
RestResponse dockingDistributionTransactionCreate(); RestResponse dockingDistributionTransactionCreate();
/** /**
* 对接订单提现创建
*
* @return 结果
*/
RestResponse dockingDistributionWithdrawalCreate();
/**
* 查询分销会员下级列表 * 查询分销会员下级列表
* *
* @return 结果 * @return 结果
......
package com.system.serivce;
import com.system.transfer.docking.DockingDistributionMemberCreateInVo;
import com.system.transfer.response.RestResponse;
/**
* @author Inori
*/
public interface IDockingService {
/**
* 对接分销会员创建
*
* @param inVo 条件
* @return 结果
*/
RestResponse dockingDistributionMemberCreate(DockingDistributionMemberCreateInVo inVo);
}
...@@ -7,8 +7,10 @@ public interface IDockingShoppingMallService { ...@@ -7,8 +7,10 @@ public interface IDockingShoppingMallService {
/** /**
* 查询商城订单列表 * 查询商城订单列表
*
* @return 列表
*/ */
void shoppingMallOrderList(); String shoppingMallOrderList();
/** /**
* 查询商城产品列表 * 查询商城产品列表
...@@ -17,8 +19,11 @@ public interface IDockingShoppingMallService { ...@@ -17,8 +19,11 @@ public interface IDockingShoppingMallService {
/** /**
* 查询商城会员列表 * 查询商城会员列表
*
* @param queueId 唯一标识
* @return 列表
*/ */
void shoppingMallMemberList(); String shoppingMallMemberList(String queueId);
} }
package com.system.serivce;
/**
* @author Inori
*/
public interface ISynchronizationService {
/**
* 同步对接
*/
void synchronization();
}
...@@ -5,6 +5,8 @@ import com.system.serivce.IDockingDistributionService; ...@@ -5,6 +5,8 @@ import com.system.serivce.IDockingDistributionService;
import com.system.transfer.response.RestResponse; import com.system.transfer.response.RestResponse;
import com.system.utils.HttpClientUtil; import com.system.utils.HttpClientUtil;
import com.system.utils.JsonUtil; import com.system.utils.JsonUtil;
import com.system.utils.ThirdPartyLogUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
...@@ -24,10 +26,13 @@ public class DockingDistributionServiceImpl implements IDockingDistributionServi ...@@ -24,10 +26,13 @@ public class DockingDistributionServiceImpl implements IDockingDistributionServi
private String secret; private String secret;
@Autowired
private ThirdPartyLogUtil thirdPartyLogUtil;
@PostConstruct @PostConstruct
public void init() { public void init() {
String result = HttpClientUtil.sendGet("http://192.168.2.75:8080/api/v1/getSign"); String result = HttpClientUtil.sendGet("http://192.168.0.34:8080/api/v1/getSign");
Map<String, Object> map = JsonUtil.toMap(result, String.class, Object.class); Map<String, Object> map = JsonUtil.toMap(result, String.class, Object.class);
if (!CollectionUtils.isEmpty(map) && Constants.SUCCESS_CODE.equals(String.valueOf(map.get(Constants.SUCCESS_NAME)))) { if (!CollectionUtils.isEmpty(map) && Constants.SUCCESS_CODE.equals(String.valueOf(map.get(Constants.SUCCESS_NAME)))) {
this.secret = String.valueOf(map.get("data")); this.secret = String.valueOf(map.get("data"));
...@@ -35,27 +40,17 @@ public class DockingDistributionServiceImpl implements IDockingDistributionServi ...@@ -35,27 +40,17 @@ public class DockingDistributionServiceImpl implements IDockingDistributionServi
} }
@Override @Override
public RestResponse dockingDistributionMemberCreate() { public String dockingDistributionMemberCreate(Map<String, Object> data, String queueId) {
try { try {
Map<String, Object> data = new HashMap<>(); data.put("secret", secret);
data.put("secret", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1MzExMTczMzk4MDcsInBheWxvYWQiOiJcInhpYW9qaWFuZ1wiIn0.rOY3JXrYpNMWwATmY7r3jm0Ec6SuhNPyrP2rGD43Isk"); String result = HttpClientUtil.sendPost("http://192.168.0.34:8080/api/v1/memberAdd", JsonUtil.toString(data));
data.put("disUserId", "5555");
data.put("disUserName", "54321");
data.put("disPlatformId", "dist_yiji");
data.put("disParentId", "");
data.put("disNote", "");
String result = HttpClientUtil.sendPost("http://192.168.2.75:8080/api/v1/memberAdd", JsonUtil.toString(data));
Map<String, Object> map = JsonUtil.toMap(result, String.class, Object.class); thirdPartyLogUtil.thirdPartyLogCreate("分销会员创建", "0001", queueId, "平台->分销", JsonUtil.toString(data), result, 1);
if (CollectionUtils.isEmpty(map) && !Constants.SUCCESS_CODE.equals(String.valueOf(map.get(Constants.SUCCESS_NAME)))) { return result;
return RestResponse.fail("新增会员失败");
}
return RestResponse.success();
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
return RestResponse.fail("新增会员失败"); return "";
} }
} }
@Override @Override
...@@ -67,10 +62,10 @@ public class DockingDistributionServiceImpl implements IDockingDistributionServi ...@@ -67,10 +62,10 @@ public class DockingDistributionServiceImpl implements IDockingDistributionServi
data.put("orderId", "5555"); data.put("orderId", "5555");
data.put("disAmount", "12"); data.put("disAmount", "12");
data.put("disNote", ""); data.put("disNote", "");
String result = HttpClientUtil.sendPost("http://192.168.2.75:8080/api/v1/trade", JsonUtil.toString(data)); String result = HttpClientUtil.sendPost("http://192.168.0.34:8080/api/v1/trade", JsonUtil.toString(data));
Map<String, Object> map = JsonUtil.toMap(result, String.class, Object.class); Map<String, Object> map = JsonUtil.toMap(result, String.class, Object.class);
if (CollectionUtils.isEmpty(map) && !Constants.SUCCESS_CODE.equals(String.valueOf(map.get(Constants.SUCCESS_NAME)))) { if (CollectionUtils.isEmpty(map) || !Constants.SUCCESS_CODE.equals(String.valueOf(map.get(Constants.SUCCESS_NAME)))) {
return RestResponse.fail("新增交易失败"); return RestResponse.fail("新增交易失败");
} }
return RestResponse.success(); return RestResponse.success();
...@@ -81,12 +76,33 @@ public class DockingDistributionServiceImpl implements IDockingDistributionServi ...@@ -81,12 +76,33 @@ public class DockingDistributionServiceImpl implements IDockingDistributionServi
} }
@Override @Override
public RestResponse dockingDistributionWithdrawalCreate() {
try {
Map<String, Object> data = new HashMap<>();
data.put("secret", secret);
data.put("userId", "admin");
data.put("amount", "1");
data.put("accountType", "2");
String result = HttpClientUtil.sendPost("http://192.168.0.34:8080/api/v1/withdraw", JsonUtil.toString(data));
Map<String, Object> map = JsonUtil.toMap(result, String.class, Object.class);
if (CollectionUtils.isEmpty(map) || !Constants.SUCCESS_CODE.equals(String.valueOf(map.get(Constants.SUCCESS_NAME)))) {
return RestResponse.fail("新增提现失败");
}
return RestResponse.success();
} catch (IOException e) {
e.printStackTrace();
return RestResponse.fail("新增提现失败");
}
}
@Override
public RestResponse dockingDistributionMemberSubordinateList() { public RestResponse dockingDistributionMemberSubordinateList() {
try { try {
Map<String, Object> data = new HashMap<>(); Map<String, Object> data = new HashMap<>();
data.put("secret", secret); data.put("secret", secret);
data.put("memberId", "1111"); data.put("memberId", "1111");
String result = HttpClientUtil.sendPost("http://192.168.2.75:8080/api/v1/subordinate", JsonUtil.toString(data)); String result = HttpClientUtil.sendPost("http://192.168.0.34:8080/api/v1/subordinate", JsonUtil.toString(data));
List<Map<String, Object>> recordsList = new ArrayList<>(); List<Map<String, Object>> recordsList = new ArrayList<>();
Map<String, Object> map = JsonUtil.toMap(result, String.class, Object.class); Map<String, Object> map = JsonUtil.toMap(result, String.class, Object.class);
......
package com.system.serivce.impl;
import com.system.constants.Constants;
import com.system.serivce.IDockingDistributionService;
import com.system.serivce.IDockingService;
import com.system.transfer.docking.DockingDistributionMemberCreateInVo;
import com.system.transfer.response.RestResponse;
import com.system.utils.JsonUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.HashMap;
import java.util.Map;
/**
* @author Inori
*/
@Service
public class DockingServiceImpl implements IDockingService {
@Autowired
private IDockingDistributionService dockingDistributionService;
@Override
public RestResponse dockingDistributionMemberCreate(DockingDistributionMemberCreateInVo inVo) {
Map<String, Object> data = new HashMap<>();
data.put("disUserId", inVo.getMemberId());
data.put("disUserName", inVo.getMemeberName());
data.put("disParentId", inVo.getReferrerId());
data.put("disPlatformId", inVo.getPlatformId());
data.put("disNote", inVo.getRemark());
String result = dockingDistributionService.dockingDistributionMemberCreate(data, inVo.getQueueId());
Map<String, Object> map = JsonUtil.toMap(result, String.class, Object.class);
if (CollectionUtils.isEmpty(map) || !Constants.SUCCESS_CODE.equals(String.valueOf(map.get(Constants.SUCCESS_NAME)))) {
return RestResponse.fail("新增会员失败");
}
return RestResponse.success();
}
}
package com.system.serivce.impl; package com.system.serivce.impl;
import com.system.constants.Constants;
import com.system.serivce.IDockingShoppingMallService; import com.system.serivce.IDockingShoppingMallService;
import com.system.utils.HttpClientUtil; import com.system.utils.HttpClientUtil;
import com.system.utils.JsonUtil; import com.system.utils.JsonUtil;
import com.system.utils.ThirdPartyLogUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
...@@ -16,8 +18,12 @@ import java.util.Map; ...@@ -16,8 +18,12 @@ import java.util.Map;
@Service @Service
public class DockingShoppingMallServiceImpl implements IDockingShoppingMallService { public class DockingShoppingMallServiceImpl implements IDockingShoppingMallService {
@Autowired
private ThirdPartyLogUtil thirdPartyLogUtil;
@Override @Override
public void shoppingMallOrderList() { public String shoppingMallOrderList() {
Map<String, Object> data = new HashMap<>(2); Map<String, Object> data = new HashMap<>(2);
data.put("startTime", "2019-01-01+00:00:00"); data.put("startTime", "2019-01-01+00:00:00");
data.put("endTime", "2022-10-12+23:59:59"); data.put("endTime", "2022-10-12+23:59:59");
...@@ -29,6 +35,8 @@ public class DockingShoppingMallServiceImpl implements IDockingShoppingMallServi ...@@ -29,6 +35,8 @@ public class DockingShoppingMallServiceImpl implements IDockingShoppingMallServi
String result = HttpClientUtil.sendGet("http://192.168.2.212:81/apis/order/order/page?current=1&size=100" + param.toString()); String result = HttpClientUtil.sendGet("http://192.168.2.212:81/apis/order/order/page?current=1&size=100" + param.toString());
System.out.println(result); System.out.println(result);
return result;
} }
@Override @Override
...@@ -47,29 +55,28 @@ public class DockingShoppingMallServiceImpl implements IDockingShoppingMallServi ...@@ -47,29 +55,28 @@ public class DockingShoppingMallServiceImpl implements IDockingShoppingMallServi
} }
@Override @Override
public void shoppingMallMemberList() { public String shoppingMallMemberList(String queueId) {
Map<String, Object> data = new HashMap<>(2); Map<String, Object> data = new HashMap<>(2);
data.put("startTime", "2019-01-01+00:00:00"); data.put("startTime", "2019-01-01+00:00:00");
data.put("endTime", "2022-10-12+23:59:59"); data.put("endTime", "2022-10-12+23:59:59");
StringBuilder param = new StringBuilder(); StringBuilder param = new StringBuilder();
for (Map.Entry<String, Object> entry : data.entrySet()) { for (Map.Entry<String, Object> entry : data.entrySet()) {
param.append("&").append(entry.getKey()).append("=").append(entry.getValue()); if (param.length() > 0) {
param.append("&").append(entry.getKey()).append("=").append(entry.getValue());
} else {
param.append(entry.getKey()).append("=").append(entry.getValue());
}
} }
String result = HttpClientUtil.sendGet("http://192.168.2.212:81/apis/admin/user/page?current=1&size=100" + param.toString()); String result = HttpClientUtil.sendGet("https://console-mock.apipost.cn/app/mock/project/a0605054-5c08-47a3-e61e-76782a1bc5aa/member/list?" + param.toString());
System.out.println(result); int flag = 0;
Map<String, Object> map = JsonUtil.toMap(result, String.class, Object.class); Map<String, Object> map = JsonUtil.toMap(result, String.class, Object.class);
if (!CollectionUtils.isEmpty(map) && "true".equals(String.valueOf(map.get("success")))) { if (!CollectionUtils.isEmpty(map) && Constants.SUCCESS_CODE.equals(String.valueOf(map.get(Constants.SUCCESS_NAME)))) {
List<Object> objectList = JsonUtil.toList(JsonUtil.toString(map.get("records")), Object.class); flag = 1;
if (!CollectionUtils.isEmpty(objectList)) {
for (Object o : objectList) {
Map<String, Object> temp = JsonUtil.toMap(JsonUtil.toString(o), String.class, Object.class);
temp.get("userId");
temp.get("nickName");
}
}
} }
thirdPartyLogUtil.thirdPartyLogCreate("商城会员查询", "0000", queueId, "商城->平台", JsonUtil.toString(data), result, flag);
return result;
} }
......
package com.system.serivce.impl;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.system.constants.Constants;
import com.system.serivce.IDockingDistributionService;
import com.system.serivce.IDockingShoppingMallService;
import com.system.serivce.ISynchronizationService;
import com.system.utils.JsonUtil;
import com.system.utils.SnowFlakeIdUtil;
import com.system.utils.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* @author Inori
*/
@Service
public class SynchronizationServiceImpl implements ISynchronizationService {
private ExecutorService threadPool = new ThreadPoolExecutor(10, 10,
0L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(1024),
new ThreadFactoryBuilder().setNameFormat("syn-pool-%d").build(),
new ThreadPoolExecutor.AbortPolicy());
@Autowired
private IDockingShoppingMallService dockingShoppingMallService;
@Autowired
private IDockingDistributionService dockingDistributionService;
@Override
public void synchronization() {
threadPool.execute(() -> {
String queueId = SnowFlakeIdUtil.generateId().toString();
Map<String, Object> request = new HashMap<>(3);
String result = dockingShoppingMallService.shoppingMallMemberList(queueId);
Map<String, Object> map = JsonUtil.toMap(result, String.class, Object.class);
if (!CollectionUtils.isEmpty(map) && Constants.SUCCESS_CODE.equals(String.valueOf(map.get(Constants.SUCCESS_NAME)))) {
Map<String, Object> data = JsonUtil.toMap(JsonUtil.toString(map.get("data")), String.class, Object.class);
List<Object> objectList = JsonUtil.toList(JsonUtil.toString(data.get("records")), Object.class);
if (!CollectionUtils.isEmpty(objectList)) {
for (Object o : objectList) {
Map<String, Object> temp = JsonUtil.toMap(JsonUtil.toString(o), String.class, Object.class);
request.put("disUserId", temp.get("userId").toString());
request.put("disUserName", temp.get("nickName"));
if (temp.containsKey("referrerId") && StringUtil.isNotBlank(String.valueOf(temp.get("referrerId")))) {
request.put("disParentId", temp.get("referrerId"));
request.put("disPlatformId", "");
} else {
request.put("disParentId", "");
request.put("disPlatformId", "test");
}
request.put("disNote", "");
}
}
}
if (!CollectionUtils.isEmpty(request)) {
String temp = dockingDistributionService.dockingDistributionMemberCreate(request, queueId);
}
});
}
}
package com.system.transfer.docking;
import lombok.Data;
/**
* @author Inori
*/
@Data
public class DockingDistributionMemberCreateInVo {
/**
* 唯一标识
*/
private String queueId;
/**
* 会员标识
*/
private String memberId;
/**
* 会员名称
*/
private String memeberName;
/**
* 推荐人标识
*/
private String referrerId;
/**
* 平台标识
*/
private String platformId;
/**
* 备注
*/
private String remark;
}
package com.system.transfer.log;
import lombok.Data;
/**
* @author Inori
*/
@Data
public class ThirdPartyLogCreateInVo {
/**
* ID
*/
private Integer id;
/**
* 业务名称
*/
private String name;
/**
* 业务标识
*/
private String code;
/**
* 唯一标识
*/
private String queueId;
/**
* 请求方向
*/
private String direction;
/**
* 请求参数
*/
private String request;
/**
* 是否成功(0-失败,1-成功)
*/
private Integer flag;
/**
* 响应信息
*/
private String response;
/**
* 错误原因
*/
private String message;
}
package com.system.utils;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.SystemUtils;
import java.net.Inet4Address;
import java.net.UnknownHostException;
/**
* @author Inori
*/
public class SnowFlakeIdUtil {
/**
* 机器id所占的位数
*/
private final long workerIdBits = 5L;
/**
* 数据标识id所占的位数
*/
private final long dataCenterIdBits = 5L;
/**
* 工作机器ID(0~31)
*/
private final long workerId;
/**
* 数据中心ID(0~31)
*/
private final long dataCenterId;
/**
* 毫秒内序列(0~4095)
*/
private long sequence = 0L;
/**
* 上次生成ID的时间截
*/
private long lastTimestamp = -1L;
private static final SnowFlakeIdUtil ID_WORKER;
static {
ID_WORKER = new SnowFlakeIdUtil(getWorkId(), getDataCenterId());
}
//==============================Constructors=====================================
/**
* 构造函数
*
* @param workerId 工作ID (0~31)
* @param dataCenterId 数据中心ID (0~31)
*/
public SnowFlakeIdUtil(long workerId, long dataCenterId) {
/* 支持的最大机器id,结果是31 (这个移位算法可以很快地计算出几位二进制数所能表示的最大十进制数) */
long maxWorkerId = ~(-1L << workerIdBits);
if (workerId > maxWorkerId || workerId < 0) {
throw new IllegalArgumentException(String.format("workerId can''t be greater than %d or less than 0", maxWorkerId));
}
/* 支持的最大数据标识id,结果是31 */
long maxDataCenterId = ~(-1L << dataCenterIdBits);
if (dataCenterId > maxDataCenterId || dataCenterId < 0) {
throw new IllegalArgumentException(String.format("dataCenterId can''t be greater than %d or less than 0", maxDataCenterId));
}
this.workerId = workerId;
this.dataCenterId = dataCenterId;
}
// ==============================Methods==========================================
/**
* 获得下一个ID (该方法是线程安全的)
*
* @return SnowflakeId
*/
public synchronized long nextId() {
long timestamp = timeGen();
//如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常
if (timestamp < lastTimestamp) {
throw new RuntimeException(
String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
}
//如果是同一时间生成的,则进行毫秒内序列
/* 序列在id中占的位数 */
long sequenceBits = 12L;
if (lastTimestamp == timestamp) {
/* 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095) */
long sequenceMask = ~(-1L << sequenceBits);
sequence = (sequence + 1) & sequenceMask;
//毫秒内序列溢出
if (sequence == 0) {
//阻塞到下一个毫秒,获得新的时间戳
timestamp = tilNextMillis(lastTimestamp);
}
}
//时间戳改变,毫秒内序列重置
else {
sequence = 0L;
}
//上次生成ID的时间截
lastTimestamp = timestamp;
//移位并通过或运算拼到一起组成64位的ID
/* 开始时间截 (2015-01-01) */
long twepoch = 1489111610226L;
/* 机器ID向左移12位 */
/* 数据标识id向左移17位(12+5) */
long dataCenterIdShift = sequenceBits + workerIdBits;
/* 时间截向左移22位(5+5+12) */
long timestampLeftShift = sequenceBits + workerIdBits + dataCenterIdBits;
return ((timestamp - twepoch) << timestampLeftShift)
| (dataCenterId << dataCenterIdShift)
| (workerId << sequenceBits)
| sequence;
}
/**
* 阻塞到下一个毫秒,直到获得新的时间戳
*
* @param lastTimestamp 上次生成ID的时间截
* @return 当前时间戳
*/
protected long tilNextMillis(long lastTimestamp) {
long timestamp = timeGen();
while (timestamp <= lastTimestamp) {
timestamp = timeGen();
}
return timestamp;
}
/**
* 返回以毫秒为单位的当前时间
*
* @return 当前时间(毫秒)
*/
protected long timeGen() {
return System.currentTimeMillis();
}
private static Long getWorkId() {
try {
String hostAddress = Inet4Address.getLocalHost().getHostAddress();
int[] ints = StringUtils.toCodePoints(hostAddress);
int sums = 0;
for (int b : ints) {
sums += b;
}
return (long) (sums % 32);
} catch (UnknownHostException e) {
// 如果获取失败,则使用随机数备用
return RandomUtils.nextLong(0, 31);
}
}
private static Long getDataCenterId() {
int[] intList = StringUtil.toCodePoints(SystemUtils.getHostName());
int sums = 0;
for (int i : intList) {
sums += i;
}
return (long) (sums % 32);
}
public static Long generateId() {
return ID_WORKER.nextId();
}
}
package com.system.utils;
import com.system.dao.ThirdPartyLogMapper;
import com.system.transfer.log.ThirdPartyLogCreateInVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @author Inori
*/
@Component
public class ThirdPartyLogUtil {
@Autowired
private ThirdPartyLogMapper thirdPartyLogMapper;
public Integer thirdPartyLogCreate(String name, String docType, String queueId, String direction, String request, String response, Integer flag) {
ThirdPartyLogCreateInVo inVo = new ThirdPartyLogCreateInVo();
inVo.setName(name);
inVo.setCode(docType);
inVo.setQueueId(queueId);
inVo.setDirection(direction);
inVo.setRequest(request);
inVo.setResponse(response);
inVo.setFlag(flag);
thirdPartyLogMapper.thirdPartyLogCreate(inVo);
return inVo.getId();
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论