diff --git a/src/main/java/com/glxp/api/config/TaskPoolConfig.java b/src/main/java/com/glxp/api/config/TaskPoolConfig.java new file mode 100644 index 000000000..06f722079 --- /dev/null +++ b/src/main/java/com/glxp/api/config/TaskPoolConfig.java @@ -0,0 +1,38 @@ +package com.glxp.api.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 配置线程池 + */ +@Configuration +@EnableAsync +public class TaskPoolConfig { + + @Bean(name = "taskExecutor") + public ThreadPoolTaskExecutor taskExecutor() { + // 获取当前主机的cpu核心数 + int threadCount = Runtime.getRuntime().availableProcessors(); + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + //核心池的大小 + taskExecutor.setCorePoolSize(threadCount); + //线程池最大线程数 + taskExecutor.setMaxPoolSize(threadCount * 2); + //队列最大长度 + taskExecutor.setQueueCapacity(200); + //线程空闲时间 + taskExecutor.setKeepAliveSeconds(60); + //配置线程前缀 + taskExecutor.setThreadNamePrefix("custom_executor"); + //配置拒绝策略 + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + //执行初始化 + taskExecutor.initialize(); + return taskExecutor; + } +} diff --git a/src/main/java/com/glxp/api/constant/BasicExportStatusEnum.java b/src/main/java/com/glxp/api/constant/BasicExportStatusEnum.java new file mode 100644 index 000000000..2f5c908ff --- /dev/null +++ b/src/main/java/com/glxp/api/constant/BasicExportStatusEnum.java @@ -0,0 +1,25 @@ +package com.glxp.api.constant; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum BasicExportStatusEnum { + + /** + * 接收失败 + */ + FAILED(1, "接收失败"), + + /** + * 接收成功 + */ + SUCCESS(2, "接收成功"), + ; + @EnumValue + private Integer code; + + private String remark; +} diff --git a/src/main/java/com/glxp/api/constant/BasicExportStatusTimeEnum.java b/src/main/java/com/glxp/api/constant/BasicExportStatusTimeEnum.java new file mode 100644 index 000000000..93438257d --- /dev/null +++ b/src/main/java/com/glxp/api/constant/BasicExportStatusTimeEnum.java @@ -0,0 +1,60 @@ +package com.glxp.api.constant; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum BasicExportStatusTimeEnum { + + /** + * 耗材字典 + */ + BASIC_PRODUCTS("basic_products", "耗材字典"), + + /** + * 往来单位字典 + */ + BASIC_CORP("basic_corp", "往来单位字典"), + + /** + * 国家库DI数据 + */ + DB_DI_PRODUCTS("db_di_products", "国家库DI数据"), + + /** + * 首营资质 + */ + SUP_CERT("sup_cert", "首营资质"), + + /** + * UDI码补齐 + */ + IO_CODE_LOST("io_code_lost", "UDI码补齐"), + + /** + * UDI码关联关系 + */ + IO_CODE_REL("io_code_rel", "UDI码关联关系"), + + /** + * 业务单据类型 + */ + BASIC_BUSSINESS_TYPE("basic_bussiness_type","扫码单据类型"), + + /** + * 扫码单据类型 + */ + BASIC_BUSTYPE_CHANGE("basic_bustype_change","业务单据类型"), + + /** + * 业务单据类型 + */ + THR_BUSTYPE_ORIGIN("thr_bustype_origin","第三方单据类型"), + ; + @EnumValue + private String key; + + private String remark; +} diff --git a/src/main/java/com/glxp/api/constant/BasicExportTypeEnum.java b/src/main/java/com/glxp/api/constant/BasicExportTypeEnum.java index 4740ad1ad..bf7a40bc4 100644 --- a/src/main/java/com/glxp/api/constant/BasicExportTypeEnum.java +++ b/src/main/java/com/glxp/api/constant/BasicExportTypeEnum.java @@ -15,7 +15,12 @@ public enum BasicExportTypeEnum { /** * 国家库DI数据 */ -// COUNTRY_DI_DATA("country_di_data", "国家库DI数据"), + COUNTRY_DI_DATA("country_di_data", "国家库DI数据"), + + /** + * 单据类型 + */ + DOCUMENT_TYPE("document_type", "单据类型"), /** * 其他数据 diff --git a/src/main/java/com/glxp/api/dao/sync/BasicExportTimeDao.java b/src/main/java/com/glxp/api/dao/sync/BasicExportTimeDao.java index aa615cca7..a396c24ab 100644 --- a/src/main/java/com/glxp/api/dao/sync/BasicExportTimeDao.java +++ b/src/main/java/com/glxp/api/dao/sync/BasicExportTimeDao.java @@ -1,5 +1,6 @@ package com.glxp.api.dao.sync; +import com.glxp.api.dao.BaseMapperPlus; import com.glxp.api.entity.sync.BasicExportStatusTimeEntity; import com.glxp.api.req.sync.BasicExportTimeRequest; import org.apache.ibatis.annotations.Mapper; @@ -7,7 +8,7 @@ import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper -public interface BasicExportTimeDao { +public interface BasicExportTimeDao extends BaseMapperPlus { List filterExportStatus(BasicExportTimeRequest basicExportStatusRequest); diff --git a/src/main/java/com/glxp/api/entity/sync/BasicExportStatusEntity.java b/src/main/java/com/glxp/api/entity/sync/BasicExportStatusEntity.java index 621b094a5..96eefbe77 100644 --- a/src/main/java/com/glxp/api/entity/sync/BasicExportStatusEntity.java +++ b/src/main/java/com/glxp/api/entity/sync/BasicExportStatusEntity.java @@ -2,9 +2,16 @@ package com.glxp.api.entity.sync; import java.util.Date; +import com.glxp.api.constant.BasicExportStatusEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; @Data +@AllArgsConstructor +@NoArgsConstructor +@Builder public class BasicExportStatusEntity { private String id; @@ -19,8 +26,8 @@ public class BasicExportStatusEntity { private String cacheFilePath; /** - * 接收状态 -1:接收失败 0:等待接收 1:接收成功 + * 接收状态 1:接收失败 2:接收成功 */ - private String receiveStatus; + private Integer receiveStatus; } diff --git a/src/main/java/com/glxp/api/entity/sync/BasicExportStatusTimeEntity.java b/src/main/java/com/glxp/api/entity/sync/BasicExportStatusTimeEntity.java index fc5164266..b044f812d 100644 --- a/src/main/java/com/glxp/api/entity/sync/BasicExportStatusTimeEntity.java +++ b/src/main/java/com/glxp/api/entity/sync/BasicExportStatusTimeEntity.java @@ -1,8 +1,14 @@ package com.glxp.api.entity.sync; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; @Data +@AllArgsConstructor +@NoArgsConstructor +@Builder public class BasicExportStatusTimeEntity { private Integer id; diff --git a/src/main/java/com/glxp/api/http/sync/SpGetHttpClient.java b/src/main/java/com/glxp/api/http/sync/SpGetHttpClient.java index be720400d..1cd42e2c0 100644 --- a/src/main/java/com/glxp/api/http/sync/SpGetHttpClient.java +++ b/src/main/java/com/glxp/api/http/sync/SpGetHttpClient.java @@ -13,6 +13,7 @@ import com.glxp.api.req.inout.ReviewFinishRequest; import com.glxp.api.req.inout.ReviewSpmsRequest; import com.glxp.api.req.sync.BasicExportStatusRequest; import com.glxp.api.req.sync.OrderStatusFilterRequest; +import com.glxp.api.req.sync.SyncUpLoadRequest; import com.glxp.api.res.PageSimpleResponse; import com.glxp.api.res.sync.*; import com.glxp.api.res.system.SyncDataSetResponse; @@ -51,6 +52,13 @@ public class SpGetHttpClient { return headers; } + public BaseResponse postData(BasicExportTypeEnum exportType, Object data) { + SyncUpLoadRequest build = SyncUpLoadRequest.builder().exportType(exportType).data(data).build(); + String result = okHttpCli.doPostJson(getIpUrl() + "sps/sync/upload/data", JSONUtil.toJsonStr(build), buildHeader()); + return JSONObject.parseObject(result, new TypeReference>() { + }); + } + //上传扫码单据 public BaseResponse postAllOrder(SpsSyncOrderResponse spsSyncOrderResponse) { diff --git a/src/main/java/com/glxp/api/req/sync/SyncUpLoadRequest.java b/src/main/java/com/glxp/api/req/sync/SyncUpLoadRequest.java new file mode 100644 index 000000000..37baf9281 --- /dev/null +++ b/src/main/java/com/glxp/api/req/sync/SyncUpLoadRequest.java @@ -0,0 +1,19 @@ +package com.glxp.api.req.sync; + +import com.glxp.api.constant.BasicExportTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class SyncUpLoadRequest { + + private BasicExportTypeEnum exportType; + + private Object data; + +} diff --git a/src/main/java/com/glxp/api/service/basic/IBasicBusTypeChangeService.java b/src/main/java/com/glxp/api/service/basic/IBasicBusTypeChangeService.java index b8cbac5eb..887e373b4 100644 --- a/src/main/java/com/glxp/api/service/basic/IBasicBusTypeChangeService.java +++ b/src/main/java/com/glxp/api/service/basic/IBasicBusTypeChangeService.java @@ -1,5 +1,6 @@ package com.glxp.api.service.basic; +import com.baomidou.mybatisplus.extension.service.IService; import com.glxp.api.entity.basic.BasicBusTypeChangeEntity; import com.glxp.api.req.basic.FilterBusTypeChangeRequest; import com.glxp.api.res.basic.BasicBusTypeChangeResponse; @@ -10,7 +11,7 @@ import java.util.List; /** * 单据生成设置Service */ -public interface IBasicBusTypeChangeService { +public interface IBasicBusTypeChangeService extends IService { BasicBusTypeChangeEntity selectByOriginAction(String action); diff --git a/src/main/java/com/glxp/api/service/basic/IBasicBussinessTypeService.java b/src/main/java/com/glxp/api/service/basic/IBasicBussinessTypeService.java index 6eb767322..933cf2bb4 100644 --- a/src/main/java/com/glxp/api/service/basic/IBasicBussinessTypeService.java +++ b/src/main/java/com/glxp/api/service/basic/IBasicBussinessTypeService.java @@ -1,5 +1,6 @@ package com.glxp.api.service.basic; +import com.baomidou.mybatisplus.extension.service.IService; import com.glxp.api.entity.basic.BasicBussinessTypeEntity; import com.glxp.api.req.basic.FilterBussinessTypeRequest; import com.glxp.api.res.basic.BasicBussinessTypeResponse; @@ -10,7 +11,7 @@ import java.util.List; /** * 单据类型Service */ -public interface IBasicBussinessTypeService { +public interface IBasicBussinessTypeService extends IService { /** * 查询单据类型列表 diff --git a/src/main/java/com/glxp/api/service/basic/impl/BasicBusTypeChangeServiceImpl.java b/src/main/java/com/glxp/api/service/basic/impl/BasicBusTypeChangeServiceImpl.java index 7812a8b36..72dfa7b1a 100644 --- a/src/main/java/com/glxp/api/service/basic/impl/BasicBusTypeChangeServiceImpl.java +++ b/src/main/java/com/glxp/api/service/basic/impl/BasicBusTypeChangeServiceImpl.java @@ -2,6 +2,7 @@ package com.glxp.api.service.basic.impl; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.pagehelper.PageHelper; import com.glxp.api.dao.basic.BasicBusTypeChangeDao; import com.glxp.api.entity.basic.BasicBusTypeChangeEntity; @@ -21,7 +22,7 @@ import java.util.List; @Slf4j @Service @Transactional(rollbackFor = Exception.class) -public class BasicBusTypeChangeServiceImpl implements IBasicBusTypeChangeService { +public class BasicBusTypeChangeServiceImpl extends ServiceImpl implements IBasicBusTypeChangeService { @Resource private CustomerService customerService; diff --git a/src/main/java/com/glxp/api/service/basic/impl/BasicBussinessTypeServiceImpl.java b/src/main/java/com/glxp/api/service/basic/impl/BasicBussinessTypeServiceImpl.java index 981bcaa08..717fa7ecf 100644 --- a/src/main/java/com/glxp/api/service/basic/impl/BasicBussinessTypeServiceImpl.java +++ b/src/main/java/com/glxp/api/service/basic/impl/BasicBussinessTypeServiceImpl.java @@ -3,6 +3,7 @@ package com.glxp.api.service.basic.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.pagehelper.PageHelper; import com.glxp.api.constant.Constant; import com.glxp.api.constant.ConstantStatus; @@ -27,7 +28,7 @@ import java.util.stream.Collectors; @Slf4j @Service @Transactional(rollbackFor = Exception.class) -public class BasicBussinessTypeServiceImpl implements IBasicBussinessTypeService { +public class BasicBussinessTypeServiceImpl extends ServiceImpl implements IBasicBussinessTypeService { @Resource private CustomerService customerService; diff --git a/src/main/java/com/glxp/api/service/sync/BasicExportTimeService.java b/src/main/java/com/glxp/api/service/sync/BasicExportTimeService.java index 3147fc9ef..a9cbac902 100644 --- a/src/main/java/com/glxp/api/service/sync/BasicExportTimeService.java +++ b/src/main/java/com/glxp/api/service/sync/BasicExportTimeService.java @@ -2,12 +2,13 @@ package com.glxp.api.service.sync; +import com.baomidou.mybatisplus.extension.service.IService; import com.glxp.api.entity.sync.BasicExportStatusTimeEntity; import com.glxp.api.req.sync.BasicExportTimeRequest; import java.util.List; -public interface BasicExportTimeService { +public interface BasicExportTimeService extends IService { BasicExportStatusTimeEntity findByKey(String key); diff --git a/src/main/java/com/glxp/api/service/sync/HeartService.java b/src/main/java/com/glxp/api/service/sync/HeartService.java index e7d385125..800eaa7fc 100644 --- a/src/main/java/com/glxp/api/service/sync/HeartService.java +++ b/src/main/java/com/glxp/api/service/sync/HeartService.java @@ -3,17 +3,14 @@ package com.glxp.api.service.sync; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.lang.Dict; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; -import com.glxp.api.common.enums.ResultEnum; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.glxp.api.common.res.BaseResponse; import com.glxp.api.common.util.ResultVOUtils; -import com.glxp.api.constant.BasicExportTypeEnum; -import com.glxp.api.constant.BasicProcessStatus; -import com.glxp.api.constant.ConstantStatus; +import com.glxp.api.constant.*; import com.glxp.api.dao.basic.*; import com.glxp.api.dao.inout.IoCodeLostMapper; import com.glxp.api.dao.inout.IoCodeRelMapper; @@ -25,13 +22,19 @@ import com.glxp.api.entity.purchase.*; import com.glxp.api.entity.sync.BasicDownloadStatusEntity; import com.glxp.api.entity.sync.BasicExportStatusEntity; import com.glxp.api.entity.sync.BasicExportStatusTimeEntity; +import com.glxp.api.entity.system.SyncDataBustypeEntity; +import com.glxp.api.entity.system.SyncDataSetEntity; +import com.glxp.api.entity.thrsys.ThrBusTypeOriginEntity; import com.glxp.api.http.sync.SpGetHttpClient; import com.glxp.api.req.sync.SpsSyncDataRequest; import com.glxp.api.res.sync.*; +import com.glxp.api.service.basic.IBasicBusTypeChangeService; +import com.glxp.api.service.basic.IBasicBussinessTypeService; import com.glxp.api.service.inout.*; +import com.glxp.api.service.thrsys.IThrBusTypeOriginService; import com.glxp.api.util.CustomUtil; import com.glxp.api.util.DateUtil; -import com.glxp.api.util.JsonUtils; +import com.glxp.api.util.RedisUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.session.ExecutorType; @@ -44,8 +47,8 @@ import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.io.IOException; import java.util.*; +import java.util.function.Function; @Slf4j @Service @@ -199,6 +202,422 @@ public class HeartService { return ResultVOUtils.success(); } + private final RedisUtil redisUtil; + + + @Transactional + public void chooseData(SyncDataSetEntity info, Date syncTime, BasicExportTypeEnum exportType) { + + Date now = new Date(); + String taskId = CustomUtil.getId(); + switch (exportType) { + case BASIC_DATA: + if (needExec(info.getBasicProducts(), info.getBasicCorp(), info.getSupCert())) { + uploadData(exportType, taskId, x -> x.getBasicData(info, taskId, now, syncTime)); + } + break; + case OTHER_DATA: + if (needExec(info.getUdiCodeLost(), info.getUdiCodeRel())) { + uploadData(exportType, taskId, x -> x.getOtherData(info, taskId, now, syncTime)); + } + break; + case DOCUMENT_TYPE: + if (needExec(info.getTypeBus(), info.getTypeScan(), info.getTypeThird())) { + uploadData(exportType, taskId, x -> x.getDocumentTypeData(info, taskId, now, syncTime)); + } + break; + case COUNTRY_DI_DATA: + } + } + + + /** + * 获取基础数据模块数据 + * + * @param info 同步设置 + * @param now 当前时间 + * @param syncTime 同步时间 -- 传入时不操作exportTime表 + * @return + */ + public SpsSyncBasicDataResponse getBasicData(SyncDataSetEntity info, String taskId, Date now, Date syncTime) { + SpsSyncBasicDataResponse dataResponse = null; + Map syncTimeMap = new WeakHashMap<>(3); + syncTimeMap.put("isNew", true); + syncTimeMap.put("oldDate", syncTime); + //确认有开启物资字典同步 + if (needExec(info.getBasicProducts())) { + Map map; + if (syncTime == null) { + map = basicExportStatusTimeInfo(now, BasicExportStatusTimeEnum.BASIC_PRODUCTS); + } else { + map = syncTimeMap; + } + List hospTypeList = basicHospTypeDao.selectList(Wrappers.lambdaQuery(BasicHospTypeEntity.class) + .le((boolean) map.get("isNew"), BasicHospTypeEntity::getUpdateTime, now) + .between(!(boolean) map.get("isNew"), BasicHospTypeEntity::getUpdateTime + , map.get("oldDate"), now) + ); + if (CollectionUtil.isNotEmpty(hospTypeList)) { + dataResponse = new SpsSyncBasicDataResponse(); + dataResponse.setHospTypeList(hospTypeList); + } + List udiRelevanceList = udiRelevanceDao.selectList(Wrappers.lambdaQuery(UdiRelevanceEntity.class) + .le((boolean) map.get("isNew"), UdiRelevanceEntity::getUpdateTime, now) + .between(!(boolean) map.get("isNew"), UdiRelevanceEntity::getUpdateTime + , map.get("oldDate"), now) + ); + if (CollectionUtil.isNotEmpty(udiRelevanceList)) { + if (dataResponse == null) { + dataResponse = new SpsSyncBasicDataResponse(); + } + dataResponse.setUdiRelevanceList(udiRelevanceList); + } + List productsList = basicProductsDao.selectList(Wrappers.lambdaQuery(BasicProductsEntity.class) + .le((boolean) map.get("isNew"), BasicProductsEntity::getUpdateTime, now) + .between(!(boolean) map.get("isNew"), BasicProductsEntity::getUpdateTime + , map.get("oldDate"), now) + ); + if (CollectionUtil.isNotEmpty(productsList)) { + if (dataResponse == null) { + dataResponse = new SpsSyncBasicDataResponse(); + } + dataResponse.setProductsList(productsList); + } + List relevanceList = relevanceDao.selectList(Wrappers.lambdaQuery(CompanyProductRelevanceEntity.class) + .le((boolean) map.get("isNew"), CompanyProductRelevanceEntity::getUpdateTime, now) + .between(!(boolean) map.get("isNew"), CompanyProductRelevanceEntity::getUpdateTime + , map.get("oldDate"), now) + ); + if (CollectionUtil.isNotEmpty(relevanceList)) { + if (dataResponse == null) { + dataResponse = new SpsSyncBasicDataResponse(); + } + dataResponse.setRelevanceList(relevanceList); + } + } + //确认有开启往来单位字典同步 + if (needExec(info.getBasicCorp())) { + Map map; + if (syncTime == null) { + map = basicExportStatusTimeInfo(now, BasicExportStatusTimeEnum.BASIC_CORP); + } else { + map = syncTimeMap; + } + List corpList = corpDao.selectList(Wrappers.lambdaQuery(BasicCorpEntity.class) + .le((boolean) map.get("isNew"), BasicCorpEntity::getUpdateTime, now) + .between(!(boolean) map.get("isNew"), BasicCorpEntity::getUpdateTime + , map.get("oldDate"), now) + ); + if (CollectionUtil.isNotEmpty(corpList)) { + if (dataResponse == null) { + dataResponse = new SpsSyncBasicDataResponse(); + } + dataResponse.setCorpList(corpList); + } + } + + //确认有开启首营资质同步 + if (info.getSupCert() == 2) { + Map map; + if (syncTime == null) { + map = basicExportStatusTimeInfo(now, BasicExportStatusTimeEnum.SUP_CERT); + } else { + map = syncTimeMap; + } + List supCertList = supCertDao.selectList(Wrappers.lambdaQuery(SupCertEntity.class) + .le((boolean) map.get("isNew"), SupCertEntity::getUpdateTime, now) + .between(!(boolean) map.get("isNew"), SupCertEntity::getUpdateTime + , map.get("oldDate"), now) + ); + if (CollectionUtil.isNotEmpty(supCertList)) { + if (dataResponse == null) { + dataResponse = new SpsSyncBasicDataResponse(); + } + dataResponse.setSupCertList(supCertList); + } + List supCertSetList = supCertSetDao.selectList(Wrappers.lambdaQuery(SupCertSetEntity.class) + .le((boolean) map.get("isNew"), SupCertSetEntity::getUpdateTime, now) + .between(!(boolean) map.get("isNew"), SupCertSetEntity::getUpdateTime + , map.get("oldDate"), now) + ); + if (CollectionUtil.isNotEmpty(supCertSetList)) { + if (dataResponse == null) { + dataResponse = new SpsSyncBasicDataResponse(); + } + dataResponse.setSupCertSetList(supCertSetList); + } + List supCompanyList = supCompanyDao.selectList(Wrappers.lambdaQuery(SupCompanyEntity.class) + .le((boolean) map.get("isNew"), SupCompanyEntity::getUpdateTime, now) + .between(!(boolean) map.get("isNew"), SupCompanyEntity::getUpdateTime + , map.get("oldDate"), now) + ); + if (CollectionUtil.isNotEmpty(supCompanyList)) { + if (dataResponse == null) { + dataResponse = new SpsSyncBasicDataResponse(); + } + dataResponse.setSupCompanyList(supCompanyList); + } + List supManufacturerList = supManufacturerDao.selectList(Wrappers.lambdaQuery(SupManufacturerEntity.class) + .le((boolean) map.get("isNew"), SupManufacturerEntity::getUpdateTime, now) + .between(!(boolean) map.get("isNew"), SupManufacturerEntity::getUpdateTime + , map.get("oldDate"), now) + ); + if (CollectionUtil.isNotEmpty(supManufacturerList)) { + if (dataResponse == null) { + dataResponse = new SpsSyncBasicDataResponse(); + } + dataResponse.setSupManufacturerList(supManufacturerList); + } + List supProductList = supProductDao.selectList(Wrappers.lambdaQuery(SupProductEntity.class) + .le((boolean) map.get("isNew"), SupProductEntity::getUpdateTime, now) + .between(!(boolean) map.get("isNew"), SupProductEntity::getUpdateTime + , map.get("oldDate"), now) + ); + if (CollectionUtil.isNotEmpty(supProductList)) { + if (dataResponse == null) { + dataResponse = new SpsSyncBasicDataResponse(); + } + dataResponse.setSupProductList(supProductList); + } + + } + if (dataResponse != null) { + dataResponse.setTaskId(taskId); + } + + return dataResponse; + } + + + /** + * 获取其他数据模块数据 + * + * @param info 同步设置 + * @param now 当前时间 + * @param syncTime 同步时间 -- 传入时不操作exportTime表 + * @return + */ + public SpsSyncOtherDataResponse getOtherData(SyncDataSetEntity info, String taskId, Date now, Date syncTime) { + + SpsSyncOtherDataResponse dataResponse = null; + Map syncTimeMap = new WeakHashMap<>(3); + syncTimeMap.put("isNew", true); + syncTimeMap.put("oldDate", syncTime); + //确认有开启udi码补齐同步 + if (needExec(info.getUdiCodeLost())) { + Map map; + if (syncTime == null) { + map = basicExportStatusTimeInfo(now, BasicExportStatusTimeEnum.BASIC_PRODUCTS); + } else { + map = syncTimeMap; + } + List ioCodeLostList = ioCodeLostMapper.selectList(Wrappers.lambdaQuery(IoCodeLostEntity.class) + .le((boolean) map.get("isNew"), IoCodeLostEntity::getUpdateTime, now) + .between(!(boolean) map.get("isNew"), IoCodeLostEntity::getUpdateTime + , map.get("oldDate"), now) + ); + if (CollectionUtil.isNotEmpty(ioCodeLostList)) { + dataResponse = new SpsSyncOtherDataResponse(); + dataResponse.setIoCodeLostList(ioCodeLostList); + } + } + //确认有开启udi关联关系同步 + if (needExec(info.getUdiCodeRel())) { + Map map; + if (syncTime == null) { + map = basicExportStatusTimeInfo(now, BasicExportStatusTimeEnum.IO_CODE_REL); + } else { + map = syncTimeMap; + } + List ioCodeRelList = ioCodeRelMapper.selectList(Wrappers.lambdaQuery(IoCodeRelEntity.class) + .le((boolean) map.get("isNew"), IoCodeRelEntity::getUpdateTime, now) + .between(!(boolean) map.get("isNew"), IoCodeRelEntity::getUpdateTime + , map.get("oldDate"), now) + ); + if (CollectionUtil.isNotEmpty(ioCodeRelList)) { + if (dataResponse == null) { + dataResponse = new SpsSyncOtherDataResponse(); + } + dataResponse.setIoCodeRelList(ioCodeRelList); + } + } + if (dataResponse != null) { + dataResponse.setTaskId(taskId); + } + + return dataResponse; + } + + private final IBasicBussinessTypeService bussinessTypeService; + private final IBasicBusTypeChangeService busTypeChangeService; + private final IThrBusTypeOriginService thrBusTypeOriginService; + + /** + * 获取单据类型数据 + * + * @param info 同步设置 + * @param now 当前时间 + * @param syncTime 同步时间 -- 传入时不操作exportTime表 + * @return + */ + public SpsSyncBusResponse getDocumentTypeData(SyncDataSetEntity info, String taskId, Date now, Date syncTime) { + SpsSyncBusResponse dataResponse = null; + Map syncTimeMap = new WeakHashMap<>(3); + syncTimeMap.put("isNew", true); + syncTimeMap.put("oldDate", syncTime); + + //确认有开启业务单据类型同步 + if (needExec(info.getTypeBus())) { + Map map; + if (syncTime == null) { + map = basicExportStatusTimeInfo(now, BasicExportStatusTimeEnum.BASIC_BUSSINESS_TYPE); + } else { + map = syncTimeMap; + } + List bussinessTypeEntities = bussinessTypeService.list(Wrappers.lambdaQuery(BasicBussinessTypeEntity.class) + .le((boolean) map.get("isNew"), BasicBussinessTypeEntity::getUpdateTime, now) + .between(!(boolean) map.get("isNew"), BasicBussinessTypeEntity::getUpdateTime + , map.get("oldDate"), now) + ); + if (CollectionUtil.isNotEmpty(bussinessTypeEntities)) { + dataResponse = new SpsSyncBusResponse(); + dataResponse.setBussinessTypeEntities(bussinessTypeEntities); + } + } + + //确认有开启扫码单据类型同步 + if (needExec(info.getTypeScan())) { + Map map; + if (syncTime == null) { + map = basicExportStatusTimeInfo(now, BasicExportStatusTimeEnum.BASIC_BUSTYPE_CHANGE); + } else { + map = syncTimeMap; + } + List busTypeChangeList = busTypeChangeService.list(Wrappers.lambdaQuery(BasicBusTypeChangeEntity.class) + .le((boolean) map.get("isNew"), BasicBusTypeChangeEntity::getUpdateTime, now) + .between(!(boolean) map.get("isNew"), BasicBusTypeChangeEntity::getUpdateTime + , map.get("oldDate"), now) + ); + if (CollectionUtil.isNotEmpty(busTypeChangeList)) { + if(dataResponse==null){ + dataResponse = new SpsSyncBusResponse(); + } + dataResponse.setBusTypeChangeEntities(busTypeChangeList); + } + } + + //确认有开启第三方单据类型同步 + if (needExec(info.getTypeThird())) { + Map map; + if (syncTime == null) { + map = basicExportStatusTimeInfo(now, BasicExportStatusTimeEnum.THR_BUSTYPE_ORIGIN); + } else { + map = syncTimeMap; + } + List thrBusTypeOriginEntities = thrBusTypeOriginService.list(Wrappers.lambdaQuery(ThrBusTypeOriginEntity.class) + .le((boolean) map.get("isNew"), ThrBusTypeOriginEntity::getUpdateTime, now) + .between(!(boolean) map.get("isNew"), ThrBusTypeOriginEntity::getUpdateTime + , map.get("oldDate"), now) + ); + if (CollectionUtil.isNotEmpty(thrBusTypeOriginEntities)) { + if(dataResponse==null){ + dataResponse = new SpsSyncBusResponse(); + } + dataResponse.setThrBusTypeOriginEntities(thrBusTypeOriginEntities); + } + } + + if (dataResponse != null) { + dataResponse.setTaskId(taskId); + } + return dataResponse; + } + + /** + * 判断是否需要执行 由内向外 + * + * @param set 需要判断的数据 + * @return + */ + private boolean needExec(int... set) { + return CollectionUtil.contains(Collections.singleton(set), 1); + } + + public void uploadData(BasicExportTypeEnum exportType, String taskId, Function dataMethod) { + Integer status = BasicExportStatusEnum.SUCCESS.getCode(); + Object data = dataMethod.apply(this); + if (data == null) { + return; + } + BaseResponse baseResponse = spGetHttp.postData(exportType, data); + if (baseResponse.getCode() != 20000) { + status = BasicExportStatusEnum.FAILED.getCode(); + } + BasicExportStatusEntity exportStatus = BasicExportStatusEntity.builder() + .id(taskId) + .status(status) + .idDatas(exportType.getKey()) + .type(exportType.getRemark()) + .startTime(new Date()) + .endTime(new Date()) + .updateTime(new Date()) + .receiveStatus(status) + .scheduleType(BasicProcessStatus.SCHEDULE_NORMAL) + .build(); + this.insertExportStatus(exportStatus); + } + + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void insertExportStatus(BasicExportStatusEntity exportStatus) { + basicExportService.insertExportStatus(exportStatus); + } + + + /** + * 插入 basicExportStatusTime表 + * + * @param date 当前时间 + * @param exportStatusTimeEnum key枚举 + * @return 最后一次同步时间 返回值需与参数 date 比较,判断是否相等 + * @throws Exception + */ + public Map basicExportStatusTimeInfo(Date date, BasicExportStatusTimeEnum exportStatusTimeEnum) { + //防止出现同时调用问题 + String redisKey = String.format("spsm-sync-task:%s", exportStatusTimeEnum.getKey()); + boolean result = redisUtil.setIfAbsent(redisKey, 1, 10); + if (!result) { + String errorMsg = String.format("syncIdcSps----process------------同步[%s]重复进入", exportStatusTimeEnum.getRemark()); +// logger.info(errorMsg); + throw new RuntimeException(errorMsg); + } + boolean isNew = true; + BasicExportStatusTimeEntity timeInfo = basicExportTimeService.getOne(Wrappers.lambdaQuery(BasicExportStatusTimeEntity.class) + .eq(BasicExportStatusTimeEntity::getKey, exportStatusTimeEnum.getKey())); + if (timeInfo == null) { + timeInfo = BasicExportStatusTimeEntity.builder() + .key(exportStatusTimeEnum.getKey()) + .lastUpdateTime(DateUtil.formatDateTime(date)) + .remark(exportStatusTimeEnum.getRemark()) + .build(); + basicExportTimeService.save(timeInfo); + } else { + if (StrUtil.isNotEmpty(timeInfo.getLastUpdateTime())) { + isNew = false; + } + basicExportTimeService.update(Wrappers.lambdaUpdate(BasicExportStatusTimeEntity.class) + .set(BasicExportStatusTimeEntity::getLastUpdateTime, DateUtil.formatDateTime(date)) + .eq(BasicExportStatusTimeEntity::getKey, exportStatusTimeEnum.getKey()) + ); + } + redisUtil.del(redisKey); + WeakHashMap returnMap = new WeakHashMap<>(10); + returnMap.put("isNew", isNew); + returnMap.put("oldDate", isNew ? null : timeInfo.getLastUpdateTime()); + returnMap.put("id", timeInfo.getId()); + + return returnMap; + } + //上传最近更新单据类型 public BaseResponse uploadAllBus(String syncTime) { SpsSyncDataRequest spsSyncDataRequest = new SpsSyncDataRequest(); diff --git a/src/main/java/com/glxp/api/service/sync/SyncDataBustypeService.java b/src/main/java/com/glxp/api/service/sync/SyncDataBustypeService.java index fd3e15c2a..4eb141808 100644 --- a/src/main/java/com/glxp/api/service/sync/SyncDataBustypeService.java +++ b/src/main/java/com/glxp/api/service/sync/SyncDataBustypeService.java @@ -1,10 +1,11 @@ package com.glxp.api.service.sync; +import com.baomidou.mybatisplus.extension.service.IService; import com.glxp.api.entity.system.SyncDataBustypeEntity; import java.util.List; -public interface SyncDataBustypeService { +public interface SyncDataBustypeService extends IService { List findAll(Integer direct); diff --git a/src/main/java/com/glxp/api/service/sync/UpBasicService.java b/src/main/java/com/glxp/api/service/sync/UpBasicService.java index 9cfecdfa4..4e1003ecd 100644 --- a/src/main/java/com/glxp/api/service/sync/UpBasicService.java +++ b/src/main/java/com/glxp/api/service/sync/UpBasicService.java @@ -1,6 +1,7 @@ package com.glxp.api.service.sync; import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.extension.service.IService; import com.glxp.api.constant.ConstantStatus; import com.glxp.api.entity.auth.*; import com.glxp.api.entity.basic.BasicBusTypeChangeEntity; diff --git a/src/main/java/com/glxp/api/service/sync/impl/BasicExportTimeServiceImpl.java b/src/main/java/com/glxp/api/service/sync/impl/BasicExportTimeServiceImpl.java index 739993cbb..2e1030de6 100644 --- a/src/main/java/com/glxp/api/service/sync/impl/BasicExportTimeServiceImpl.java +++ b/src/main/java/com/glxp/api/service/sync/impl/BasicExportTimeServiceImpl.java @@ -1,6 +1,7 @@ package com.glxp.api.service.sync.impl; import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.glxp.api.dao.sync.BasicExportTimeDao; import com.glxp.api.entity.sync.BasicExportStatusTimeEntity; import com.glxp.api.req.sync.BasicExportTimeRequest; @@ -14,7 +15,7 @@ import java.util.List; @Service @Transactional(rollbackFor = Exception.class) -public class BasicExportTimeServiceImpl implements BasicExportTimeService { +public class BasicExportTimeServiceImpl extends ServiceImpl implements BasicExportTimeService { @Resource BasicExportTimeDao basicExportTimeDao; diff --git a/src/main/java/com/glxp/api/service/sync/impl/SyncDataBustypeServiceImpl.java b/src/main/java/com/glxp/api/service/sync/impl/SyncDataBustypeServiceImpl.java index dab28c92a..9843187b8 100644 --- a/src/main/java/com/glxp/api/service/sync/impl/SyncDataBustypeServiceImpl.java +++ b/src/main/java/com/glxp/api/service/sync/impl/SyncDataBustypeServiceImpl.java @@ -1,6 +1,7 @@ package com.glxp.api.service.sync.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.glxp.api.dao.sync.SyncDataBustypeDao; import com.glxp.api.entity.system.SyncDataBustypeEntity; import com.glxp.api.service.sync.SyncDataBustypeService; @@ -12,7 +13,7 @@ import java.util.List; @Service @Transactional(rollbackFor = Exception.class) -public class SyncDataBustypeServiceImpl implements SyncDataBustypeService { +public class SyncDataBustypeServiceImpl extends ServiceImpl implements SyncDataBustypeService { @Resource SyncDataBustypeDao syncDataBustypeDao; diff --git a/src/main/java/com/glxp/api/service/thrsys/IThrBusTypeOriginService.java b/src/main/java/com/glxp/api/service/thrsys/IThrBusTypeOriginService.java index ff222a5e1..17f3f521a 100644 --- a/src/main/java/com/glxp/api/service/thrsys/IThrBusTypeOriginService.java +++ b/src/main/java/com/glxp/api/service/thrsys/IThrBusTypeOriginService.java @@ -1,5 +1,6 @@ package com.glxp.api.service.thrsys; +import com.baomidou.mybatisplus.extension.service.IService; import com.glxp.api.common.res.BaseResponse; import com.glxp.api.entity.thrsys.ThrBusTypeOriginEntity; import com.glxp.api.entity.thrsys.ThrSystemDetailEntity; @@ -12,7 +13,7 @@ import java.util.List; /** * 第三方单据类型Service */ -public interface IThrBusTypeOriginService { +public interface IThrBusTypeOriginService extends IService { /** * 查询启用的第三方单据类型列表 diff --git a/src/main/java/com/glxp/api/service/thrsys/impl/ThrBusTypeOriginServiceImpl.java b/src/main/java/com/glxp/api/service/thrsys/impl/ThrBusTypeOriginServiceImpl.java index 00772815e..907c4df4c 100644 --- a/src/main/java/com/glxp/api/service/thrsys/impl/ThrBusTypeOriginServiceImpl.java +++ b/src/main/java/com/glxp/api/service/thrsys/impl/ThrBusTypeOriginServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.pagehelper.PageHelper; import com.glxp.api.common.res.BaseResponse; import com.glxp.api.common.util.ResultVOUtils; @@ -32,7 +33,7 @@ import java.util.List; @Slf4j @Service @Transactional(rollbackFor = Exception.class) -public class ThrBusTypeOriginServiceImpl implements IThrBusTypeOriginService { +public class ThrBusTypeOriginServiceImpl extends ServiceImpl implements IThrBusTypeOriginService { @Resource private CustomerService customerService; diff --git a/src/main/java/com/glxp/api/task/SyncHeartTask.java b/src/main/java/com/glxp/api/task/SyncHeartTask.java index ee55b14fc..5c57283d2 100644 --- a/src/main/java/com/glxp/api/task/SyncHeartTask.java +++ b/src/main/java/com/glxp/api/task/SyncHeartTask.java @@ -75,6 +75,9 @@ public class SyncHeartTask implements SchedulingConfigurer { heartService.uploadThrData(null); heartService.uploadThrProducts(null); heartService.uploadSysSetting(null); + Arrays.stream(BasicExportTypeEnum.values()).forEach(i -> { + heartService.chooseData(syncDataSetEntity, null, i); + }); redisUtil.set("SPS_SYNC_UPLOAD_DATA", curTime1); } } catch (Exception e) { diff --git a/src/main/java/com/glxp/api/util/RedisUtil.java b/src/main/java/com/glxp/api/util/RedisUtil.java index bb399da61..4411ddcff 100644 --- a/src/main/java/com/glxp/api/util/RedisUtil.java +++ b/src/main/java/com/glxp/api/util/RedisUtil.java @@ -601,4 +601,22 @@ public class RedisUtil { } } + + + + /** + * 不存在key则缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 过期时间 (秒) + * @return boolean true为set成功,false为key已存在set失败 + */ + public boolean setIfAbsent(String key, Object value, long time) { + if (StrUtil.isEmpty(key)) { + return false; + } + return Boolean.TRUE.equals(redisTemplate.opsForValue().setIfAbsent(key, value, time, TimeUnit.SECONDS)); + } + }