databoard.java 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139
  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 common.Controller;
  6. import common.YosException;
  7. import common.annotation.API;
  8. import common.annotation.CACHEING;
  9. import common.data.Row;
  10. import common.data.Rows;
  11. import common.data.RowsMap;
  12. import common.data.SQLFactory;
  13. import org.apache.commons.lang.StringUtils;
  14. import restcontroller.R;
  15. import java.math.BigDecimal;
  16. import java.text.SimpleDateFormat;
  17. import java.util.*;
  18. import java.util.stream.Collectors;
  19. /**
  20. * 数据看板
  21. */
  22. public class databoard extends Controller {
  23. /**
  24. * 构造函数
  25. *
  26. * @param content
  27. */
  28. public databoard(JSONObject content) throws YosException {
  29. super(content);
  30. }
  31. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  32. /**
  33. * 经销商订货分析
  34. *
  35. * @return
  36. */
  37. @API(title = "经销商订货分析", apiversion = R.ID20230803143703.v1.class)
  38. @CACHEING
  39. public String agentOrderAndPaymentAnalysis() throws Exception {
  40. String datetype = content.getStringValue("datetype");
  41. String begindate = "";
  42. String enddate = "";
  43. //
  44. String begindate1 = "";
  45. String enddate1 = "";
  46. String begindate2 = "";
  47. String enddate2 = "";
  48. switch (datetype) {
  49. case "月":
  50. begindate = getMonthFirstDay();
  51. begindate1=caluteDate(Calendar.MONTH,begindate);
  52. begindate2=caluteDate(Calendar.YEAR,begindate);
  53. enddate = getMonthLastDay();
  54. enddate1= caluteDate(Calendar.MONTH,enddate);
  55. enddate2= caluteDate(Calendar.YEAR,enddate);
  56. break;
  57. case "年":
  58. begindate = new SimpleDateFormat("yyyy").format(new Date()) + "-01-01";
  59. begindate1=caluteDate(Calendar.YEAR,begindate);
  60. enddate = new SimpleDateFormat("yyyy").format(new Date()) + "-12-31";
  61. enddate1= caluteDate(Calendar.YEAR,enddate);
  62. break;
  63. case "日":
  64. begindate = sdf.format(new Date().getTime());
  65. begindate1=caluteDate(Calendar.DAY_OF_MONTH,begindate);
  66. enddate = sdf.format(new Date().getTime());
  67. enddate1= caluteDate(Calendar.DAY_OF_MONTH,enddate);
  68. break;
  69. default:
  70. break;
  71. }
  72. StringBuffer where = new StringBuffer(" 1=1 and t1.sys_enterpriseid="+sys_enterpriseid);
  73. StringBuffer whereLast1 = new StringBuffer(" 1=1 and t1.sys_enterpriseid="+sys_enterpriseid);
  74. StringBuffer whereLast2 = new StringBuffer(" 1=1 and t1.sys_enterpriseid="+sys_enterpriseid);
  75. if (begindate != "") {
  76. where.append(" and DATE_FORMAT(t1.billdate, '%Y-%m-%d') >='").append(begindate).append("' ");
  77. }
  78. if (enddate != "") {
  79. where.append(" and DATE_FORMAT(t1.billdate, '%Y-%m-%d') <='").append(enddate).append("' ");
  80. }
  81. if (begindate1 != "") {
  82. whereLast1.append(" and DATE_FORMAT(t1.billdate, '%Y-%m-%d') >='").append(begindate1).append("' ");
  83. }
  84. if (enddate1 != "") {
  85. whereLast1.append(" and DATE_FORMAT(t1.billdate, '%Y-%m-%d') <='").append(enddate1).append("' ");
  86. }
  87. if (begindate2 != "") {
  88. whereLast2.append(" and DATE_FORMAT(t1.billdate, '%Y-%m-%d') >='").append(begindate2).append("' ");
  89. }
  90. if (enddate2 != "") {
  91. whereLast2.append(" and DATE_FORMAT(t1.billdate, '%Y-%m-%d') <='").append(enddate2).append("' ");
  92. }
  93. JSONArray jsonArray = new JSONArray();
  94. //订货额
  95. JSONObject jsonObject = new JSONObject();
  96. SQLFactory factory = new SQLFactory(this, "销售额统计查询_经销商");
  97. factory.addParameter("siteid", siteid);
  98. factory.addParameter_SQL("where", where);
  99. Rows rows = dbConnect.runSqlQuery(factory.getSQL(false));
  100. //环比
  101. SQLFactory factoryLast1 = new SQLFactory(this, "销售额统计查询_经销商");
  102. factoryLast1.addParameter("siteid", siteid);
  103. factoryLast1.addParameter_SQL("where", whereLast1);
  104. Rows rowsLast1 = dbConnect.runSqlQuery(factoryLast1.getSQL(false));
  105. //同比
  106. SQLFactory factoryLast2 = new SQLFactory(this, "销售额统计查询_经销商");
  107. factoryLast2.addParameter("siteid", siteid);
  108. factoryLast2.addParameter_SQL("where", whereLast2);
  109. Rows rowsLast2 = dbConnect.runSqlQuery(factoryLast2.getSQL(false));
  110. BigDecimal typestatistics =rows.get(0).getBigDecimal("typestatistics");
  111. BigDecimal typestatistics1 =rowsLast1.get(0).getBigDecimal("typestatistics");
  112. BigDecimal typestatistics2 =rowsLast2.get(0).getBigDecimal("typestatistics");
  113. BigDecimal huanbirate=BigDecimal.ZERO;
  114. BigDecimal tongbirate=BigDecimal.ZERO;
  115. if(typestatistics1.compareTo(BigDecimal.ZERO)>0){
  116. huanbirate=(typestatistics.subtract(typestatistics1)).divide(typestatistics1, 4, BigDecimal.ROUND_HALF_UP);
  117. }
  118. if(typestatistics2.compareTo(BigDecimal.ZERO)>0){
  119. tongbirate=(typestatistics.subtract(typestatistics2)).divide(typestatistics2, 4, BigDecimal.ROUND_HALF_UP);
  120. }
  121. jsonObject = new JSONObject();
  122. jsonObject.put("typestatistics",typestatistics);
  123. jsonObject.put("huanbirate", huanbirate);
  124. jsonObject.put("tongbirate", tongbirate);
  125. jsonArray.add(jsonObject);
  126. return getSucReturnObject().setData(jsonArray).toString();
  127. }
  128. /**
  129. * 经销商余额
  130. *
  131. * @return
  132. */
  133. @API(title = "经销商余额", apiversion = R.ID20230803165003.v1.class)
  134. @CACHEING
  135. public String agentBalanceAnalysis() throws Exception {
  136. //账户余额
  137. SQLFactory balancefactory= new SQLFactory(this, "账户余额_经销商");
  138. balancefactory.addParameter("siteid", siteid);
  139. balancefactory.addParameter("sys_enterpriseid", sys_enterpriseid);
  140. Rows balanceRows = dbConnect.runSqlQuery(balancefactory.getSQL(false));
  141. return getSucReturnObject().setData(balanceRows).toString();
  142. }
  143. /**
  144. * 订货额类别占比分析
  145. *
  146. * @return
  147. */
  148. @API(title = "订货分析", apiversion = R.ID20230729103203.v1.class)
  149. @CACHEING
  150. public String orderAndPaymentAnalysis() throws Exception {
  151. String datetype = content.getStringValue("datetype");
  152. String begindate = "";
  153. String enddate = "";
  154. switch (datetype) {
  155. case "月":
  156. begindate = getMonthFirstDay();
  157. enddate = getMonthLastDay();
  158. break;
  159. case "年":
  160. begindate = new SimpleDateFormat("yyyy").format(new Date()) + "-01-01";
  161. enddate = new SimpleDateFormat("yyyy").format(new Date()) + "-12-31";
  162. break;
  163. case "季":
  164. begindate = sdf.format(getQuarterStart(new Date()).getTime());
  165. enddate = sdf.format(getQuarterEnd(new Date()).getTime());
  166. break;
  167. case "上半年":
  168. begindate = new SimpleDateFormat("yyyy").format(new Date()) + "-01-01";
  169. enddate = new SimpleDateFormat("yyyy").format(new Date()) + "-06-30";
  170. break;
  171. default:
  172. break;
  173. }
  174. /*
  175. * 过滤条件设置
  176. */
  177. if (content.containsKey("where")) {
  178. JSONObject whereObject = content.getJSONObject("where");
  179. if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
  180. begindate = whereObject.getString("begindate");
  181. }
  182. if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
  183. enddate = whereObject.getString("enddate");
  184. }
  185. }
  186. StringBuffer where = new StringBuffer(" 1=1 ");
  187. StringBuffer whereLastYear = new StringBuffer(" 1=1 ");
  188. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  189. if (begindate != "") {
  190. where.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') >='").append(begindate).append("' ");
  191. Date date = sdf.parse(begindate);
  192. //创建Calendar实例
  193. Calendar cal = Calendar.getInstance();
  194. //设置当前时间
  195. cal.setTime(date);
  196. //在当前时间基础上减一年
  197. cal.add(Calendar.YEAR, -1);
  198. whereLastYear.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') >='").append(sdf.format(cal.getTime())).append("' ");
  199. }
  200. if (enddate != "") {
  201. where.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') <='").append(enddate).append("' ");
  202. Date date = sdf.parse(enddate);
  203. //创建Calendar实例
  204. Calendar cal = Calendar.getInstance();
  205. //设置当前时间
  206. cal.setTime(date);
  207. //在当前时间基础上减一年
  208. cal.add(Calendar.YEAR, -1);
  209. whereLastYear.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') <='").append(sdf.format(cal.getTime())).append("' ");
  210. }
  211. JSONArray jsonArray = new JSONArray();
  212. //订货额
  213. JSONObject jsonObject = new JSONObject();
  214. SQLFactory factory = new SQLFactory(this, "销售额统计查询");
  215. factory.addParameter("siteid", siteid);
  216. factory.addParameter_SQL("where", where);
  217. Rows rows = dbConnect.runSqlQuery(factory.getSQL(false));
  218. SQLFactory factoryLastYear = new SQLFactory(this, "销售额统计查询");
  219. factoryLastYear.addParameter("siteid", siteid);
  220. factoryLastYear.addParameter_SQL("where", whereLastYear);
  221. Rows rowsLastYear = dbConnect.runSqlQuery(factoryLastYear.getSQL(false));
  222. jsonObject.put("type", "订货额");
  223. jsonObject.put("currentData", rows.get(0).getBigDecimal("typestatistics"));
  224. jsonObject.put("yearonyeargrowth", rows.get(0).getBigDecimal("typestatistics").subtract(rowsLastYear.get(0).getBigDecimal("typestatistics")));
  225. if (rowsLastYear.get(0).getBigDecimal("typestatistics").compareTo(BigDecimal.ZERO) == 0) {
  226. jsonObject.put("yearonyearrate", 0);
  227. } else {
  228. 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));
  229. }
  230. jsonArray.add(jsonObject);
  231. //订单量
  232. jsonObject = new JSONObject();
  233. factory = new SQLFactory(this, "销售单量统计查询");
  234. factory.addParameter("siteid", siteid);
  235. factory.addParameter_SQL("where", where);
  236. rows = dbConnect.runSqlQuery(factory.getSQL(false));
  237. factoryLastYear = new SQLFactory(this, "销售单量统计查询");
  238. factoryLastYear.addParameter("siteid", siteid);
  239. factoryLastYear.addParameter_SQL("where", whereLastYear);
  240. rowsLastYear = dbConnect.runSqlQuery(factoryLastYear.getSQL(false));
  241. jsonObject.put("type", "订单量");
  242. ;
  243. jsonObject.put("currentData", rows.get(0).getBigDecimal("typestatistics"));
  244. jsonObject.put("yearonyeargrowth", rows.get(0).getBigDecimal("typestatistics").subtract(rowsLastYear.get(0).getBigDecimal("typestatistics")));
  245. if (rowsLastYear.get(0).getBigDecimal("typestatistics").compareTo(BigDecimal.ZERO) == 0) {
  246. jsonObject.put("yearonyearrate", 0);
  247. } else {
  248. 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));
  249. }
  250. jsonArray.add(jsonObject);
  251. //客户数
  252. jsonObject = new JSONObject();
  253. factory = new SQLFactory(this, "销售客户数统计查询");
  254. factory.addParameter("siteid", siteid);
  255. factory.addParameter_SQL("where", where);
  256. rows = dbConnect.runSqlQuery(factory.getSQL(false));
  257. factoryLastYear = new SQLFactory(this, "销售客户数统计查询");
  258. factoryLastYear.addParameter("siteid", siteid);
  259. factoryLastYear.addParameter_SQL("where", whereLastYear);
  260. rowsLastYear = dbConnect.runSqlQuery(factoryLastYear.getSQL(false));
  261. jsonObject.put("type", "客户数");
  262. jsonObject.put("currentData", rows.get(0).getBigDecimal("typestatistics"));
  263. jsonObject.put("yearonyeargrowth", rows.get(0).getBigDecimal("typestatistics").subtract(rowsLastYear.get(0).getBigDecimal("typestatistics")));
  264. if (rowsLastYear.get(0).getBigDecimal("typestatistics").compareTo(BigDecimal.ZERO) == 0) {
  265. jsonObject.put("yearonyearrate", 0);
  266. } else {
  267. 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));
  268. }
  269. jsonArray.add(jsonObject);
  270. //回款
  271. jsonObject = new JSONObject();
  272. factory = new SQLFactory(this, "回款统计查询");
  273. factory.addParameter("siteid", siteid);
  274. factory.addParameter_SQL("where", where);
  275. rows = dbConnect.runSqlQuery(factory.getSQL(false));
  276. factoryLastYear = new SQLFactory(this, "回款统计查询");
  277. factoryLastYear.addParameter("siteid", siteid);
  278. factoryLastYear.addParameter_SQL("where", whereLastYear);
  279. rowsLastYear = dbConnect.runSqlQuery(factoryLastYear.getSQL(false));
  280. jsonObject.put("type", "回款");
  281. jsonObject.put("currentData", rows.get(0).getBigDecimal("typestatistics"));
  282. jsonObject.put("yearonyeargrowth", rows.get(0).getBigDecimal("typestatistics").subtract(rowsLastYear.get(0).getBigDecimal("typestatistics")));
  283. if (rowsLastYear.get(0).getBigDecimal("typestatistics").compareTo(BigDecimal.ZERO) == 0) {
  284. jsonObject.put("yearonyearrate", 0);
  285. } else {
  286. 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));
  287. }
  288. jsonArray.add(jsonObject);
  289. return getSucReturnObject().setData(jsonArray).toString();
  290. }
  291. /**
  292. * 销售类型分析
  293. *
  294. * @return
  295. */
  296. @API(title = "销售订单按月份分析", apiversion = R.ID20230729142603.v1.class)
  297. @CACHEING
  298. public String SalesOrderByMonthAnalysis() throws Exception {
  299. String datatype = content.getString("datatype");
  300. String where = " 1=1 ";
  301. if(sys_enterpriseid>0){
  302. where=where+" and t1.sys_enterpriseid="+sys_enterpriseid;
  303. }
  304. /*
  305. * 过滤条件设置
  306. */
  307. // if (content.containsKey("where")) {
  308. // JSONObject whereObject = content.getJSONObject("where");
  309. // if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
  310. // begindate = whereObject.getString("begindate");
  311. // }
  312. // if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
  313. // enddate = whereObject.getString("enddate");
  314. // }
  315. // }
  316. SQLFactory factory;
  317. if (datatype.equals("订货额")) {
  318. factory = new SQLFactory(this, "销售额统计查询_月份");
  319. } else if (datatype.equals("订货单量")) {
  320. factory = new SQLFactory(this, "销售单量统计查询_月份");
  321. } else {
  322. return getErrReturnObject().setErrMsg("datatype类型错误").toString();
  323. }
  324. factory.addParameter("siteid", siteid);
  325. factory.addParameter_SQL("where", where);
  326. Rows rows = dbConnect.runSqlQuery(factory.getSQL(false));
  327. String year = new SimpleDateFormat("yyyy").format(new Date());
  328. String lastyear = String.valueOf(Integer.parseInt(new SimpleDateFormat("yyyy").format(new Date())) - 1);
  329. List<DataTrans> list = new ArrayList();
  330. for (Row row : rows) {
  331. DataTrans dataTrans = new DataTrans();
  332. if (row.getString("y").equals(year) || row.getString("y").equals(lastyear)) {
  333. dataTrans.setName(row.getString("y") + "-" + row.getString("m"));
  334. dataTrans.setMonth(row.getString("m"));
  335. dataTrans.setYear(row.getString("y"));
  336. dataTrans.setValue(row.getBigDecimal("typestatistics"));
  337. list.add(dataTrans);
  338. }
  339. }
  340. list = supplementDate(Integer.parseInt(year), list);
  341. list = supplementDate(Integer.parseInt(lastyear), list);
  342. list.sort(Comparator.comparingLong(o -> Long.parseLong(StringUtils.isBlank(o.getMonth())?"9999":o.getMonth())));
  343. return getSucReturnObject().setData(list).toString();
  344. }
  345. /**
  346. * 销售类型分析
  347. *
  348. * @return
  349. */
  350. @API(title = "销售类型分析", apiversion = R.ID20230728133003.v1.class)
  351. @CACHEING
  352. public String SalesTypeAnalysis() throws YosException {
  353. String datetype = content.getStringValue("datetype");
  354. String datatype = content.getString("datatype");
  355. String begindate = "";
  356. String enddate = "";
  357. switch (datetype) {
  358. case "月":
  359. begindate = getMonthFirstDay();
  360. enddate = getMonthLastDay();
  361. break;
  362. case "年":
  363. begindate = new SimpleDateFormat("yyyy").format(new Date()) + "-01-01";
  364. enddate = new SimpleDateFormat("yyyy").format(new Date()) + "-12-31";
  365. break;
  366. case "周":
  367. begindate = getWeekFirstDay();
  368. enddate = getWeekLastDay();
  369. break;
  370. default:
  371. break;
  372. }
  373. /*
  374. * 过滤条件设置
  375. */
  376. if (content.containsKey("where")) {
  377. JSONObject whereObject = content.getJSONObject("where");
  378. if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
  379. begindate = whereObject.getString("begindate");
  380. }
  381. if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
  382. enddate = whereObject.getString("enddate");
  383. }
  384. }
  385. StringBuffer where = new StringBuffer(" 1=1 ");
  386. if (begindate != "") {
  387. where.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') >='").append(begindate).append("' ");
  388. }
  389. if (enddate != "") {
  390. where.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') <='").append(enddate).append("' ");
  391. }
  392. SQLFactory factory;
  393. if (datatype.equals("销售额")) {
  394. factory = new SQLFactory(this, "销售额统计查询_类型");
  395. } else if (datatype.equals("销售单量")) {
  396. factory = new SQLFactory(this, "销售单量统计查询_类型");
  397. } else {
  398. return getErrReturnObject().setErrMsg("datatype类型错误").toString();
  399. }
  400. factory.addParameter("siteid", siteid);
  401. factory.addParameter_SQL("where", where);
  402. Rows rows = dbConnect.runSqlQuery(factory.getSQL(false));
  403. return getSucReturnObject().setData(rows).toString();
  404. }
  405. /**
  406. * 订货额类别占比分析
  407. *
  408. * @return
  409. */
  410. @API(title = "订货额类别占比分析", apiversion = R.ID20230728143503.v1.class)
  411. @CACHEING
  412. public String orderAmountCategoriesAnalysis() throws Exception {
  413. String datetype = content.getStringValue("datetype");
  414. String datatype = content.getString("datatype");
  415. String begindate = "";
  416. String enddate = "";
  417. switch (datetype) {
  418. case "月":
  419. begindate = getMonthFirstDay();
  420. enddate = getMonthLastDay();
  421. break;
  422. case "年":
  423. begindate = new SimpleDateFormat("yyyy").format(new Date()) + "-01-01";
  424. enddate = new SimpleDateFormat("yyyy").format(new Date()) + "-12-31";
  425. break;
  426. case "周":
  427. begindate = getWeekFirstDay();
  428. enddate = getWeekLastDay();
  429. break;
  430. default:
  431. break;
  432. }
  433. /*
  434. * 过滤条件设置
  435. */
  436. if (content.containsKey("where")) {
  437. JSONObject whereObject = content.getJSONObject("where");
  438. if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
  439. begindate = whereObject.getString("begindate");
  440. }
  441. if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
  442. enddate = whereObject.getString("enddate");
  443. }
  444. }
  445. StringBuffer where = new StringBuffer(" 1=1 ");
  446. StringBuffer whereLastYear = new StringBuffer(" 1=1 ");
  447. if (begindate != "") {
  448. where.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') >='").append(begindate).append("' ");
  449. Date date = sdf.parse(begindate);
  450. //创建Calendar实例
  451. Calendar cal = Calendar.getInstance();
  452. //设置当前时间
  453. cal.setTime(date);
  454. //在当前时间基础上减一年
  455. cal.add(Calendar.YEAR, -1);
  456. whereLastYear.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') >='").append(sdf.format(cal.getTime())).append("' ");
  457. }
  458. if (enddate != "") {
  459. where.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') <='").append(enddate).append("' ");
  460. Date date = sdf.parse(enddate);
  461. //创建Calendar实例
  462. Calendar cal = Calendar.getInstance();
  463. //设置当前时间
  464. cal.setTime(date);
  465. //在当前时间基础上减一年
  466. cal.add(Calendar.YEAR, -1);
  467. whereLastYear.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') <='").append(sdf.format(cal.getTime())).append("' ");
  468. }
  469. if(sys_enterpriseid>0){
  470. where.append(" and t1.sys_enterpriseid="+sys_enterpriseid);
  471. }
  472. if (datatype.equals("标准")) {
  473. where.append(" and t1.type='标准订单' ");
  474. whereLastYear.append(" and t1.type='标准订单' ");
  475. } else if (datatype.equals("促销")) {
  476. where.append(" and t1.type='促销订单' ");
  477. whereLastYear.append(" and t1.type='标准订单' ");
  478. } else if (datatype.equals("特殊")) {
  479. where.append(" and t1.type='特殊订单' ");
  480. whereLastYear.append(" and t1.type='标准订单' ");
  481. } else {
  482. where.append(" and 1=1 ");
  483. whereLastYear.append(" and 1=1 ");
  484. }
  485. //Rows topItemclassRows = dbConnect.runSqlQuery("select itemclassid,itemclassname marketingcategory from plm_itemclass where classtype='营销' and siteid='" + siteid + "' and ifnull(parentid,0)=0");
  486. SQLFactory factory = new SQLFactory(this, "订货额类别统计分析");
  487. factory.addParameter("siteid", siteid);
  488. factory.addParameter_SQL("where", where);
  489. Rows rows = dbConnect.runSqlQuery(factory.getSQL(false));
  490. SQLFactory factoryLastYear = new SQLFactory(this, "订货额类别统计分析");
  491. factoryLastYear.addParameter("siteid", siteid);
  492. factoryLastYear.addParameter_SQL("where", whereLastYear);
  493. Rows rowsLastYear = dbConnect.runSqlQuery(factoryLastYear.getSQL(false));
  494. RowsMap rowsLastYearMap =rowsLastYear.toRowsMap("marketingcategory");
  495. for (Row row : rows) {
  496. if (rows.isNotEmpty()) {
  497. row.put("amount", row.getBigDecimal("typestatistics"));
  498. } else {
  499. row.put("amount", BigDecimal.ZERO);
  500. }
  501. if(rowsLastYearMap.containsKey(row.getString("marketingcategory"))){
  502. if(rowsLastYearMap.get(row.getString("marketingcategory")).isNotEmpty()){
  503. row.put("lastyearamount", rowsLastYearMap.get(row.getString("marketingcategory")).get(0).getBigDecimal("typestatistics"));
  504. }else {
  505. row.put("lastyearamount", BigDecimal.ZERO);
  506. }
  507. }else{
  508. row.put("lastyearamount", BigDecimal.ZERO);
  509. }
  510. if (row.getBigDecimal("lastyearamount").compareTo(BigDecimal.ZERO) == 0) {
  511. row.put("yearonyear", BigDecimal.ZERO);
  512. } else {
  513. row.put("yearonyear", (row.getBigDecimal("amount").subtract(row.getBigDecimal("lastyearamount"))).divide(row.getBigDecimal("lastyearamount"), 4, BigDecimal.ROUND_HALF_UP));
  514. }
  515. }
  516. BigDecimal sumamount = rows.sum("amount");
  517. for (Row row : rows) {
  518. if (sumamount.compareTo(BigDecimal.ZERO) == 0) {
  519. row.put("proportion", BigDecimal.ZERO);
  520. } else {
  521. row.put("proportion", row.getBigDecimal("amount").divide(sumamount, 4, BigDecimal.ROUND_HALF_UP));
  522. }
  523. }
  524. rows.sort(Comparator.comparingDouble(o ->o.getDouble("amount")));
  525. Collections.reverse(rows);
  526. return getSucReturnObject().setData(rows).toString();
  527. }
  528. /**
  529. * 财务统计分析
  530. *
  531. * @return
  532. */
  533. @API(title = "财务统计分析", apiversion = R.ID20230802111003.v1.class)
  534. @CACHEING
  535. public String financialStatistics() throws Exception {
  536. String datetype = content.getStringValue("datetype");
  537. String begindate = "";
  538. String enddate = "";
  539. StringBuffer where = new StringBuffer(" 1=1 ");
  540. SQLFactory factory;
  541. switch (datetype) {
  542. case "月":
  543. factory = new SQLFactory(this, "财务统计_月");
  544. begindate = getMonthFirstDay();
  545. enddate = getMonthLastDay();
  546. break;
  547. case "年":
  548. factory = new SQLFactory(this, "财务统计_年度");
  549. begindate = new SimpleDateFormat("yyyy").format(new Date()) + "-01-01";
  550. enddate = new SimpleDateFormat("yyyy").format(new Date()) + "-12-31";
  551. break;
  552. case "季":
  553. factory = new SQLFactory(this, "财务统计_季");
  554. begindate = sdf.format(getQuarterStart(new Date()).getTime());
  555. enddate = sdf.format(getQuarterEnd(new Date()).getTime());
  556. break;
  557. default:
  558. factory = new SQLFactory(this, "财务统计_月");
  559. break;
  560. }
  561. /*
  562. * 过滤条件设置
  563. */
  564. if (content.containsKey("where")) {
  565. JSONObject whereObject = content.getJSONObject("where");
  566. if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
  567. begindate = whereObject.getString("begindate");
  568. }
  569. if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
  570. enddate = whereObject.getString("enddate");
  571. }
  572. }
  573. if (begindate != "") {
  574. where.append(" and DATE_FORMAT(checkdate, '%Y-%m-%d') >='").append(begindate).append("' ");
  575. }
  576. if (enddate != "") {
  577. where.append(" and DATE_FORMAT(checkdate, '%Y-%m-%d') <='").append(enddate).append("' ");
  578. }
  579. factory.addParameter("siteid", siteid);
  580. factory.addParameter_SQL("where", where);
  581. Rows rows = dbConnect.runSqlQuery(factory.getSQL(false));
  582. List<DataTrans> list = new ArrayList();
  583. switch (datetype) {
  584. case "月":
  585. for (Row row : rows) {
  586. DataTrans dataTrans = new DataTrans();
  587. if (row.getString("y").equals(new SimpleDateFormat("yyyy").format(new Date()))) {
  588. dataTrans.setName(row.getString("y") + "-" + row.getString("d") + "-" + row.getString("type"));
  589. dataTrans.setType(row.getString("type"));
  590. dataTrans.setMonth(row.getString("d"));
  591. dataTrans.setYear(row.getString("y"));
  592. dataTrans.setValue(row.getBigDecimal("typestatistics"));
  593. list.add(dataTrans);
  594. }
  595. }
  596. list = supplementDate_cashbill_month(Integer.parseInt(new SimpleDateFormat("yyyy").format(new Date())), list);
  597. break;
  598. case "年":
  599. for (Row row : rows) {
  600. DataTrans dataTrans = new DataTrans();
  601. if (row.getString("y").equals(new SimpleDateFormat("yyyy").format(new Date()))) {
  602. dataTrans.setName(row.getString("y") + "-" + row.getString("m") + "-" + row.getString("type"));
  603. dataTrans.setType(row.getString("type"));
  604. dataTrans.setMonth(row.getString("m"));
  605. dataTrans.setYear(row.getString("y"));
  606. dataTrans.setValue(row.getBigDecimal("typestatistics"));
  607. list.add(dataTrans);
  608. }
  609. }
  610. list = supplementDate_cashbill(Integer.parseInt(new SimpleDateFormat("yyyy").format(new Date())), list);
  611. break;
  612. case "季":
  613. for (Row row : rows) {
  614. DataTrans dataTrans = new DataTrans();
  615. if (row.getString("y").equals(new SimpleDateFormat("yyyy").format(new Date()))) {
  616. dataTrans.setName(row.getString("y") + "-" + row.getString("m") + "-" + row.getString("type"));
  617. dataTrans.setType(row.getString("type"));
  618. dataTrans.setMonth(row.getString("m"));
  619. dataTrans.setYear(row.getString("y"));
  620. dataTrans.setValue(row.getBigDecimal("typestatistics"));
  621. list.add(dataTrans);
  622. }
  623. }
  624. list = supplementDate_cashbill_quarter(Integer.parseInt(new SimpleDateFormat("yyyy").format(new Date())), list);
  625. break;
  626. default:
  627. break;
  628. }
  629. list.sort(Comparator.comparingLong(o -> Long.parseLong(StringUtils.isBlank(o.getMonth())?"9999":o.getMonth())));
  630. return getSucReturnObject().setData(list).toString();
  631. }
  632. /**
  633. * 新品销售占比
  634. *
  635. * @return
  636. */
  637. @API(title = "新品销售占比", apiversion = R.ID20230802100103.v1.class)
  638. @CACHEING
  639. public String newProductSalesAnalysis() throws Exception {
  640. String datetype = content.getStringValue("datetype");
  641. String begindate = "";
  642. String enddate = "";
  643. switch (datetype) {
  644. case "月":
  645. begindate = getMonthFirstDay();
  646. enddate = getMonthLastDay();
  647. break;
  648. case "年":
  649. begindate = new SimpleDateFormat("yyyy").format(new Date()) + "-01-01";
  650. enddate = new SimpleDateFormat("yyyy").format(new Date()) + "-12-31";
  651. break;
  652. case "周":
  653. begindate = getWeekFirstDay();
  654. enddate = getWeekLastDay();
  655. break;
  656. default:
  657. break;
  658. }
  659. /*
  660. * 过滤条件设置
  661. */
  662. if (content.containsKey("where")) {
  663. JSONObject whereObject = content.getJSONObject("where");
  664. if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
  665. begindate = whereObject.getString("begindate");
  666. }
  667. if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
  668. enddate = whereObject.getString("enddate");
  669. }
  670. }
  671. StringBuffer where = new StringBuffer(" 1=1 ");
  672. StringBuffer whereLastYear = new StringBuffer(" 1=1 ");
  673. if (begindate != "") {
  674. where.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') >='").append(begindate).append("' ");
  675. Date date = sdf.parse(begindate);
  676. //创建Calendar实例
  677. Calendar cal = Calendar.getInstance();
  678. //设置当前时间
  679. cal.setTime(date);
  680. //在当前时间基础上减一年
  681. cal.add(Calendar.YEAR, -1);
  682. whereLastYear.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') >='").append(sdf.format(cal.getTime())).append("' ");
  683. }
  684. if (enddate != "") {
  685. where.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') <='").append(enddate).append("' ");
  686. Date date = sdf.parse(enddate);
  687. //创建Calendar实例
  688. Calendar cal = Calendar.getInstance();
  689. //设置当前时间
  690. cal.setTime(date);
  691. //在当前时间基础上减一年
  692. cal.add(Calendar.YEAR, -1);
  693. whereLastYear.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') <='").append(sdf.format(cal.getTime())).append("' ");
  694. }
  695. SQLFactory factory = new SQLFactory(this, "新品销售占比");
  696. factory.addParameter("siteid", siteid);
  697. factory.addParameter_SQL("where", where);
  698. Rows rows = dbConnect.runSqlQuery(factory.getSQL(false));
  699. return getSucReturnObject().setData(rows).toString();
  700. }
  701. /**
  702. * 新品销售走势
  703. *
  704. * @return
  705. */
  706. @API(title = "新品销售走势", apiversion = R.ID20230802103303.v1.class)
  707. @CACHEING
  708. public String newProductSalesTrend() throws Exception {
  709. SQLFactory factory = new SQLFactory(this, "新品销售走势");
  710. String year = new SimpleDateFormat("yyyy").format(new Date());
  711. factory.addParameter("siteid", siteid);
  712. factory.addParameter_SQL("year", year);
  713. Rows rows = dbConnect.runSqlQuery(factory.getSQL(false));
  714. List<DataTrans> list = new ArrayList();
  715. for (Row row : rows) {
  716. DataTrans dataTrans = new DataTrans();
  717. if (row.getString("y").equals(year)) {
  718. dataTrans.setName(row.getString("y") + "-" + row.getString("m"));
  719. dataTrans.setMonth(row.getString("m"));
  720. dataTrans.setYear(row.getString("y"));
  721. dataTrans.setValue(row.getBigDecimal("typestatistics"));
  722. list.add(dataTrans);
  723. }
  724. }
  725. list = supplementDate(Integer.parseInt(year), list);
  726. return getSucReturnObject().setData(list).toString();
  727. }
  728. /**
  729. * 战区数据分析
  730. *
  731. * @return
  732. */
  733. @API(title = "战区数据分析", apiversion = R.ID20230802093703.v1.class)
  734. @CACHEING
  735. public String warZoneAnalysis() throws YosException {
  736. String datetype = content.getStringValue("datetype");
  737. String datatype = content.getString("datatype");
  738. String begindate = "";
  739. String enddate = "";
  740. switch (datetype) {
  741. case "月":
  742. begindate = getMonthFirstDay();
  743. enddate = getMonthLastDay();
  744. break;
  745. case "年":
  746. begindate = new SimpleDateFormat("yyyy").format(new Date()) + "-01-01";
  747. enddate = new SimpleDateFormat("yyyy").format(new Date()) + "-12-31";
  748. break;
  749. case "周":
  750. begindate = getWeekFirstDay();
  751. enddate = getWeekLastDay();
  752. break;
  753. default:
  754. break;
  755. }
  756. /*
  757. * 过滤条件设置
  758. */
  759. if (content.containsKey("where")) {
  760. JSONObject whereObject = content.getJSONObject("where");
  761. if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
  762. begindate = whereObject.getString("begindate");
  763. }
  764. if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
  765. enddate = whereObject.getString("enddate");
  766. }
  767. }
  768. StringBuffer where = new StringBuffer(" 1=1 ");
  769. if (begindate != "") {
  770. where.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') >='").append(begindate).append("' ");
  771. }
  772. if (enddate != "") {
  773. where.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') <='").append(enddate).append("' ");
  774. }
  775. SQLFactory factory;
  776. if (datatype.equals("经销商")) {
  777. factory = new SQLFactory(this, "战区数据_经销商");
  778. } else if (datatype.equals("区域")) {
  779. factory = new SQLFactory(this, "战区数据_区域");
  780. } else {
  781. return getErrReturnObject().setErrMsg("datatype类型错误").toString();
  782. }
  783. factory.addParameter("siteid", siteid);
  784. factory.addParameter_SQL("where", where);
  785. Rows rows = dbConnect.runSqlQuery(factory.getSQL(false));
  786. return getSucReturnObject().setData(rows).toString();
  787. }
  788. /**
  789. * 工厂待发明细
  790. *
  791. * @return
  792. */
  793. @API(title = "工厂待发明细", apiversion = R.ID20230803140903.v1.class)
  794. @CACHEING
  795. public String factoryPendingDetails() throws YosException {
  796. /*
  797. * 过滤条件设置
  798. */
  799. StringBuffer where = new StringBuffer(" 1=1 ");
  800. if(sys_enterpriseid>0){
  801. where.append(" and t2.sys_enterpriseid="+sys_enterpriseid);
  802. }
  803. if (content.containsKey("where")) {
  804. JSONObject whereObject = content.getJSONObject("where");
  805. if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
  806. where.append(" and DATE_FORMAT(t2.checkdate, '%Y-%m-%d') >='").append(whereObject.getString("begindate")).append("' ");
  807. }
  808. if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
  809. where.append(" and DATE_FORMAT(t2.checkdate, '%Y-%m-%d') <='").append(whereObject.getString("enddate")).append("' ");
  810. }
  811. }
  812. SQLFactory factory = new SQLFactory(this, "工厂待发明细查询");
  813. factory.addParameter("siteid", siteid);
  814. factory.addParameter_SQL("where", where);
  815. Rows rows = dbConnect.runSqlQuery(factory.getSQL(false));
  816. SQLFactory sumfactory = new SQLFactory(this, "工厂待发合计金额及数量查询");
  817. sumfactory.addParameter("siteid", siteid);
  818. sumfactory.addParameter_SQL("where", where);
  819. Rows sumrows = dbConnect.runSqlQuery(sumfactory.getSQL(false));
  820. if(rows.isNotEmpty()){
  821. rows.get(0).put("sumrows", sumrows);
  822. }
  823. return getSucReturnObject().setData(rows).toString();
  824. }
  825. /**
  826. * @Description: 获取季度第一天
  827. * 1.根据给定日期计算当前季度的第一个月份
  828. * 2.设置日历的月份为当前季度的第一个月份
  829. * 3.最后设置日历月份天数为第一天即可
  830. * @Author: wsp
  831. **/
  832. public static Calendar getQuarterStart(Date date) {
  833. Calendar startCalendar = Calendar.getInstance();
  834. startCalendar.setTime(date);
  835. //get方法:获取给定日历属性的值,如 endCalendar.get(Calendar.MONTH) 获取日历的月份
  836. //计算季度数:由于月份从0开始,即1月份的Calendar.MONTH值为0,所以计算季度的第一个月份只需 月份 / 3 * 3
  837. startCalendar.set(Calendar.MONTH, (((int) startCalendar.get(Calendar.MONTH)) / 3) * 3);
  838. startCalendar.set(Calendar.DAY_OF_MONTH, 1);
  839. return startCalendar;
  840. }
  841. /**
  842. * @Description: 获取季度最后一天
  843. * @Author: wsp
  844. **/
  845. public static Calendar getQuarterEnd(Date date) { // 季度结束
  846. Calendar endCalendar = Calendar.getInstance();
  847. endCalendar.setTime(date);
  848. //计算季度数:由于月份从0开始,即1月份的Calendar.MONTH值为0,所以计算季度的第三个月份只需 月份 / 3 * 3 + 2
  849. endCalendar.set(Calendar.MONTH, (((int) endCalendar.get(Calendar.MONTH)) / 3) * 3 + 2);
  850. endCalendar.set(Calendar.DAY_OF_MONTH, endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH));
  851. return endCalendar;
  852. }
  853. public static List<DataTrans> supplementDate(int year, List<DataTrans> params) {
  854. String[] monthAndDay = new String[]{"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"};
  855. List<DataTrans> list = new ArrayList<>();
  856. if (params.isEmpty()) {
  857. for (String s : monthAndDay) {
  858. DataTrans dataTrans = new DataTrans();
  859. String date = year + "-" + s;
  860. dataTrans.setName(date);
  861. dataTrans.setMonth(s);
  862. dataTrans.setYear(String.valueOf(year));
  863. dataTrans.setValue(BigDecimal.ZERO);
  864. list.add(dataTrans);
  865. }
  866. } else {
  867. for (DataTrans data : params) {
  868. list.add(data);
  869. for (String s : monthAndDay) {
  870. DataTrans dataTrans = new DataTrans();
  871. String date = year + "-" + s;
  872. if (!date.equals(data.getName())) {
  873. dataTrans.setName(date);
  874. dataTrans.setMonth(s);
  875. dataTrans.setYear(String.valueOf(year));
  876. dataTrans.setValue(BigDecimal.ZERO);
  877. list.add(dataTrans);
  878. }
  879. }
  880. }
  881. }
  882. // 集合中相同属性去重、值合并
  883. return merge(list);
  884. }
  885. public static List<DataTrans> supplementDate_cashbill(int year, List<DataTrans> params) {
  886. String[] monthAndDay = new String[]{"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"};
  887. String[] types = new String[]{"支出", "收入"};
  888. List<DataTrans> list = new ArrayList<>();
  889. if (params.isEmpty()) {
  890. for (String type : types) {
  891. for (String s : monthAndDay) {
  892. DataTrans dataTrans = new DataTrans();
  893. String date = year + "-" + s + "-" + type;
  894. dataTrans.setName(date);
  895. dataTrans.setMonth(s);
  896. dataTrans.setType(type);
  897. dataTrans.setYear(String.valueOf(year));
  898. dataTrans.setValue(BigDecimal.ZERO);
  899. list.add(dataTrans);
  900. }
  901. }
  902. } else {
  903. for (DataTrans data : params) {
  904. list.add(data);
  905. for (String type : types) {
  906. for (String s : monthAndDay) {
  907. DataTrans dataTrans = new DataTrans();
  908. String date = year + "-" + s + "-" + type;
  909. if (!date.equals(data.getName())) {
  910. dataTrans.setName(date);
  911. dataTrans.setMonth(s);
  912. dataTrans.setType(type);
  913. dataTrans.setYear(String.valueOf(year));
  914. dataTrans.setValue(BigDecimal.ZERO);
  915. list.add(dataTrans);
  916. }
  917. }
  918. }
  919. }
  920. }
  921. // 集合中相同属性去重、值合并
  922. return merge(list);
  923. }
  924. public static List<DataTrans> supplementDate_cashbill_month(int year, List<DataTrans> params) {
  925. String[] monthAndDay = new String[]{"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31"};
  926. String[] types = new String[]{"支出", "收入"};
  927. List<DataTrans> list = new ArrayList<>();
  928. if (params.isEmpty()) {
  929. for (String type : types) {
  930. for (String s : monthAndDay) {
  931. DataTrans dataTrans = new DataTrans();
  932. String date = year + "-" + s + "-" + type;
  933. dataTrans.setName(date);
  934. dataTrans.setMonth(s);
  935. dataTrans.setType(type);
  936. dataTrans.setYear(String.valueOf(year));
  937. dataTrans.setValue(BigDecimal.ZERO);
  938. list.add(dataTrans);
  939. }
  940. }
  941. } else {
  942. for (DataTrans data : params) {
  943. list.add(data);
  944. for (String type : types) {
  945. for (String s : monthAndDay) {
  946. DataTrans dataTrans = new DataTrans();
  947. String date = year + "-" + s + "-" + type;
  948. if (!date.equals(data.getName())) {
  949. dataTrans.setName(date);
  950. dataTrans.setMonth(s);
  951. dataTrans.setType(type);
  952. dataTrans.setYear(String.valueOf(year));
  953. dataTrans.setValue(BigDecimal.ZERO);
  954. list.add(dataTrans);
  955. }
  956. }
  957. }
  958. }
  959. }
  960. // 集合中相同属性去重、值合并
  961. return merge(list);
  962. }
  963. public static List<DataTrans> supplementDate_cashbill_quarter(int year, List<DataTrans> params) {
  964. String[] monthAndDay = new String[3];
  965. Calendar startCalendar = Calendar.getInstance();
  966. startCalendar.setTime(new Date());
  967. //get方法:获取给定日历属性的值,如 endCalendar.get(Calendar.MONTH) 获取日历的月份
  968. //计算季度数:由于月份从0开始,即1月份的Calendar.MONTH值为0,所以计算季度的第一个月份只需 月份 / 3 * 3
  969. int current = (((int) startCalendar.get(Calendar.MONTH)) / 3) * 3;
  970. for (int i = 1; i <= 3; i++) {
  971. monthAndDay[i - 1] = String.format("%02d", current + i);
  972. }
  973. String[] types = new String[]{"支出", "收入"};
  974. List<DataTrans> list = new ArrayList<>();
  975. if (params.isEmpty()) {
  976. for (String type : types) {
  977. for (String s : monthAndDay) {
  978. DataTrans dataTrans = new DataTrans();
  979. String date = year + "-" + s + "-" + type;
  980. dataTrans.setName(date);
  981. dataTrans.setMonth(s);
  982. dataTrans.setType(type);
  983. dataTrans.setYear(String.valueOf(year));
  984. dataTrans.setValue(BigDecimal.ZERO);
  985. list.add(dataTrans);
  986. }
  987. }
  988. } else {
  989. for (DataTrans data : params) {
  990. list.add(data);
  991. for (String type : types) {
  992. for (String s : monthAndDay) {
  993. DataTrans dataTrans = new DataTrans();
  994. String date = year + "-" + s + "-" + type;
  995. if (!(date.equals(data.getName()) && type.equals(data.getType()))) {
  996. dataTrans.setName(date);
  997. dataTrans.setMonth(s);
  998. dataTrans.setType(type);
  999. dataTrans.setYear(String.valueOf(year));
  1000. dataTrans.setValue(BigDecimal.ZERO);
  1001. list.add(dataTrans);
  1002. }
  1003. }
  1004. }
  1005. }
  1006. }
  1007. // 集合中相同属性去重、值合并
  1008. return merge(list);
  1009. }
  1010. public static List<DataTrans> merge(List<DataTrans> list) {
  1011. List<DataTrans> result = list.stream()
  1012. // 表示name为key,接着如果有重复的,那么从DataTrans对象o1与o2中筛选出一个,这里选择o1,
  1013. // 并把name重复,需要将value与o1进行合并的o2, 赋值给o1,最后返回o1
  1014. .collect(Collectors.toMap(DataTrans::getName, a -> a, (o1, o2) -> {
  1015. o1.setValue(o1.getValue().add(o2.getValue()));
  1016. return o1;
  1017. })).values().stream().collect(Collectors.toList());
  1018. return result;
  1019. }
  1020. public String caluteDate(int datetype,String selectdate) throws Exception {
  1021. Date date = sdf.parse(selectdate);
  1022. //创建Calendar实例
  1023. Calendar cal = Calendar.getInstance();
  1024. //设置当前时间
  1025. cal.setTime(date);
  1026. //在当前时间基础上减一年
  1027. cal.add(datetype, -1);
  1028. return sdf.format(cal.getTime());
  1029. }
  1030. }