performancetargetboard.java 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712
  1. package restcontroller.webmanage.sale.salestarget_cucu;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import common.Controller;
  5. import common.YosException;
  6. import common.annotation.API;
  7. import common.data.*;
  8. import restcontroller.R;
  9. import restcontroller.webmanage.sale.salestarget.personnel;
  10. import javax.sql.RowSetReader;
  11. import java.math.BigDecimal;
  12. import java.math.RoundingMode;
  13. import java.util.ArrayList;
  14. import java.util.Calendar;
  15. import java.util.ConcurrentModificationException;
  16. import java.util.List;
  17. import static beans.salearea.SaleArea.getSubSaleAreaIds;
  18. import static beans.salearea.SaleArea.getSubSaleAreas;
  19. @API(title = "业绩目标看板")
  20. public class performancetargetboard extends Controller {
  21. /**
  22. * 构造函数
  23. *
  24. * @param content
  25. */
  26. public performancetargetboard(JSONObject content) throws YosException {
  27. super(content);
  28. }
  29. @API(title = "获取当前业务员区域", apiversion = R.ID2025103010165903.v1.class)
  30. public String querycurrentAreaList() throws YosException {
  31. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sys_hr","name","hrid");
  32. querySQL.setTableAlias("t1");
  33. querySQL.addJoinTable(JOINTYPE.inner, "sa_salearea_hr", "t2", "t1.siteid = t2.siteid and t1.hrid = t2.hrid");
  34. querySQL.addJoinTable(JOINTYPE.inner, "sa_salearea", "t3", " t3.siteid = t2.siteid and t3.sa_saleareaid = t2.sa_saleareaid", "sa_saleareaid","areaname");
  35. querySQL.setWhere("t1.siteid", siteid);
  36. querySQL.setWhere("t1.hrid", hrid);
  37. Rows rows = querySQL.query();
  38. return getSucReturnObject().setData(rows).toString();
  39. }
  40. @API(title = "获取当前业务员区域及其下属区域", apiversion = R.ID2025103009445603.v1.class)
  41. public String querySalerAreaList() throws YosException {
  42. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sys_hr","name","hrid");
  43. querySQL.setTableAlias("t1");
  44. querySQL.addJoinTable(JOINTYPE.inner, "sa_salearea_hr", "t2", "t1.siteid = t2.siteid and t1.hrid = t2.hrid");
  45. querySQL.addJoinTable(JOINTYPE.inner, "sa_salearea", "t3", " t3.siteid = t2.siteid and t3.sa_saleareaid = t2.sa_saleareaid", "sa_saleareaid","areaname");
  46. querySQL.setWhere("t1.siteid", siteid);
  47. querySQL.setWhere("t1.hrid", hrid);
  48. Rows rows = querySQL.query();
  49. Rows arearows=new Rows();
  50. ArrayList<Long> list = new ArrayList<>();
  51. for (Row row : rows) {
  52. list.add(row.getLong("sa_saleareaid"));
  53. }
  54. arearows =getSubSaleAreas(this,list);
  55. rows.addAll(arearows);
  56. // if(rows.isNotEmpty()){
  57. // arearows =getSubSaleAreas(this,list);
  58. // Rows saleareahrrows =dbConnect.runSqlQuery("select t1.name,t2.sa_saleareaid,t1.hrid from sys_hr t1 inner join sa_salearea_hr t2 on t1.siteid = t2.siteid and t1.hrid = t2.hrid where t1.siteid='"+siteid+"'");
  59. // RowsMap saleareahrRowsMap =saleareahrrows.toRowsMap("sa_saleareaid");
  60. // for (Row row :arearows){
  61. // if(saleareahrRowsMap.containsKey(row.getString("sa_saleareaid"))){
  62. // for(Row row1 :saleareahrRowsMap.get(row.getString("sa_saleareaid"))){
  63. // row.put("name",row1.getString("name"));
  64. // row.put("hrid",row1.getString("hrid"));
  65. // rows.add(row);
  66. // }
  67. // }
  68. // }
  69. // }
  70. return getSucReturnObject().setData(rows).toString();
  71. }
  72. @API(title = "查询业务员指标", apiversion = R.ID2025103010192003.v1.class)
  73. public String queryperformancetarget() throws YosException {
  74. //long hrid= content.getLong("hrid");
  75. //long sa_saleareaid= content.getLong("sa_saleareaid");
  76. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sys_hr","name","hrid");
  77. querySQL.setTableAlias("t1");
  78. querySQL.addJoinTable(JOINTYPE.inner, "sa_salearea_hr", "t2", "t1.siteid = t2.siteid and t1.hrid = t2.hrid");
  79. querySQL.addJoinTable(JOINTYPE.inner, "sa_salearea", "t3", " t3.siteid = t2.siteid and t3.sa_saleareaid = t2.sa_saleareaid", "sa_saleareaid","areaname");
  80. querySQL.setWhere("t1.siteid", siteid);
  81. querySQL.setWhere("t1.hrid", hrid);
  82. Rows arearows = querySQL.query();
  83. Rows arearows1=new Rows();
  84. ArrayList<Long> saleareaidlist = new ArrayList<>();
  85. for (Row row : arearows) {
  86. saleareaidlist.add(row.getLong("sa_saleareaid"));
  87. }
  88. arearows1 =getSubSaleAreas(this,saleareaidlist);
  89. arearows.addAll(arearows1);
  90. long year= content.getLong("year");
  91. long month= content.getLong("month");
  92. JSONArray months = content.getJSONArray("months");
  93. String monthstr = String.format("%02d", month);
  94. BigDecimal gcproportion =BigDecimal.ZERO;
  95. BigDecimal zzproportion =BigDecimal.ZERO;
  96. Rows salestargetbillrows =dbConnect.runSqlQuery("select * from sa_salestargetbill where siteid='"+siteid+"' and year="+year+" and targettype='人员目标'");
  97. Rows rows = dbConnect.runSqlQuery("select * from sys_site_parameter where siteid='" + siteid + "'");
  98. if(rows.isNotEmpty()){
  99. gcproportion=rows.get(0).getBigDecimal("gcproportion").divide(BigDecimal.valueOf(100));
  100. zzproportion=rows.get(0).getBigDecimal("zzproportion").divide(BigDecimal.valueOf(100));
  101. }
  102. long sa_salestargetbillid=0;
  103. if(salestargetbillrows.isNotEmpty()){
  104. sa_salestargetbillid=salestargetbillrows.get(0).getLong("sa_salestargetbillid");
  105. }
  106. SQLFactory personnelsqlFactory = new SQLFactory(this, "人员-目标详情列表");
  107. personnelsqlFactory.addParameter("sa_salestargetbillid", sa_salestargetbillid);
  108. personnelsqlFactory.addParameter_SQL("where", " 1=1 ");
  109. personnelsqlFactory.addParameter("siteid", siteid);
  110. Rows salestargetrows = dbConnect.runSqlQuery(personnelsqlFactory.getSQL());
  111. RowsMap salestargetrowsMap = salestargetrows.toRowsMap("sa_saleareaid");
  112. SQLFactory paymentsqlFactory = new SQLFactory(this, "账户回款统计");
  113. paymentsqlFactory.addParameter("year", year);
  114. paymentsqlFactory.addParameter_SQL("where"," 1=1 ");
  115. paymentsqlFactory.addParameter("siteid", siteid);
  116. Rows paymentRows_All = dbConnect.runSqlQuery(paymentsqlFactory.getSQL());
  117. //RowsMap paymentRowsMap =paymentRows.toRowsMap("accountname");
  118. SQLFactory rebatesqlFactory = new SQLFactory(this, "账户返利统计");
  119. rebatesqlFactory.addParameter("year", year);
  120. rebatesqlFactory.addParameter_SQL("where"," 1=1 ");
  121. rebatesqlFactory.addParameter("siteid", siteid);
  122. Rows rebateRows_All = dbConnect.runSqlQuery(rebatesqlFactory.getSQL());
  123. //RowsMap rebateRowsMap =rebateRows.toRowsMap("month");
  124. for(Row row :arearows){
  125. BigDecimal rw_month=BigDecimal.ZERO;
  126. if(salestargetrowsMap.containsKey(row.getString("sa_saleareaid"))){
  127. //月度任务(万)
  128. row.put("rw_month",salestargetrowsMap.get(row.getString("sa_saleareaid")).get(0).getBigDecimal("m"+month+"l"));
  129. rw_month=salestargetrowsMap.get(row.getString("sa_saleareaid")).get(0).getBigDecimal("m"+month+"l");
  130. }else{
  131. row.put("rw_month",BigDecimal.ZERO);
  132. }
  133. ArrayList<Long> list = new ArrayList<>();
  134. list.add(row.getLong("sa_saleareaid"));
  135. list.addAll(getSubSaleAreaIds(this,list));
  136. Rows paymentRows =new Rows();
  137. Rows rebateRows =new Rows();
  138. for(Row paymentRow :paymentRows_All){
  139. if(list.contains(paymentRow.getLong("sa_saleareaid"))){
  140. paymentRows.add(paymentRow);
  141. }
  142. }
  143. RowsMap paymentRowsMap =paymentRows.toRowsMap("accountname");
  144. for(Row rebateRow :rebateRows_All){
  145. if(list.contains(rebateRow.getLong("sa_saleareaid"))){
  146. rebateRows.add(rebateRow);
  147. }
  148. }
  149. RowsMap rebateRowsMap =rebateRows.toRowsMap("month");
  150. BigDecimal xainjin=paymentRowsMap.containsKey("现金账户")?paymentRowsMap.get("现金账户").toRowsMap("month").containsKey(monthstr)?paymentRowsMap.get("现金账户").toRowsMap("month").get(monthstr).sum("amount"):BigDecimal.ZERO:BigDecimal.ZERO;
  151. BigDecimal huodong=paymentRowsMap.containsKey("活动预存账户")?paymentRowsMap.get("活动预存账户").toRowsMap("month").containsKey(monthstr)?paymentRowsMap.get("活动预存账户").toRowsMap("month").get(monthstr).sum("amount"):BigDecimal.ZERO:BigDecimal.ZERO;
  152. BigDecimal fanli=rebateRowsMap.containsKey(monthstr)?rebateRowsMap.get(monthstr).sum("amount"):BigDecimal.ZERO;
  153. //回款完成额
  154. row.put("completedamount",xainjin.add(huodong).add(fanli));
  155. BigDecimal previousexceed=BigDecimal.ZERO;
  156. BigDecimal completedamountexceed100=BigDecimal.ZERO;
  157. for(int i=1;i<=month;i++){
  158. previousexceed=completedamountexceed100;
  159. BigDecimal looprw_month=salestargetrowsMap.get(row.getString("sa_saleareaid")).isNotEmpty()?salestargetrowsMap.get(row.getString("sa_saleareaid")).get(0).getBigDecimal("m"+i+"l"):BigDecimal.ZERO;
  160. BigDecimal loopxainjin=paymentRowsMap.containsKey("现金账户")?paymentRowsMap.get("现金账户").toRowsMap("month").containsKey(String.format("%02d", i))?paymentRowsMap.get("现金账户").toRowsMap("month").get(String.format("%02d", i)).sum("amount"):BigDecimal.ZERO:BigDecimal.ZERO;
  161. BigDecimal loophuodong=paymentRowsMap.containsKey("活动预存账户")?paymentRowsMap.get("活动预存账户").toRowsMap("month").containsKey(String.format("%02d", i))?paymentRowsMap.get("活动预存账户").toRowsMap("month").get(String.format("%02d", i)).sum("amount"):BigDecimal.ZERO:BigDecimal.ZERO;
  162. BigDecimal loopfanli=rebateRowsMap.containsKey(String.format("%02d", i))?rebateRowsMap.get(String.format("%02d", i)).sum("amount"):BigDecimal.ZERO;
  163. BigDecimal loopgcgc=paymentRowsMap.containsKey("GC工程现金账户")?paymentRowsMap.get("GC工程现金账户").toRowsMap("month").containsKey(String.format("%02d", i))?paymentRowsMap.get("GC工程现金账户").toRowsMap("month").get(String.format("%02d", i)).sum("amount"):BigDecimal.ZERO:BigDecimal.ZERO;
  164. BigDecimal loopzzgc=paymentRowsMap.containsKey("整装工程现金账户")?paymentRowsMap.get("整装工程现金账户").toRowsMap("month").containsKey(String.format("%02d", i))?paymentRowsMap.get("整装工程现金账户").toRowsMap("month").get(String.format("%02d", i)).sum("amount"):BigDecimal.ZERO:BigDecimal.ZERO;
  165. completedamountexceed100=loopxainjin.add(loophuodong).add(loopfanli).add(previousexceed)
  166. .add(loopgcgc.min(looprw_month.multiply(gcproportion).multiply(BigDecimal.valueOf(10000))))
  167. .add(loopzzgc.min(looprw_month.multiply(zzproportion).multiply(BigDecimal.valueOf(10000))))
  168. .subtract(looprw_month.multiply(BigDecimal.valueOf(10000)));
  169. }
  170. //上月完成额超出部分
  171. row.put("previousexceed",previousexceed.compareTo(BigDecimal.ZERO)>0?previousexceed:0);
  172. BigDecimal gcgc=paymentRowsMap.containsKey("GC工程现金账户")?paymentRowsMap.get("GC工程现金账户").toRowsMap("month").containsKey(monthstr)?paymentRowsMap.get("GC工程现金账户").toRowsMap("month").get(monthstr).sum("amount"):BigDecimal.ZERO:BigDecimal.ZERO;
  173. //GC工程完成额
  174. row.put("gccompletedamount",gcgc.min(rw_month.multiply(gcproportion).multiply(BigDecimal.valueOf(10000))));
  175. //GC工程超出部分
  176. row.put("gccompletedamountexceed",gcgc.subtract(rw_month.multiply(gcproportion).multiply(BigDecimal.valueOf(10000))).compareTo(BigDecimal.ZERO)>0?gcgc.subtract(rw_month.multiply(gcproportion).multiply(BigDecimal.valueOf(10000))):0);
  177. BigDecimal zzgc=paymentRowsMap.containsKey("整装工程现金账户")?paymentRowsMap.get("整装工程现金账户").toRowsMap("month").containsKey(monthstr)?paymentRowsMap.get("整装工程现金账户").toRowsMap("month").get(monthstr).sum("amount"):BigDecimal.ZERO:BigDecimal.ZERO;
  178. //整装工程完成额
  179. row.put("zzcompletedamount",zzgc.min(rw_month.multiply(zzproportion).multiply(BigDecimal.valueOf(10000))));
  180. //整装工程超出部分
  181. row.put("zzcompletedamountexceed",zzgc.subtract(rw_month.multiply(zzproportion).multiply(BigDecimal.valueOf(10000))).compareTo(BigDecimal.ZERO)>0?zzgc.subtract(rw_month.multiply(zzproportion).multiply(BigDecimal.valueOf(10000))):0);
  182. //完成额超出100%部分
  183. row.put("completedamountexceed100",completedamountexceed100.compareTo(BigDecimal.ZERO)>0?completedamountexceed100:0);
  184. //实际完成额
  185. row.put("actualcompletedamount",row.getBigDecimal("completedamount").add(row.getBigDecimal("gccompletedamount")).add(row.getBigDecimal("zzcompletedamount")));
  186. //实际完成百分比
  187. if(rw_month.compareTo(BigDecimal.ZERO)==0){
  188. row.put("actualcompletedpercentage",0);
  189. }else{
  190. row.put("actualcompletedpercentage", (row.getBigDecimal("completedamount").add(row.getBigDecimal("previousexceed")).add(row.getBigDecimal("gccompletedamount")).add(row.getBigDecimal("zzcompletedamount"))).divide((rw_month.multiply(BigDecimal.valueOf(10000))),4, RoundingMode.HALF_UP));
  191. }
  192. }
  193. Rows arearows_quarter= queryperformancetarget_quarter(month,arearows,salestargetrowsMap,paymentRows_All,rebateRows_All);
  194. System.err.println(arearows_quarter.get(0).getString("sa_saleareaid")+":"+arearows_quarter.get(0).getBigDecimal("completedamount"));
  195. RowsMap arearowsMap_quarter=arearows_quarter.toRowsMap("sa_saleareaid");
  196. Rows arearows_total= queryperformancetarget_total(month,months,arearows,salestargetrowsMap,paymentRows_All,rebateRows_All);
  197. RowsMap arearowsMap_total=arearows_total.toRowsMap("sa_saleareaid");
  198. for(Row row : arearows){
  199. if(arearowsMap_quarter.containsKey(row.getString("sa_saleareaid"))){
  200. row.put("rw_quarter",arearowsMap_quarter.get(row.getString("sa_saleareaid")).get(0).getBigDecimal("rw_quarter"));
  201. row.put("actualcompletedamount_quarter",arearowsMap_quarter.get(row.getString("sa_saleareaid")).get(0).getBigDecimal("actualcompletedamount_quarter"));
  202. row.put("zzcompletedamount_quarter",arearowsMap_quarter.get(row.getString("sa_saleareaid")).get(0).getBigDecimal("zzcompletedamount_quarter"));
  203. row.put("gccompletedamount_quarter",arearowsMap_quarter.get(row.getString("sa_saleareaid")).get(0).getBigDecimal("gccompletedamount_quarter"));
  204. row.put("actualcompletedpercentage_quarter",arearowsMap_quarter.get(row.getString("sa_saleareaid")).get(0).getBigDecimal("actualcompletedpercentage_quarter"));
  205. System.err.println(row.getString("sa_saleareaid")+":"+arearowsMap_quarter.get(row.getString("sa_saleareaid")).get(0).getBigDecimal("completedamount_quarter"));
  206. row.put("completedamount_quarter",arearowsMap_quarter.get(row.getString("sa_saleareaid")).get(0).getBigDecimal("completedamount_quarter"));
  207. row.put("previousexceed_quarter",arearowsMap_quarter.get(row.getString("sa_saleareaid")).get(0).getBigDecimal("previousexceed_quarter"));
  208. }else{
  209. row.put("rw_quarter",0);
  210. row.put("actualcompletedamount_quarter",0);
  211. row.put("zzcompletedamount_quarter",0);
  212. row.put("gccompletedamount_quarter",0);
  213. row.put("actualcompletedpercentage_quarter",0);
  214. row.put("completedamount_quarter",0);
  215. row.put("previousexceed_quarter",0);
  216. }
  217. if(arearowsMap_total.containsKey(row.getString("sa_saleareaid"))){
  218. row.put("rw_total",arearowsMap_total.get(row.getString("sa_saleareaid")).get(0).getBigDecimal("rw_total"));
  219. row.put("actualcompletedamount_total",arearowsMap_total.get(row.getString("sa_saleareaid")).get(0).getBigDecimal("actualcompletedamount_total"));
  220. row.put("zzcompletedamount_total",arearowsMap_total.get(row.getString("sa_saleareaid")).get(0).getBigDecimal("zzcompletedamount_total"));
  221. row.put("gccompletedamount_total",arearowsMap_total.get(row.getString("sa_saleareaid")).get(0).getBigDecimal("gccompletedamount_total"));
  222. row.put("actualcompletedpercentage_total",arearowsMap_total.get(row.getString("sa_saleareaid")).get(0).getBigDecimal("actualcompletedpercentage_total"));
  223. row.put("differenceamount_total",arearowsMap_total.get(row.getString("sa_saleareaid")).get(0).getBigDecimal("differenceamount_total"));
  224. row.put("completedamount_total",arearowsMap_total.get(row.getString("sa_saleareaid")).get(0).getBigDecimal("completedamount_total"));
  225. }else{
  226. row.put("rw_total",0);
  227. row.put("actualcompletedamount_total",0);
  228. row.put("zzcompletedamount_total",0);
  229. row.put("gccompletedamount_total",0);
  230. row.put("actualcompletedpercentage_total",0);
  231. row.put("differenceamount_total",0);
  232. row.put("completedamount_total",0);
  233. }
  234. }
  235. return getSucReturnObject().setData(arearows).toString();
  236. }
  237. /**
  238. * 查询业务员季度指标
  239. * @param selectmonth
  240. * @param arearows
  241. * @param salestargetrowsMap
  242. * @param paymentRows_All
  243. * @param rebateRows_All
  244. * @return
  245. * @throws YosException
  246. */
  247. public Rows queryperformancetarget_quarter(long selectmonth,Rows arearows,RowsMap salestargetrowsMap,Rows paymentRows_All,Rows rebateRows_All) throws YosException {
  248. // long hrid= content.getLong("hrid");
  249. //long sa_saleareaid= content.getLong("sa_saleareaid");
  250. // Rows salestargetbillrows =dbConnect.runSqlQuery("select * from sa_salestargetbill where siteid='"+siteid+"' and year="+year+" and targettype='人员目标'");
  251. // long sa_salestargetbillid=0;
  252. // if(salestargetbillrows.isNotEmpty()){
  253. // sa_salestargetbillid=salestargetbillrows.get(0).getLong("sa_salestargetbillid");
  254. // }
  255. // SQLFactory personnelsqlFactory = new SQLFactory(this, "人员-目标详情列表");
  256. // personnelsqlFactory.addParameter("sa_salestargetbillid", sa_salestargetbillid);
  257. // personnelsqlFactory.addParameter_SQL("where", " 1=1 ");
  258. // personnelsqlFactory.addParameter("siteid", siteid);
  259. // Rows salestargetrows = dbConnect.runSqlQuery(personnelsqlFactory.getSQL());
  260. // RowsMap salestargetrowsMap = salestargetrows.toRowsMap("sa_saleareaid");
  261. List<Integer> months = getCurrentQuarterMonths((int)selectmonth);
  262. List<Integer> previousmonths =getPreviousQuarterMonthsCalendar((int)selectmonth);
  263. // SQLFactory paymentsqlFactory = new SQLFactory(this, "账户回款统计");
  264. // paymentsqlFactory.addParameter("year", year);
  265. // paymentsqlFactory.addParameter_SQL("where"," 1=1 ");
  266. // paymentsqlFactory.addParameter("siteid", siteid);
  267. // Rows paymentRows_All = dbConnect.runSqlQuery(paymentsqlFactory.getSQL());
  268. // RowsMap paymentRowsMap =paymentRows.toRowsMap("accountname");
  269. // SQLFactory rebatesqlFactory = new SQLFactory(this, "账户返利统计");
  270. // rebatesqlFactory.addParameter("year", year);
  271. // rebatesqlFactory.addParameter_SQL("where"," 1=1 ");
  272. // rebatesqlFactory.addParameter("siteid", siteid);
  273. // Rows rebateRows_All = dbConnect.runSqlQuery(rebatesqlFactory.getSQL());
  274. // RowsMap rebateRowsMap =rebateRows.toRowsMap("month");
  275. Rows arearowsResult =new Rows();
  276. for(Row row :arearows){
  277. Row arearowResult =new Row();
  278. arearowResult.put("sa_saleareaid",row.getLong("sa_saleareaid"));
  279. BigDecimal rw_quarter=BigDecimal.ZERO;
  280. BigDecimal rw_previousquarter=BigDecimal.ZERO;
  281. BigDecimal completedamount=BigDecimal.ZERO;
  282. BigDecimal gcgccompletedamount=BigDecimal.ZERO;
  283. BigDecimal zzgccompletedamount=BigDecimal.ZERO;
  284. if(salestargetrowsMap.containsKey(row.getString("sa_saleareaid"))){
  285. for(int month : months){
  286. rw_quarter=rw_quarter.add(salestargetrowsMap.get(row.getString("sa_saleareaid")).get(0).getBigDecimal("m"+month+"l"));
  287. }
  288. for(int previousmonth : previousmonths){
  289. rw_previousquarter=rw_previousquarter.add(salestargetrowsMap.get(row.getString("sa_saleareaid")).get(0).getBigDecimal("m"+previousmonth+"l"));
  290. }
  291. }
  292. //季度任务(万)
  293. arearowResult.put("rw_quarter",rw_quarter);
  294. ArrayList<Long> list = new ArrayList<>();
  295. list.add(row.getLong("sa_saleareaid"));
  296. list.addAll(getSubSaleAreaIds(this,list));
  297. Rows paymentRows =new Rows();
  298. Rows rebateRows =new Rows();
  299. for(Row paymentRow :paymentRows_All){
  300. if(list.contains(paymentRow.getLong("sa_saleareaid"))){
  301. paymentRows.add(paymentRow);
  302. }
  303. }
  304. RowsMap paymentRowsMap =paymentRows.toRowsMap("accountname");
  305. for(Row rebateRow :rebateRows_All){
  306. if(list.contains(rebateRow.getLong("sa_saleareaid"))){
  307. rebateRows.add(rebateRow);
  308. }
  309. }
  310. RowsMap rebateRowsMap =rebateRows.toRowsMap("month");
  311. for(int month : months){
  312. String monthstr = String.format("%02d", month);
  313. BigDecimal xainjin=paymentRowsMap.containsKey("现金账户")?paymentRowsMap.get("现金账户").toRowsMap("month").containsKey(monthstr)?paymentRowsMap.get("现金账户").toRowsMap("month").get(monthstr).sum("amount"):BigDecimal.ZERO:BigDecimal.ZERO;
  314. BigDecimal huodong=paymentRowsMap.containsKey("活动预存账户")?paymentRowsMap.get("活动预存账户").toRowsMap("month").containsKey(monthstr)?paymentRowsMap.get("活动预存账户").toRowsMap("month").get(monthstr).sum("amount"):BigDecimal.ZERO:BigDecimal.ZERO;
  315. BigDecimal fanli=rebateRowsMap.containsKey(monthstr)?rebateRowsMap.get(monthstr).sum("amount"):BigDecimal.ZERO;
  316. BigDecimal gcgc=paymentRowsMap.containsKey("GC工程现金账户")?paymentRowsMap.get("GC工程现金账户").toRowsMap("month").containsKey(monthstr)?paymentRowsMap.get("GC工程现金账户").toRowsMap("month").get(monthstr).sum("amount"):BigDecimal.ZERO:BigDecimal.ZERO;
  317. BigDecimal zzgc=paymentRowsMap.containsKey("整装工程现金账户")?paymentRowsMap.get("整装工程现金账户").toRowsMap("month").containsKey(monthstr)?paymentRowsMap.get("整装工程现金账户").toRowsMap("month").get(monthstr).sum("amount"):BigDecimal.ZERO:BigDecimal.ZERO;
  318. gcgccompletedamount=gcgccompletedamount.add(gcgc);
  319. zzgccompletedamount=zzgccompletedamount.add(zzgc);
  320. completedamount=completedamount.add(xainjin).add(huodong).add(fanli);
  321. }
  322. BigDecimal previousexceed=BigDecimal.ZERO;
  323. BigDecimal completedamountexceed100=BigDecimal.ZERO;
  324. int quarter = getQuarterByMonth((int)selectmonth);
  325. for(int i=1;i<=quarter;i++){
  326. previousexceed=completedamountexceed100;
  327. List<Integer> loopmonths = getCurrentQuarterMonths(i*3-2);
  328. BigDecimal looprw_quarter=BigDecimal.ZERO;
  329. BigDecimal loopcompletedamount=BigDecimal.ZERO;
  330. BigDecimal loopgcgccompletedamount=BigDecimal.ZERO;
  331. BigDecimal loopzzgccompletedamount=BigDecimal.ZERO;
  332. if(salestargetrowsMap.get(row.getString("sa_saleareaid")).isNotEmpty()){
  333. for(int month : loopmonths){
  334. looprw_quarter=looprw_quarter.add(salestargetrowsMap.get(row.getString("sa_saleareaid")).get(0).getBigDecimal("m"+month+"l"));
  335. }
  336. }
  337. for(int month : loopmonths){
  338. String monthstr = String.format("%02d", month);
  339. BigDecimal loopxainjin=paymentRowsMap.containsKey("现金账户")?paymentRowsMap.get("现金账户").toRowsMap("month").containsKey(monthstr)?paymentRowsMap.get("现金账户").toRowsMap("month").get(monthstr).sum("amount"):BigDecimal.ZERO:BigDecimal.ZERO;
  340. BigDecimal loophuodong=paymentRowsMap.containsKey("活动预存账户")?paymentRowsMap.get("活动预存账户").toRowsMap("month").containsKey(monthstr)?paymentRowsMap.get("活动预存账户").toRowsMap("month").get(monthstr).sum("amount"):BigDecimal.ZERO:BigDecimal.ZERO;
  341. BigDecimal loopfanli=rebateRowsMap.containsKey(monthstr)?rebateRowsMap.get(monthstr).sum("amount"):BigDecimal.ZERO;
  342. BigDecimal loopgcgc=paymentRowsMap.containsKey("GC工程现金账户")?paymentRowsMap.get("GC工程现金账户").toRowsMap("month").containsKey(monthstr)?paymentRowsMap.get("GC工程现金账户").toRowsMap("month").get(monthstr).sum("amount"):BigDecimal.ZERO:BigDecimal.ZERO;
  343. BigDecimal loopzzgc=paymentRowsMap.containsKey("整装工程现金账户")?paymentRowsMap.get("整装工程现金账户").toRowsMap("month").containsKey(monthstr)?paymentRowsMap.get("整装工程现金账户").toRowsMap("month").get(monthstr).sum("amount"):BigDecimal.ZERO:BigDecimal.ZERO;
  344. loopgcgccompletedamount=loopgcgccompletedamount.add(loopgcgc);
  345. loopzzgccompletedamount=loopzzgccompletedamount.add(loopzzgc);
  346. loopcompletedamount=loopcompletedamount.add(loopxainjin).add(loophuodong).add(loopfanli);
  347. }
  348. completedamountexceed100=loopcompletedamount.add(previousexceed).add(loopgcgccompletedamount)
  349. .add(loopzzgccompletedamount).subtract(looprw_quarter.multiply(BigDecimal.valueOf(10000)));
  350. }
  351. //回款完成额
  352. arearowResult.put("completedamount_quarter",completedamount);
  353. //上季完成额超出部分
  354. arearowResult.put("previousexceed_quarter",previousexceed.compareTo(BigDecimal.ZERO)>0?previousexceed:0);
  355. //GC工程完成额
  356. arearowResult.put("gccompletedamount_quarter",gcgccompletedamount);
  357. //整装工程完成额
  358. arearowResult.put("zzcompletedamount_quarter",zzgccompletedamount);
  359. //季度完成额
  360. arearowResult.put("actualcompletedamount_quarter",arearowResult.getBigDecimal("completedamount_quarter").add(arearowResult.getBigDecimal("previousexceed_quarter")).add(arearowResult.getBigDecimal("gccompletedamount_quarter")).add(arearowResult.getBigDecimal("zzcompletedamount_quarter")));
  361. //季度百分比
  362. if(rw_quarter.compareTo(BigDecimal.ZERO)==0){
  363. arearowResult.put("actualcompletedpercentage_quarter",0);
  364. }else{
  365. arearowResult.put("actualcompletedpercentage_quarter",arearowResult.getBigDecimal("actualcompletedamount_quarter").divide((rw_quarter.multiply(BigDecimal.valueOf(10000))),4, RoundingMode.HALF_UP));
  366. }
  367. arearowsResult.add(arearowResult);
  368. }
  369. return arearowsResult;
  370. }
  371. /**
  372. * 查询业务员总指标
  373. * @param selectmonth
  374. * @param arearows
  375. * @param salestargetrowsMap
  376. * @param paymentRows_All
  377. * @param rebateRows_All
  378. * @return
  379. * @throws YosException
  380. */
  381. public Rows queryperformancetarget_total(long selectmonth,JSONArray months,Rows arearows,RowsMap salestargetrowsMap,Rows paymentRows_All,Rows rebateRows_All) throws YosException {
  382. BigDecimal gcproportion =BigDecimal.ZERO.divide(BigDecimal.valueOf(100));
  383. BigDecimal zzproportion =BigDecimal.ZERO.divide(BigDecimal.valueOf(100));
  384. // Rows salestargetbillrows =dbConnect.runSqlQuery("select * from sa_salestargetbill where siteid='"+siteid+"' and year="+year+" and targettype='人员目标'");
  385. Rows rows = dbConnect.runSqlQuery("select * from sys_site_parameter where siteid='" + siteid + "'");
  386. if(months.isEmpty()){
  387. if(rows.isNotEmpty()){
  388. gcproportion=rows.get(0).getBigDecimal("gcproportion");
  389. zzproportion=rows.get(0).getBigDecimal("zzproportion");
  390. for(int i=1;i<=selectmonth;i++){
  391. if(rows.get(0).getJSONArray("statistics_months").contains(i)){
  392. months.add(i);
  393. }
  394. }
  395. }
  396. }
  397. // long sa_salestargetbillid=0;
  398. // if(salestargetbillrows.isNotEmpty()){
  399. // sa_salestargetbillid=salestargetbillrows.get(0).getLong("sa_salestargetbillid");
  400. // }
  401. // SQLFactory personnelsqlFactory = new SQLFactory(this, "人员-目标详情列表");
  402. // personnelsqlFactory.addParameter("sa_salestargetbillid", sa_salestargetbillid);
  403. // personnelsqlFactory.addParameter_SQL("where", " 1=1 ");
  404. // personnelsqlFactory.addParameter("siteid", siteid);
  405. // Rows salestargetrows = dbConnect.runSqlQuery(personnelsqlFactory.getSQL());
  406. // RowsMap salestargetrowsMap = salestargetrows.toRowsMap("sa_saleareaid");
  407. // SQLFactory paymentsqlFactory = new SQLFactory(this, "账户回款统计");
  408. // paymentsqlFactory.addParameter("year", year);
  409. // paymentsqlFactory.addParameter_SQL("where"," 1=1 ");
  410. // paymentsqlFactory.addParameter("siteid", siteid);
  411. // Rows paymentRows_All = dbConnect.runSqlQuery(paymentsqlFactory.getSQL());
  412. // RowsMap paymentRowsMap =paymentRows.toRowsMap("accountname");
  413. // SQLFactory rebatesqlFactory = new SQLFactory(this, "账户返利统计");
  414. // rebatesqlFactory.addParameter("year", year);
  415. // rebatesqlFactory.addParameter_SQL("where"," 1=1 ");
  416. // rebatesqlFactory.addParameter("siteid", siteid);
  417. // Rows rebateRows_All = dbConnect.runSqlQuery(rebatesqlFactory.getSQL());
  418. // RowsMap rebateRowsMap =rebateRows.toRowsMap("month");
  419. Rows arearowsResult =new Rows();
  420. for(Row row :arearows){
  421. Row arearowResult =new Row();
  422. arearowResult.put("sa_saleareaid",row.getLong("sa_saleareaid"));
  423. BigDecimal rw_all=BigDecimal.ZERO;
  424. BigDecimal rw_year=BigDecimal.ZERO;
  425. BigDecimal completedamount=BigDecimal.ZERO;
  426. BigDecimal gcgccompletedamount=BigDecimal.ZERO;
  427. BigDecimal zzgccompletedamount=BigDecimal.ZERO;
  428. if(salestargetrowsMap.get(row.getString("sa_saleareaid")).isNotEmpty()){
  429. for(Object month : months){
  430. rw_all=rw_all.add(salestargetrowsMap.get(row.getString("sa_saleareaid")).get(0).getBigDecimal("m"+ (Integer)month+"l"));
  431. }
  432. rw_year=salestargetrowsMap.get(row.getString("sa_saleareaid")).get(0).getBigDecimal("y1l");
  433. }
  434. ArrayList<Long> list = new ArrayList<>();
  435. list.add(row.getLong("sa_saleareaid"));
  436. list.addAll(getSubSaleAreaIds(this,list));
  437. Rows paymentRows =new Rows();
  438. Rows rebateRows =new Rows();
  439. for(Row paymentRow :paymentRows_All){
  440. if(list.contains(paymentRow.getLong("sa_saleareaid"))){
  441. paymentRows.add(paymentRow);
  442. }
  443. }
  444. RowsMap paymentRowsMap =paymentRows.toRowsMap("accountname");
  445. for(Row rebateRow :rebateRows_All){
  446. if(list.contains(rebateRow.getLong("sa_saleareaid"))){
  447. rebateRows.add(rebateRow);
  448. }
  449. }
  450. RowsMap rebateRowsMap =rebateRows.toRowsMap("month");
  451. //总任务(万)
  452. arearowResult.put("rw_total",rw_year);
  453. for(Object month : months){
  454. String monthstr = String.format("%02d", (Integer)month);
  455. BigDecimal xainjin=paymentRowsMap.containsKey("现金账户")?paymentRowsMap.get("现金账户").toRowsMap("month").containsKey(monthstr)?paymentRowsMap.get("现金账户").toRowsMap("month").get(monthstr).sum("amount"):BigDecimal.ZERO:BigDecimal.ZERO;
  456. BigDecimal huodong=paymentRowsMap.containsKey("活动预存账户")?paymentRowsMap.get("活动预存账户").toRowsMap("month").containsKey(monthstr)?paymentRowsMap.get("活动预存账户").toRowsMap("month").get(monthstr).sum("amount"):BigDecimal.ZERO:BigDecimal.ZERO;
  457. BigDecimal fanli=rebateRowsMap.containsKey(monthstr)?rebateRowsMap.get(monthstr).sum("amount"):BigDecimal.ZERO;
  458. BigDecimal gcgc=paymentRowsMap.containsKey("GC工程现金账户")?paymentRowsMap.get("GC工程现金账户").toRowsMap("month").containsKey(monthstr)?paymentRowsMap.get("GC工程现金账户").toRowsMap("month").get(monthstr).sum("amount"):BigDecimal.ZERO:BigDecimal.ZERO;
  459. BigDecimal zzgc=paymentRowsMap.containsKey("整装工程现金账户")?paymentRowsMap.get("整装工程现金账户").toRowsMap("month").containsKey(monthstr)?paymentRowsMap.get("整装工程现金账户").toRowsMap("month").get(monthstr).sum("amount"):BigDecimal.ZERO:BigDecimal.ZERO;
  460. gcgccompletedamount=gcgccompletedamount.add(gcgc);
  461. zzgccompletedamount=zzgccompletedamount.add(zzgc);
  462. completedamount=completedamount.add(xainjin).add(huodong).add(fanli);
  463. }
  464. //回款完成额
  465. arearowResult.put("completedamount_total",completedamount);
  466. //GC工程完成额
  467. arearowResult.put("gccompletedamount_total",gcgccompletedamount.min(rw_all.multiply(gcproportion).multiply(BigDecimal.valueOf(10000))));
  468. //整装工程完成额
  469. arearowResult.put("zzcompletedamount_total",zzgccompletedamount.min(rw_all.multiply(zzproportion).multiply(BigDecimal.valueOf(10000))));
  470. //总完成额
  471. arearowResult.put("actualcompletedamount_total",arearowResult.getBigDecimal("completedamount_total").add(arearowResult.getBigDecimal("gccompletedamount_total")).add(arearowResult.getBigDecimal("zzcompletedamount_total")));
  472. //百分比
  473. if(rw_all.compareTo(BigDecimal.ZERO)==0){
  474. arearowResult.put("actualcompletedpercentage_total",0);
  475. }else{
  476. arearowResult.put("actualcompletedpercentage_total",arearowResult.getBigDecimal("actualcompletedamount_total").divide((rw_all.multiply(BigDecimal.valueOf(10000))),4, RoundingMode.HALF_UP));
  477. }
  478. //和年度任务的差额
  479. BigDecimal differenceamount=rw_all.multiply(BigDecimal.valueOf(7000)).subtract(arearowResult.getBigDecimal("actualcompletedamount_total"));
  480. arearowResult.put("differenceamount_total",differenceamount.compareTo(BigDecimal.ZERO)>0?differenceamount:0);
  481. arearowsResult.add(arearowResult);
  482. }
  483. return arearowsResult;
  484. }
  485. @API(title = "大区查询", apiversion = R.ID2025103015481203.v1.class)
  486. public String queryareaname2() throws YosException {
  487. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sys_hr");
  488. querySQL.setTableAlias("t1");
  489. querySQL.addJoinTable(JOINTYPE.inner, "sa_salearea_hr", "t2", "t1.siteid = t2.siteid and t1.hrid = t2.hrid");
  490. querySQL.addJoinTable(JOINTYPE.inner, "sa_salearea", "t3", " t3.siteid = t2.siteid and t3.sa_saleareaid = t2.sa_saleareaid", "sa_saleareaid","areaname","level");
  491. querySQL.setWhere("t1.siteid", siteid);
  492. querySQL.setWhere("t1.hrid", hrid);
  493. Rows rows = querySQL.query();
  494. Rows arearows=new Rows();
  495. ArrayList<Long> list = new ArrayList<>();
  496. for (Row row : rows) {
  497. list.add(row.getLong("sa_saleareaid"));
  498. }
  499. arearows =getSubSaleAreas(this,list);
  500. rows.addAll(arearows);
  501. Rows arearows2 = new Rows();
  502. for(Row row :rows){
  503. if(row.getLong("level")==2){
  504. arearows2.add(row);
  505. }
  506. }
  507. return getSucReturnObject().setData(arearows2).toString();
  508. }
  509. @API(title = "区域查询", apiversion = R.ID2025103015485403.v1.class)
  510. public String queryareaname3() throws YosException {
  511. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sys_hr");
  512. querySQL.setTableAlias("t1");
  513. querySQL.addJoinTable(JOINTYPE.inner, "sa_salearea_hr", "t2", "t1.siteid = t2.siteid and t1.hrid = t2.hrid");
  514. querySQL.addJoinTable(JOINTYPE.inner, "sa_salearea", "t3", " t3.siteid = t2.siteid and t3.sa_saleareaid = t2.sa_saleareaid", "sa_saleareaid","areaname","level");
  515. querySQL.setWhere("t1.siteid", siteid);
  516. querySQL.setWhere("t1.hrid", hrid);
  517. Rows rows = querySQL.query();
  518. Rows arearows=new Rows();
  519. ArrayList<Long> list = new ArrayList<>();
  520. for (Row row : rows) {
  521. list.add(row.getLong("sa_saleareaid"));
  522. }
  523. arearows =getSubSaleAreas(this,list);
  524. rows.addAll(arearows);
  525. Rows arearows3 = new Rows();
  526. for(Row row :rows){
  527. if(row.getLong("level")==3){
  528. arearows3.add(row);
  529. }
  530. }
  531. return getSucReturnObject().setData(arearows3).toString();
  532. }
  533. @API(title = "省份查询", apiversion = R.ID2025103015494803.v1.class)
  534. public String queryProvince() throws YosException {
  535. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "t_province ", "province");
  536. querySQL.setTableAlias("t1");
  537. querySQL.setPage(pageSize, pageNumber);
  538. pageSorting=" t1.provinceid asc";
  539. Rows rows = querySQL.query();
  540. return getSucReturnObject().setData(rows).toString();
  541. }
  542. @API(title = "回款明细", apiversion = R.ID2025103015304303.v1.class)
  543. public String querypaymentdetail() throws YosException {
  544. long month =content.getLong("month");
  545. String monthstr = String.format("%02d", month);
  546. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sys_hr","name","hrid");
  547. querySQL.setTableAlias("t1");
  548. querySQL.addJoinTable(JOINTYPE.inner, "sa_salearea_hr", "t2", "t1.siteid = t2.siteid and t1.hrid = t2.hrid");
  549. querySQL.addJoinTable(JOINTYPE.inner, "sa_salearea", "t3", " t3.siteid = t2.siteid and t3.sa_saleareaid = t2.sa_saleareaid", "sa_saleareaid","areaname");
  550. querySQL.setWhere("t1.siteid", siteid);
  551. querySQL.setWhere("t1.hrid", hrid);
  552. Rows currentarearows = querySQL.query();
  553. Rows arearows=new Rows();
  554. ArrayList<Long> list = new ArrayList<>();
  555. for (Row row : currentarearows) {
  556. list.add(row.getLong("sa_saleareaid"));
  557. }
  558. list.addAll(getSubSaleAreaIds(this,list));
  559. long year= content.getLong("year");
  560. StringBuffer where = new StringBuffer(" 1=1 ");
  561. if (content.containsKey("where")) {
  562. JSONObject whereObject = content.getJSONObject("where");
  563. if (whereObject.containsKey("status") && !"".equals(whereObject.getString("status"))) {
  564. where.append(" and t2.status ='").append(whereObject.getString("status")).append("' ");
  565. }
  566. if (whereObject.containsKey("areaname3") && !"".equals(whereObject.getString("areaname3"))) {
  567. where.append(" and (t4.areaname3 ='").append(whereObject.getString("areaname3")).append("' or t4.areaname2 ='").append(whereObject.getString("areaname3")).append("' )");
  568. }
  569. }
  570. SQLFactory sqlFactory = new SQLFactory(this, "回款明细");
  571. sqlFactory.addParameter("siteid", siteid);
  572. sqlFactory.addParameter("year", year);
  573. sqlFactory.addParameter("period", monthstr);
  574. sqlFactory.addParameter_in("sa_saleareaids", list);
  575. sqlFactory.addParameter_SQL("where", where);
  576. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  577. return getSucReturnObject().setData(rows).toString();
  578. }
  579. public List<Integer> getCurrentQuarterMonths(int currentMonth) {
  580. int quarterStartMonth = ((currentMonth - 1) / 3) * 3 + 1;
  581. List<Integer> quarterMonths = new ArrayList<>();
  582. for (int i = 0; i < 3; i++) {
  583. quarterMonths.add(quarterStartMonth + i);
  584. }
  585. return quarterMonths;
  586. }
  587. public int getQuarterByMonth(int month) {
  588. if (month >= 1 && month <= 3) {
  589. return 1;
  590. } else if (month >= 4 && month <= 6) {
  591. return 2;
  592. } else if (month >= 7 && month <= 9) {
  593. return 3;
  594. } else if (month >= 10 && month <= 12) {
  595. return 4;
  596. } else {
  597. throw new IllegalArgumentException("月份必须在 1-12 之间: " + month);
  598. }
  599. }
  600. public List<Integer> getPreviousQuarterMonthsCalendar(int currentMonth) {
  601. int currentQuarter = (currentMonth - 1) / 3 + 1;
  602. int lastQuarter = currentQuarter - 1;
  603. List<Integer> quarterMonths = new ArrayList<>();
  604. // 处理跨年情况
  605. if (lastQuarter == 0) {
  606. return quarterMonths;
  607. }
  608. int quarterStartMonth = (lastQuarter - 1) * 3 + 1;
  609. for (int i = 0; i < 3; i++) {
  610. quarterMonths.add(quarterStartMonth + i);
  611. }
  612. return quarterMonths;
  613. }
  614. }