Commit 4f861fd3 authored by chenyuxi's avatar chenyuxi

feat: 瓜子更新银行支行信息

parent 644322ff
......@@ -52,4 +52,12 @@ public class updateUserTask {
HttpDaprUtil.invokeMethodPost(daprUpmsProperties.getAppUrl(),daprUpmsProperties.getAppId(),"/dept/inner/updateDept","", SysDept.class, SecurityConstants.FROM_IN);
log.info("------------更新部门-定时任务结束------------");
}
public void everyDayPushGzBankBranck() {
log.info("-------------每日1:30 拉取瓜子支行信息-定时任务开始------------");
HttpDaprUtil.invokeMethodPost(daprUpmsProperties.getAppUrl(), daprUpmsProperties.getAppId(),
"/sysguazibankbranch/inner/pushBankBranck", "", Object.class,
SecurityConstants.FROM_IN);
log.info("-------------每日1.30 拉取瓜子支行信息-定时任务结束------------");
}
}
......@@ -97,5 +97,8 @@ public class SysGuaziBankBranch extends BaseEntity {
@Schema(description = "所在市编码")
private String cityId;
@Schema(description = "生效状态(A有效,I失效)")
private String effStatus;
}
package com.yifu.cloud.plus.v1.yifu.admin.config;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.web.client.RestTemplate;
/**
* @Author: hgw
* @Date: 2025-6-23 10:41:07
* @Description:
* @return: 瓜子配置
**/
@Configuration
@Data
@Slf4j
public class GzConfig {
@Value("${gz.appkey}")
private String appkey;
@Value("${gz.appsecret}")
private String appsecret;
@Value("${gz.tid}")
private String tid;
@Value("${gz.appUrl}")
private String appUrl;
private static final String APP_KEY = "appKey";
private static final String TIMESTAMP = "timestamp";
private static final String X_REQ_NONCE = "xReqNonce";
private static final String VERSION = "version";
public String getGzBankInfo(RestTemplate restTemplate, String sortedParams) {
String gzBankUrl = appUrl + "/eim-hr-induction/api/hr/induction/open/base/bank-branch?"+ sortedParams;
// 创建请求头并添加Authorization
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "00000000"); // 设置Authorization头
// 创建HttpEntity,包含headers(GET请求没有body,所以为null)
HttpEntity<String> entity = new HttpEntity<>(null, headers);
// 发送GET请求
return restTemplate.exchange(gzBankUrl, HttpMethod.GET, entity, String.class).getBody();
}
}
......@@ -20,10 +20,12 @@ package com.yifu.cloud.plus.v1.yifu.admin.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yifu.cloud.plus.v1.yifu.common.core.util.DateUtil;
import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
import com.yifu.cloud.plus.v1.yifu.common.log.annotation.SysLog;
import com.yifu.cloud.plus.v1.yifu.admin.api.entity.SysGuaziBankBranch;
import com.yifu.cloud.plus.v1.yifu.admin.service.SysGuaziBankBranchService;
import com.yifu.cloud.plus.v1.yifu.common.security.annotation.Inner;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
......@@ -60,4 +62,41 @@ public class SysGuaziBankBranchController {
return new R<>(sysGuaziBankBranchService.getSysGuaziBankBranchPage(page, sysGuaziBankBranch));
}
/**
* 拉取瓜子支行信息
* @return R
*/
@SysLog("拉取瓜子支行信息")
@PostMapping("/pushBankBranck")
public R pushBankBranckTest() {
// String startDay = "2020-01-01";
// String startTime = startDay+" 00:00:00";
// String endDay = "2025-07-12";
// String endTime = endDay+" 00:00:00";
// Integer pageNum = 173;
String startDay = DateUtil.addDay(-1);
String startTime = startDay+" 00:00:00";
String endDay = DateUtil.addDay(0);
String endTime = endDay+" 00:00:00";
Integer pageNum = 1;
return sysGuaziBankBranchService.pushBankBranck(startTime, endTime, pageNum);
}
/**
* 拉取瓜子支行信息
* @return R
*/
@SysLog("拉取瓜子支行信息")
@PostMapping("/inner/pushBankBranck")
@Inner
public R pushBankBranck() {
String startDay = DateUtil.addDay(-1);
String startTime = startDay+" 00:00:00";
String endDay = DateUtil.addDay(0);
String endTime = endDay+" 00:00:00";
Integer pageNum = 1;
return sysGuaziBankBranchService.pushBankBranck(startTime, endTime, pageNum);
}
}
......@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.yifu.cloud.plus.v1.yifu.admin.api.entity.SysGuaziBankBranch;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
/**
......@@ -38,4 +39,10 @@ public interface SysGuaziBankBranchService extends IService<SysGuaziBankBranch>
*/
IPage<SysGuaziBankBranch> getSysGuaziBankBranchPage(Page<SysGuaziBankBranch> page, SysGuaziBankBranch sysGuaziBankBranch);
/**
* 拉取瓜子支行信息
* @return R
*/
R pushBankBranck(String startTime, String endTime, Integer pageNum);
}
......@@ -16,16 +16,41 @@
*/
package com.yifu.cloud.plus.v1.yifu.admin.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yifu.cloud.plus.v1.yifu.admin.api.entity.SysDictItem;
import com.yifu.cloud.plus.v1.yifu.admin.api.entity.SysGuaziBankBranch;
import com.yifu.cloud.plus.v1.yifu.admin.config.GzConfig;
import com.yifu.cloud.plus.v1.yifu.admin.mapper.SysGuaziBankBranchMapper;
import com.yifu.cloud.plus.v1.yifu.admin.service.SysGuaziBankBranchService;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.ClientNameConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.util.Common;
import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.codec.binary.Base64;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.web.client.RestTemplate;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
/**
* 瓜子银行支行信息
......@@ -37,6 +62,18 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@Service
@RequiredArgsConstructor
public class SysGuaziBankBranchServiceImpl extends ServiceImpl<SysGuaziBankBranchMapper, SysGuaziBankBranch> implements SysGuaziBankBranchService {
private static final String STRING = "abcdefghijklmnopqrstuvwxyz";
private static final String APP_KEY = "appkey";
private static final String EXPIRES = "expires";
private static final String NONCE = "nonce";
private static final String SIGNATURE = "signature";
@Autowired
private GzConfig gzConfig;
private RestTemplate restTemplate = new RestTemplate();
/**
* 瓜子银行支行信息简单分页查询
*
......@@ -48,4 +85,254 @@ public class SysGuaziBankBranchServiceImpl extends ServiceImpl<SysGuaziBankBranc
return baseMapper.getSysGuaziBankBranchPage(page, sysGuaziBankBranch);
}
/**
* 拉取瓜子支行信息
*
* @param startTime
* @param endTime
* @return R
*/
@Override
public R pushBankBranck(String startTime, String endTime, Integer pageNum) {
Map<String, Object> params = new HashMap<>();
params.put("pageNum", pageNum);
params.put("pageSize", 10000);
params.put("startTime", startTime);
params.put("endTime", endTime);
params.put("appsecret", gzConfig.getAppsecret());
params.put("tid", gzConfig.getTid());
addSignature(params, gzConfig.getAppkey(), gzConfig.getAppsecret());
params.remove("startTime", startTime);
params.remove("endTime", endTime);
String sortedParams = getEncodeString(params);
sortedParams += "&startTime=" + startTime + "&endTime=" + endTime;
// 调取瓜子接口,拿到支行数据
String result = gzConfig.getGzBankInfo(restTemplate, sortedParams);
if (result != null && result.contains("code") && result.contains("data")) {
JSONObject resultObject = JSON.parseObject(result);
String code = resultObject.getString("code");
if (Common.isNotNull(code) && "S00000".equals(code)) {
JSONArray dataArray = (JSONArray) resultObject.get("data");
if(dataArray.size() == 0){
return R.ok("当天暂为拉取到新数据");
}
JSONObject dataObject;
Integer cnapsId;
// 获取已存在数据库的支行信息
Set<Integer> checkCnapsIdSet = new HashSet<>();
Set<Integer> haveCnapsIdSet = new HashSet<>();
for (int i=0;i<dataArray.size(); i++) {
dataObject = (JSONObject)dataArray.get(i);
cnapsId = dataObject.getInteger("cnapsId");
checkCnapsIdSet.add(cnapsId);
}
LambdaQueryWrapper<SysGuaziBankBranch> findQuery = Wrappers.<SysGuaziBankBranch>lambdaQuery()
.in(SysGuaziBankBranch::getCnapsId, checkCnapsIdSet);
List<SysGuaziBankBranch> findCnapsIdList = this.list(findQuery);
if(Common.isNotNull(findCnapsIdList)){
haveCnapsIdSet = findCnapsIdList.stream().map(SysGuaziBankBranch::getCnapsId).collect(Collectors.toSet());
}
String bankCd;
String cnapsNum;
String bankDescr;
String stateId;
String cityId;
String effStatus;
SysGuaziBankBranch saveOne;
List<SysGuaziBankBranch> saveList = new ArrayList<>();
// 开始处理支行数据
for (int i=0;i<dataArray.size(); i++) {
dataObject = (JSONObject)dataArray.get(i);
bankCd = dataObject.getString("bankCd");
cnapsId = dataObject.getInteger("cnapsId");
cnapsNum = dataObject.getString("cnapsNum");
bankDescr = dataObject.getString("bankDescr");
stateId = dataObject.getString("stateId");
cityId = dataObject.getString("cityId");
effStatus = dataObject.getString("effStatus");
// cnapsId 已存在就更新,否则新增
if(Common.isNotNull(haveCnapsIdSet) && haveCnapsIdSet.contains(cnapsId)){
LambdaUpdateWrapper<SysGuaziBankBranch> updateInfoWrapper = new LambdaUpdateWrapper<>();
updateInfoWrapper.eq(SysGuaziBankBranch::getCnapsId, cnapsId)
.set(SysGuaziBankBranch::getBankCd, bankCd)
.set(SysGuaziBankBranch::getCnapsNum, cnapsNum)
.set(SysGuaziBankBranch::getBankDescr, bankDescr)
.set(SysGuaziBankBranch::getStateId, stateId)
.set(SysGuaziBankBranch::getCityId, cityId)
.set(SysGuaziBankBranch::getEffStatus, effStatus)
.set(SysGuaziBankBranch::getUpdateBy, "1")
.set(SysGuaziBankBranch::getUpdateTime, LocalDateTime.now());
this.update(null, updateInfoWrapper);
} else {
saveOne = new SysGuaziBankBranch();
saveOne.setBankCd(bankCd);
saveOne.setCnapsId(cnapsId);
saveOne.setCnapsNum(cnapsNum);
saveOne.setBankDescr(bankDescr);
saveOne.setCityId(cityId);
saveOne.setStateId(stateId);
saveOne.setEffStatus(effStatus);
saveOne.setCreateBy("1");
saveOne.setCreateName("系统");
saveOne.setCreateTime(LocalDateTime.now());
saveList.add(saveOne);
}
}
if(Common.isNotNull(saveList)){
this.saveBatch(saveList);
}
// 一页更新完,再调下一页
this.pushBankBranck(startTime, endTime, pageNum+1);
return R.ok();
}
}
return R.failed("瓜子接口响应异常");
}
/**
* 生成签名并且将签名加到参数表中
*
* @param params 业务参数列表信息
* @param appKey
* @param appSecret
* @return
*/
private static Map<String, Object> addSignature(Map<String, Object> params, String appKey, String appSecret) {
String sign = generateSignature(params, appKey, appSecret);
params.put(SIGNATURE, sign);
return params;
}
/**
* 根据参数计算签名值
*
* @param params
* @return
*/
private static String generateSignature(Map<String, Object> params, String appKey, String appSecret) {
if (params == null ) {
return null;
}
params.put(APP_KEY, appKey);
params.put(EXPIRES, getCurrentSecond());
params.put(NONCE, generateRandomStr(6));
String sortedParams = getEncodeString(params);
return generateSignature(sortedParams, appSecret);
}
/**
* 生成签名 取5-15共10位返回
*
* @param params
* @param appSecret
* @return
*/
private static String generateSignature(String params, String appSecret) {
String result = md5(sha256HMACEncode(params, appSecret)).substring(5, 15);
return result;
}
private static String md5(String value) {
try {
MessageDigest md = MessageDigest.getInstance("md5");
byte[] e = md.digest(value.getBytes());
return byteToHexString(e);
} catch (NoSuchAlgorithmException e) {
}
return null;
}
private static String byteToHexString(byte[] salt) {
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < salt.length; i++) {
String hex = Integer.toHexString(salt[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
hexString.append(hex.toLowerCase());
}
return hexString.toString();
}
/**
* sha256取hash Base64编码
*
* @param params
* @param secret
* @return
*/
private static String sha256HMACEncode(String params, String secret) {
String result = "";
try {
Mac sha256HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
sha256HMAC.init(secretKey);
byte[] sha256HMACBytes = sha256HMAC.doFinal(params.getBytes());
String hash = Base64.encodeBase64String(sha256HMACBytes);
return hash;
} catch (Exception e) {
}
return result;
}
// 获取当前时间秒数+60S
private static String getCurrentSecond() {
return (System.currentTimeMillis() / 1000 + 60) + "";
}
// 获取len个随机字符串
private static String generateRandomStr(int len) {
StringBuffer sb = new StringBuffer();
int count = len <= STRING.length() ? len : STRING.length();
Random random = new Random();
for (int i = 0; i < count; i++) {
sb.append(STRING.charAt(random.nextInt(STRING.length() - 1)));
}
return sb.toString();
}
// 通过参数集合map 组装成需要签名的字符串id=123&name=456
public static String getEncodeString(Map<String, Object> params) {
if (params == null || params.size() == 0) {
return "";
}
Iterator<String> it = params.keySet().iterator();
ArrayList<String> al = new ArrayList<String>();
while (it.hasNext()) {
al.add(it.next());
}
// 字母升序排列
Collections.sort(al);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < al.size(); i++) {
try {
String key = al.get(i);
sb.append(URLEncoder.encode(key == null ? "" : key.toString(), "UTF-8"));
sb.append("=");
String item = null;
Object value = params.get(key);
item = URLEncoder.encode(value == null ? "" : value.toString(), "UTF-8");
sb.append(item);
} catch (UnsupportedEncodingException e) {
} catch (NullPointerException e) {
}
sb.append("&");
}
String result = sb.toString();
return result.substring(0, result.length() - 1);
}
}
......@@ -16,7 +16,12 @@ spring:
password: yf_zsk
url: jdbc:mysql://192.168.1.65:43306/yifu_upms?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
#瓜子配置
gz:
appkey: hr_eny00002_test
appsecret: hr_eny00002_test_20250620
tid: c2da1d84e9bd4a30b6be5ecd209096fb
appUrl: https://eim-busin-api-test-jwtys.guazi.com
......@@ -28,5 +28,10 @@ spring:
max-lifetime: 0 #此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
#瓜子配置
gz:
appkey: hr_eny00002_test
appsecret: hr_eny00002_test_20250620
tid: c2da1d84e9bd4a30b6be5ecd209096fb
appUrl: https://eim-busin-api-test-jwtys.guazi.com
......@@ -26,4 +26,11 @@ spring:
idle-timeout: 60000 # 空闲连接存活最大时间,默认600000(10分钟)
maximum-pool-size: 12 # 连接池最大连接数,默认是10
auto-commit: true #此属性控制从池返回的连接的默认自动提交行为,默认值:true
max-lifetime: 0 #此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
\ No newline at end of file
max-lifetime: 0 #此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
#瓜子配置
gz:
appkey: hr_eny00002_test
appsecret: hr_eny00002_test_20250620
tid: c2da1d84e9bd4a30b6be5ecd209096fb
appUrl: https://eim-busin-api-test-jwtys.guazi.com
......@@ -31,6 +31,7 @@
<result property="bankDescr" column="bank_descr"/>
<result property="stateId" column="state_id"/>
<result property="cityId" column="city_id"/>
<result property="effStatus" column="eff_status"/>
<result property="createTime" column="create_time"/>
<result property="createBy" column="create_by"/>
<result property="createName" column="create_name"/>
......@@ -45,6 +46,7 @@
a.bank_descr,
a.state_id,
a.city_id,
a.eff_status,
a.create_time,
a.create_by,
a.create_name,
......@@ -97,7 +99,7 @@
<include refid="Base_Column_List"/>
FROM sys_guazi_bank_branch a
<where>
1=1
a.eff_status = 'A'
<include refid="sysGuaziBankBranch_where"/>
</where>
order by a.id
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment