|
|
|
@ -1,19 +1,50 @@
|
|
|
|
|
package com.ruoyi.zhiyuanzhe.service.impl;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
|
|
import cn.hutool.core.collection.CollectionUtil;
|
|
|
|
|
import cn.hutool.core.date.DateField;
|
|
|
|
|
import cn.hutool.core.date.DateTime;
|
|
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
|
|
import cn.hutool.crypto.SecureUtil;
|
|
|
|
|
import cn.hutool.http.HttpRequest;
|
|
|
|
|
import cn.hutool.json.JSONArray;
|
|
|
|
|
import cn.hutool.json.JSONObject;
|
|
|
|
|
import cn.hutool.json.JSONUtil;
|
|
|
|
|
import com.ruoyi.common.core.domain.entity.SysDictData;
|
|
|
|
|
import com.ruoyi.common.core.domain.entity.SysUser;
|
|
|
|
|
import com.ruoyi.common.exception.ServiceException;
|
|
|
|
|
import com.ruoyi.common.utils.DateUtils;
|
|
|
|
|
import com.ruoyi.common.utils.SecurityUtils;
|
|
|
|
|
import com.ruoyi.system.service.ISysConfigService;
|
|
|
|
|
import com.ruoyi.system.service.ISysDictDataService;
|
|
|
|
|
import com.ruoyi.system.service.ISysUserService;
|
|
|
|
|
import com.ruoyi.zhiyuanzhe.domain.BActivityPoints;
|
|
|
|
|
import com.ruoyi.zhiyuanzhe.domain.BDistributionRecords;
|
|
|
|
|
import com.ruoyi.zhiyuanzhe.domain.BPersonTags;
|
|
|
|
|
import com.ruoyi.zhiyuanzhe.domain.dto.DictDTO;
|
|
|
|
|
import com.ruoyi.zhiyuanzhe.domain.dto.ResDTO;
|
|
|
|
|
import com.ruoyi.zhiyuanzhe.domain.dto.ServiceLongDTO;
|
|
|
|
|
import com.ruoyi.zhiyuanzhe.domain.dto.VolunteerDTO;
|
|
|
|
|
import com.ruoyi.zhiyuanzhe.domain.request.BActivityPointsRequest;
|
|
|
|
|
import com.ruoyi.zhiyuanzhe.domain.request.SubmitRequest;
|
|
|
|
|
import com.ruoyi.zhiyuanzhe.mapper.BDistributionRecordsMapper;
|
|
|
|
|
import com.ruoyi.zhiyuanzhe.service.IBActivityPointsService;
|
|
|
|
|
import com.ruoyi.zhiyuanzhe.service.IBDistributionRecordsService;
|
|
|
|
|
import com.ruoyi.zhiyuanzhe.service.IBPersonTagsService;
|
|
|
|
|
import com.ruoyi.zhiyuanzhe.utils.PushDataUtil;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Date;
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.Set;
|
|
|
|
|
import java.util.concurrent.ExecutionException;
|
|
|
|
|
import java.util.concurrent.ExecutorService;
|
|
|
|
|
import java.util.concurrent.Executors;
|
|
|
|
|
import java.util.concurrent.Future;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -28,6 +59,21 @@ public class BDistributionRecordsServiceImpl implements IBDistributionRecordsSer
|
|
|
|
|
@Resource
|
|
|
|
|
private BDistributionRecordsMapper bDistributionRecordsMapper;
|
|
|
|
|
|
|
|
|
|
@Resource
|
|
|
|
|
private ISysDictDataService sysDictDataService;
|
|
|
|
|
|
|
|
|
|
@Resource
|
|
|
|
|
private IBActivityPointsService bActivityPointsService;
|
|
|
|
|
|
|
|
|
|
@Resource
|
|
|
|
|
private ISysUserService sysUserService;
|
|
|
|
|
|
|
|
|
|
@Resource
|
|
|
|
|
private IBPersonTagsService personTagsService;
|
|
|
|
|
|
|
|
|
|
@Resource
|
|
|
|
|
private ISysConfigService configService;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询发放记录
|
|
|
|
|
*
|
|
|
|
@ -124,7 +170,7 @@ public class BDistributionRecordsServiceImpl implements IBDistributionRecordsSer
|
|
|
|
|
* @return 已使用的积分
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public Integer findPointsByUserId(Long userId) {
|
|
|
|
|
public Double findPointsByUserId(Long userId) {
|
|
|
|
|
return bDistributionRecordsMapper.findPointsByUserId(userId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -152,4 +198,242 @@ public class BDistributionRecordsServiceImpl implements IBDistributionRecordsSer
|
|
|
|
|
PushDataUtil.pushData(jsonStr);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 同步一次性活动数据
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void findList() {
|
|
|
|
|
// 清除现有活动数据
|
|
|
|
|
bActivityPointsService.delAll();
|
|
|
|
|
String startTime = "2019-12-19 00:00:00";
|
|
|
|
|
getActivityData(startTime);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* https://zyz.sipac.gov.cn/ 正式地址
|
|
|
|
|
* https://sungent.fyxmt.com/ 测试地址
|
|
|
|
|
* 获取活动数据
|
|
|
|
|
*
|
|
|
|
|
* @param startTime 活动开始时间
|
|
|
|
|
*/
|
|
|
|
|
private void getActivityData(String startTime) {
|
|
|
|
|
Date localDateTime = DateUtil.offsetDay(DateUtil.date(), 30);
|
|
|
|
|
// 如果下次开始时间小于当前时间30天则继续递归数据
|
|
|
|
|
if (localDateTime.after(DateUtil.parse(startTime))) {
|
|
|
|
|
Map<String, Object> param = new HashMap<>();
|
|
|
|
|
param.put("startTime", startTime);
|
|
|
|
|
// 开始时间字符串转日期
|
|
|
|
|
Date date = DateUtil.parse(startTime);
|
|
|
|
|
// 日期加30天获取结束时间
|
|
|
|
|
Date newDate = DateUtil.offsetDay(date, 30);
|
|
|
|
|
// 结束时间转字符串
|
|
|
|
|
String endTime = DateUtil.format(newDate, "yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
param.put("endTime", endTime);
|
|
|
|
|
String body = JSONUtil.toJsonStr(param);
|
|
|
|
|
String res = HttpRequest.post("https://zyz.sipac.gov.cn/volunteer_api/api/sip/block-chain/service-long-list").body(body).execute().body();
|
|
|
|
|
JSONObject jsonObject = JSONUtil.parseObj(res);
|
|
|
|
|
ResDTO bean = jsonObject.toBean(ResDTO.class);
|
|
|
|
|
// 解密
|
|
|
|
|
String decrypt = SecureUtil.des("A2#&15x29".getBytes()).decryptStr(bean.getObj());
|
|
|
|
|
// 响应数据不为空
|
|
|
|
|
if (!decrypt.equals("[]")) {
|
|
|
|
|
// 将字符串转成JSONArray
|
|
|
|
|
JSONArray jsonArray = JSONUtil.parseArray(decrypt);
|
|
|
|
|
// 将JSONArray转成List<Bean>
|
|
|
|
|
List<ServiceLongDTO> serviceLongDTOList = JSONUtil.toList(jsonArray, ServiceLongDTO.class);
|
|
|
|
|
List<BActivityPoints> list = new ArrayList<>();
|
|
|
|
|
for (ServiceLongDTO dto : serviceLongDTOList) {
|
|
|
|
|
BActivityPoints points = new BActivityPoints();
|
|
|
|
|
try {
|
|
|
|
|
points.setId(Long.valueOf(dto.getId()));
|
|
|
|
|
} catch (NumberFormatException e) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
points.setPoints(dto.getServiceLong() == null ? 0 : dto.getServiceLong());
|
|
|
|
|
points.setActivityTime(DateUtil.date(dto.getStartTime()));
|
|
|
|
|
points.setName(dto.getActivityName());
|
|
|
|
|
// 根据手机号作为用户id
|
|
|
|
|
try {
|
|
|
|
|
points.setUId(Long.valueOf(dto.getVolunteerPhone()));
|
|
|
|
|
} catch (NumberFormatException e) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
list.add(points);
|
|
|
|
|
}
|
|
|
|
|
// 保存数据
|
|
|
|
|
bActivityPointsService.addAll(list);
|
|
|
|
|
}
|
|
|
|
|
// 结束日期加上31天为下次开始时间
|
|
|
|
|
DateTime nextStartTime = DateUtil.offsetDay(newDate, 30);
|
|
|
|
|
// 日期转字符串
|
|
|
|
|
String startTimeStr = DateUtil.format(nextStartTime, "yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
getActivityData(startTimeStr);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 同步字典
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void dict() {
|
|
|
|
|
String body = HttpRequest.get("https://zyz.sipac.gov.cn/volunteer_api/api/sip/block-chain/dict").execute().body();
|
|
|
|
|
JSONObject jsonObject = JSONUtil.parseObj(body);
|
|
|
|
|
ResDTO bean = jsonObject.toBean(ResDTO.class);
|
|
|
|
|
String decrypt = SecureUtil.des("A2#&15x29".getBytes()).decryptStr(bean.getObj());
|
|
|
|
|
// 将字符串转成JSONArray
|
|
|
|
|
JSONArray jsonArray = JSONUtil.parseArray(decrypt);
|
|
|
|
|
// 将JSONArray转成List<Bean>
|
|
|
|
|
List<DictDTO> dictList = JSONUtil.toList(jsonArray, DictDTO.class);
|
|
|
|
|
if (CollectionUtil.isNotEmpty(dictList)) {
|
|
|
|
|
// 删除字典
|
|
|
|
|
sysDictDataService.delByType();
|
|
|
|
|
Map<String, List<DictDTO>> groupedData = new HashMap<>();
|
|
|
|
|
for (DictDTO item : dictList) {
|
|
|
|
|
String parentCode = item.getParentCode();
|
|
|
|
|
if (groupedData.containsKey(parentCode)) {
|
|
|
|
|
groupedData.get(parentCode).add(item);
|
|
|
|
|
} else {
|
|
|
|
|
List<DictDTO> itemList = new ArrayList<>();
|
|
|
|
|
itemList.add(item);
|
|
|
|
|
groupedData.put(parentCode, itemList);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Set<String> keySet = groupedData.keySet();
|
|
|
|
|
for (String key : keySet) {
|
|
|
|
|
String str;
|
|
|
|
|
if (key.equals("education")) {
|
|
|
|
|
str = "education_range";
|
|
|
|
|
} else if (key.equals("skill")) {
|
|
|
|
|
str = "speciality_type";
|
|
|
|
|
} else if (key.equals("industry_cate")) {
|
|
|
|
|
str = "industry_type";
|
|
|
|
|
} else if (key.equals("country_list")) {
|
|
|
|
|
str = "nationality_type";
|
|
|
|
|
} else {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
for (DictDTO dictDTO : groupedData.get(key)) {
|
|
|
|
|
SysDictData dictData = new SysDictData();
|
|
|
|
|
dictData.setDictCode(null);
|
|
|
|
|
dictData.setDictSort((long) dictDTO.getSequence());
|
|
|
|
|
dictData.setDictLabel(dictDTO.getName());
|
|
|
|
|
dictData.setDictValue(String.valueOf(dictDTO.getSequence()));
|
|
|
|
|
dictData.setDictType(str);
|
|
|
|
|
dictData.setIsDefault("N");
|
|
|
|
|
dictData.setListClass("default");
|
|
|
|
|
sysDictDataService.insertDictData(dictData);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void processVolunteers(List<VolunteerDTO> volunteerDTOS) {
|
|
|
|
|
|
|
|
|
|
// 创建一个固定大小的线程池,线程数根据实际情况进行配置
|
|
|
|
|
ExecutorService executorService = Executors.newFixedThreadPool(20);
|
|
|
|
|
List<Future<?>> futures = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
List<SysUser> userList = new ArrayList<>();
|
|
|
|
|
List<BPersonTags> tagsList = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
for (VolunteerDTO dto : volunteerDTOS) {
|
|
|
|
|
// 创建一个Runnable任务
|
|
|
|
|
Runnable task = () -> {
|
|
|
|
|
// 创建用户
|
|
|
|
|
SysUser sysUser = new SysUser();
|
|
|
|
|
// 创建人员标签
|
|
|
|
|
BPersonTags tags = new BPersonTags();
|
|
|
|
|
// 填充用户信息
|
|
|
|
|
sysUser.setNickName(dto.getName());
|
|
|
|
|
sysUser.setUserName(dto.getPhone());
|
|
|
|
|
// 加密密码
|
|
|
|
|
sysUser.setPassword(SecurityUtils.encryptPassword("123456"));
|
|
|
|
|
sysUser.setStatus("0");
|
|
|
|
|
sysUser.setDelFlag("0");
|
|
|
|
|
sysUser.setSex("2");
|
|
|
|
|
sysUser.setRoleId(101L);
|
|
|
|
|
sysUser.setUserId(Long.valueOf(dto.getPhone()));
|
|
|
|
|
// 标记为导出数据
|
|
|
|
|
sysUser.setRemark("1");
|
|
|
|
|
userList.add(sysUser);
|
|
|
|
|
// 填充人员标签
|
|
|
|
|
tags.setUId(Long.valueOf(dto.getPhone()));
|
|
|
|
|
tags.setNationalityRange(dto.getCountryText());
|
|
|
|
|
tags.setProfessionalRange(dto.getSkillText());
|
|
|
|
|
tags.setIndustryRange(dto.getIndustryCateText());
|
|
|
|
|
tags.setEducationRange(dto.getEducationText());
|
|
|
|
|
// 标记为导出数据
|
|
|
|
|
tags.setRemark("1");
|
|
|
|
|
tagsList.add(tags);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 提交任务给线程池并获取Future对象
|
|
|
|
|
Future<?> future = executorService.submit(task);
|
|
|
|
|
futures.add(future);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 等待所有任务执行完成
|
|
|
|
|
for (Future<?> future : futures) {
|
|
|
|
|
try {
|
|
|
|
|
future.get();
|
|
|
|
|
} catch (InterruptedException | ExecutionException e) {
|
|
|
|
|
// 处理异常
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 所有任务执行完成后执行批量保存操作
|
|
|
|
|
if (CollectionUtil.isNotEmpty(userList)) {
|
|
|
|
|
// 保存用户信息
|
|
|
|
|
sysUserService.addAll(userList);
|
|
|
|
|
}
|
|
|
|
|
if (CollectionUtil.isNotEmpty(tagsList)) {
|
|
|
|
|
// 保存用户标签
|
|
|
|
|
personTagsService.addAll(tagsList);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 关闭线程池
|
|
|
|
|
executorService.shutdown();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 同步志愿者数据
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void volunteer() {
|
|
|
|
|
// 删除所有导入的用户以及标签
|
|
|
|
|
sysUserService.delByRemark();
|
|
|
|
|
personTagsService.delByRemark();
|
|
|
|
|
// 将字符串日期转换为Date对象
|
|
|
|
|
Date startTime = DateUtil.parse("2012-01-01 00:00:00");
|
|
|
|
|
Date localTime = new Date();
|
|
|
|
|
// 计算两个日期之间相差的年数
|
|
|
|
|
long yearsDiff = DateUtil.age(startTime, localTime);
|
|
|
|
|
|
|
|
|
|
for (long i = 0; i <= yearsDiff; i++) {
|
|
|
|
|
Date endTime = DateUtil.offset(startTime, DateField.YEAR, 1);
|
|
|
|
|
// 格式化请求日期
|
|
|
|
|
String startTimeStr = DateUtil.format(startTime, "yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
String endTimeStr = DateUtil.format(endTime, "yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
Map<String, Object> param = new HashMap<>();
|
|
|
|
|
param.put("startTime", startTimeStr);
|
|
|
|
|
param.put("endTime", endTimeStr);
|
|
|
|
|
String body = JSONUtil.toJsonStr(param);
|
|
|
|
|
String res = HttpRequest.post("https://zyz.sipac.gov.cn/volunteer_api/api/sip/block-chain/volunteer-list").body(body).execute().body();
|
|
|
|
|
JSONObject jsonObject = JSONUtil.parseObj(res);
|
|
|
|
|
ResDTO bean = jsonObject.toBean(ResDTO.class);
|
|
|
|
|
// 解密
|
|
|
|
|
String decrypt = SecureUtil.des("A2#&15x29".getBytes()).decryptStr(bean.getObj());
|
|
|
|
|
// 响应数据不为空
|
|
|
|
|
if (!decrypt.equals("[]")) {
|
|
|
|
|
// 将字符串转成JSONArray
|
|
|
|
|
JSONArray jsonArray = JSONUtil.parseArray(decrypt);
|
|
|
|
|
// 将JSONArray转成List<Bean>
|
|
|
|
|
List<VolunteerDTO> volunteerDTOS = JSONUtil.toList(jsonArray, VolunteerDTO.class);
|
|
|
|
|
processVolunteers(volunteerDTOS);
|
|
|
|
|
}
|
|
|
|
|
startTime = endTime;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|