diff --git a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/controller/SysErpConfigController.java b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/controller/SysErpConfigController.java index 2085a00..5f3ff96 100644 --- a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/controller/SysErpConfigController.java +++ b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/controller/SysErpConfigController.java @@ -108,7 +108,6 @@ public class SysErpConfigController extends BaseController { /** * 下拉框查询ERP系统配置列表 */ - @GetMapping("/getSysErpConfigList") public R> getSysErpConfigList(SysErpConfigBo bo) { List list = sysErpConfigService.queryList(bo); diff --git a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/controller/SysErpMappingController.java b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/controller/SysErpMappingController.java index 7ea2a01..c5078eb 100644 --- a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/controller/SysErpMappingController.java +++ b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/controller/SysErpMappingController.java @@ -108,7 +108,6 @@ public class SysErpMappingController extends BaseController { /** * 下拉框查询ERP接口映射列表 */ - @GetMapping("/getSysErpMappingList") public R> getSysErpMappingList(SysErpMappingBo bo) { List list = sysErpMappingService.queryList(bo); diff --git a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/controller/SysErpTokenController.java b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/controller/SysErpTokenController.java index 29707b8..499c1f1 100644 --- a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/controller/SysErpTokenController.java +++ b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/controller/SysErpTokenController.java @@ -108,7 +108,6 @@ public class SysErpTokenController extends BaseController { /** * 下拉框查询ERPToken管理列表 */ - @GetMapping("/getSysErpTokenList") public R> getSysErpTokenList(SysErpTokenBo bo) { List list = sysErpTokenService.queryList(bo); diff --git a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/domain/SysErpConfig.java b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/domain/SysErpConfig.java index bd7edf3..8ed82c2 100644 --- a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/domain/SysErpConfig.java +++ b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/domain/SysErpConfig.java @@ -57,10 +57,7 @@ public class SysErpConfig extends TenantEntity { */ private String tokenUrl; - /** - * token过期时间(秒) - */ - private Long tokenExpireTime; + /** * 激活标识(1是 0否) diff --git a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/domain/SysErpMapping.java b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/domain/SysErpMapping.java index 1d67294..37488b1 100644 --- a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/domain/SysErpMapping.java +++ b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/domain/SysErpMapping.java @@ -43,12 +43,12 @@ public class SysErpMapping extends TenantEntity { private String erpApiUrl; /** - * 请求方法(GET POST) + * ERP请求方法(GET POST) */ private String erpMethod; /** - * 请求参数模板 + * ERP请求参数模板 */ private String erpParams; @@ -63,7 +63,7 @@ public class SysErpMapping extends TenantEntity { private String localMethod; /** - * 字段映射关系 + * 字段映射关系(JSON格式) */ private String fieldMapping; diff --git a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/domain/bo/SysErpConfigBo.java b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/domain/bo/SysErpConfigBo.java index e115e7b..1e05c48 100644 --- a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/domain/bo/SysErpConfigBo.java +++ b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/domain/bo/SysErpConfigBo.java @@ -58,11 +58,6 @@ public class SysErpConfigBo extends BaseEntity { */ private String tokenUrl; - /** - * token过期时间(秒) - */ - private Long tokenExpireTime; - /** * 激活标识(1是 0否) */ diff --git a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/domain/vo/SysErpConfigVo.java b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/domain/vo/SysErpConfigVo.java index 7975c94..0247f00 100644 --- a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/domain/vo/SysErpConfigVo.java +++ b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/domain/vo/SysErpConfigVo.java @@ -71,12 +71,6 @@ public class SysErpConfigVo implements Serializable { @ExcelProperty(value = "token地址") private String tokenUrl; - /** - * token过期时间(秒) - */ - @ExcelProperty(value = "token过期时间(秒)") - private Long tokenExpireTime; - /** * 激活标识(1是 0否) */ diff --git a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/ISysErpMappingService.java b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/ISysErpMappingService.java index 70a9e26..71d26b4 100644 --- a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/ISysErpMappingService.java +++ b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/ISysErpMappingService.java @@ -8,6 +8,7 @@ import org.dromara.common.mybatis.core.page.PageQuery; import java.util.Collection; import java.util.List; +import java.util.Map; /** * ERP接口映射Service接口 @@ -66,4 +67,13 @@ public interface ISysErpMappingService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 调用ERP接口 + * + * @param mappingId 映射ID + * @param params 请求参数 + * @return 响应结果 + */ + Map callErpApiById(Long mappingId, Map params); } diff --git a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/ISysErpTokenService.java b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/ISysErpTokenService.java index df204ae..a19a673 100644 --- a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/ISysErpTokenService.java +++ b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/ISysErpTokenService.java @@ -66,4 +66,21 @@ public interface ISysErpTokenService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 获取有效的Token + * + * @param configId 配置ID + * @return 有效的Token信息 + */ + SysErpTokenVo getValidToken(Long configId); + + /** + * 根据配置ID获取Token + * + * @param configId 配置ID + * @return Token信息 + */ + SysErpTokenVo getTokenByConfigId(Long configId); + } diff --git a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/impl/BaseMaterialInfoApiServiceImpl.java b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/impl/BaseMaterialInfoApiServiceImpl.java index c3996a7..99a6be1 100644 --- a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/impl/BaseMaterialInfoApiServiceImpl.java +++ b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/impl/BaseMaterialInfoApiServiceImpl.java @@ -1,26 +1,21 @@ package org.dromara.api.service.impl; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; import org.apache.dubbo.config.annotation.DubboReference; -import org.dromara.api.domain.sap.SAPPortDto; -import org.dromara.api.domain.sap.vo.SAPResultVo; import org.dromara.api.service.IBaseMaterialInfoApiService; - +import org.dromara.api.service.ISysErpMappingService; import lombok.RequiredArgsConstructor; import org.dromara.api.service.ICommonApiService; -import org.dromara.api.utils.SAPApiUtils; -import org.dromara.api.utils.SAPConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.json.utils.JsonUtils; import org.dromara.mes.api.RemoteMaterialInfoService; import org.dromara.mes.api.model.bo.BaseMaterialInfoBo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; +import java.util.Map; /** * API物料Service业务层处理 @@ -35,20 +30,87 @@ public class BaseMaterialInfoApiServiceImpl implements IBaseMaterialInfoApiServi @Autowired private final ICommonApiService commonApiService; + @Autowired + private final ISysErpMappingService mappingService; + @DubboReference private final RemoteMaterialInfoService remoteMaterialInfoService; @Override public String insertApi(String requestBody) { - SAPPortDto sapPortDto = new SAPPortDto(); - //请求API接口,获取数据 - String json = commonApiService.getSAPData(sapPortDto); - //解析数据,存储实体类 - List list = commonApiService.convertSAPToMaterialEntity(json); - remoteMaterialInfoService.remoteInsertBaseMaterialInfo(list); - return "success"; + try { + // 1. 解析请求参数 + Map params = JsonUtils.parseObject(requestBody, Map.class); + if (params == null) { + throw new ServiceException("请求参数不能为空"); + } + + // 2. 获取映射ID + Object mappingIdObj = params.get("mappingId"); + if (mappingIdObj == null) { + throw new ServiceException("mappingId不能为空"); + } + Long mappingId = Long.valueOf(String.valueOf(mappingIdObj)); + + // 3. 调用ERP接口 + Map result = mappingService.callErpApiById(mappingId, params); + if (result == null) { + throw new ServiceException("ERP接口返回结果为空"); + } + + // 4. 转换数据为物料实体 + List materialList = convertToMaterialList(result); + if (materialList == null || materialList.isEmpty()) { + throw new ServiceException("未获取到有效的物料数据"); + } + + // 5. 调用远程服务保存数据 + remoteMaterialInfoService.remoteInsertBaseMaterialInfo(materialList); + + return "success"; + } catch (Exception e) { + throw new ServiceException("物料数据同步失败:" + e.getMessage()); + } } + /** + * 将ERP接口返回结果转换为物料实体列表 + * + * @param result ERP接口返回结果 + * @return 物料实体列表 + */ + private List convertToMaterialList(Map result) { + List materialList = new ArrayList<>(); + try { + // 1. 获取数据列表 + Object data = result.get("data"); + if (data == null) { + return materialList; + } + // 2. 转换为List + List> dataList; + if (data instanceof List) { + dataList = (List>) data; + } else { + dataList = new ArrayList<>(); + dataList.add((Map) data); + } + + // 3. 遍历数据转换为物料实体 + for (Map item : dataList) { + BaseMaterialInfoBo material = new BaseMaterialInfoBo(); + // 设置物料属性 + material.setMaterialCode(String.valueOf(item.get("materialCode"))); + material.setMaterialName(String.valueOf(item.get("materialName"))); + + materialList.add(material); + } + } catch (Exception e) { + throw new ServiceException("数据转换失败:" + e.getMessage()); + } + + return materialList; + } } diff --git a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/impl/SysErpConfigServiceImpl.java b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/impl/SysErpConfigServiceImpl.java index 10df213..1a1f700 100644 --- a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/impl/SysErpConfigServiceImpl.java +++ b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/impl/SysErpConfigServiceImpl.java @@ -80,7 +80,6 @@ public class SysErpConfigServiceImpl implements ISysErpConfigService { .eq(StringUtils.isNotBlank(bo.getAppKey()), SysErpConfig::getAppKey, bo.getAppKey()) .eq(StringUtils.isNotBlank(bo.getAppSecret()), SysErpConfig::getAppSecret, bo.getAppSecret()) .eq(StringUtils.isNotBlank(bo.getTokenUrl()), SysErpConfig::getTokenUrl, bo.getTokenUrl()) - .eq(bo.getTokenExpireTime() != null, SysErpConfig::getTokenExpireTime, bo.getTokenExpireTime()) .eq(StringUtils.isNotBlank(bo.getActiveFlag()), SysErpConfig::getActiveFlag, bo.getActiveFlag()) .orderByDesc(SysErpConfig::getCreateTime); return lqw; diff --git a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/impl/SysErpMappingServiceImpl.java b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/impl/SysErpMappingServiceImpl.java index 18d46c8..816b3b2 100644 --- a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/impl/SysErpMappingServiceImpl.java +++ b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/impl/SysErpMappingServiceImpl.java @@ -1,6 +1,8 @@ package org.dromara.api.service.impl; import org.dromara.api.domain.SysErpConfig; +import org.dromara.api.domain.vo.SysErpConfigVo; +import org.dromara.api.utils.ErpMappingUtils; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -11,15 +13,21 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.dromara.api.domain.bo.SysErpMappingBo; import org.dromara.api.domain.vo.SysErpMappingVo; import org.dromara.api.domain.SysErpMapping; import org.dromara.api.mapper.SysErpMappingMapper; import org.dromara.api.service.ISysErpMappingService; +import org.dromara.api.service.ISysErpConfigService; +import org.dromara.common.core.exception.ServiceException; import java.util.List; import java.util.Map; import java.util.Collection; +import java.util.Date; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; /** * ERP接口映射Service业务层处理 @@ -32,6 +40,7 @@ import java.util.Collection; public class SysErpMappingServiceImpl implements ISysErpMappingService { private final SysErpMappingMapper baseMapper; + private final ISysErpConfigService configService; /** * 查询ERP接口映射 @@ -40,7 +49,7 @@ public class SysErpMappingServiceImpl implements ISysErpMappingService { * @return ERP接口映射 */ @Override - public SysErpMappingVo queryById(Long mappingId){ + public SysErpMappingVo queryById(Long mappingId) { return baseMapper.selectVoById(mappingId); } @@ -73,21 +82,21 @@ public class SysErpMappingServiceImpl implements ISysErpMappingService { private MPJLambdaWrapper buildQueryWrapper(SysErpMappingBo bo) { Map params = bo.getParams(); MPJLambdaWrapper lqw = JoinWrappers.lambda(SysErpMapping.class) - .selectAll(SysErpMapping.class) + .selectAll(SysErpMapping.class) .select(SysErpConfig::getConfigName) .leftJoin(SysErpConfig.class, SysErpConfig::getConfigId, SysErpMapping::getConfigId) - .eq(bo.getMappingId() != null, SysErpMapping::getMappingId, bo.getMappingId()) - .eq(bo.getConfigId() != null, SysErpMapping::getConfigId, bo.getConfigId()) - .eq(StringUtils.isNotBlank(bo.getBusinessType()), SysErpMapping::getBusinessType, bo.getBusinessType()) - .eq(StringUtils.isNotBlank(bo.getErpApiUrl()), SysErpMapping::getErpApiUrl, bo.getErpApiUrl()) - .eq(StringUtils.isNotBlank(bo.getErpMethod()), SysErpMapping::getErpMethod, bo.getErpMethod()) - .eq(StringUtils.isNotBlank(bo.getErpParams()), SysErpMapping::getErpParams, bo.getErpParams()) - .eq(StringUtils.isNotBlank(bo.getLocalApiUrl()), SysErpMapping::getLocalApiUrl, bo.getLocalApiUrl()) - .eq(StringUtils.isNotBlank(bo.getLocalMethod()), SysErpMapping::getLocalMethod, bo.getLocalMethod()) - .eq(StringUtils.isNotBlank(bo.getFieldMapping()), SysErpMapping::getFieldMapping, bo.getFieldMapping()) - .eq(StringUtils.isNotBlank(bo.getNeedToken()), SysErpMapping::getNeedToken, bo.getNeedToken()) - .eq(StringUtils.isNotBlank(bo.getActiveFlag()), SysErpMapping::getActiveFlag, bo.getActiveFlag()) - .orderByDesc(SysErpMapping::getCreateTime); + .eq(bo.getMappingId() != null, SysErpMapping::getMappingId, bo.getMappingId()) + .eq(bo.getConfigId() != null, SysErpMapping::getConfigId, bo.getConfigId()) + .eq(StringUtils.isNotBlank(bo.getBusinessType()), SysErpMapping::getBusinessType, bo.getBusinessType()) + .eq(StringUtils.isNotBlank(bo.getErpApiUrl()), SysErpMapping::getErpApiUrl, bo.getErpApiUrl()) + .eq(StringUtils.isNotBlank(bo.getErpMethod()), SysErpMapping::getErpMethod, bo.getErpMethod()) + .eq(StringUtils.isNotBlank(bo.getErpParams()), SysErpMapping::getErpParams, bo.getErpParams()) + .eq(StringUtils.isNotBlank(bo.getLocalApiUrl()), SysErpMapping::getLocalApiUrl, bo.getLocalApiUrl()) + .eq(StringUtils.isNotBlank(bo.getLocalMethod()), SysErpMapping::getLocalMethod, bo.getLocalMethod()) + .eq(StringUtils.isNotBlank(bo.getFieldMapping()), SysErpMapping::getFieldMapping, bo.getFieldMapping()) + .eq(StringUtils.isNotBlank(bo.getNeedToken()), SysErpMapping::getNeedToken, bo.getNeedToken()) + .eq(StringUtils.isNotBlank(bo.getActiveFlag()), SysErpMapping::getActiveFlag, bo.getActiveFlag()) + .orderByDesc(SysErpMapping::getCreateTime); return lqw; } @@ -124,7 +133,7 @@ public class SysErpMappingServiceImpl implements ISysErpMappingService { /** * 保存前的数据校验 */ - private void validEntityBeforeSave(SysErpMapping entity){ + private void validEntityBeforeSave(SysErpMapping entity) { //TODO 做一些数据校验,如唯一约束 } @@ -137,9 +146,38 @@ public class SysErpMappingServiceImpl implements ISysErpMappingService { */ @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ + if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 } return baseMapper.deleteByIds(ids) > 0; } + + /** + * 根据映射ID调用ERP接口 + * + * @param mappingId 映射ID + * @param params 请求参数 + * @return 响应结果 + */ + @Override + public Map callErpApiById(Long mappingId, Map params) { + // 1. 获取接口映射配置 + SysErpMappingVo mapping = baseMapper.selectVoById(mappingId); + if (mapping == null) { + throw new ServiceException("接口映射配置不存在"); + } + + // 2. 获取ERP配置信息 + SysErpConfigVo config = configService.queryById(mapping.getConfigId()); + if (config == null) { + throw new ServiceException("ERP配置不存在"); + } + + // 3. 调用ERP接口 + SysErpMapping erpMapping = MapstructUtils.convert(mapping, SysErpMapping.class); + return ErpMappingUtils.callErpApi(erpMapping, config, params); + } + + + } diff --git a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/impl/SysErpTokenServiceImpl.java b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/impl/SysErpTokenServiceImpl.java index 913cb4d..b81f2e0 100644 --- a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/impl/SysErpTokenServiceImpl.java +++ b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/service/impl/SysErpTokenServiceImpl.java @@ -1,5 +1,7 @@ package org.dromara.api.service.impl; +import org.dromara.api.domain.vo.SysErpConfigVo; +import org.dromara.api.utils.ErpApiUtils; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -10,15 +12,20 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.dromara.api.domain.bo.SysErpTokenBo; import org.dromara.api.domain.vo.SysErpTokenVo; import org.dromara.api.domain.SysErpToken; import org.dromara.api.mapper.SysErpTokenMapper; import org.dromara.api.service.ISysErpTokenService; +import org.dromara.api.service.ISysErpConfigService; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.DateUtils; import java.util.List; import java.util.Map; import java.util.Collection; +import java.util.Date; /** * ERPToken管理Service业务层处理 @@ -32,6 +39,8 @@ public class SysErpTokenServiceImpl implements ISysErpTokenService { private final SysErpTokenMapper baseMapper; + private final ISysErpConfigService configService; + /** * 查询ERPToken管理 * @@ -135,4 +144,105 @@ public class SysErpTokenServiceImpl implements ISysErpTokenService { } return baseMapper.deleteByIds(ids) > 0; } + + /** + * 获取有效的Token + * + * @param configId 配置ID + * @return 有效的Token信息 + */ + @Override + public SysErpTokenVo getValidToken(Long configId) { + // 1. 获取现有token + SysErpTokenVo token = getTokenByConfigId(configId); + + // 2. 检查token是否有效 + if (!isTokenValid(configId)) { + // 3. 刷新token + refreshToken(configId); + // 4. 重新获取token + token = getTokenByConfigId(configId); + } + + return token; + } + + /** + * 刷新Token + * + * @param configId 配置ID + * @return 是否刷新成功 + */ + @Transactional(rollbackFor = Exception.class) + public Boolean refreshToken(Long configId) { + // 1. 获取ERP配置信息 + SysErpConfigVo config = configService.queryById(configId); + if (config == null) { + throw new ServiceException("ERP配置不存在"); + } + + // 2. 获取现有token记录 + SysErpTokenVo existingToken = getTokenByConfigId(configId); + if (existingToken == null) { + throw new ServiceException("Token记录不存在"); + } + + // 3. 调用ERP系统的token刷新接口 + String newToken = refreshTokenFromErp(config); + + // 4. 直接使用Mapper更新数据库 + SysErpToken update = new SysErpToken(); + update.setTokenId(existingToken.getTokenId()); + update.setAccessToken(newToken); + update.setExpireTime(DateUtils.addSeconds(new Date(), existingToken.getExpiresIn().intValue())); + + return baseMapper.updateById(update) > 0; + } + + /** + * 检查Token是否有效 + * + * @param configId 配置ID + * @return 是否有效 + */ + public Boolean isTokenValid(Long configId) { + SysErpTokenVo token = getTokenByConfigId(configId); + if (token == null) { + return false; + } + + // 检查token是否过期 + if (token.getExpireTime() == null || token.getExpireTime().before(new Date())) { + return false; + } + + // 预留5分钟缓冲时间 + return DateUtils.addMinutes(token.getExpireTime(), -5).after(new Date()); + } + + /** + * 根据配置ID获取Token + * + * @param configId 配置ID + * @return Token信息 + */ + @Override + public SysErpTokenVo getTokenByConfigId(Long configId) { + SysErpTokenBo bo = new SysErpTokenBo(); + bo.setConfigId(configId); + List list = queryList(bo); + return list.isEmpty() ? null : list.get(0); + } + + /** + * 从ERP系统刷新Token + * + * @param config ERP配置信息 + * @return 新的Token + */ + private String refreshTokenFromErp(SysErpConfigVo config) { + // 用友U8的API中刷新token和获取token使用同一个接口 + return ErpApiUtils.getErpToken(config); + } + } diff --git a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/snailjob/ErpApiJobExecutor.java b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/snailjob/ErpApiJobExecutor.java new file mode 100644 index 0000000..85b565b --- /dev/null +++ b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/snailjob/ErpApiJobExecutor.java @@ -0,0 +1,72 @@ +package org.dromara.api.snailjob; + +import com.aizuda.snailjob.client.job.core.annotation.JobExecutor; +import com.aizuda.snailjob.client.job.core.dto.JobArgs; +import com.aizuda.snailjob.client.model.ExecuteResult; +import com.aizuda.snailjob.common.core.util.JsonUtil; +import com.aizuda.snailjob.common.log.SnailJobLog; +import org.dromara.api.service.ISysErpMappingService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * ERP接口同步定时任务执行器 + * + * @author Yinq + * @date 2025-03-26 + */ +@Component +@JobExecutor(name = "erpApiJobExecutor") +public class ErpApiJobExecutor { + + @Autowired + private ISysErpMappingService mappingService; + + /** + * 执行定时任务 + * + * @param jobArgs 任务参数 + * @return 执行结果 + */ + public ExecuteResult jobExecute(JobArgs jobArgs) { + try { + // 1. 获取任务参数 + Object jobParams = jobArgs.getJobParams(); + if (jobParams == null) { + throw new IllegalArgumentException("任务参数不能为空"); + } + + // 2. 解析参数 + Map params; + if (jobParams instanceof Map) { + params = (Map) jobParams; + } else if (jobParams instanceof String) { + params = JsonUtil.parseObject((String) jobParams, Map.class); + } else { + params = JsonUtil.parseObject(JsonUtil.toJsonString(jobParams), Map.class); + } + + // 3. 获取映射ID + Object mappingIdObj = params.get("mappingId"); + if (mappingIdObj == null) { + throw new IllegalArgumentException("mappingId不能为空"); + } + Long mappingId = Long.valueOf(String.valueOf(mappingIdObj)); + + // 4. 调用ERP接口 + SnailJobLog.LOCAL.info("开始同步ERP接口数据,mappingId:{},参数:{}", mappingId, JsonUtil.toJsonString(params)); + Map result = mappingService.callErpApiById(mappingId, params); + + // 5. 记录执行结果 + SnailJobLog.LOCAL.info("ERP接口数据同步完成,mappingId:{},结果:{}", mappingId, JsonUtil.toJsonString(result)); + return ExecuteResult.success("ERP接口数据同步成功"); + + } catch (Exception e) { + // 6. 记录错误信息 + SnailJobLog.LOCAL.error("ERP接口数据同步失败:{}", e.getMessage()); + return ExecuteResult.failure("ERP接口数据同步失败:" + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/utils/ErpApiUtils.java b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/utils/ErpApiUtils.java new file mode 100644 index 0000000..d88f35a --- /dev/null +++ b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/utils/ErpApiUtils.java @@ -0,0 +1,222 @@ +package org.dromara.api.utils; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import lombok.extern.slf4j.Slf4j; +import org.dromara.api.domain.vo.SysErpConfigVo; +import org.dromara.common.core.exception.ServiceException; +import org.springframework.util.StringUtils; + +import java.util.Map; + +/** + * ERP接口工具类 + * + * @Author YinQ + * @create 2024-03-27 10:52 + */ +@Slf4j +public class ErpApiUtils { + + /** + * ERP类型常量 + */ + public static final String ERP_TYPE_K3 = "0"; // K3 + public static final String ERP_TYPE_U8 = "1"; // U8 + public static final String ERP_TYPE_SAP = "2"; // SAP + + /** + * 发送HTTP请求 + * + * @param url 请求地址 + * @param method 请求方法 + * @param headers 请求头 + * @param params 请求参数 + * @return 响应结果 + */ + public static String sendHttpRequest(String url, String method, Map headers, Map params) { + try { + HttpRequest request = null; + switch (method.toUpperCase()) { + case "GET": + request = HttpRequest.get(url); + break; + case "POST": + request = HttpRequest.post(url); + break; + case "PUT": + request = HttpRequest.put(url); + break; + case "DELETE": + request = HttpRequest.delete(url); + break; + default: + throw new ServiceException("不支持的请求方法:" + method); + } + + // 设置请求头 + if (headers != null) { + headers.forEach(request::header); + } + + // 设置请求参数 + if (params != null) { + if ("GET".equalsIgnoreCase(method)) { + params.forEach(request::form); + } else { + request.body(JSONUtil.toJsonStr(params)); + } + } + + // 发送请求 + HttpResponse response = request.execute(); + + // 检查响应状态 + if (!response.isOk()) { + throw new ServiceException("HTTP请求失败,状态码:" + response.getStatus()); + } + + return response.body(); + } catch (Exception e) { + log.error("HTTP请求异常", e); + throw new ServiceException("HTTP请求异常:" + e.getMessage()); + } + } + + /** + * 获取ERP Token + * + * @param config ERP配置信息 + * @return Token信息 + */ + public static String getErpToken(SysErpConfigVo config) { + if (config == null) { + throw new ServiceException("ERP配置信息不能为空"); + } + + String erpType = config.getErpType(); + if (StringUtils.isEmpty(erpType)) { + throw new ServiceException("ERP类型不能为空"); + } + + switch (erpType) { + case ERP_TYPE_K3: + return getK3Token(config); + case ERP_TYPE_U8: + return getU8Token(config); + case ERP_TYPE_SAP: + return getSapToken(config); + default: + throw new ServiceException("不支持的ERP类型:" + erpType); + } + } + + /** + * 获取K3 Token + * + * @param config ERP配置信息 + * @return Token信息 + */ + private static String getK3Token(SysErpConfigVo config) { + return null; + } + + /** + * 获取U8 Token + * + * @param config ERP配置信息 + * @return Token信息 + */ + private static String getU8Token(SysErpConfigVo config) { + // 构建请求参数 + Map params = Map.of( + "app_key", config.getAppKey(), + "app_secret", config.getAppSecret() + ); + + // 发送请求获取token + String response = sendHttpRequest( + config.getTokenUrl(), + "GET", + null, + params + ); + + // 解析响应结果 + JSONObject result = JSONUtil.parseObj(response); + + // 检查错误码 + String errcode = result.getStr("errcode"); + if (!"0".equals(errcode)) { + String errmsg = result.getStr("errmsg"); + throw new ServiceException("获取U8 Token失败:" + errmsg); + } + + // 获取token信息 + JSONObject tokenInfo = result.getJSONObject("token"); + if (tokenInfo == null) { + throw new ServiceException("获取U8 Token失败:返回数据格式错误"); + } + + return tokenInfo.getStr("id"); + } + + /** + * 获取SAP Token + * + * @param config ERP配置信息 + * @return Token信息 + */ + private static String getSapToken(SysErpConfigVo config) { + return null; + } + + /** + * 调用ERP接口 + * + * @param config ERP配置信息 + * @param token 访问令牌 + * @param apiUrl 接口地址 + * @param method 请求方法 + * @param params 请求参数 + * @return 响应结果 + */ + public static String callErpApi(SysErpConfigVo config, String token, String apiUrl, String method, Map params) { + if (config == null) { + throw new ServiceException("ERP配置信息不能为空"); + } + + if (StringUtils.isEmpty(token)) { + throw new ServiceException("访问令牌不能为空"); + } + + // 构建完整URL + String fullUrl = StrUtil.format("{}{}", config.getServerUrl(), apiUrl); + + // 构建请求头 + Map headers = Map.of( + "Authorization", "Bearer " + token, + "Content-Type", "application/json" + ); + + // 发送请求 + String response = sendHttpRequest(fullUrl, method, headers, params); + + // 解析响应结果 + JSONObject result = JSONUtil.parseObj(response); + + // 检查错误码 + String errcode = result.getStr("errcode"); + if (!"0".equals(errcode)) { + String errmsg = result.getStr("errmsg"); + throw new ServiceException("调用ERP接口失败:" + errmsg); + } + + return response; + } + + +} diff --git a/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/utils/ErpMappingUtils.java b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/utils/ErpMappingUtils.java new file mode 100644 index 0000000..812ef8f --- /dev/null +++ b/ruoyi-modules/hwmom-api/src/main/java/org/dromara/api/utils/ErpMappingUtils.java @@ -0,0 +1,134 @@ +package org.dromara.api.utils; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import lombok.extern.slf4j.Slf4j; +import org.dromara.api.domain.SysErpMapping; +import org.dromara.api.domain.vo.SysErpConfigVo; +import org.dromara.common.core.exception.ServiceException; + +import java.util.Map; + +/** + * ERP接口映射工具类 + * + * @Author YinQ + * @create 2024-03-27 10:52 + */ +@Slf4j +public class ErpMappingUtils { + + /** + * 构建ERP请求参数 + * + * @param mapping 接口映射配置 + * @param localParams 本地请求参数 + * @return ERP请求参数 + */ + public static Map buildErpParams(SysErpMapping mapping, Map localParams) { + try { + // 1. 获取ERP参数模板 + String erpParams = mapping.getErpParams(); + if (StrUtil.isEmpty(erpParams)) { + return localParams; + } + + // 2. 解析参数模板 + JSONObject template = JSONUtil.parseObj(erpParams); + + // 3. 根据字段映射转换参数 + JSONObject result = new JSONObject(); + template.forEach((key, value) -> { + if (value instanceof String) { + String localKey = (String) value; + if (localParams.containsKey(localKey)) { + result.put(key, localParams.get(localKey)); + } + } else { + result.put(key, value); + } + }); + + return result.toBean(Map.class); + } catch (Exception e) { + log.error("构建ERP请求参数失败", e); + throw new ServiceException("构建ERP请求参数失败:" + e.getMessage()); + } + } + + /** + * 转换ERP响应数据 + * + * @param mapping 接口映射配置 + * @param erpResponse ERP响应数据 + * @return 本地响应数据 + */ + public static Map convertErpResponse(SysErpMapping mapping, String erpResponse) { + try { + // 1. 解析ERP响应数据 + JSONObject erpData = JSONUtil.parseObj(erpResponse); + + // 2. 获取字段映射关系 + String fieldMapping = mapping.getFieldMapping(); + if (StrUtil.isEmpty(fieldMapping)) { + return erpData.toBean(Map.class); + } + + // 3. 解析字段映射 + JSONObject mappingConfig = JSONUtil.parseObj(fieldMapping); + + // 4. 转换数据 + JSONObject result = new JSONObject(); + mappingConfig.forEach((localKey, erpKey) -> { + if (erpKey instanceof String) { + String key = (String) erpKey; + if (erpData.containsKey(key)) { + result.put(localKey, erpData.get(key)); + } + } + }); + + return result.toBean(Map.class); + } catch (Exception e) { + log.error("转换ERP响应数据失败", e); + throw new ServiceException("转换ERP响应数据失败:" + e.getMessage()); + } + } + + /** + * 调用ERP接口 + * + * @param mapping 接口映射配置 + * @param config ERP配置信息 + * @param localParams 本地请求参数 + * @return 本地响应数据 + */ + public static Map callErpApi(SysErpMapping mapping, SysErpConfigVo config, Map localParams) { + try { + // 1. 构建ERP请求参数 + Map erpParams = buildErpParams(mapping, localParams); + + // 2. 获取token(如果需要) + String token = null; + if ("1".equals(mapping.getNeedToken())) { + token = ErpApiUtils.getErpToken(config); + } + + // 3. 调用ERP接口 + String response = ErpApiUtils.callErpApi( + config, + token, + mapping.getErpApiUrl(), + mapping.getErpMethod(), + erpParams + ); + + // 4. 转换响应数据 + return convertErpResponse(mapping, response); + } catch (Exception e) { + log.error("调用ERP接口失败", e); + throw new ServiceException("调用ERP接口失败:" + e.getMessage()); + } + } +} \ No newline at end of file