|
|
@@ -32,72 +32,72 @@ public class EnterpriseHealthComputer {
|
|
|
/**
|
|
|
* 清算注销 - 企业已处于注销流程,请核查经营情况
|
|
|
*/
|
|
|
- LIQUIDATION(10, "清算注销", "企业已处于注销流程,请核查经营情况"),
|
|
|
+ LIQUIDATION(10, "清算注销", "企业已处于注销流程,请核查经营情况", "day"),
|
|
|
|
|
|
/**
|
|
|
* 严重失信 - 企业列入严重违法失信名单,暂停政策申请
|
|
|
*/
|
|
|
- SERIOUS_DISHONESTY(11, "严重失信", "企业列入严重违法失信名单,暂停政策申请"),
|
|
|
+ SERIOUS_DISHONESTY(11, "严重失信", "企业列入严重违法失信名单,暂停政策申请", "day"),
|
|
|
|
|
|
/**
|
|
|
* 股权出质 - 股权已全额出质,关注经营稳定性
|
|
|
*/
|
|
|
- EQUITY_PLEDGE(12, "股权出质", "股权已全额出质,关注经营稳定性"),
|
|
|
+ EQUITY_PLEDGE(12, "股权出质", "股权已全额出质,关注经营稳定性", "day"),
|
|
|
|
|
|
/**
|
|
|
* 终本案件 - 存在大额未履行终本案件,注意法律风险
|
|
|
*/
|
|
|
- FINAL_CASE(13, "终本案件", "存在大额未履行终本案件,注意法律风险"),
|
|
|
+ FINAL_CASE(13, "终本案件", "存在大额未履行终本案件,注意法律风险", "day"),
|
|
|
|
|
|
/**
|
|
|
* 税收跳水 - 税收断崖式下跌,需核实经营情况
|
|
|
*/
|
|
|
- TAX_DIVE(14, "税收跳水", "税收断崖式下跌,需核实经营情况"),
|
|
|
+ TAX_DIVE(14, "税收跳水", "税收断崖式下跌,需核实经营情况", "season"),
|
|
|
|
|
|
/**
|
|
|
* 能耗异常 - 能耗接近零,疑似停产或外迁
|
|
|
*/
|
|
|
- ENERGY_ABNORMAL(15, "能耗异常", "能耗接近零,疑似停产或外迁"),
|
|
|
+ ENERGY_ABNORMAL(15, "能耗异常", "能耗接近零,疑似停产或外迁", "season"),
|
|
|
|
|
|
/**
|
|
|
* 租约到期 - 租约即将到期未续签,提前跟进招商
|
|
|
*/
|
|
|
- LEASE_EXPIRY(16, "租约到期", "租约即将到期未续签,提前跟进招商"),
|
|
|
+ LEASE_EXPIRY(16, "租约到期", "租约即将到期未续签,提前跟进招商", "day"),
|
|
|
|
|
|
/**
|
|
|
* 纳税逾期 - 多次逾期申报,提醒企业及时纳税
|
|
|
*/
|
|
|
- TAX_OVERDUE(17, "纳税逾期", "多次逾期申报,提醒企业及时纳税"),
|
|
|
+ TAX_OVERDUE(17, "纳税逾期", "多次逾期申报,提醒企业及时纳税", "day"),
|
|
|
|
|
|
/**
|
|
|
* 税收上升 - 税收稳步提升,潜力优秀
|
|
|
*/
|
|
|
- TAX_RISE(20, "税收上升", "税收稳步提升,潜力优秀"),
|
|
|
+ TAX_RISE(20, "税收上升", "税收稳步提升,潜力优秀", "season"),
|
|
|
|
|
|
/**
|
|
|
* 产值上升 - 产值稳步提升,潜力优秀
|
|
|
*/
|
|
|
- OUTPUT_RISE(21, "产值上升", "产值稳步提升,潜力优秀"),
|
|
|
+ OUTPUT_RISE(21, "产值上升", "产值稳步提升,潜力优秀", "season"),
|
|
|
|
|
|
/**
|
|
|
* 升规成功 - 企业新晋规上,建议重点服务
|
|
|
*/
|
|
|
- UPGRADE_SUCCESS(22, "升规成功", "企业新晋规上,建议重点服务"),
|
|
|
+ UPGRADE_SUCCESS(22, "升规成功", "企业新晋规上,建议重点服务", "month"),
|
|
|
|
|
|
/**
|
|
|
* 专利爆发 - 知识产权快速积累,创新力强
|
|
|
*/
|
|
|
- PATENT_EXPLOSION(23, "专利爆发", "知识产权快速积累,创新力强"),
|
|
|
+ PATENT_EXPLOSION(23, "专利爆发", "知识产权快速积累,创新力强", "season"),
|
|
|
|
|
|
/**
|
|
|
* 500强投资 - 背靠500强,扩张潜力大
|
|
|
*/
|
|
|
- TOP500_INVESTMENT(24, "500强投", "背靠500强,扩张潜力大"),
|
|
|
+ TOP500_INVESTMENT(24, "500强投", "背靠500强,扩张潜力大", "day"),
|
|
|
|
|
|
/**
|
|
|
* 产业新星 - 重点产业新落地,建议跟踪服务
|
|
|
*/
|
|
|
- INDUSTRIAL_RISING_STAR(25, "产业新星", "重点产业新落地,建议跟踪服务");
|
|
|
+ INDUSTRIAL_RISING_STAR(25, "产业新星", "重点产业新落地,建议跟踪服务", "day");
|
|
|
|
|
|
@Getter
|
|
|
final int value;
|
|
|
@@ -105,11 +105,14 @@ public class EnterpriseHealthComputer {
|
|
|
final String defaultName;
|
|
|
@Getter
|
|
|
final String defaultDescribe;
|
|
|
+ @Getter
|
|
|
+ final String showTime;
|
|
|
|
|
|
- HealthType(int value, String defaultName, String defaultDescribe) {
|
|
|
+ HealthType(int value, String defaultName, String defaultDescribe, String showTime) {
|
|
|
this.value = value;
|
|
|
this.defaultName = defaultName;
|
|
|
this.defaultDescribe = defaultDescribe;
|
|
|
+ this.showTime = showTime;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -280,7 +283,7 @@ public class EnterpriseHealthComputer {
|
|
|
Collectors.toMap(
|
|
|
enterpriseEconomic -> YearMonth.parse(enterpriseEconomic.getCYearMonth(), economicYearMonthFormat),
|
|
|
Function.identity(),
|
|
|
- (a,b)->a
|
|
|
+ (a, b) -> a
|
|
|
)
|
|
|
));
|
|
|
}
|
|
|
@@ -314,16 +317,16 @@ public class EnterpriseHealthComputer {
|
|
|
List<List<EnterpriseEconomic>> seasonEconomic = getEconomicBySeasonList(enterprise, seasons);
|
|
|
List<List<EnterpriseEconomic>> previousYearSeasonEconomic = getEconomicBySeasonList(enterprise, previousYearSeasons);
|
|
|
//去年数据必须完整,避免因数据缺失异常标记
|
|
|
- if (previousYearSeasonEconomic.stream().anyMatch(list->list.contains(null))) {
|
|
|
+ if (previousYearSeasonEconomic.stream().anyMatch(list -> list.contains(null))) {
|
|
|
continue;
|
|
|
}
|
|
|
//较新四个季度的税收统计
|
|
|
BigDecimal riseRate = checkAllRiseAndGetRiseRate(seasonEconomic, previousYearSeasonEconomic);
|
|
|
if (riseRate == null) continue;
|
|
|
//当总额上升率超过20%时提交记录
|
|
|
- if (riseRate.compareTo(BigDecimal.valueOf(12,1)) >= 0) {
|
|
|
+ if (riseRate.compareTo(BigDecimal.valueOf(12, 1)) >= 0) {
|
|
|
putResult(enterprise,
|
|
|
- HealthType.TAX_RISE.getDefaultName()+simpleDecimalFormat.format(riseRate.subtract(BigDecimal.ONE)),
|
|
|
+ HealthType.TAX_RISE.getDefaultName() + simpleDecimalFormat.format(riseRate.subtract(BigDecimal.ONE)),
|
|
|
HealthType.TAX_RISE.getDefaultDescribe(),
|
|
|
HealthType.TAX_RISE,
|
|
|
time, seasons.get(0).getStartTime(), seasons.get(seasons.size() - 1).getEndTime());
|
|
|
@@ -346,7 +349,7 @@ public class EnterpriseHealthComputer {
|
|
|
List<List<EnterpriseEconomic>> seasonEconomic = getEconomicBySeasonList(enterprise, seasons);
|
|
|
List<List<EnterpriseEconomic>> previousYearSeasonEconomic = getEconomicBySeasonList(enterprise, previousYearSeasons);
|
|
|
//去年数据必须完整,避免因数据缺失异常标记
|
|
|
- if (previousYearSeasonEconomic.stream().anyMatch(list->list.contains(null))) {
|
|
|
+ if (previousYearSeasonEconomic.stream().anyMatch(list -> list.contains(null))) {
|
|
|
continue;
|
|
|
}
|
|
|
//计算上升率
|
|
|
@@ -355,9 +358,9 @@ public class EnterpriseHealthComputer {
|
|
|
continue;
|
|
|
}
|
|
|
//当总额上升率超过20%时提交记录
|
|
|
- if (riseRate.compareTo(BigDecimal.valueOf(12,1)) >= 0) {
|
|
|
+ if (riseRate.compareTo(BigDecimal.valueOf(12, 1)) >= 0) {
|
|
|
putResult(enterprise,
|
|
|
- HealthType.OUTPUT_RISE.getDefaultName()+simpleDecimalFormat.format(riseRate.subtract(BigDecimal.ONE)),
|
|
|
+ HealthType.OUTPUT_RISE.getDefaultName() + simpleDecimalFormat.format(riseRate.subtract(BigDecimal.ONE)),
|
|
|
HealthType.OUTPUT_RISE.getDefaultDescribe(),
|
|
|
HealthType.OUTPUT_RISE,
|
|
|
time, seasons.get(0).getStartTime(), seasons.get(seasons.size() - 1).getEndTime());
|
|
|
@@ -375,10 +378,10 @@ public class EnterpriseHealthComputer {
|
|
|
Season season = getLastSeason(time);
|
|
|
Season previousYearSeason = season.minusSeasons(4);
|
|
|
for (Enterprise enterprise : enterprises) {
|
|
|
- List<EnterpriseEconomic> seasonEconomic = getEconomicBySeason(enterprise,season);
|
|
|
- List<EnterpriseEconomic> previousYearSeasonEconomic = getEconomicBySeason(enterprise,previousYearSeason);
|
|
|
+ List<EnterpriseEconomic> seasonEconomic = getEconomicBySeason(enterprise, season);
|
|
|
+ List<EnterpriseEconomic> previousYearSeasonEconomic = getEconomicBySeason(enterprise, previousYearSeason);
|
|
|
//今年数据必须完整,避免因数据缺失异常标记
|
|
|
- if (seasonEconomic.stream().anyMatch(Objects::isNull)){
|
|
|
+ if (seasonEconomic.stream().anyMatch(Objects::isNull)) {
|
|
|
continue;
|
|
|
}
|
|
|
BigDecimal seasonTax = seasonEconomic.stream()
|
|
|
@@ -393,8 +396,8 @@ public class EnterpriseHealthComputer {
|
|
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
if (seasonTax.compareTo(previousYearSeasonTax) < 0) {
|
|
|
BigDecimal divide = seasonTax.divide(previousYearSeasonTax, RoundingMode.HALF_UP);
|
|
|
- if (divide.compareTo(BigDecimal.valueOf(7,1))<0){
|
|
|
- putResult(enterprise,HealthType.TAX_DIVE,time,season.getStartTime(),season.getEndTime());
|
|
|
+ if (divide.compareTo(BigDecimal.valueOf(7, 1)) < 0) {
|
|
|
+ putResult(enterprise, HealthType.TAX_DIVE, time, season.getStartTime(), season.getEndTime());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -411,18 +414,18 @@ public class EnterpriseHealthComputer {
|
|
|
LocalDate nowDate = time.toLocalDate();
|
|
|
for (Enterprise enterprise : enterprises) {
|
|
|
String enterpriseCode = enterprise.getCUnifiedSocialCreditCode();
|
|
|
- if (enterpriseCode==null || enterpriseCode.isEmpty()) continue;
|
|
|
- List<LeaseDetail> leases =enterpriseLeases.get(enterpriseCode);
|
|
|
- if (leases==null) continue;
|
|
|
+ if (enterpriseCode == null || enterpriseCode.isEmpty()) continue;
|
|
|
+ List<LeaseDetail> leases = enterpriseLeases.get(enterpriseCode);
|
|
|
+ if (leases == null) continue;
|
|
|
boolean leasesAlmostOutDate = leases.stream()
|
|
|
.filter(Objects::nonNull)
|
|
|
.filter(leaseDetail -> !leaseDetail.getStartDate().isAfter(nowDate))
|
|
|
.map(LeaseDetail::getCEndDate)
|
|
|
.filter(Objects::nonNull)
|
|
|
- .filter(t-> !t.isBefore(nowDate))
|
|
|
- .anyMatch(t-> Duration.between(nowDate.atStartOfDay(),t.atStartOfDay()).toDays()<30);
|
|
|
+ .filter(t -> !t.isBefore(nowDate))
|
|
|
+ .anyMatch(t -> Duration.between(nowDate.atStartOfDay(), t.atStartOfDay()).toDays() < 30);
|
|
|
if (leasesAlmostOutDate) {
|
|
|
- putResult(enterprise,HealthType.LEASE_EXPIRY,time,nowDate.atStartOfDay(),nowDate.plusDays(1).atStartOfDay());
|
|
|
+ putResult(enterprise, HealthType.LEASE_EXPIRY, time, nowDate.atStartOfDay(), nowDate.plusDays(1).atStartOfDay());
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -442,8 +445,27 @@ public class EnterpriseHealthComputer {
|
|
|
*/
|
|
|
private void putResult(Enterprise enterprise, String title, String describe, HealthType type, LocalDateTime computeTime,
|
|
|
LocalDateTime healthStart, LocalDateTime healthEnd) {
|
|
|
+ LocalDateTime showTimeStart = computeTime.plusDays(1).toLocalDate().atStartOfDay();
|
|
|
+ LocalDateTime showTimeEnd;
|
|
|
+ switch (type.showTime) {
|
|
|
+ case "day": {
|
|
|
+ showTimeEnd = showTimeStart.plusDays(1);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case "month": {
|
|
|
+ showTimeEnd = showTimeStart.plusMonths(1);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case "season": {
|
|
|
+ showTimeEnd = showTimeStart.plusMonths(3);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default: {
|
|
|
+ showTimeEnd = showTimeStart.plusMonths(1);
|
|
|
+ }
|
|
|
+ }
|
|
|
EnterpriseHealth result = new EnterpriseHealth(title, describe, type.value, computeTime,
|
|
|
- healthStart, healthEnd, enterprise.getCUnifiedSocialCreditCode());
|
|
|
+ healthStart, healthEnd, enterprise.getCUnifiedSocialCreditCode(),showTimeStart,showTimeEnd);
|
|
|
results.add(result);
|
|
|
}
|
|
|
|
|
|
@@ -458,9 +480,7 @@ public class EnterpriseHealthComputer {
|
|
|
*/
|
|
|
private void putResult(Enterprise enterprise, HealthType type, LocalDateTime computeTime,
|
|
|
LocalDateTime healthStart, LocalDateTime healthEnd) {
|
|
|
- EnterpriseHealth result = new EnterpriseHealth(type.defaultName, type.defaultDescribe, type.value, computeTime,
|
|
|
- healthStart, healthEnd, enterprise.getCUnifiedSocialCreditCode());
|
|
|
- results.add(result);
|
|
|
+ putResult(enterprise, type.getDefaultName(), type.getDefaultDescribe(), type, computeTime, healthStart, healthEnd);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -468,10 +488,10 @@ public class EnterpriseHealthComputer {
|
|
|
* 按季节分组,每个季节包含该季节内各个月份的经济数据列表
|
|
|
*
|
|
|
* @param enterprise 企业对象,包含企业基本信息
|
|
|
- * @param seasons 季节列表,每个季节包含对应的年月信息
|
|
|
+ * @param seasons 季节列表,每个季节包含对应的年月信息
|
|
|
* @return 按季节分组的企业经济数据二维列表
|
|
|
- * 外层列表对应每个季节,内层列表对应该季节各个月份的经济数据
|
|
|
- * 如果某个月份没有数据,对应位置可能为null
|
|
|
+ * 外层列表对应每个季节,内层列表对应该季节各个月份的经济数据
|
|
|
+ * 如果某个月份没有数据,对应位置可能为null
|
|
|
*/
|
|
|
private List<List<EnterpriseEconomic>> getEconomicBySeasonList(Enterprise enterprise, List<Season> seasons) {
|
|
|
List<List<EnterpriseEconomic>> seasonEconomic = new ArrayList<>();
|
|
|
@@ -579,6 +599,7 @@ public class EnterpriseHealthComputer {
|
|
|
|
|
|
/**
|
|
|
* 分别计算输入1和输入2的合计值并做除法
|
|
|
+ *
|
|
|
* @return 除法的结果,当输入2为0时返回空
|
|
|
*/
|
|
|
private static BigDecimal sumAndDivide(List<BigDecimal> valueList1, List<BigDecimal> valueList2) {
|
|
|
@@ -601,23 +622,24 @@ public class EnterpriseHealthComputer {
|
|
|
|
|
|
/**
|
|
|
* 计算输入的连续两年的数据每个季节都同比上升,在这个基础上计算上升率
|
|
|
+ *
|
|
|
* @return
|
|
|
*/
|
|
|
private static BigDecimal checkAllRiseAndGetRiseRate(List<List<EnterpriseEconomic>> seasonEconomic, List<List<EnterpriseEconomic>> previousYearSeasonEconomic) {
|
|
|
List<BigDecimal> seasonTax = seasonEconomic.stream().map(
|
|
|
- l->l.stream()
|
|
|
+ l -> l.stream()
|
|
|
.filter(Objects::nonNull)
|
|
|
.map(EnterpriseEconomic::getCApprovedTax)
|
|
|
.filter(Objects::nonNull)
|
|
|
- .reduce(BigDecimal.ZERO,BigDecimal::add)
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add)
|
|
|
).collect(Collectors.toList());
|
|
|
//较旧四个季度的税收统计
|
|
|
List<BigDecimal> previousYearSeasonTax = previousYearSeasonEconomic.stream().map(
|
|
|
- l->l.stream()
|
|
|
+ l -> l.stream()
|
|
|
.filter(Objects::nonNull)
|
|
|
.map(EnterpriseEconomic::getCApprovedTax)
|
|
|
.filter(Objects::nonNull)
|
|
|
- .reduce(BigDecimal.ZERO,BigDecimal::add)
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add)
|
|
|
).collect(Collectors.toList());
|
|
|
//检查所有季度是否同比上升
|
|
|
if (!isAllUpper(seasonTax, previousYearSeasonTax)) {
|