databoard.java 50 KB

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