|
@@ -0,0 +1,367 @@
|
|
|
+package com.enteprise.benefit_monitor_assess.service.impl;
|
|
|
+
|
|
|
+import com.enteprise.benefit_monitor_assess.domain.AvgBenefit;
|
|
|
+import com.enteprise.benefit_monitor_assess.domain.BenefitMonitorAssess;
|
|
|
+import com.enteprise.benefit_monitor_assess.domain.IndustrySummary;
|
|
|
+import com.enteprise.benefit_monitor_assess.service.IBusinessMonitorAssessService;
|
|
|
+import com.enteprise.industry_run.domain.EnterpriseBaseDataTotal;
|
|
|
+import com.enteprise.industry_run.service.IEnterpriseBaseDataTotalService;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.util.*;
|
|
|
+import java.util.logging.Level;
|
|
|
+import java.util.logging.Logger;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+@Service
|
|
|
+public class BusinessMonitorAssessService implements IBusinessMonitorAssessService {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ IEnterpriseBaseDataTotalService service;
|
|
|
+
|
|
|
+ private static final Logger LOGGER = Logger.getLogger(BusinessMonitorAssessService.class.getName());
|
|
|
+ @Override
|
|
|
+ public List<BenefitMonitorAssess> getListByBusinessMonitorAssess(BenefitMonitorAssess businessMonitorAssess) {
|
|
|
+ List<BenefitMonitorAssess> list = new ArrayList<>();
|
|
|
+ EnterpriseBaseDataTotal dataTotal = new EnterpriseBaseDataTotal();
|
|
|
+ List<EnterpriseBaseDataTotal> currentDataTotal = new ArrayList<>();
|
|
|
+ List<EnterpriseBaseDataTotal> previousDataTotal = new ArrayList<>();
|
|
|
+ String year = businessMonitorAssess.getYear();
|
|
|
+ String season = businessMonitorAssess.getSeason();
|
|
|
+
|
|
|
+ dataTotal.setCode(businessMonitorAssess.getCode());
|
|
|
+ dataTotal.setEnterpriseName(businessMonitorAssess.getEnterpriseName());
|
|
|
+
|
|
|
+ if (year !=null || !year.equals("")) {
|
|
|
+
|
|
|
+ if (season != null) {
|
|
|
+
|
|
|
+ setDataWithYearAndSeason(year, season, dataTotal);
|
|
|
+ currentDataTotal = service.selectEnterpriseBaseDataTotalList(dataTotal);
|
|
|
+ getPreviousQuarter(businessMonitorAssess, dataTotal);
|
|
|
+ previousDataTotal = service.selectEnterpriseBaseDataTotalList(dataTotal);
|
|
|
+
|
|
|
+ if (businessMonitorAssess.getMode().equals("trendAnalysis")) {
|
|
|
+ compareTrendAnalysis(currentDataTotal, previousDataTotal, list);
|
|
|
+ } else if (businessMonitorAssess.getMode().equals("avgAnalysis")) {
|
|
|
+ compareAvgAnalysis(previousDataTotal, list, year, season);
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ Calendar now = Calendar.getInstance();
|
|
|
+ int currentMonth = now.get(Calendar.MONTH) + 1;
|
|
|
+ int currentQuarter = (currentMonth - 1) / 3 + 1;
|
|
|
+ for (int i = currentQuarter; i > 0; i--) {
|
|
|
+ dataTotal.setYear(year);
|
|
|
+ dataTotal.setSeason(String.valueOf(i));
|
|
|
+ currentDataTotal = service.selectEnterpriseBaseDataTotalList(dataTotal);
|
|
|
+ if (i==1){
|
|
|
+
|
|
|
+ int _year = Integer.parseInt(year) - 1;
|
|
|
+ dataTotal.setYear(String.valueOf(_year));
|
|
|
+ dataTotal.setSeason("4");
|
|
|
+ }else {
|
|
|
+ dataTotal.setSeason(String.valueOf(i - 1));
|
|
|
+ }
|
|
|
+ previousDataTotal = service.selectEnterpriseBaseDataTotalList(dataTotal);
|
|
|
+
|
|
|
+ if (businessMonitorAssess.getMode().equals("trendAnalysis")) {
|
|
|
+ compareTrendAnalysis(currentDataTotal, previousDataTotal, list);
|
|
|
+ } else if (businessMonitorAssess.getMode().equals("avgAnalysis")) {
|
|
|
+ compareAvgAnalysis(previousDataTotal, list, year, String.valueOf(i));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public static void setDataWithYearAndSeason(String year, String season, EnterpriseBaseDataTotal dataTotal){
|
|
|
+ dataTotal.setSeason(season);
|
|
|
+ dataTotal.setYear(year);
|
|
|
+ }
|
|
|
+
|
|
|
+ * 计算某年某月的上一季度
|
|
|
+ * @param assess
|
|
|
+ * @param dataTotal
|
|
|
+ */
|
|
|
+ public static void getPreviousQuarter(BenefitMonitorAssess assess, EnterpriseBaseDataTotal dataTotal) {
|
|
|
+ int year = Integer.parseInt(assess.getYear());
|
|
|
+ int season = Integer.parseInt(assess.getSeason());
|
|
|
+ if (season == 1) {
|
|
|
+ dataTotal.setYear(String.valueOf(year - 1));
|
|
|
+ } else {
|
|
|
+ dataTotal.setSeason(String.valueOf(season - 1));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 对比数据--趋势分析
|
|
|
+ * @param currentQuarterList 当前季度数据
|
|
|
+ * @param previousQuarterList 上季度数据
|
|
|
+ */
|
|
|
+ public static void compareTrendAnalysis(List<EnterpriseBaseDataTotal> currentQuarterList, List<EnterpriseBaseDataTotal> previousQuarterList, List<BenefitMonitorAssess> list) {
|
|
|
+
|
|
|
+ Map<String, List<EnterpriseBaseDataTotal>> previousDataMap = new HashMap<>();
|
|
|
+
|
|
|
+ for (EnterpriseBaseDataTotal data : previousQuarterList) {
|
|
|
+ previousDataMap.computeIfAbsent(data.getEnterpriseName(), k -> new ArrayList<>()).add(data);
|
|
|
+ }
|
|
|
+
|
|
|
+ String enterpriseName = "";
|
|
|
+
|
|
|
+ for (EnterpriseBaseDataTotal currentData : currentQuarterList) {
|
|
|
+
|
|
|
+ if (enterpriseName.isEmpty() || !enterpriseName.equals(currentData.getEnterpriseName())) {
|
|
|
+ enterpriseName = currentData.getEnterpriseName();
|
|
|
+ List<EnterpriseBaseDataTotal> previousDataList = previousDataMap.get(enterpriseName);
|
|
|
+ if (previousDataList != null) {
|
|
|
+
|
|
|
+
|
|
|
+ List<Boolean> powerChangeTrend = new ArrayList<>();
|
|
|
+ List<Boolean> outputChangeTrend = new ArrayList<>();
|
|
|
+
|
|
|
+ EnterpriseBaseDataTotal previousFirstData = previousDataList.get(0);
|
|
|
+ double previousTotalOutput = previousFirstData.getTotalIndustrialValue();
|
|
|
+ double previousPower = previousFirstData.getPowerConsume();
|
|
|
+
|
|
|
+
|
|
|
+ double currentQuarterTaxSum = 0L;
|
|
|
+ double currentQuarterIncomeSum = 0L;
|
|
|
+ double previousQuarterTaxSum = previousFirstData.getPaidTax();
|
|
|
+ double previousQuarterIncomeSum = previousFirstData.getTaxableIncome();
|
|
|
+
|
|
|
+ for (int i = 1; i < previousDataList.size(); i++) {
|
|
|
+ double currentOutput = previousDataList.get(i).getTotalIndustrialValue();
|
|
|
+ double currentPower = previousDataList.get(i).getPowerConsume();
|
|
|
+
|
|
|
+ double currentTax = previousDataList.get(i).getPaidTax();
|
|
|
+ double currentIncome = previousDataList.get(i).getTaxableIncome();
|
|
|
+ previousQuarterTaxSum += currentTax;
|
|
|
+ previousQuarterIncomeSum += currentIncome;
|
|
|
+
|
|
|
+
|
|
|
+ powerChangeTrend.add(currentPower > previousPower);
|
|
|
+ outputChangeTrend.add(currentOutput > previousTotalOutput);
|
|
|
+
|
|
|
+ previousTotalOutput = currentOutput;
|
|
|
+ previousPower = currentPower;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ for (EnterpriseBaseDataTotal current : currentQuarterList) {
|
|
|
+ if (current.getEnterpriseName().equals(currentData.getEnterpriseName())) {
|
|
|
+ currentQuarterTaxSum += current.getPaidTax();
|
|
|
+ currentQuarterIncomeSum += current.getTaxableIncome();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ BenefitMonitorAssess assess = new BenefitMonitorAssess();
|
|
|
+ assess.setYear(currentData.getYear());
|
|
|
+ assess.setSeason(currentData.getSeason());
|
|
|
+ assess.setEnterpriseName(enterpriseName);
|
|
|
+ assess.setCode(currentData.getCode());
|
|
|
+
|
|
|
+ if (currentQuarterTaxSum > previousQuarterTaxSum) {
|
|
|
+
|
|
|
+ if (determineTrend(outputChangeTrend).equals("0") && determineTrend(powerChangeTrend).equals("0")) {
|
|
|
+ assess.setTrendAnalysis("连续近三个月,工业产值持续升高、电力消耗持续升高、本季度实缴税金相较上一季度升高");
|
|
|
+ assess.setOperationalEvaluate("企业订单增加,市场份额提升,对地区经济发展的贡献度提高");
|
|
|
+ list.add(assess);
|
|
|
+ }else if (determineTrend(outputChangeTrend).equals("0") && determineTrend(powerChangeTrend).equals("1")) {
|
|
|
+ assess.setTrendAnalysis("连续近三个月,工业产值持续升高、电力消耗持续下降、本季度实缴税金相较上一季度升高");
|
|
|
+ assess.setOperationalEvaluate("企业订单增加,市场份额提升,对地区行业和经济发展的贡献度提高,可能存在技术或设备更新");
|
|
|
+ list.add(assess);
|
|
|
+ } else if (determineTrend(outputChangeTrend).equals("1") && determineTrend(powerChangeTrend).equals("0")) {
|
|
|
+ assess.setTrendAnalysis("连续近三个月,工业产值持续下降、电力消耗持续升高、本季度实缴税金相较上一季度升高");
|
|
|
+ assess.setOperationalEvaluate("企业上报数据可能存在错误,企业生产经营情况可能存在异常");
|
|
|
+ list.add(assess);
|
|
|
+ } else if (determineTrend(outputChangeTrend).equals("1") && determineTrend(powerChangeTrend).equals("1")) {
|
|
|
+ assess.setTrendAnalysis("连续近三个月,工业产值持续下降、电力消耗持续下降、本季度实缴税金相较上一季度升高");
|
|
|
+ assess.setOperationalEvaluate("企业上报数据可能存在错误,企业生产经营情况可能存在异常");
|
|
|
+ list.add(assess);
|
|
|
+ } else if (determineTrend(outputChangeTrend).equals("2") || determineTrend(powerChangeTrend).equals("2")) {
|
|
|
+
|
|
|
+ if (currentQuarterIncomeSum > previousQuarterIncomeSum){
|
|
|
+
|
|
|
+ assess.setTrendAnalysis("连续三个月,工业产值和电力消耗存在小幅波动、本季度应税收入和实缴税金相较上一季度均升高");
|
|
|
+ assess.setOperationalEvaluate("企业生产经营情况良好");
|
|
|
+ list.add(assess);
|
|
|
+ }else {
|
|
|
+
|
|
|
+ assess.setTrendAnalysis("连续三个月,工业产值和电力消耗存在小幅波动、本季度应税收入相较上一季度下降,实缴税金相较上一季度升高");
|
|
|
+ assess.setOperationalEvaluate("企业生产经营情况可能存在异常");
|
|
|
+ list.add(assess);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ LOGGER.log(Level.WARNING, "企业名称: {0} - 对比数据出错", currentData.getEnterpriseName());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+
|
|
|
+ if (determineTrend(outputChangeTrend).equals("0") && determineTrend(powerChangeTrend).equals("0")) {
|
|
|
+ assess.setTrendAnalysis("连续近三个月,工业产值持续升高、电力消耗持续升高、本季度实缴税金相较上一季度下降");
|
|
|
+ assess.setOperationalEvaluate("企业订单增加,市场份额提升,可能存在退税、政策扶持或缴税异常");
|
|
|
+ list.add(assess);
|
|
|
+ }else if (determineTrend(outputChangeTrend).equals("0") && determineTrend(powerChangeTrend).equals("1")) {
|
|
|
+ assess.setTrendAnalysis("连续近三个月,工业产值持续升高、电力消耗持续下降、本季度实缴税金相较上一季度下降");
|
|
|
+ assess.setOperationalEvaluate("企业订单增加,市场份额提升,可能存在退税、政策扶持或缴税异常,可能存在技术或设备更新");
|
|
|
+ list.add(assess);
|
|
|
+ } else if (determineTrend(outputChangeTrend).equals("1") && determineTrend(powerChangeTrend).equals("0")) {
|
|
|
+ assess.setTrendAnalysis("连续近三个月,工业产值持续下降、电力消耗持续升高、本季度实缴税金相较上一季度下降");
|
|
|
+ assess.setOperationalEvaluate("企业生产经营情况可能存在异常");
|
|
|
+ list.add(assess);
|
|
|
+ } else if (determineTrend(outputChangeTrend).equals("1") && determineTrend(powerChangeTrend).equals("1")) {
|
|
|
+ assess.setTrendAnalysis("连续近三个月,工业产值持续下降、电力消耗持续下降、本季度实缴税金相较上一季度下降");
|
|
|
+ assess.setOperationalEvaluate("企业订单减少,市场份额萎缩,企业生产经营情况可能存在异常");
|
|
|
+ list.add(assess);
|
|
|
+ }else if (determineTrend(outputChangeTrend).equals("2") || determineTrend(powerChangeTrend).equals("2")) {
|
|
|
+
|
|
|
+ if (currentQuarterIncomeSum > previousQuarterIncomeSum){
|
|
|
+
|
|
|
+ assess.setTrendAnalysis("连续三个月,工业产值和电力消耗存在小幅波动、本季度应税收入相较上一季度升高,实缴税金相较上一季度下降");
|
|
|
+ assess.setOperationalEvaluate("企业生产经营情况良好,可能存在退税、政策扶持或缴税异常");
|
|
|
+ list.add(assess);
|
|
|
+ }else {
|
|
|
+
|
|
|
+ assess.setTrendAnalysis("连续三个月,工业产值和电力消耗存在小幅波动、本季度应税收入和实缴税金相较上一季度均下降");
|
|
|
+ assess.setOperationalEvaluate("企业生产经营情况一般");
|
|
|
+ list.add(assess);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ LOGGER.log(Level.WARNING, "企业名称: {0} - 对比数据出错", currentData.getEnterpriseName());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+ LOGGER.log(Level.WARNING, "企业名称: {0} - 上个季度无数据", currentData.getEnterpriseName());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 季度对比
|
|
|
+ * @param trends
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private static String determineTrend(List<Boolean> trends) {
|
|
|
+ boolean allIncreasing = true;
|
|
|
+ boolean allDecreasing = true;
|
|
|
+
|
|
|
+ for (Boolean trend : trends) {
|
|
|
+ if (!trend) {
|
|
|
+ allIncreasing = false;
|
|
|
+ }
|
|
|
+ if (trend) {
|
|
|
+ allDecreasing = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (allIncreasing) {
|
|
|
+
|
|
|
+ return "0";
|
|
|
+ } else if (allDecreasing) {
|
|
|
+
|
|
|
+ return "1";
|
|
|
+ } else {
|
|
|
+
|
|
|
+ return "2";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 平均水平对比
|
|
|
+ * @param previousQuarterList 上季度数据
|
|
|
+ * @param list 返回的结果list
|
|
|
+ */
|
|
|
+ public static void compareAvgAnalysis(List<EnterpriseBaseDataTotal> previousQuarterList, List<BenefitMonitorAssess> list, String year, String season){
|
|
|
+ String enterpriseName = "";
|
|
|
+ Double industrialValueSum = 0.0;
|
|
|
+ Double paidTaxSum = 0.0;
|
|
|
+ int i = 1;
|
|
|
+ List<AvgBenefit> benefits = new ArrayList<>();
|
|
|
+
|
|
|
+ for (EnterpriseBaseDataTotal item : previousQuarterList){
|
|
|
+ if (!enterpriseName.equals(item.getEnterpriseName())){
|
|
|
+
|
|
|
+ if (!enterpriseName.isEmpty()){
|
|
|
+
|
|
|
+ AvgBenefit benefit = new AvgBenefit();
|
|
|
+ benefit.setEnterpriseName(enterpriseName);
|
|
|
+ benefit.setCode(item.getCode());
|
|
|
+ benefit.setIndustrialValueAvg(industrialValueSum / i);
|
|
|
+ benefit.setPaidTaxAvg(paidTaxSum / i);
|
|
|
+ benefits.add(benefit);
|
|
|
+ }
|
|
|
+ enterpriseName = item.getEnterpriseName();
|
|
|
+ industrialValueSum = item.getTotalIndustrialValue();
|
|
|
+ paidTaxSum = item.getPaidTax();
|
|
|
+ i = 1;
|
|
|
+ }else {
|
|
|
+
|
|
|
+ industrialValueSum += item.getTotalIndustrialValue();
|
|
|
+ paidTaxSum += item.getPaidTax();
|
|
|
+ i += 1;
|
|
|
+ if (i == previousQuarterList.size() ){
|
|
|
+
|
|
|
+ AvgBenefit benefit = new AvgBenefit();
|
|
|
+ benefit.setEnterpriseName(enterpriseName);
|
|
|
+ benefit.setCode(item.getCode());
|
|
|
+ benefit.setIndustrialValueAvg(industrialValueSum / i);
|
|
|
+ benefit.setPaidTaxAvg(paidTaxSum / i);
|
|
|
+ benefits.add(benefit);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Map<String, IndustrySummary> industrySummaryMap = previousQuarterList.stream()
|
|
|
+ .collect(Collectors.groupingBy(
|
|
|
+ EnterpriseBaseDataTotal::getCode,
|
|
|
+ Collectors.collectingAndThen(
|
|
|
+ Collectors.toList(),
|
|
|
+ enterpriseBaseData -> {
|
|
|
+ double totalIndustrialValue = enterpriseBaseData.stream()
|
|
|
+ .mapToDouble(EnterpriseBaseDataTotal::getTotalIndustrialValue)
|
|
|
+ .sum();
|
|
|
+ double totalPaidTax = enterpriseBaseData.stream()
|
|
|
+ .mapToDouble(EnterpriseBaseDataTotal::getPaidTax)
|
|
|
+ .sum();
|
|
|
+ int uniqueEnterpriseCount = (int) enterpriseBaseData.stream()
|
|
|
+ .map(EnterpriseBaseDataTotal::getEnterpriseName)
|
|
|
+ .distinct()
|
|
|
+ .count();
|
|
|
+
|
|
|
+ return new IndustrySummary(totalIndustrialValue, totalPaidTax, uniqueEnterpriseCount);
|
|
|
+ }
|
|
|
+ )
|
|
|
+ ));
|
|
|
+ for (AvgBenefit item : benefits){
|
|
|
+ BenefitMonitorAssess assess = new BenefitMonitorAssess();
|
|
|
+ assess.setEnterpriseName(item.getEnterpriseName());
|
|
|
+ assess.setCode(item.getCode());
|
|
|
+ assess.setYear(year);
|
|
|
+ assess.setSeason(season);
|
|
|
+
|
|
|
+ IndustrySummary industrySummary = industrySummaryMap.get(item.getCode());
|
|
|
+ if (item.getIndustrialValueAvg() < industrySummary.getIndustrialValueSum() / industrySummary.getEnterpriseNumber() && item.getPaidTaxAvg() < industrySummary.getPaidTaxSum() / industrySummary.getEnterpriseNumber()){
|
|
|
+ assess.setAvgAnalysis("近三个月工业总产值低于行业平均水平,且本季度实缴税金低于行业平均水平");
|
|
|
+ assess.setOperationalEvaluate("企业生产经营状况一般,行业竞争力较弱");
|
|
|
+ }else if (item.getIndustrialValueAvg() > industrySummary.getIndustrialValueSum() / industrySummary.getEnterpriseNumber() && item.getPaidTaxAvg() > industrySummary.getPaidTaxSum() / industrySummary.getEnterpriseNumber()){
|
|
|
+ assess.setAvgAnalysis("近三个月工业总产值高于行业平均水平,且本季度实缴税金高于行业平均水平");
|
|
|
+ assess.setOperationalEvaluate("企业生产经营状况良好,具备行业竞争力");
|
|
|
+ }else if (item.getIndustrialValueAvg() < industrySummary.getIndustrialValueSum() / industrySummary.getEnterpriseNumber() && item.getPaidTaxAvg() > industrySummary.getPaidTaxSum() / industrySummary.getEnterpriseNumber()){
|
|
|
+ assess.setAvgAnalysis("近三个月工业总产值低于行业平均水平,且本季度实缴税金高于行业平均水平");
|
|
|
+ assess.setOperationalEvaluate("企业上报数据可能存在错误,企业生产经营情况可能存在异常");
|
|
|
+ }else if (item.getIndustrialValueAvg() > industrySummary.getIndustrialValueSum() / industrySummary.getEnterpriseNumber() && item.getPaidTaxAvg() < industrySummary.getPaidTaxSum() / industrySummary.getEnterpriseNumber()){
|
|
|
+ assess.setAvgAnalysis("近三个月工业总产值高于行业平均水平,且本季度实缴税金低于行业平均水平");
|
|
|
+ assess.setOperationalEvaluate("企业生产经营状况一般,行业竞争力良好,可能存在退税、政策扶持或缴税异常等情况");
|
|
|
+ }else {
|
|
|
+ LOGGER.log(Level.WARNING, "企业名称: {0} - 上个季度无数据或任一数据没有变化", item.getEnterpriseName());
|
|
|
+ }
|
|
|
+ list.add(assess);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|