ArticulationUtils.java
11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
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;
}
}