databoard.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  1. package restcontroller.webmanage.sale.databoard;
  2. import beans.itemclass.ItemClass;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.sun.org.apache.bcel.internal.generic.NEW;
  6. import common.Controller;
  7. import common.YosException;
  8. import common.annotation.API;
  9. import common.annotation.CACHEING;
  10. import common.data.Row;
  11. import common.data.Rows;
  12. import common.data.RowsMap;
  13. import common.data.SQLFactory;
  14. import restcontroller.R;
  15. import javax.swing.tree.RowMapper;
  16. import java.math.BigDecimal;
  17. import java.math.RoundingMode;
  18. import java.text.SimpleDateFormat;
  19. import java.util.*;
  20. import java.util.stream.Collectors;
  21. /**
  22. * 数据看板
  23. */
  24. public class databoard extends Controller {
  25. /**
  26. * 构造函数
  27. *
  28. * @param content
  29. */
  30. public databoard(JSONObject content) throws YosException {
  31. super(content);
  32. }
  33. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  34. /**
  35. * 订货额类别占比分析
  36. *
  37. * @return
  38. */
  39. @API(title = "订货分析", apiversion = R.ID20230729103203.v1.class)
  40. @CACHEING
  41. public String orderAndPaymentAnalysis() throws Exception {
  42. String datetype = content.getStringValue("datetype");
  43. String begindate = "";
  44. String enddate = "";
  45. switch (datetype) {
  46. case "月":
  47. begindate = getMonthFirstDay();
  48. enddate = getMonthLastDay();
  49. break;
  50. case "年":
  51. begindate = new SimpleDateFormat("yyyy").format(new Date()) + "-01-01";
  52. enddate = new SimpleDateFormat("yyyy").format(new Date()) + "-12-31";
  53. break;
  54. case "季":
  55. begindate = sdf.format(getQuarterStart(new Date()).getTime());
  56. enddate = sdf.format(getQuarterEnd(new Date()).getTime());
  57. break;
  58. case "上半年":
  59. begindate = new SimpleDateFormat("yyyy").format(new Date()) + "-01-01";
  60. enddate = new SimpleDateFormat("yyyy").format(new Date()) + "-06-30";
  61. break;
  62. default:
  63. break;
  64. }
  65. /*
  66. * 过滤条件设置
  67. */
  68. if (content.containsKey("where")) {
  69. JSONObject whereObject = content.getJSONObject("where");
  70. if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
  71. begindate = whereObject.getString("begindate");
  72. }
  73. if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
  74. enddate = whereObject.getString("enddate");
  75. }
  76. }
  77. StringBuffer where = new StringBuffer(" 1=1 ");
  78. StringBuffer whereLastYear = new StringBuffer(" 1=1 ");
  79. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  80. if (begindate != "") {
  81. where.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') >='").append(begindate).append("' ");
  82. Date date = sdf.parse(begindate);
  83. //创建Calendar实例
  84. Calendar cal = Calendar.getInstance();
  85. //设置当前时间
  86. cal.setTime(date);
  87. //在当前时间基础上减一年
  88. cal.add(Calendar.YEAR, -1);
  89. whereLastYear.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') >='").append(sdf.format(cal.getTime())).append("' ");
  90. }
  91. if (enddate != "") {
  92. where.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') <='").append(enddate).append("' ");
  93. Date date = sdf.parse(enddate);
  94. //创建Calendar实例
  95. Calendar cal = Calendar.getInstance();
  96. //设置当前时间
  97. cal.setTime(date);
  98. //在当前时间基础上减一年
  99. cal.add(Calendar.YEAR, -1);
  100. whereLastYear.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') <='").append(sdf.format(cal.getTime())).append("' ");
  101. }
  102. JSONArray jsonArray = new JSONArray();
  103. //订货额
  104. JSONObject jsonObject = new JSONObject();
  105. SQLFactory factory = new SQLFactory(this, "销售额统计查询");
  106. factory.addParameter("siteid", siteid);
  107. factory.addParameter_SQL("where", where);
  108. Rows rows = dbConnect.runSqlQuery(factory.getSQL(false));
  109. SQLFactory factoryLastYear = new SQLFactory(this, "销售额统计查询");
  110. factoryLastYear.addParameter("siteid", siteid);
  111. factoryLastYear.addParameter_SQL("where", whereLastYear);
  112. Rows rowsLastYear = dbConnect.runSqlQuery(factoryLastYear.getSQL(false));
  113. jsonObject.put("type", "订货额");
  114. jsonObject.put("currentData", rows.get(0).getBigDecimal("typestatistics"));
  115. jsonObject.put("yearonyeargrowth", rows.get(0).getBigDecimal("typestatistics").subtract(rowsLastYear.get(0).getBigDecimal("typestatistics")));
  116. if (rowsLastYear.get(0).getBigDecimal("typestatistics").compareTo(BigDecimal.ZERO) == 0) {
  117. jsonObject.put("yearonyearrate", 0);
  118. } else {
  119. jsonObject.put("yearonyearrate", (rows.get(0).getBigDecimal("typestatistics").subtract(rowsLastYear.get(0).getBigDecimal("typestatistics"))).divide(rowsLastYear.get(0).getBigDecimal("typestatistics"), 4, BigDecimal.ROUND_HALF_UP));
  120. }
  121. jsonArray.add(jsonObject);
  122. //订单量
  123. jsonObject = new JSONObject();
  124. factory = new SQLFactory(this, "销售单量统计查询");
  125. factory.addParameter("siteid", siteid);
  126. factory.addParameter_SQL("where", where);
  127. rows = dbConnect.runSqlQuery(factory.getSQL(false));
  128. factoryLastYear = new SQLFactory(this, "销售单量统计查询");
  129. factoryLastYear.addParameter("siteid", siteid);
  130. factoryLastYear.addParameter_SQL("where", whereLastYear);
  131. rowsLastYear = dbConnect.runSqlQuery(factoryLastYear.getSQL(false));
  132. jsonObject.put("type", "订单量");
  133. ;
  134. jsonObject.put("currentData", rows.get(0).getBigDecimal("typestatistics"));
  135. jsonObject.put("yearonyeargrowth", rows.get(0).getBigDecimal("typestatistics").subtract(rowsLastYear.get(0).getBigDecimal("typestatistics")));
  136. if (rowsLastYear.get(0).getBigDecimal("typestatistics").compareTo(BigDecimal.ZERO) == 0) {
  137. jsonObject.put("yearonyearrate", 0);
  138. } else {
  139. jsonObject.put("yearonyearrate", (rows.get(0).getBigDecimal("typestatistics").subtract(rowsLastYear.get(0).getBigDecimal("typestatistics"))).divide(rowsLastYear.get(0).getBigDecimal("typestatistics"), 4, BigDecimal.ROUND_HALF_UP));
  140. }
  141. jsonArray.add(jsonObject);
  142. //客户数
  143. jsonObject = new JSONObject();
  144. factory = new SQLFactory(this, "销售客户数统计查询");
  145. factory.addParameter("siteid", siteid);
  146. factory.addParameter_SQL("where", where);
  147. rows = dbConnect.runSqlQuery(factory.getSQL(false));
  148. factoryLastYear = new SQLFactory(this, "销售客户数统计查询");
  149. factoryLastYear.addParameter("siteid", siteid);
  150. factoryLastYear.addParameter_SQL("where", whereLastYear);
  151. rowsLastYear = dbConnect.runSqlQuery(factoryLastYear.getSQL(false));
  152. jsonObject.put("type", "客户数");
  153. jsonObject.put("currentData", rows.get(0).getBigDecimal("typestatistics"));
  154. jsonObject.put("yearonyeargrowth", rows.get(0).getBigDecimal("typestatistics").subtract(rowsLastYear.get(0).getBigDecimal("typestatistics")));
  155. if (rowsLastYear.get(0).getBigDecimal("typestatistics").compareTo(BigDecimal.ZERO) == 0) {
  156. jsonObject.put("yearonyearrate", 0);
  157. } else {
  158. jsonObject.put("yearonyearrate", (rows.get(0).getBigDecimal("typestatistics").subtract(rowsLastYear.get(0).getBigDecimal("typestatistics"))).divide(rowsLastYear.get(0).getBigDecimal("typestatistics"), 4, BigDecimal.ROUND_HALF_UP));
  159. }
  160. jsonArray.add(jsonObject);
  161. //回款
  162. jsonObject = new JSONObject();
  163. factory = new SQLFactory(this, "回款统计查询");
  164. factory.addParameter("siteid", siteid);
  165. factory.addParameter_SQL("where", where);
  166. rows = dbConnect.runSqlQuery(factory.getSQL(false));
  167. factoryLastYear = new SQLFactory(this, "回款统计查询");
  168. factoryLastYear.addParameter("siteid", siteid);
  169. factoryLastYear.addParameter_SQL("where", whereLastYear);
  170. rowsLastYear = dbConnect.runSqlQuery(factoryLastYear.getSQL(false));
  171. jsonObject.put("type", "回款");
  172. jsonObject.put("currentData", rows.get(0).getBigDecimal("typestatistics"));
  173. jsonObject.put("yearonyeargrowth", rows.get(0).getBigDecimal("typestatistics").subtract(rowsLastYear.get(0).getBigDecimal("typestatistics")));
  174. if (rowsLastYear.get(0).getBigDecimal("typestatistics").compareTo(BigDecimal.ZERO) == 0) {
  175. jsonObject.put("yearonyearrate", 0);
  176. } else {
  177. jsonObject.put("yearonyearrate", (rows.get(0).getBigDecimal("typestatistics").subtract(rowsLastYear.get(0).getBigDecimal("typestatistics"))).divide(rowsLastYear.get(0).getBigDecimal("typestatistics"), 4, BigDecimal.ROUND_HALF_UP));
  178. }
  179. jsonArray.add(jsonObject);
  180. return getSucReturnObject().setData(jsonArray).toString();
  181. }
  182. /**
  183. * 销售类型分析
  184. *
  185. * @return
  186. */
  187. @API(title = "销售订单按月份分析", apiversion = R.ID20230729142603.v1.class)
  188. @CACHEING
  189. public String SalesOrderByMonthAnalysis() throws Exception {
  190. String datatype = content.getString("datatype");
  191. /*
  192. * 过滤条件设置
  193. */
  194. // if (content.containsKey("where")) {
  195. // JSONObject whereObject = content.getJSONObject("where");
  196. // if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
  197. // begindate = whereObject.getString("begindate");
  198. // }
  199. // if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
  200. // enddate = whereObject.getString("enddate");
  201. // }
  202. // }
  203. SQLFactory factory;
  204. if (datatype.equals("订货额")) {
  205. factory = new SQLFactory(this, "销售额统计查询_月份");
  206. } else if (datatype.equals("订货单量")) {
  207. factory = new SQLFactory(this, "销售单量统计查询_月份");
  208. } else {
  209. return getErrReturnObject().setErrMsg("datatype类型错误").toString();
  210. }
  211. factory.addParameter("siteid", siteid);
  212. Rows rows = dbConnect.runSqlQuery(factory.getSQL(false));
  213. String year = new SimpleDateFormat("yyyy").format(new Date());
  214. String lastyear = String.valueOf(Integer.parseInt(new SimpleDateFormat("yyyy").format(new Date())) - 1);
  215. List<DataTrans> list = new ArrayList();
  216. for (Row row : rows) {
  217. DataTrans dataTrans = new DataTrans();
  218. if(row.getString("y").equals(year) || row.getString("y").equals(lastyear)){
  219. dataTrans.setName(row.getString("y")+"-"+ row.getString("m"));
  220. dataTrans.setMonth(row.getString("m"));
  221. dataTrans.setYear(row.getString("y"));
  222. dataTrans.setValue(row.getBigDecimal("typestatistics"));
  223. list.add(dataTrans);
  224. }
  225. }
  226. list=supplementDate(Integer.parseInt(year),list);
  227. list=supplementDate(Integer.parseInt(lastyear),list);
  228. return getSucReturnObject().setData(list).toString();
  229. }
  230. /**
  231. * 销售类型分析
  232. *
  233. * @return
  234. */
  235. @API(title = "销售类型分析", apiversion = R.ID20230728133003.v1.class)
  236. @CACHEING
  237. public String SalesTypeAnalysis() throws YosException {
  238. String datetype = content.getStringValue("datetype");
  239. String datatype = content.getString("datatype");
  240. String begindate = "";
  241. String enddate = "";
  242. switch (datetype) {
  243. case "月":
  244. begindate = getMonthFirstDay();
  245. enddate = getMonthLastDay();
  246. break;
  247. case "年":
  248. begindate = new SimpleDateFormat("yyyy").format(new Date()) + "-01-01";
  249. enddate = new SimpleDateFormat("yyyy").format(new Date()) + "-12-31";
  250. break;
  251. case "周":
  252. begindate = getWeekFirstDay();
  253. enddate = getWeekLastDay();
  254. break;
  255. default:
  256. break;
  257. }
  258. /*
  259. * 过滤条件设置
  260. */
  261. if (content.containsKey("where")) {
  262. JSONObject whereObject = content.getJSONObject("where");
  263. if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
  264. begindate = whereObject.getString("begindate");
  265. }
  266. if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
  267. enddate = whereObject.getString("enddate");
  268. }
  269. }
  270. StringBuffer where = new StringBuffer(" 1=1 ");
  271. if (begindate != "") {
  272. where.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') >='").append(begindate).append("' ");
  273. }
  274. if (enddate != "") {
  275. where.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') <='").append(enddate).append("' ");
  276. }
  277. SQLFactory factory;
  278. if (datatype.equals("销售额")) {
  279. factory = new SQLFactory(this, "销售额统计查询_类型");
  280. } else if (datatype.equals("销售单量")) {
  281. factory = new SQLFactory(this, "销售单量统计查询_类型");
  282. } else {
  283. return getErrReturnObject().setErrMsg("datatype类型错误").toString();
  284. }
  285. factory.addParameter("siteid", siteid);
  286. factory.addParameter_SQL("where", where);
  287. Rows rows = dbConnect.runSqlQuery(factory.getSQL(false));
  288. return getSucReturnObject().setData(rows).toString();
  289. }
  290. /**
  291. * 订货额类别占比分析
  292. *
  293. * @return
  294. */
  295. @API(title = "订货额类别占比分析", apiversion = R.ID20230728143503.v1.class)
  296. @CACHEING
  297. public String orderAmountCategoriesAnalysis() throws Exception {
  298. String datetype = content.getStringValue("datetype");
  299. String datatype = content.getString("datatype");
  300. String begindate = "";
  301. String enddate = "";
  302. switch (datetype) {
  303. case "月":
  304. begindate = getMonthFirstDay();
  305. enddate = getMonthLastDay();
  306. break;
  307. case "年":
  308. begindate = new SimpleDateFormat("yyyy").format(new Date()) + "-01-01";
  309. enddate = new SimpleDateFormat("yyyy").format(new Date()) + "-12-31";
  310. break;
  311. case "周":
  312. begindate = getWeekFirstDay();
  313. enddate = getWeekLastDay();
  314. break;
  315. default:
  316. break;
  317. }
  318. /*
  319. * 过滤条件设置
  320. */
  321. if (content.containsKey("where")) {
  322. JSONObject whereObject = content.getJSONObject("where");
  323. if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
  324. begindate = whereObject.getString("begindate");
  325. }
  326. if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
  327. enddate = whereObject.getString("enddate");
  328. }
  329. }
  330. StringBuffer where = new StringBuffer(" 1=1 ");
  331. StringBuffer whereLastYear = new StringBuffer(" 1=1 ");
  332. if (begindate != "") {
  333. where.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') >='").append(begindate).append("' ");
  334. Date date = sdf.parse(begindate);
  335. //创建Calendar实例
  336. Calendar cal = Calendar.getInstance();
  337. //设置当前时间
  338. cal.setTime(date);
  339. //在当前时间基础上减一年
  340. cal.add(Calendar.YEAR, -1);
  341. whereLastYear.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') >='").append(sdf.format(cal.getTime())).append("' ");
  342. }
  343. if (enddate != "") {
  344. where.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') <='").append(enddate).append("' ");
  345. Date date = sdf.parse(enddate);
  346. //创建Calendar实例
  347. Calendar cal = Calendar.getInstance();
  348. //设置当前时间
  349. cal.setTime(date);
  350. //在当前时间基础上减一年
  351. cal.add(Calendar.YEAR, -1);
  352. whereLastYear.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') <='").append(sdf.format(cal.getTime())).append("' ");
  353. }
  354. if (datatype.equals("标准")) {
  355. where.append(" and t1.type='标准订单' ");
  356. whereLastYear.append(" and t1.type='标准订单' ");
  357. } else if (datatype.equals("促销")) {
  358. where.append(" and t1.type='促销订单' ");
  359. whereLastYear.append(" and t1.type='标准订单' ");
  360. } else if (datatype.equals("特殊")) {
  361. where.append(" and t1.type='特殊订单' ");
  362. whereLastYear.append(" and t1.type='标准订单' ");
  363. } else {
  364. where.append(" and 1=1 ");
  365. whereLastYear.append(" and 1=1 ");
  366. }
  367. Rows topItemclassRows = dbConnect.runSqlQuery("select itemclassid,itemclassname from plm_itemclass where classtype='营销' and siteid='" + siteid + "' and ifnull(parentid,0)=0");
  368. for (Row row : topItemclassRows) {
  369. ArrayList<Long> itemclassids = ItemClass.getSubItemClassIds(this, row.getLong("itemclassid"));
  370. SQLFactory factory = new SQLFactory(this, "订货额类别统计分析");
  371. factory.addParameter("siteid", siteid);
  372. factory.addParameter_SQL("where", where);
  373. factory.addParameter_in("itemclassid", itemclassids);
  374. Rows rows = dbConnect.runSqlQuery(factory.getSQL(false));
  375. SQLFactory factoryLastYear = new SQLFactory(this, "订货额类别统计分析");
  376. factoryLastYear.addParameter("siteid", siteid);
  377. factoryLastYear.addParameter_SQL("where", whereLastYear);
  378. factoryLastYear.addParameter_in("itemclassid", itemclassids);
  379. Rows rowsLastYear = dbConnect.runSqlQuery(factoryLastYear.getSQL(false));
  380. if (rows.isNotEmpty()) {
  381. row.put("amount", rows.get(0).getBigDecimal("typestatistics"));
  382. } else {
  383. row.put("amount", BigDecimal.ZERO);
  384. }
  385. if (rowsLastYear.isNotEmpty()) {
  386. row.put("lastyearamount", rowsLastYear.get(0).getBigDecimal("typestatistics"));
  387. } else {
  388. row.put("lastyearamount", BigDecimal.ZERO);
  389. }
  390. if (row.getBigDecimal("lastyearamount").compareTo(BigDecimal.ZERO) == 0) {
  391. row.put("yearonyear", BigDecimal.ZERO);
  392. } else {
  393. row.put("yearonyear", (row.getBigDecimal("amount").subtract(row.getBigDecimal("lastyearamount"))).divide(row.getBigDecimal("lastyearamount"), 4, BigDecimal.ROUND_HALF_UP));
  394. }
  395. }
  396. BigDecimal sumamount = topItemclassRows.sum("amount");
  397. for (Row row : topItemclassRows) {
  398. if (sumamount.compareTo(BigDecimal.ZERO) == 0) {
  399. row.put("proportion", BigDecimal.ZERO);
  400. } else {
  401. row.put("proportion", row.getBigDecimal("amount").divide(sumamount, 4, BigDecimal.ROUND_HALF_UP));
  402. }
  403. }
  404. return getSucReturnObject().setData(topItemclassRows).toString();
  405. }
  406. /**
  407. * @Description: 获取季度第一天
  408. * 1.根据给定日期计算当前季度的第一个月份
  409. * 2.设置日历的月份为当前季度的第一个月份
  410. * 3.最后设置日历月份天数为第一天即可
  411. * @Author: wsp
  412. **/
  413. public static Calendar getQuarterStart(Date date) {
  414. Calendar startCalendar = Calendar.getInstance();
  415. startCalendar.setTime(date);
  416. //get方法:获取给定日历属性的值,如 endCalendar.get(Calendar.MONTH) 获取日历的月份
  417. //计算季度数:由于月份从0开始,即1月份的Calendar.MONTH值为0,所以计算季度的第一个月份只需 月份 / 3 * 3
  418. startCalendar.set(Calendar.MONTH, (((int) startCalendar.get(Calendar.MONTH)) / 3) * 3);
  419. startCalendar.set(Calendar.DAY_OF_MONTH, 1);
  420. return startCalendar;
  421. }
  422. /**
  423. * @Description: 获取季度最后一天
  424. * @Author: wsp
  425. **/
  426. public static Calendar getQuarterEnd(Date date) { // 季度结束
  427. Calendar endCalendar = Calendar.getInstance();
  428. endCalendar.setTime(date);
  429. //计算季度数:由于月份从0开始,即1月份的Calendar.MONTH值为0,所以计算季度的第三个月份只需 月份 / 3 * 3 + 2
  430. endCalendar.set(Calendar.MONTH, (((int) endCalendar.get(Calendar.MONTH)) / 3) * 3 + 2);
  431. endCalendar.set(Calendar.DAY_OF_MONTH, endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH));
  432. return endCalendar;
  433. }
  434. public static List<DataTrans> supplementDate(int year,List<DataTrans> params){
  435. String[] monthAndDay = new String[]{"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"};
  436. List<DataTrans> list = new ArrayList<>();
  437. for (DataTrans data:params){
  438. list.add(data);
  439. for (String s:monthAndDay){
  440. DataTrans dataTrans = new DataTrans();
  441. String date = year+"-"+s;
  442. if (!date.equals(data.getName())){
  443. dataTrans.setName(date);
  444. dataTrans.setMonth(s);
  445. dataTrans.setYear(String.valueOf(year));
  446. dataTrans.setValue(BigDecimal.ZERO);
  447. list.add(dataTrans);
  448. }
  449. }
  450. }
  451. // 集合中相同属性去重、值合并
  452. return merge(list);
  453. }
  454. public static List<DataTrans> merge(List<DataTrans> list) {
  455. List<DataTrans> result = list.stream()
  456. // 表示name为key,接着如果有重复的,那么从DataTrans对象o1与o2中筛选出一个,这里选择o1,
  457. // 并把name重复,需要将value与o1进行合并的o2, 赋值给o1,最后返回o1
  458. .collect(Collectors.toMap(DataTrans::getName, a -> a, (o1, o2)-> {
  459. o1.setValue(o1.getValue().add(o2.getValue()));
  460. return o1;
  461. })).values().stream().collect(Collectors.toList());
  462. return result;
  463. }
  464. }