ArticulationUtils.java 11 KB
package com.lhcredit.common.utils;



import com.lhcredit.project.business.reportFinanceData.domain.ReportFinanceData;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
public class ArticulationUtils {


    public static List<String> articulationList(List<ReportFinanceData> list) {
        List<String> msgList = new ArrayList<>();

        for (ReportFinanceData reportFinanceData : list) {
            //获取年份
            Integer year = reportFinanceData.getYear();
            //资产总额 ≠ 负债+所有者权益
            BigDecimal zcCont = reportFinanceData.getTotLiab().add(reportFinanceData.getTotalEquity());
            if (reportFinanceData.getTotAssets()!= zcCont){
                msgList.add(year+"资产总额 ≠ 负债+所有者权益");
            }
            //资产总额为负
            if (reportFinanceData.getTotAssets().signum()<0) {
                msgList.add(year+"资产总额为负");
            }
            //收入为负(营业收入)
            if (reportFinanceData.getOperRev().signum()<0) {
                msgList.add(year+"收入为负(营业收入)");
            }
            //纳税总额小于0;
            if (reportFinanceData.getPayTaxesTotal().signum()<0) {
                msgList.add(year+"纳税总额小于0");
            }
            //利润总额大于0,但净利润小于0。
            if(reportFinanceData.getTotProfit().signum()>0 && reportFinanceData.getNetProfit().signum()<0){
                msgList.add(year+"利润总额大于0,但净利润小于0");
            }


            //=====详财
            //(1)资产总额=流动资产+非流动资产;
            BigDecimal addShu = reportFinanceData.getTotCurAssets().add(reportFinanceData.getTotNonCurAssets());
            if (reportFinanceData.getTotAssets()!= addShu){
                msgList.add(year+"资产总额≠流动资产+非流动资产");
            }
            //(2)负债总额=流动负债+长期负债(非流动负债);
            BigDecimal add = reportFinanceData.getTotCurLiab().add(reportFinanceData.getTotNonCurLiab());
            if (reportFinanceData.getTotLiab()!= add){
                msgList.add(year+"资产总额≠流动资产+非流动资产");
            }
            //(3)固定资产净值=固定资产原值-累计折旧。

            //(4)利润表勾稽关系需要注意,如:利润总额=营业利润+营业外收入-营业外支出
            BigDecimal count = reportFinanceData.getOperProfit().add(reportFinanceData.getPlusNonOperRev()).subtract(reportFinanceData.getLessNonOperExp());
            if (reportFinanceData.getTotProfit()!= count){
                msgList.add(year+"利润总额≠营业利润+营业外收入-营业外支出");
            }
        }
        if (list.size()==2){//说明有2年的数据
            ReportFinanceData reportFinanceData2 = list.get(0);
            ReportFinanceData reportFinanceData1 = list.get(1);
            //获取最新年
            Integer year = reportFinanceData2.getYear();

            //资产、负债、所有者权益,这三项均增长率超过500%或低于-500%
            //资产
            BigDecimal rate = new BigDecimal(100);
            BigDecimal zcSubtract = reportFinanceData2.getTotAssets().subtract(reportFinanceData1.getTotAssets());
            //除以当年的资产 并且再乘以100 和500比较
            BigDecimal zhichan = zcSubtract.divide(reportFinanceData2.getTotAssets(), 2, BigDecimal.ROUND_HALF_UP).multiply(rate);

            //负债
            BigDecimal fzSubtract = reportFinanceData2.getTotLiab().subtract(reportFinanceData1.getTotLiab());
            //除以当年的资产 并且再乘以100 和500比较
            BigDecimal fuzhai = fzSubtract.divide(reportFinanceData2.getTotLiab(), 2, BigDecimal.ROUND_HALF_UP).multiply(rate);

            //所有者权益
            BigDecimal syzqySubtract = reportFinanceData2.getTotalEquity().subtract(reportFinanceData1.getTotalEquity());
            //除以当年的资产 并且再乘以100 和500比较
            BigDecimal quanyi = syzqySubtract.divide(reportFinanceData2.getTotalEquity(), 2, BigDecimal.ROUND_HALF_UP).multiply(rate);

            if ((zhichan.signum()>500 && fuzhai.signum()>500 && quanyi.signum()>500) || (zhichan.signum()<-500 && fuzhai.signum()<-500 && quanyi.signum()<-500)){
                msgList.add(year+"资产、负债、所有者权益,这三项均增长率超过500%或低于-500%");
            }

            //收入(营业收入)增长率超过500%或低于-500%
            BigDecimal yysrSubtract = reportFinanceData2.getOperRev().subtract(reportFinanceData1.getOperRev());
            BigDecimal yingyeshouru = yysrSubtract.divide(reportFinanceData2.getOperRev(), 2, BigDecimal.ROUND_HALF_UP).multiply(rate);
            if ((zhichan.signum()>500  || quanyi.signum()<-500)){
                msgList.add(year+"收入(营业收入)增长率超过500%或低于-500%");
            }


            //净利润大于0时,当前年度净资产-上一年度净资产小于等于0,净资产有可能异常。(净资产就是所有者权益)
            if (reportFinanceData2.getNetProfit().signum()>0){
                BigDecimal jzcSubtract = reportFinanceData2.getTotalEquity().subtract(reportFinanceData1.getTotalEquity());
                if (jzcSubtract.signum()<=0){
                    msgList.add(year+"净利润大于0时,当前年度净资产-上一年度净资产小于等于0,净资产有可能异常。");
                }
            }
        }
        if (list.size()==3){//说明有3年的数据
            ReportFinanceData reportFinanceData2 = list.get(0);
            ReportFinanceData reportFinanceData1 = list.get(1);
            ReportFinanceData reportFinanceData0 = list.get(2);
            //获取最新年
            Integer year = reportFinanceData2.getYear();
            Integer year1 = reportFinanceData1.getYear();


            //资产、负债、所有者权益,这三项均增长率超过500%或低于-500%
            //资产
            BigDecimal rate = new BigDecimal(100);
            BigDecimal zcSubtract = reportFinanceData2.getTotAssets().subtract(reportFinanceData1.getTotAssets());
            //除以当年的资产 并且再乘以100 和500比较
            BigDecimal zhichan = zcSubtract.divide(reportFinanceData2.getTotAssets(), 2, BigDecimal.ROUND_HALF_UP).multiply(rate);

            //负债
            BigDecimal fzSubtract = reportFinanceData2.getTotLiab().subtract(reportFinanceData1.getTotLiab());
            //除以当年的资产 并且再乘以100 和500比较
            BigDecimal fuzhai = fzSubtract.divide(reportFinanceData2.getTotLiab(), 2, BigDecimal.ROUND_HALF_UP).multiply(rate);

            //所有者权益
            BigDecimal syzqySubtract = reportFinanceData2.getTotalEquity().subtract(reportFinanceData1.getTotalEquity());
            //除以当年的资产 并且再乘以100 和500比较
            BigDecimal quanyi = syzqySubtract.divide(reportFinanceData2.getTotalEquity(), 2, BigDecimal.ROUND_HALF_UP).multiply(rate);
            if ((zhichan.signum()>500 && fuzhai.signum()>500 && quanyi.signum()>500) || (zhichan.signum()<-500 && fuzhai.signum()<-500 && quanyi.signum()<-500)){
                msgList.add(year+"资产、负债、所有者权益,这三项均增长率超过500%或低于-500%");
            }

            //收入增长率超过500%或低于-500%
            BigDecimal yysrSubtract = reportFinanceData2.getOperRev().subtract(reportFinanceData1.getOperRev());
            BigDecimal yingyeshouru = yysrSubtract.divide(reportFinanceData2.getOperRev(), 2, BigDecimal.ROUND_HALF_UP).multiply(rate);
            if ((zhichan.signum()>500  || quanyi.signum()<-500)){
                msgList.add(year+"收入(营业收入)增长率超过500%或低于-500%");
            }

            //净利润大于0时,当前年度净资产-上一年度净资产小于等于0,净资产有可能异常。(净资产就是所有者权益)
            if (reportFinanceData2.getNetProfit().signum()>0){
                BigDecimal jzcSubtract = reportFinanceData2.getTotalEquity().subtract(reportFinanceData1.getTotalEquity());
                if (jzcSubtract.signum()<=0){
                    msgList.add(year+"净利润大于0时,当前年度净资产-上一年度净资产小于等于0,净资产有可能异常。");
                }
            }

            //----如果list中有三条数据 那么去计算上一年的数据

            //资产、负债、所有者权益,这三项均增长率超过500%或低于-500%
            //资产
            BigDecimal lastZcSubtract = reportFinanceData1.getTotAssets().subtract(reportFinanceData0.getTotAssets());
            //除以当年的资产 并且再乘以100 和500比较
            BigDecimal lastZhichan = lastZcSubtract.divide(reportFinanceData1.getTotAssets(), 2, BigDecimal.ROUND_HALF_UP).multiply(rate);

            //负债
            BigDecimal lastFzSubtract = reportFinanceData1.getTotLiab().subtract(reportFinanceData0.getTotLiab());
            //除以当年的资产 并且再乘以100 和500比较
            BigDecimal lastFuzhai = lastFzSubtract.divide(reportFinanceData1.getTotLiab(), 2, BigDecimal.ROUND_HALF_UP).multiply(rate);

            //所有者权益
            BigDecimal lastSyzqySubtract = reportFinanceData1.getTotalEquity().subtract(reportFinanceData0.getTotalEquity());
            //除以当年的资产 并且再乘以100 和500比较
            BigDecimal lastQuanyi = lastSyzqySubtract.divide(reportFinanceData1.getTotalEquity(), 2, BigDecimal.ROUND_HALF_UP).multiply(rate);
            if ((lastZhichan.signum()>500 && lastFuzhai.signum()>500 && lastQuanyi.signum()>500) || (lastZhichan.signum()<-500 && lastFuzhai.signum()<-500 && lastQuanyi.signum()<-500)){
                msgList.add(year1+"资产、负债、所有者权益,这三项均增长率超过500%或低于-500%");
            }

            //收入增长率超过500%或低于-500%
            BigDecimal lastYysrSubtract = reportFinanceData1.getOperRev().subtract(reportFinanceData0.getOperRev());
            BigDecimal lastyingyeshouru = lastYysrSubtract.divide(reportFinanceData1.getOperRev(), 2, BigDecimal.ROUND_HALF_UP).multiply(rate);
            if ((lastyingyeshouru.signum()>500  || lastyingyeshouru.signum()<-500)){
                msgList.add(year1+"收入(营业收入)增长率超过500%或低于-500%");
            }

            //净利润大于0时,当前年度净资产-上一年度净资产小于等于0,净资产有可能异常。(净资产就是所有者权益)
            if (reportFinanceData1.getNetProfit().signum()>0){
                BigDecimal jzcSubtract = reportFinanceData1.getTotalEquity().subtract(reportFinanceData0.getTotalEquity());
                if (jzcSubtract.signum()<=0){
                    msgList.add(year1+"净利润大于0时,当前年度净资产-上一年度净资产小于等于0,净资产有可能异常。");
                }
            }
        }

        return msgList;
    }
}