一 swagger .要传的数据!
二 要返回的数据信息
三 fenginClient 配置接口url 以及 参数
四 定义定时任务 10秒一次定时轮询同步
/**
- 出库数据同步到生产供应
*/
@Component
@EnableScheduling
public class SynProductDetailTask {
private static final Logger logger = LoggerFactory
.getLogger(SynProductDetailTask.class);
@Autowired
private ProductDetailFeignClient productDetailFeignClient;
@Autowired
private ProductDetailService productDetailService;
@Autowired
private StockBillDetailArgs stockBillDetailArgs;
@Autowired
private TokenTask tokenTask;
// 每10s执行一次
@Scheduled(fixedDelay = Constant.uploadTime)
public void synProductDetail() {
logger.info("调出库码数据上传接口开始执行... ...start");
long startTime = System.currentTimeMillis();
String token="";
try {
// 查询所有未同步的数据
Map<String, Object> columnMap = new HashMap<>();
columnMap.put("_status", 0);
List<ProductDetail> productDetailList = productDetailService
.selectByMap(columnMap);
if (null != productDetailList && productDetailList.size() > 0) {
// 遍历所有未同步的数据
for (int i = 0; i < productDetailList.size(); i++) {
// 将位同步的数据组装成生产供应需要的数据格式
StockBillDetailArgs stockBillDetailArgs = new StockBillDetailArgs();
stockBillDetailArgs.setCreateTime(productDetailList.get(i)
.getCreateTime());// 创建时间
stockBillDetailArgs.setFactoryCode(productDetailList.get(i)
.getFactoryCode());// 工厂CODE
/*
* stockBillDetailArgs.setCode(productDetailList.get(i));//单据号
* stockBillDetailArgs
* .setCourierCompany(productDetailList.get(i));//快递公司
* stockBillDetailArgs
* .setFactoryId(productDetailList.get(i));//工厂code
* stockBillDetailArgs.setId(productDetailList.get(i));//id
* stockBillDetailArgs
* .setOperationTime(productDetailList.get(i));
* stockBillDetailArgs
* .setRecordId(productDetailList.get(i));
* stockBillDetailArgs
* .setRelativeBill(productDetailList.get(i));
* stockBillDetailArgs
* .setRemark(productDetailList.get(i).get);//备注
* stockBillDetailArgs
* .setSource(productDetailList.get(i));//出库方
* stockBillDetailArgs
* .setSourceNumber(productDetailList.get(i));//出库方编码
* stockBillDetailArgs
* .setSourceType(productDetailList.get(i));//出库方类型
*/stockBillDetailArgs.setSourceCode(productDetailList.get(
i).getSourceCode());// 第三方单号
stockBillDetailArgs.setStatus(productDetailList.get(i)
.getStatus());// 状态
stockBillDetailArgs
.setStockProductDetailList(productDetailList.get(i)
.getStockProductDetaillist());// 出入库信息
// 获取token
if (StringUtils.isNotEmpty(System
.getProperty(Constant.TOKEN_KEY))) {
token=System.getProperty(Constant.TOKEN_KEY);
}else{
token=tokenTask.getToken();
}
// 调用生产供应接口
logger.info("调用生产供应请求token为:"+token+"参数为:"+JSONObject.toJSONString(stockBillDetailArgs));
ReponseUpload ResultProductModel = productDetailFeignClient
.getUpload(token,stockBillDetailArgs);
logger.info("调用生产供应返回信息为:"+JSONObject.toJSONString(ResultProductModel));
if (ResultProductModel.getCode().equals(
HttpCode.SUCCESS_CODE)) {
//将该单据状态改成已同步状态 1为已经同步
ProductDetail productDetail=productDetailList.get(i);
productDetail.setStatus(1);
int count=productDetailService.updateById(productDetail);
if(count>0){
System.out.println("更新同步生产供应数据为已同步成功");
}else{
System.out.println("更新同步生产供应数据为已同步失败");
}
productDetail=null;
} else {
logger.info("将数据同步生产供应失败");
}
}
} else {
logger.info("当前没有需要同步到生产供应的出库数据");
}
} catch (Throwable e) {
logger.error("出库码数据上传失败:" + e);
}
long endTime = System.currentTimeMillis();
logger.info("调出库码数据上传接口任务结束... ...end,耗时" + (endTime - startTime)
+ "毫秒");
}
}
五 定时任务10s
六 token url
七 调 token的定时任务
@Component
@EnableScheduling
public class TokenTask {
private static Logger logger = LoggerFactory.getLogger(TokenTask.class);
@Autowired
private TokenFeignClient tokenFeignClient;
@Value("${jiashibo.eseCode}")
private String eseCode;
@Value("${token.username}")
private String username;
@Value("${token.password}")
private String password;
@Scheduled(fixedDelay = Constant.REFRESH_TIME)
public void refreshToken() {
logger.info("refreshToken runing");
try{
String resToken= getPlatformToken();
// System.setProperty(TOKEN_KEY, token);
logger.info(“");
logger.info(“当前token为:”+resToken);
logger.info("”);
} catch(Throwable e) {
logger.error("刷新token失败", e);
}
}
/**
* 实际获取token的方法,调用平台登录接口获取token,该类内部使用
* @return
*/
private String getPlatformToken() {
String token = "";
try{
String convertPassword = getPassword(password);
UserToken user = new UserToken(username, convertPassword);
Result<LoginMode> loginMode = tokenFeignClient.getToken(eseCode, user);
if(loginMode.getCode().equals(HttpCode.SUCCESS_CODE)) {
token = loginMode.getData().getToken();
}else{
token = Constant.TOKEN_EMPTY;
}
}catch(Exception e) {
logger.error("getPlatformToken fail", e);
token = Constant.TOKEN_ERROR;
}
// 放入System中
System.setProperty(Constant.TOKEN_KEY, token);
return token;
}
/**
* 获取token,外部类调取该方法
* @return
*/
public String getToken() {
String currentToken = System.getProperty(Constant.TOKEN_KEY);
if(StringUtils.isEmpty(currentToken)
||currentToken.equals(Constant.TOKEN_ERROR)
||currentToken.equals(Constant.TOKEN_EMPTY)) {
String newCurrentToken = getPlatformToken();
logger.info("token有异常:{},重新获取为:{}", currentToken, newCurrentToken);
// System.setProperty(TOKEN_KEY, newCurrentToken); // getPlatformToken方法已放入
currentToken = newCurrentToken;
}
return currentToken;
}
/**
* 获取平台规则的密码
*
* @param target 密码原文
* @param salt
* 盐
* @return
*/
public String getPassword(String target) {
String salt = DateUtil.getCurrentDateStr(DateUtil.YYYYMMDD);
target = MD5Utils.getMD5Code(target);
return MD5Utils.getMD5Code(format("%s%s", target, salt));
}
}