salestargetstatistics.java 56 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186
  1. package restcontroller.webmanage.sale.salestarget2;
  2. import beans.CommonHepler;
  3. import beans.brand.Brand;
  4. import beans.datatag.DataTag;
  5. import beans.datateam.DataTeam;
  6. import beans.itemclass.ItemClass;
  7. import beans.recycle.Recycle;
  8. import beans.salearea.SaleArea;
  9. import com.alibaba.fastjson.JSONArray;
  10. import com.alibaba.fastjson.JSONObject;
  11. import common.Controller;
  12. import common.YosException;
  13. import common.annotation.API;
  14. import common.data.*;
  15. import org.apache.commons.lang.StringUtils;
  16. import org.apache.poi.xssf.usermodel.XSSFCellStyle;
  17. import org.apache.poi.xssf.usermodel.XSSFSheet;
  18. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  19. import restcontroller.R;
  20. import restcontroller.sale.customer.ExportExcel;
  21. import java.math.BigDecimal;
  22. import java.time.YearMonth;
  23. import java.time.format.DateTimeFormatter;
  24. import java.time.temporal.IsoFields;
  25. import java.util.*;
  26. import java.util.stream.Collectors;
  27. public class salestargetstatistics extends Controller {
  28. /**
  29. * 构造函数
  30. *
  31. * @param content
  32. */
  33. public salestargetstatistics(JSONObject content) throws YosException {
  34. super(content);
  35. }
  36. @API(title = "营销目标", apiversion = R.ID2025122611124202.v1.class)
  37. public String marketingTarget() throws YosException {
  38. int type = content.getIntValue("type", 1);
  39. int year = content.getIntValue("year");
  40. int befyear = year - 1;
  41. int month = content.getIntValue("month");
  42. String currentMonth = year + "-" + (month > 9 ? month : "0" + month);
  43. Rows arearows = dbConnect.runSqlQuery("SELECT t1.* FROM view_areas t1 WHERE t1.siteid='" + siteid + "' ORDER BY t1.parentid,t1.sa_saleareaid");
  44. ArrayList<String> saleareaids = arearows.toArrayList("sa_saleareaid");
  45. ArrayList<String> alldates = yearToDate(year + "-12");
  46. SQLFactory sqlFactory = new SQLFactory(this, "依人员统计订单");
  47. if (type == 1) {
  48. sqlFactory = new SQLFactory(this, "依人员统计订单");
  49. }
  50. if (type == 2) {
  51. sqlFactory = new SQLFactory(this, "依医院统计订单");
  52. }
  53. if (type == 3) {
  54. sqlFactory = new SQLFactory(this, "依经销商统计订单");
  55. }
  56. sqlFactory.addParameter("siteid", siteid);
  57. sqlFactory.addParameter("year", year);
  58. sqlFactory.addParameter("befyear", befyear);
  59. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  60. RowsMap salesRowsMap = rows.toRowsMap("sa_saleareaid");
  61. sqlFactory = new SQLFactory(this, "依人员统计目标");
  62. if (type == 1) {
  63. sqlFactory = new SQLFactory(this, "依人员统计目标");
  64. }
  65. if (type == 2) {
  66. sqlFactory = new SQLFactory(this, "依医院统计目标");
  67. }
  68. if (type == 3) {
  69. sqlFactory = new SQLFactory(this, "依经销商统计目标");
  70. }
  71. sqlFactory.addParameter("siteid", siteid);
  72. sqlFactory.addParameter("year", year);
  73. Rows targetrows = dbConnect.runSqlQuery(sqlFactory);
  74. RowsMap targetRowsMap = targetrows.toRowsMap("sa_saleareaid");
  75. Rows datas = new Rows();
  76. for (String sa_saleareaid : saleareaids) {
  77. Rows salesRows = salesRowsMap.getOrDefault(sa_saleareaid, new Rows());
  78. RowsMap dateDateRow = salesRows.toRowsMap("ym");
  79. Rows targetRows = targetRowsMap.getOrDefault(sa_saleareaid, new Rows());
  80. for (String date : alldates) {
  81. Rows dateDate = dateDateRow.getOrDefault(date, new Rows());
  82. Row row = new Row();
  83. row.put("sa_saleareaid", sa_saleareaid);
  84. processDataRows(datas, row, dateDate, targetRows, date);
  85. }
  86. }
  87. RowsMap dataRowsMap = datas.toRowsMap("sa_saleareaid");
  88. for (Row arearow : arearows) {
  89. Rows dataRows = dataRowsMap.getOrDefault(arearow.getString("sa_saleareaid"), new Rows());
  90. //计算当前月份
  91. ArrayList<String> dates = new ArrayList<>();
  92. dates.add(currentMonth);
  93. calculate("m", arearow, dataRows, dates);
  94. //计算季度
  95. calculate("s", arearow, dataRows, quarterToDate(currentMonth));
  96. //计算年度
  97. calculate("y", arearow, dataRows, yearToDate(currentMonth));
  98. }
  99. return getSucReturnObject().setData(arearows).toString();
  100. }
  101. @API(title = "人员目标", apiversion = R.ID2025122611132802.v1.class)
  102. public String peopleTarget() throws YosException {
  103. int year = content.getIntValue("year");
  104. int befyear = year - 1;
  105. Long sa_saleareaid = content.getLongValue("sa_saleareaid");
  106. Rows arearows = dbConnect.runSqlQuery(" SELECT t1.*,t3.`name`,t3.userid FROM view_areas t1 " +
  107. " INNER JOIN sa_salearea_hr t2 ON t2.sa_saleareaid=t1.sa_saleareaid " +
  108. " INNER JOIN sys_hr t3 ON t3.hrid=t2.hrid " +
  109. " WHERE t1.siteid='" + siteid + "' AND t1.parentid=" + sa_saleareaid +
  110. " ORDER BY t1.parentid,t1.sa_saleareaid");
  111. SQLFactory sqlFactory = new SQLFactory(this, "按人员分组统计订单");
  112. sqlFactory.addParameter("siteid", siteid);
  113. sqlFactory.addParameter("year", year);
  114. sqlFactory.addParameter("befyear", befyear);
  115. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  116. RowsMap salesRowsMap = rows.toRowsMap("userid");
  117. sqlFactory = new SQLFactory(this, "按人员分组统计目标");
  118. sqlFactory.addParameter("siteid", siteid);
  119. sqlFactory.addParameter("year", year);
  120. Rows targetrows = dbConnect.runSqlQuery(sqlFactory);
  121. RowsMap targetRowsMap = targetrows.toRowsMap("userid");
  122. ArrayList<String> userids = arearows.toArrayList("userid");
  123. ArrayList<String> alldates = yearToDate(year + "-12");
  124. Rows datas = new Rows();
  125. for (String userid : userids) {
  126. Rows salesRows = salesRowsMap.getOrDefault(userid, new Rows());
  127. RowsMap dateDateRow = salesRows.toRowsMap("ym");
  128. Rows targetRows = targetRowsMap.getOrDefault(userid, new Rows());
  129. for (String date : alldates) {
  130. Rows dateDate = dateDateRow.getOrDefault(date, new Rows());
  131. Row row = new Row();
  132. row.put("userid", userid);
  133. processDataRows(datas, row, dateDate, targetRows, date);
  134. }
  135. }
  136. RowsMap dataRowsMap = datas.toRowsMap("userid");
  137. for (Row arearow : arearows) {
  138. Rows dataRows = dataRowsMap.getOrDefault(arearow.getString("userid"), new Rows());
  139. //计算月份
  140. for (String date : alldates) {
  141. String monthPart = date.split("-")[1];
  142. String fieldName = "m" + Integer.parseInt(monthPart);
  143. calculate(fieldName, arearow, dataRows, date);
  144. }
  145. }
  146. return getSucReturnObject().setData(arearows).toString();
  147. }
  148. @API(title = "医院目标", apiversion = R.ID2025122611135102.v1.class)
  149. public String hospitalTarget() throws YosException {
  150. int year = content.getIntValue("year");
  151. int befyear = year - 1;
  152. Long sa_saleareaid = content.getLongValue("sa_saleareaid");
  153. Rows arearows = dbConnect.runSqlQuery("SELECT t1.*,t3.`enterprisename` hospitalname,t2.sa_customersid FROM view_areas t1 " +
  154. " INNER JOIN sa_customers t2 ON t2.sa_saleareaid=t1.sa_saleareaid " +
  155. " INNER JOIN sys_enterprise t3 ON t3.sys_enterpriseid=t2.sys_enterpriseid " +
  156. " WHERE t1.siteid='" + siteid + "' AND t1.parentid= " + sa_saleareaid + " " +
  157. " ORDER BY t1.parentid,t1.sa_saleareaid ");
  158. SQLFactory sqlFactory = new SQLFactory(this, "按医院分组统计订单");
  159. sqlFactory.addParameter("siteid", siteid);
  160. sqlFactory.addParameter("year", year);
  161. sqlFactory.addParameter("befyear", befyear);
  162. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  163. RowsMap salesRowsMap = rows.toRowsMap("sa_customersid");
  164. sqlFactory = new SQLFactory(this, "按医院分组统计目标");
  165. sqlFactory.addParameter("siteid", siteid);
  166. sqlFactory.addParameter("year", year);
  167. Rows targetrows = dbConnect.runSqlQuery(sqlFactory);
  168. RowsMap targetRowsMap = targetrows.toRowsMap("sa_customersid");
  169. ArrayList<String> sa_customersids = arearows.toArrayList("sa_customersid");
  170. ArrayList<String> alldates = yearToDate(year + "-12");
  171. Rows datas = new Rows();
  172. for (String sa_customersid : sa_customersids) {
  173. Rows salesRows = salesRowsMap.getOrDefault(sa_customersid, new Rows());
  174. RowsMap dateDateRow = salesRows.toRowsMap("ym");
  175. Rows targetRows = targetRowsMap.getOrDefault(sa_customersid, new Rows());
  176. for (String date : alldates) {
  177. Rows dateDate = dateDateRow.getOrDefault(date, new Rows());
  178. Row row = new Row();
  179. row.put("sa_customersid", sa_customersid);
  180. processDataRows(datas, row, dateDate, targetRows, date);
  181. }
  182. }
  183. RowsMap dataRowsMap = datas.toRowsMap("sa_customersid");
  184. for (Row arearow : arearows) {
  185. Rows dataRows = dataRowsMap.getOrDefault(arearow.getString("sa_customersid"), new Rows());
  186. //计算月份
  187. for (String date : alldates) {
  188. String monthPart = date.split("-")[1];
  189. String fieldName = "m" + Integer.parseInt(monthPart);
  190. calculate(fieldName, arearow, dataRows, date);
  191. }
  192. }
  193. return getSucReturnObject().setData(arearows).toString();
  194. }
  195. @API(title = "经销商目标", apiversion = R.ID2025122714510802.v1.class)
  196. public String agentTarget() throws YosException {
  197. int year = content.getIntValue("year");
  198. int befyear = year - 1;
  199. Long sa_saleareaid = content.getLongValue("sa_saleareaid");
  200. Rows arearows = dbConnect.runSqlQuery("SELECT t1.*,t3.enterprisename,t2.sa_agentsid FROM view_areas t1 " +
  201. " INNER JOIN sys_enterprise_tradefield t2 ON t2.sa_saleareaid=t1.sa_saleareaid " +
  202. " INNER JOIN sys_enterprise t3 ON t3.sys_enterpriseid=t2.sys_enterpriseid " +
  203. " WHERE t1.siteid='" + siteid + "' AND t1.parentid= " + sa_saleareaid + " " +
  204. " ORDER BY t1.parentid,t1.sa_saleareaid ");
  205. SQLFactory sqlFactory = new SQLFactory(this, "按经销商分组统计订单");
  206. sqlFactory.addParameter("siteid", siteid);
  207. sqlFactory.addParameter("year", year);
  208. sqlFactory.addParameter("befyear", befyear);
  209. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  210. RowsMap salesRowsMap = rows.toRowsMap("sa_agentsid");
  211. sqlFactory = new SQLFactory(this, "按经销商分组统计目标");
  212. sqlFactory.addParameter("siteid", siteid);
  213. sqlFactory.addParameter("year", year);
  214. Rows targetrows = dbConnect.runSqlQuery(sqlFactory);
  215. RowsMap targetRowsMap = targetrows.toRowsMap("sa_agentsid");
  216. ArrayList<String> sa_agentsids = arearows.toArrayList("sa_agentsid");
  217. ArrayList<String> alldates = yearToDate(year + "-12");
  218. Rows datas = new Rows();
  219. for (String sa_agentsid : sa_agentsids) {
  220. Rows salesRows = salesRowsMap.getOrDefault(sa_agentsid, new Rows());
  221. RowsMap dateDateRow = salesRows.toRowsMap("ym");
  222. Rows targetRows = targetRowsMap.getOrDefault(sa_agentsid, new Rows());
  223. for (String date : alldates) {
  224. Rows dateDate = dateDateRow.getOrDefault(date, new Rows());
  225. Row row = new Row();
  226. row.put("sa_agentsid", sa_agentsid);
  227. processDataRows(datas, row, dateDate, targetRows, date);
  228. }
  229. }
  230. RowsMap dataRowsMap = datas.toRowsMap("sa_agentsid");
  231. for (Row arearow : arearows) {
  232. Rows dataRows = dataRowsMap.getOrDefault(arearow.getString("sa_agentsid"), new Rows());
  233. //计算月份
  234. for (String date : alldates) {
  235. String monthPart = date.split("-")[1];
  236. String fieldName = "m" + Integer.parseInt(monthPart);
  237. calculate(fieldName, arearow, dataRows, date);
  238. }
  239. }
  240. return getSucReturnObject().setData(arearows).toString();
  241. }
  242. @API(title = "统计看板", apiversion = R.ID2025122915143202.v1.class)
  243. public String peoplePanel() throws YosException {
  244. int type = content.getIntValue("type", 1);
  245. int year = content.getIntValue("year");
  246. int befyear = year - 1;
  247. Long userid = content.getLongValue("userid");
  248. Long sa_customersid = content.getLongValue("sa_customersid");
  249. Long sa_agentsid = content.getLongValue("sa_agentsid");
  250. Rows itemclassrows = dbConnect.runSqlQuery("SELECT DISTINCT itemclassname from plm_itemclass WHERE siteid='" + siteid + "' ");
  251. SQLFactory sqlFactory = new SQLFactory(this, "看板人员统计订单");
  252. if (type == 1) {
  253. sqlFactory = new SQLFactory(this, "看板人员统计订单");
  254. sqlFactory.addParameter("userid", userid);
  255. }
  256. if (type == 2) {
  257. sqlFactory = new SQLFactory(this, "看板医院统计订单");
  258. sqlFactory.addParameter("sa_customersid", sa_customersid);
  259. }
  260. if (type == 3) {
  261. sqlFactory = new SQLFactory(this, "看板经销商统计订单");
  262. sqlFactory.addParameter("sa_agentsid", sa_agentsid);
  263. }
  264. sqlFactory.addParameter("siteid", siteid);
  265. sqlFactory.addParameter("year", year);
  266. sqlFactory.addParameter("befyear", befyear);
  267. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  268. RowsMap salesRowsMap = rows.toRowsMap("itemclassname");
  269. sqlFactory = new SQLFactory(this, "看板人员统计目标");
  270. if (type == 1) {
  271. sqlFactory = new SQLFactory(this, "看板人员统计目标");
  272. sqlFactory.addParameter("userid", userid);
  273. }
  274. if (type == 2) {
  275. sqlFactory = new SQLFactory(this, "看板医院统计目标");
  276. sqlFactory.addParameter("sa_customersid", sa_customersid);
  277. }
  278. if (type == 3) {
  279. sqlFactory = new SQLFactory(this, "看板经销商统计目标");
  280. sqlFactory.addParameter("sa_agentsid", sa_agentsid);
  281. }
  282. sqlFactory.addParameter("siteid", siteid);
  283. sqlFactory.addParameter("year", year);
  284. Rows targetrows = dbConnect.runSqlQuery(sqlFactory);
  285. RowsMap targetRowsMap = targetrows.toRowsMap("itemclassname");
  286. for (Row itemclassrow : itemclassrows) {
  287. String itemclassname = itemclassrow.getString("itemclassname");
  288. Rows salesRows = salesRowsMap.getOrDefault(itemclassname, new Rows());
  289. Rows targetRows = targetRowsMap.getOrDefault(itemclassname, new Rows());
  290. BigDecimal saleamount = BigDecimal.ZERO;
  291. BigDecimal saleamount_mom = BigDecimal.ZERO;
  292. BigDecimal saleamount_yoy = BigDecimal.ZERO;
  293. BigDecimal targetamount = BigDecimal.ZERO;
  294. for (Row salesRow : salesRows) {
  295. if (salesRow.getString("y").equals(String.valueOf(year))) {
  296. saleamount = salesRow.getBigDecimal("amount");
  297. }
  298. if (salesRow.getString("y").equals(String.valueOf(befyear))) {
  299. saleamount_mom = salesRow.getBigDecimal("amount");
  300. }
  301. if (salesRow.getString("y").equals(String.valueOf(befyear))) {
  302. saleamount_yoy = salesRow.getBigDecimal("amount");
  303. }
  304. }
  305. for (Row targetRow : targetRows) {
  306. targetamount = targetRow.getBigDecimal("amount");
  307. }
  308. itemclassrow.put("y_saleamount", saleamount);
  309. itemclassrow.put("y_saleamount_mom", saleamount_mom);
  310. itemclassrow.put("y_saleamount_yoy", saleamount_yoy);
  311. itemclassrow.put("y_targetamount", targetamount);
  312. itemclassrow.put("y_balanceamount", saleamount.subtract(targetamount));
  313. //计算达成率
  314. itemclassrow.put("y_rate_achieve", calculateAchieveRate(saleamount, targetamount));
  315. //计算环比
  316. itemclassrow.put("y_rate_mom", calculateRate(saleamount, saleamount_mom));
  317. //计算同比
  318. itemclassrow.put("y_rate_yoy", calculateRate(saleamount, saleamount_yoy));
  319. }
  320. return getSucReturnObject().setData(itemclassrows).toString();
  321. }
  322. @API(title = "统计明细", apiversion = R.ID2025123014532102.v1.class)
  323. public String targetMX() throws YosException {
  324. int type = content.getIntValue("type", 1);
  325. int year = content.getIntValue("year");
  326. int befyear = year - 1;
  327. String yearMonthStr = year + "-12";
  328. Long userid = content.getLongValue("userid");
  329. Long sa_customersid = content.getLongValue("sa_customersid");
  330. Long sa_agentsid = content.getLongValue("sa_agentsid");
  331. StringBuffer where = new StringBuffer(" 1=1 ");
  332. if (content.containsKey("where")) {
  333. JSONObject whereObject = content.getJSONObject("where");
  334. if (whereObject.containsKey("sa_customersid") && !"".equals(whereObject.getString("sa_customersid"))) {
  335. where.append(" and(");
  336. where.append("t4.sa_customersid ='").append(whereObject.getString("sa_customersid")).append("' ");
  337. where.append(")");
  338. }
  339. if (whereObject.containsKey("sa_hospitaldepid") && !"".equals(whereObject.getString("sa_hospitaldepid"))) {
  340. where.append(" and(");
  341. where.append("t1.sa_hospitaldepid ='").append(whereObject.getString("sa_hospitaldepid")).append("' ");
  342. where.append(")");
  343. }
  344. if (whereObject.containsKey("itemclassname") && !"".equals(whereObject.getString("itemclassname"))) {
  345. where.append(" and(");
  346. where.append("t8.itemclassname ='").append(whereObject.getString("itemclassname")).append("' ");
  347. where.append(")");
  348. }
  349. }
  350. SQLFactory sqlFactory = new SQLFactory(this, "查询人员的统计商品明细");
  351. if (type == 1) {
  352. sqlFactory = new SQLFactory(this, "查询人员的统计商品明细");
  353. sqlFactory.addParameter("userid", userid);
  354. }
  355. if (type == 2) {
  356. sqlFactory = new SQLFactory(this, "查询医院的统计商品明细");
  357. sqlFactory.addParameter("sa_customersid", sa_customersid);
  358. }
  359. if (type == 3) {
  360. sqlFactory = new SQLFactory(this, "查询经销商的统计商品明细");
  361. sqlFactory.addParameter("sa_agentsid", sa_agentsid);
  362. }
  363. sqlFactory.addParameter("siteid", siteid);
  364. sqlFactory.addParameter("year", year);
  365. sqlFactory.addParameter_SQL("where", where);
  366. Rows itemrows = dbConnect.runSqlQuery(sqlFactory);
  367. sqlFactory = new SQLFactory(this, "查询人员的订单商品明细统计");
  368. if (type == 1) {
  369. sqlFactory = new SQLFactory(this, "查询人员的订单商品明细统计");
  370. sqlFactory.addParameter("userid", userid);
  371. }
  372. if (type == 2) {
  373. sqlFactory = new SQLFactory(this, "查询医院的订单商品明细统计");
  374. sqlFactory.addParameter("sa_customersid", sa_customersid);
  375. }
  376. if (type == 3) {
  377. sqlFactory = new SQLFactory(this, "查询经销商的订单商品明细统计");
  378. sqlFactory.addParameter("sa_agentsid", sa_agentsid);
  379. }
  380. sqlFactory.addParameter("siteid", siteid);
  381. sqlFactory.addParameter("year", year);
  382. sqlFactory.addParameter("befyear", befyear);
  383. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  384. RowsMap salesRowsMap = rows.toRowsMap("keyid");
  385. sqlFactory = new SQLFactory(this, "查询人员的目标商品明细统计");
  386. if (type == 1) {
  387. sqlFactory = new SQLFactory(this, "查询人员的目标商品明细统计");
  388. sqlFactory.addParameter("userid", userid);
  389. }
  390. if (type == 2) {
  391. sqlFactory = new SQLFactory(this, "查询医院的目标商品明细统计");
  392. sqlFactory.addParameter("sa_customersid", sa_customersid);
  393. }
  394. if (type == 3) {
  395. sqlFactory = new SQLFactory(this, "查询经销商的目标商品明细统计");
  396. sqlFactory.addParameter("sa_agentsid", sa_agentsid);
  397. }
  398. sqlFactory.addParameter("siteid", siteid);
  399. sqlFactory.addParameter("year", year);
  400. sqlFactory.addParameter("befyear", befyear);
  401. Rows targetrows = dbConnect.runSqlQuery(sqlFactory);
  402. RowsMap targetRowsMap = targetrows.toRowsMap("keyid");
  403. ArrayList<String> keyids = itemrows.toArrayList("keyid");
  404. ArrayList<String> alldates = yearToDate(yearMonthStr);
  405. Rows datas = new Rows();
  406. for (String keyid : keyids) {
  407. Rows salesRows = salesRowsMap.getOrDefault(keyid, new Rows());
  408. RowsMap dateDateRow = salesRows.toRowsMap("ym");
  409. Rows targetRows = targetRowsMap.getOrDefault(keyid, new Rows());
  410. for (String date : alldates) {
  411. Rows dateDate = dateDateRow.getOrDefault(date, new Rows());
  412. Row row = new Row();
  413. row.put("keyid", keyid);
  414. processDataRows(datas, row, dateDate, targetRows, date);
  415. }
  416. }
  417. RowsMap dataRowsMap = datas.toRowsMap("keyid");
  418. for (Row itemrow : itemrows) {
  419. Rows dataRows = dataRowsMap.getOrDefault(itemrow.getString("keyid"), new Rows());
  420. //计算月份
  421. for (String date : alldates) {
  422. String monthPart = date.split("-")[1];
  423. String fieldName = "m" + Integer.parseInt(monthPart);
  424. calculate(fieldName, itemrow, dataRows, date);
  425. }
  426. //计算年度
  427. calculate("y", itemrow, dataRows, yearToDate(yearMonthStr));
  428. }
  429. Row totalRow = new Row();
  430. totalRow.put("hospitalname", "合计");
  431. totalRow.put("hospitaldepname", "合计");
  432. // 处理1-12月数据
  433. for (int i = 1; i <= 12; i++) {
  434. processMonthData(itemrows, totalRow, "m" + i);
  435. }
  436. // 处理年度数据
  437. processMonthData(itemrows, totalRow, "y");
  438. itemrows.add(0, totalRow);
  439. return getSucReturnObject().setData(itemrows).toString();
  440. }
  441. @API(title = "营销类别明细", apiversion = R.ID2025123014533002.v1.class)
  442. public String itemclassname() throws YosException {
  443. Rows rows = dbConnect.runSqlQuery("SELECT DISTINCT itemclassname from plm_itemclass WHERE siteid='" + siteid + "'");
  444. return getSucReturnObject().setData(rows.toArrayList("itemclassname")).toString();
  445. }
  446. @API(title = "订单明细", apiversion = R.ID2025123114300602.v1.class)
  447. public String orderMX() throws YosException {
  448. StringBuffer where = new StringBuffer(" 1=1 ");
  449. if (content.containsKey("where")) {
  450. JSONObject whereObject = content.getJSONObject("where");
  451. if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
  452. where.append(" and t2.checkdate >='").append(whereObject.getString("begindate")).append("' ");
  453. }
  454. if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
  455. where.append(" and t2.checkdate <='").append(whereObject.getString("enddate")).append(" 23:59:59' ");
  456. }
  457. }
  458. String dateType = content.getString("dateType");
  459. int type = content.getIntValue("type", 1);
  460. Long userid = content.getLongValue("userid");
  461. Long sa_customersid = content.getLongValue("sa_customersid");
  462. Long sa_agentsid = content.getLongValue("sa_agentsid");
  463. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sa_orderitems",
  464. "*");
  465. querySQL.addJoinTable(JOINTYPE.left, "sa_order", "t2", "t2.sa_orderid=t1.sa_orderid and t2.siteid=t1.siteid",
  466. "sonum", "checkdate");
  467. querySQL.addJoinTable(JOINTYPE.left, "plm_item", "t3", "t3.itemid = t1.itemid and t3.siteid = t1.siteid and t3.isshow=1",
  468. "orderminqty_auxunit", "orderminqty", "orderaddqty_auxunit", "orderaddqty", "assistance", "goodstype", "explains");
  469. querySQL.addJoinTable(JOINTYPE.left, "plm_itemextend", "t4", "t4.itemid = t1.itemid and t4.siteid = t1.siteid",
  470. "erpitemname", "erpitemno");
  471. querySQL.addJoinTable(JOINTYPE.left, "sys_hr", "t6", "t6.hrid=t2.saler_hrid and t6.siteid=t2.siteid");
  472. querySQL.addQueryFields("salename", "t6.name");
  473. if (type == 1) {
  474. querySQL.setWhere("t6.userid", userid);
  475. }
  476. if (type == 2) {
  477. querySQL.setWhere("t2.sa_customersid", sa_customersid);
  478. }
  479. if (type == 3) {
  480. querySQL.setWhere("t2.sa_agentsid", sa_agentsid);
  481. }
  482. if (dateType.equals("本年")) {
  483. querySQL.setWhere("year(t2.checkdate) in (year(current_date))");
  484. }
  485. if (dateType.equals("本季")) {
  486. querySQL.setWhere("QUARTER(t2.checkdate) = QUARTER(CURDATE()) and year(t2.checkdate) in (year(current_date))");
  487. }
  488. if (dateType.equals("本月")) {
  489. querySQL.setWhere("DATE_FORMAT( t2.checkdate, '%Y%m' ) = DATE_FORMAT( CURDATE( ) , '%Y%m' )");
  490. }
  491. if (dateType.equals("上月")) {
  492. querySQL.setWhere("DATE_FORMAT( t2.checkdate, '%Y%m' ) = DATE_FORMAT( CURDATE( ) - INTERVAL 1 MONTH , '%Y%m' )");
  493. }
  494. if (dateType.equals("上季")) {
  495. querySQL.setWhere("YEAR(t2.checkdate) = YEAR(DATE_SUB(CURDATE(), INTERVAL 1 QUARTER)) AND QUARTER(t2.checkdate) = QUARTER(DATE_SUB(CURDATE(), INTERVAL 1 QUARTER))");
  496. }
  497. querySQL.setWhere(where.toString());
  498. querySQL.setWhere("t1.siteid", siteid);
  499. querySQL.setTableAlias("t1");
  500. querySQL.setWhere("t2.`status` in ('审核', '关闭')");
  501. querySQL.setPage(pageSize, pageNumber).setOrderBy(pageSorting);
  502. Rows rows = querySQL.query();
  503. ArrayList<Long> ids = rows.toArrayList("itemid", new ArrayList<>());
  504. // 商品品牌
  505. RowsMap brandRowsMap = Brand.getBrandRowsMap(this, ids);
  506. RowsMap itemclassRowsMap = ItemClass.getAllItemClassRowsMap(this, ids);
  507. for (Row row : rows) {
  508. Rows brandRows = brandRowsMap.getOrDefault(row.getString("itemid"), new Rows());
  509. Rows itemclassRows = itemclassRowsMap.getOrDefault(row.getString("itemid"), new Rows());
  510. row.put("brandname", StringUtils.join(brandRows.toArray("brandname"), ","));
  511. row.put("itemclassname", StringUtils.join(itemclassRows.toArray("itemclassname"), ","));
  512. }
  513. return getSucReturnObject().setData(rows).toString();
  514. }
  515. private void processDataRows(Rows datas, Row row, Rows dateDate, Rows targetRows, String date) {
  516. row.put("ym", date);
  517. row.put("amount", dateDate.isNotEmpty() ? dateDate.get(0).getBigDecimal("amount") : 0);
  518. //根据日期中的月份(如 "11")从 targetRows 中动态取出对应的 m{月}amount 字段值
  519. String monthPart = date.split("-")[1];
  520. String fieldName = "m" + Integer.parseInt(monthPart) + "amount";
  521. BigDecimal target = BigDecimal.ZERO;
  522. if (!targetRows.isEmpty()) {
  523. Object val = targetRows.get(0).get(fieldName);
  524. if (val instanceof BigDecimal) {
  525. target = (BigDecimal) val;
  526. } else if (val != null) {
  527. target = new BigDecimal(val.toString());
  528. }
  529. }
  530. row.put("target", target);
  531. datas.add(row);
  532. }
  533. //计算合计
  534. private void processMonthData(Rows itemrows, Row row, String key) {
  535. BigDecimal saleamount = itemrows.sum(key + "_saleamount");
  536. BigDecimal saleamount_mom = itemrows.sum(key + "_saleamount_mom");
  537. BigDecimal saleamount_yoy = itemrows.sum(key + "_saleamount_yoy");
  538. BigDecimal targetamount = itemrows.sum(key + "_targetamount");
  539. row.put(key + "_saleamount", saleamount);
  540. row.put(key + "_saleamount_mom", saleamount_mom);
  541. row.put(key + "_saleamount_yoy", saleamount_yoy);
  542. row.put(key + "_targetamount", targetamount);
  543. // 计算达成率
  544. row.put(key + "_rate_achieve", calculateAchieveRate(saleamount, targetamount));
  545. // 计算环比
  546. row.put(key + "_rate_mom", calculateRate(saleamount, saleamount_mom));
  547. // 计算同比
  548. row.put(key + "_rate_yoy", calculateRate(saleamount, saleamount_yoy));
  549. }
  550. public void calculate(String key, Row arearow, Rows dataRows, ArrayList<String> dates) {
  551. BigDecimal saleamount = BigDecimal.ZERO;
  552. BigDecimal saleamount_mom = BigDecimal.ZERO;
  553. BigDecimal saleamount_yoy = BigDecimal.ZERO;
  554. BigDecimal targetamount = BigDecimal.ZERO;
  555. for (String month : dates) {
  556. for (Row dataRow : dataRows) {
  557. String ym = dataRow.getString("ym");
  558. String momMonth = getMomMonth(month);
  559. String yoyMonth = getYoyMonth(month);
  560. BigDecimal amount = dataRow.getBigDecimal("amount");
  561. BigDecimal target = dataRow.getBigDecimal("target");
  562. if (ym.equals(month)) {
  563. saleamount = saleamount.add(amount);
  564. targetamount = targetamount.add(target);
  565. }
  566. if (ym.equals(momMonth)) {
  567. saleamount_mom = saleamount_mom.add(amount);
  568. }
  569. if (ym.equals(yoyMonth)) {
  570. saleamount_yoy = saleamount_yoy.add(amount);
  571. }
  572. }
  573. }
  574. arearow.putIfAbsent(key + "_saleamount", saleamount);
  575. arearow.putIfAbsent(key + "_saleamount_mom", saleamount_mom);
  576. arearow.putIfAbsent(key + "_saleamount_yoy", saleamount_yoy);
  577. arearow.putIfAbsent(key + "_targetamount", targetamount);
  578. arearow.putIfAbsent(key + "_balanceamount", saleamount.subtract(targetamount));
  579. //计算达成率
  580. arearow.put(key + "_rate_achieve", calculateAchieveRate(saleamount, targetamount));
  581. //计算环比
  582. arearow.put(key + "_rate_mom", calculateRate(saleamount, saleamount_mom));
  583. //计算同比
  584. arearow.put(key + "_rate_yoy", calculateRate(saleamount, saleamount_yoy));
  585. }
  586. public void calculate(String key, Row arearow, Rows dataRows, String month) {
  587. BigDecimal saleamount = BigDecimal.ZERO;
  588. BigDecimal saleamount_mom = BigDecimal.ZERO;
  589. BigDecimal saleamount_yoy = BigDecimal.ZERO;
  590. BigDecimal targetamount = BigDecimal.ZERO;
  591. for (Row dataRow : dataRows) {
  592. String ym = dataRow.getString("ym");
  593. String momMonth = getMomMonth(month);
  594. String yoyMonth = getYoyMonth(month);
  595. BigDecimal amount = dataRow.getBigDecimal("amount");
  596. BigDecimal target = dataRow.getBigDecimal("target");
  597. if (ym.equals(month)) {
  598. saleamount = saleamount.add(amount);
  599. targetamount = targetamount.add(target);
  600. }
  601. if (ym.equals(momMonth)) {
  602. saleamount_mom = saleamount_mom.add(amount);
  603. }
  604. if (ym.equals(yoyMonth)) {
  605. saleamount_yoy = saleamount_yoy.add(amount);
  606. }
  607. }
  608. arearow.putIfAbsent(key + "_saleamount", saleamount);
  609. arearow.putIfAbsent(key + "_saleamount_mom", saleamount_mom);
  610. arearow.putIfAbsent(key + "_saleamount_yoy", saleamount_yoy);
  611. arearow.putIfAbsent(key + "_targetamount", targetamount);
  612. //计算达成率
  613. arearow.put(key + "_rate_achieve", calculateAchieveRate(saleamount, targetamount));
  614. //计算环比
  615. arearow.put(key + "_rate_mom", calculateRate(saleamount, saleamount_mom));
  616. //计算同比
  617. arearow.put(key + "_rate_yoy", calculateRate(saleamount, saleamount_yoy));
  618. arearow.put("month", month);
  619. }
  620. //计算达成率
  621. public String calculateAchieveRate(BigDecimal saleamount, BigDecimal targetamount) {
  622. // 参数校验
  623. if (saleamount == null || targetamount == null) {
  624. return "-";
  625. }
  626. // 检查目标金额是否为0
  627. if (targetamount.compareTo(BigDecimal.ZERO) == 0) {
  628. return "-";
  629. }
  630. try {
  631. // 计算达成率:(saleamount / targetamount) * 100
  632. BigDecimal rate = saleamount.divide(targetamount, 10, BigDecimal.ROUND_HALF_UP)
  633. .multiply(BigDecimal.valueOf(100))
  634. .setScale(2, BigDecimal.ROUND_HALF_UP);
  635. return rate + "%";
  636. } catch (ArithmeticException e) {
  637. // 处理除法结果为无限循环小数的情况
  638. return "-";
  639. }
  640. }
  641. //计算环比
  642. public String calculateRate(BigDecimal saleamount, BigDecimal saleamount2) {
  643. if (saleamount2.compareTo(BigDecimal.ZERO) == 0) {
  644. return "-";
  645. } else {
  646. // 先计算差值
  647. BigDecimal difference = saleamount.subtract(saleamount2);
  648. // 计算比率,使用指定精度避免无限循环小数
  649. BigDecimal rate = difference.divide(saleamount2, 10, BigDecimal.ROUND_HALF_UP);
  650. // 乘以100转换为百分比并保留2位小数
  651. BigDecimal percentage = rate.multiply(BigDecimal.valueOf(100))
  652. .setScale(2, BigDecimal.ROUND_HALF_UP);
  653. return percentage + "%";
  654. }
  655. }
  656. //当年1月 到 指定月份
  657. public static ArrayList<String> yearToDate(String yearMonthStr) {
  658. YearMonth target = YearMonth.parse(yearMonthStr);
  659. ArrayList<String> yearToDate = new ArrayList<>();
  660. YearMonth startOfYear = YearMonth.of(target.getYear(), 1);
  661. for (YearMonth ym = startOfYear; !ym.isAfter(target); ym = ym.plusMonths(1)) {
  662. yearToDate.add(ym.toString());
  663. }
  664. return yearToDate;
  665. }
  666. // 季度起始月 到 指定月份
  667. public static ArrayList<String> quarterToDate(String yearMonthStr) {
  668. YearMonth target = YearMonth.parse(yearMonthStr);
  669. int quarter = target.get(IsoFields.QUARTER_OF_YEAR); // 1~4
  670. int startMonthOfQuarter = (quarter - 1) * 3 + 1; // Q1=1, Q2=4, Q3=7, Q4=10
  671. YearMonth startOfQuarter = YearMonth.of(target.getYear(), startMonthOfQuarter);
  672. ArrayList<String> quarterToDate = new ArrayList<>();
  673. for (YearMonth ym = startOfQuarter; !ym.isAfter(target); ym = ym.plusMonths(1)) {
  674. quarterToDate.add(ym.toString());
  675. }
  676. return quarterToDate;
  677. }
  678. //环比日期
  679. public static String getMomMonth(String yyyyMM) {
  680. YearMonth ym = YearMonth.parse(yyyyMM);
  681. return ym.minusMonths(1).format(DateTimeFormatter.ofPattern("yyyy-MM"));
  682. }
  683. //同比日期
  684. public static String getYoyMonth(String yyyyMM) {
  685. YearMonth ym = YearMonth.parse(yyyyMM);
  686. return ym.minusYears(1).format(DateTimeFormatter.ofPattern("yyyy-MM"));
  687. }
  688. public static ArrayList<String> getMonths(int year, int month_start, int month_end) {
  689. YearMonth ymstart = YearMonth.of(year, month_start);
  690. YearMonth ymend = YearMonth.of(year, month_end);
  691. ArrayList<String> months = new ArrayList<>();
  692. for (YearMonth ym = ymstart; !ym.isAfter(ymend); ym = ym.plusMonths(1)) {
  693. months.add(ym.toString()); // 本期
  694. }
  695. return months;
  696. }
  697. @API(title = "小程序人员目标概况", apiversion = R.ID2026010509531602.v1.class)
  698. public String mAPeopleInfo() throws YosException {
  699. int year = content.getIntValue("year");
  700. int befyear = year - 1;
  701. int month = content.getIntValue("month");
  702. String currentMonth = year + "-" + (month > 9 ? month : "0" + month);
  703. Long sa_saleareaid = content.getLongValue("sa_saleareaid");
  704. ArrayList<Long> sa_saleareaids = new ArrayList<>();
  705. if (sa_saleareaid == 0) {
  706. Rows rows = dbConnect.runSqlQuery("SELECT sa_saleareaid from sa_salearea_hr WHERE siteid='" + siteid + "' and hrid=" + hrid);
  707. sa_saleareaids = rows.toArrayList("sa_saleareaid", new ArrayList<>());
  708. if (sa_saleareaids.size() == 0) {
  709. rows = dbConnect.runSqlQuery("SELECT sa_saleareaid from sa_salearea WHERE siteid='" + siteid + "' and level=1");
  710. sa_saleareaids = rows.toArrayList("sa_saleareaid", new ArrayList<>());
  711. }
  712. } else {
  713. sa_saleareaids.add(sa_saleareaid);
  714. }
  715. ArrayList<Long> subSaleAreaIds = SaleArea.getSubSaleAreaIds(this, sa_saleareaids);
  716. subSaleAreaIds.add(sa_saleareaid);
  717. StringBuffer where = new StringBuffer(" 1=1 ");
  718. String sql = " and t4.sa_saleareaid in " + subSaleAreaIds + " ";
  719. sql = sql.replace("[", "(").replace("]", ")");
  720. where.append(sql);
  721. Rows arearows = new Rows();
  722. Row temprow = new Row();
  723. temprow.put("yearmonth", currentMonth);
  724. arearows.add(temprow);
  725. SQLFactory sqlFactory = new SQLFactory(this, "小程序人员订单概况");
  726. sqlFactory.addParameter("siteid", siteid);
  727. sqlFactory.addParameter("year", year);
  728. sqlFactory.addParameter("befyear", befyear);
  729. sqlFactory.addParameter_SQL("where", where);
  730. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  731. RowsMap salesRowsMap = rows.toRowsMap("ym");
  732. sqlFactory = new SQLFactory(this, "小程序人员目标概况");
  733. sqlFactory.addParameter("siteid", siteid);
  734. sqlFactory.addParameter("year", year);
  735. sqlFactory.addParameter_SQL("where", where);
  736. Rows targetrows = dbConnect.runSqlQuery(sqlFactory);
  737. Rows datas = new Rows();
  738. Rows salesRows = salesRowsMap.getOrDefault(currentMonth, new Rows());
  739. RowsMap dateDateRow = salesRows.toRowsMap("ym");
  740. for (String date : yearToDate(year + "-12")) {
  741. Rows dateDate = dateDateRow.getOrDefault(date, new Rows());
  742. Row row = new Row();
  743. row.put("currentMonth", currentMonth);
  744. processDataRows(datas, row, dateDate, targetrows, date);
  745. }
  746. RowsMap dataRowsMap = datas.toRowsMap("tempMonth");
  747. for (Row arearow : arearows) {
  748. Rows dataRows = dataRowsMap.getOrDefault(arearow.getString("tempMonth"), new Rows());
  749. //计算当前月份
  750. ArrayList<String> dates = new ArrayList<>();
  751. dates.add(currentMonth);
  752. calculate("m", arearow, dataRows, dates);
  753. //计算季度
  754. calculate("s", arearow, dataRows, quarterToDate(currentMonth));
  755. //计算年度
  756. calculate("y", arearow, dataRows, yearToDate(currentMonth));
  757. }
  758. return getSucReturnObject().setData(arearows).toString();
  759. }
  760. @API(title = "小程序人员/医院/经销商目标", apiversion = R.ID2026010610085402.v1.class)
  761. public String mATarget() throws YosException {
  762. int type = content.getIntValue("type", 1);
  763. int year = content.getIntValue("year");
  764. int befyear = year - 1;
  765. int month_start = content.getIntValue("month_start");
  766. int month_end = content.getIntValue("month_end");
  767. String yearMonthStr = year + "-12";
  768. Long sa_saleareaid = content.getLongValue("sa_saleareaid");
  769. Long userid = content.getLongValue("userid");
  770. Long sa_customersid = content.getLongValue("sa_customersid");
  771. Long sa_agentsid = content.getLongValue("sa_agentsid");
  772. ArrayList<Long> sa_saleareaids = new ArrayList<>();
  773. if (sa_saleareaid == 0) {
  774. Rows rows = dbConnect.runSqlQuery("SELECT sa_saleareaid from sa_salearea_hr WHERE siteid='" + siteid + "' and hrid=" + hrid);
  775. sa_saleareaids = rows.toArrayList("sa_saleareaid", new ArrayList<>());
  776. if (sa_saleareaids.size() == 0) {
  777. rows = dbConnect.runSqlQuery("SELECT sa_saleareaid from sa_salearea WHERE siteid='" + siteid + "' and level=1");
  778. sa_saleareaids = rows.toArrayList("sa_saleareaid", new ArrayList<>());
  779. }
  780. } else {
  781. sa_saleareaids.add(sa_saleareaid);
  782. }
  783. ArrayList<Long> subSaleAreaIds = SaleArea.getSubSaleAreaIds(this, sa_saleareaids);
  784. subSaleAreaIds.add(sa_saleareaid);
  785. StringBuffer where = new StringBuffer(" 1=1 ");
  786. String sql = " and t4.sa_saleareaid in " + subSaleAreaIds + " ";
  787. sql = sql.replace("[", "(").replace("]", ")");
  788. where.append(sql);
  789. Rows arearows = new Rows();
  790. Row temprow = new Row();
  791. temprow.put("year", year);
  792. temprow.put("month_start", month_start);
  793. temprow.put("month_end", month_end);
  794. arearows.add(temprow);
  795. SQLFactory sqlFactory = new SQLFactory(this, "小程序人员订单");
  796. if (type == 1) {
  797. sqlFactory = new SQLFactory(this, "小程序人员订单");
  798. sqlFactory.addParameter_SQL("where", where);
  799. sqlFactory.addParameter("userid", userid);
  800. }
  801. if (type == 2) {
  802. sqlFactory = new SQLFactory(this, "小程序医院订单");
  803. sqlFactory.addParameter("sa_customersid", sa_customersid);
  804. }
  805. if (type == 3) {
  806. sqlFactory = new SQLFactory(this, "小程序经销商订单");
  807. sqlFactory.addParameter("sa_agentsid", sa_agentsid);
  808. }
  809. sqlFactory.addParameter("siteid", siteid);
  810. sqlFactory.addParameter("year", year);
  811. sqlFactory.addParameter("befyear", befyear);
  812. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  813. RowsMap salesRowsMap = rows.toRowsMap("ym");
  814. sqlFactory = new SQLFactory(this, "小程序人员目标");
  815. if (type == 1) {
  816. sqlFactory = new SQLFactory(this, "小程序人员目标");
  817. sqlFactory.addParameter_SQL("where", where);
  818. sqlFactory.addParameter("userid", userid);
  819. }
  820. if (type == 2) {
  821. sqlFactory = new SQLFactory(this, "小程序医院目标");
  822. sqlFactory.addParameter("sa_customersid", sa_customersid);
  823. }
  824. if (type == 3) {
  825. sqlFactory = new SQLFactory(this, "小程序经销商目标");
  826. sqlFactory.addParameter("sa_agentsid", sa_agentsid);
  827. }
  828. sqlFactory.addParameter("siteid", siteid);
  829. sqlFactory.addParameter("year", year);
  830. Rows targetrows = dbConnect.runSqlQuery(sqlFactory);
  831. ArrayList<String> alldates = yearToDate(yearMonthStr);
  832. Rows datas = new Rows();
  833. for (String date : alldates) {
  834. Rows dateDate = salesRowsMap.getOrDefault(date, new Rows());
  835. Row row = new Row();
  836. row.put("date", date);
  837. processDataRows(datas, row, dateDate, targetrows, date);
  838. }
  839. RowsMap dataRowsMap = datas.toRowsMap("tempMonth");
  840. for (Row arearow : arearows) {
  841. Rows dataRows = dataRowsMap.getOrDefault(arearow.getString("tempMonth"), new Rows());
  842. //计算范围
  843. calculate("m", arearow, dataRows, getMonths(year, month_start, month_end));
  844. }
  845. return getSucReturnObject().setData(arearows).toString();
  846. }
  847. @API(title = "查询当前账号的营销区域", apiversion = R.ID2026010513574702.v1.class)
  848. public String queryCurrentUserarea() throws YosException {
  849. Rows rows = dbConnect.runSqlQuery("SELECT t1.*FROM sa_salearea t1 INNER JOIN sa_salearea_hr t2 ON t2.sa_saleareaid=t1.sa_saleareaid WHERE t2.hrid=" + hrid + " and t1.siteid='" + siteid + "'");
  850. return getSucReturnObject().setData(rows).toString();
  851. }
  852. @API(title = "查询当前账号所在区域以及下级区域的医院", apiversion = R.ID2026010516151802.v1.class)
  853. public String hospitalList() throws YosException {
  854. String tablename = "sa_customers";
  855. StringBuffer where = new StringBuffer(" 1=1 ");
  856. if (content.containsKey("where")) {
  857. JSONObject whereObject = content.getJSONObject("where");
  858. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  859. where.append(" and(");
  860. where.append("t1.billno like'%").append(whereObject.getString("condition")).append("%' ");
  861. where.append("or t1.province like'%").append(whereObject.getString("condition")).append("%' ");
  862. where.append("or t1.city like'%").append(whereObject.getString("condition")).append("%' ");
  863. where.append("or t1.county like'%").append(whereObject.getString("condition")).append("%' ");
  864. where.append("or t1.address like'%").append(whereObject.getString("condition")).append("%' ");
  865. where.append("or t2.enterprisename like'%").append(whereObject.getString("condition")).append("%' ");
  866. where.append("or t2.abbreviation like'%").append(whereObject.getString("condition")).append("%' ");
  867. where.append("or t6.name like'%").append(whereObject.getString("condition")).append("%' ");
  868. where.append("or t8.depname like'%").append(whereObject.getString("condition")).append("%' ");
  869. where.append("or t3.areaname like'%").append(whereObject.getString("condition")).append("%' ");
  870. where.append(")");
  871. }
  872. //营销区域
  873. if (whereObject.containsKey("sa_saleareaid") && !"".equals(whereObject.getString("sa_saleareaid"))) {
  874. Long sa_saleareaid = whereObject.getLong("sa_saleareaid");
  875. ArrayList<Long> sa_saleareaids = SaleArea.getSubSaleAreaIds(this, sa_saleareaid);
  876. sa_saleareaids.add(sa_saleareaid);
  877. Rows rows = dbConnect.runSqlQuery("SELECT DISTINCT t2.userid from sa_salearea_hr t1 " +
  878. "inner join sys_hr t2 ON t2.hrid=t1.hrid and t2.siteid=t1.siteid " +
  879. "WHERE t1.siteid='" + siteid + "' and t1.sa_saleareaid in(" + StringUtils.join(sa_saleareaids, ",") + ") and t2.userid>0");
  880. HashSet<Long> userIds = new HashSet<>(rows.toArrayList("userid", new ArrayList<>()));
  881. userIds.add(-1L);
  882. where.append(" and(");
  883. where.append(" t6.userid in ").append(userIds.toString().replace("[", "(").replace("]", ")"));
  884. where.append(")");
  885. }
  886. }
  887. where.append(" and ( t1.datastatus in (0,2) )");
  888. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sa_customers", "sa_customersid", "createby", "createdate",
  889. "sys_enterpriseid", "status", "type", "tradingstatus", "datastatus", "billno", "province", "city", "county", "address", "stagename", "grade", "sa_saleareaid");
  890. querySQL.setTableAlias("t1");
  891. querySQL.addJoinTable(JOINTYPE.left, "sys_enterprise", "t2", "t2.sys_enterpriseid = t1.sys_enterpriseid AND t2.siteid = t1.siteid", "enterprisename");
  892. querySQL.addJoinTable(JOINTYPE.left, "sa_salearea", "t3", "t3.sa_saleareaid = t1.sa_saleareaid AND t3.siteid = t1.siteid", "areaname");
  893. QuerySQL t5 = SQLFactory.createQuerySQL(this, "sys_datafollowup", "ownerid");
  894. t5.setWhere("ownertable", "sa_customers");
  895. t5.setSiteid(siteid);
  896. t5.addGroupBy("ownerid");
  897. t5.addQueryFields("followdate", "max(createdate)");
  898. t5.setRoleDataLimit(false);
  899. querySQL.addJoinTable(JOINTYPE.left, t5, "t5", "t5.ownerid = t1.sa_customersid", "followdate");
  900. querySQL.addJoinTable(JOINTYPE.left, "sys_datateam", "t6", "t6.ownerid = t1.sa_customersid and t6.siteid = t1.siteid and t6.ownertable = 'sa_customers' and t6.isleader = 1");
  901. querySQL.addJoinTable(JOINTYPE.left, "sys_hr", "t7", "t7.userid = t6.userid and t7.siteid = t6.siteid ");
  902. querySQL.addJoinTable(JOINTYPE.left, "sys_department", "t8", "t8.departmentid = t7.departmentid and t8.siteid = t7.siteid ");
  903. querySQL.addJoinTable(JOINTYPE.left, "sys_dataextend", "t10", "t1.siteid = t10.siteid and t1.sa_customersid = t10.ownerid and t10.ownertable = 'sa_customers'", "deletereason");
  904. querySQL.setSiteid(siteid);
  905. querySQL.setWhere(where);
  906. querySQL.setWhere("t1.sa_saleareaid", getUserAreas());
  907. querySQL.setPage(pageSize, pageNumber);
  908. if (pageSorting.equals("''")) {
  909. pageSorting = "t1.createdate desc";
  910. }
  911. querySQL.setOrderBy(pageSorting);
  912. querySQL.setRoleDataLimit(false);
  913. querySQL.withDeleteData(true);
  914. Rows rows = querySQL.query();
  915. RowsMap leaderRows = DataTeam.getLeaderWithoutHeadpic(this, "sa_customers", rows.toArrayList("sa_customersid")).toRowsMap("ownerid");
  916. ArrayList<Long> ids = rows.toArrayList("sa_customersid", new ArrayList<>());
  917. //标签
  918. HashMap<Long, ArrayList<String>> tagList = DataTag.queryTag(this, tablename, ids, false);
  919. //系统标签
  920. HashMap<Long, ArrayList<String>> sysTagList = DataTag.queryTag(this, tablename, ids, true);
  921. Rows stageRows = dbConnect.runSqlQuery("SELECT stagename,sequence from sa_devstage WHERE siteid='" + siteid + "' order by sequence");
  922. RowsMap AgentRowsMap = CommonHepler.getAgentRowsMap(this, ids);
  923. RowsMap KeyDoctorsRowsMap = CommonHepler.getKeyDoctorsRowsMap(this, ids);
  924. RowsMap opRowsMap = CommonHepler.getHospitalOPRowsMap(this);
  925. for (Row row : rows) {
  926. Long id = row.getLong("sa_customersid");
  927. row.put("leader", leaderRows.get(String.valueOf(id)));
  928. if (leaderRows.get(String.valueOf(id)).isNotEmpty()) {
  929. row.put("name", leaderRows.get(String.valueOf(id)).get(0).getString("name"));
  930. row.put("depname", leaderRows.get(String.valueOf(id)).get(0).getString("depname"));
  931. }
  932. ArrayList<String> tag = tagList.get(id) != null ? tagList.get(id) : new ArrayList<String>();
  933. ArrayList<String> sys_tag = sysTagList.get(id) != null ? sysTagList.get(id) : new ArrayList<String>();
  934. //非系统标签
  935. row.put("tag", tag);
  936. //系统标签
  937. row.put("tag_sys", sys_tag);
  938. ArrayList<String> tags = new ArrayList<>();
  939. tags.addAll(tag);
  940. tags.addAll(sys_tag);
  941. row.put("tagstr", StringUtils.join(tags, ","));
  942. row.putIfAbsent("followdate", "");
  943. //预估手术总量
  944. Rows totalop = opRowsMap.getOrDefault(String.valueOf(id), new Rows());
  945. row.putIfAbsent("totalop", totalop.isNotEmpty() ? totalop.get(0).getInteger("qty") : 0);
  946. //关键人
  947. Rows KeyDoctors = KeyDoctorsRowsMap.getOrDefault(String.valueOf(id), new Rows());
  948. row.putIfAbsent("keyperson", StringUtils.join(KeyDoctors.toArray("doctorname"), ","));
  949. //签约经销商
  950. Rows signagent = AgentRowsMap.getOrDefault(String.valueOf(id), new Rows());
  951. row.putIfAbsent("signagent", StringUtils.join(signagent.toArray("enterprisename"), ","));
  952. String stagename = row.getString("stagename");
  953. for (Row stageRow : stageRows) {
  954. if (stagename.equals(stageRow.getString("stagename"))) {
  955. stageRow.put("active", 1);
  956. }
  957. stageRow.putIfAbsent("active", 0);
  958. }
  959. row.put("stages", stageRows);
  960. }
  961. return getSucReturnObject().setData(rows).toString();
  962. }
  963. @API(title = "查询当前账号所在区域以及下级区域的经销商", apiversion = R.ID2026010516152802.v1.class)
  964. public String agentList() throws YosException {
  965. /*
  966. 过滤条件设置
  967. */
  968. StringBuffer where = new StringBuffer(" 1=1 ");
  969. if (content.containsKey("where")) {
  970. JSONObject whereObject = content.getJSONObject("where");
  971. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  972. where.append(" and(");
  973. where.append("t1.agentnum like'%").append(whereObject.getString("condition")).append("%' ");
  974. where.append("or t2.enterprisename like'%").append(whereObject.getString("condition")).append("%' ");
  975. where.append("or t2.province like'%").append(whereObject.getString("condition")).append("%' ");
  976. where.append("or t2.city like'%").append(whereObject.getString("condition")).append("%' ");
  977. where.append("or t2.county like'%").append(whereObject.getString("condition")).append("%' ");
  978. where.append("or t2.address like'%").append(whereObject.getString("condition")).append("%' ");
  979. where.append("or t3.erpagentnum like'%").append(whereObject.getString("condition")).append("%' ");
  980. where.append("or t5.salernames like'%").append(whereObject.getString("condition")).append("%' ");
  981. where.append(")");
  982. }
  983. }
  984. where.append(" and t1.status !='作废' ");
  985. JSONArray sa_saleareaidsArray = content.getJSONArray("sa_saleareaids");
  986. ArrayList<Long> sa_saleareaidsList = new ArrayList<>();
  987. for (Object o : sa_saleareaidsArray) {
  988. String sa_saleareaid = o.toString();
  989. sa_saleareaidsList.add(Long.parseLong(sa_saleareaid));
  990. sa_saleareaidsList.addAll(SaleArea.getSubSaleAreaIds(this, Long.parseLong(sa_saleareaid)));
  991. }
  992. if (sa_saleareaidsList.size() > 0) {
  993. String sqlStr = " and t1.sys_enterpriseid in (SELECT DISTINCT sys_enterpriseid from sys_enterprise_tradefield WHERE sa_saleareaid in " + sa_saleareaidsList + " )";
  994. sqlStr = sqlStr.replace("[", "(").replace("]", ")");
  995. where.append(sqlStr);
  996. } else {
  997. String sqlStr = " and t1.sys_enterpriseid in (SELECT DISTINCT sys_enterpriseid from sys_enterprise_tradefield WHERE sa_saleareaid in " + getUserAreas() + " and hrid ='" + hrid + "' )";
  998. sqlStr = sqlStr.replace("[", "(").replace("]", ")");
  999. where.append(sqlStr);
  1000. }
  1001. SQLFactory sqlFactory = new SQLFactory(this, "查询经销商业务员");
  1002. sqlFactory.addParameter("siteid", siteid);
  1003. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sa_agents",
  1004. "sa_agentsid", "sys_enterpriseid", "gmname", "gmphonenumber", "agentnum", "cooperatetype", "remarks", "status", "createdate", "scale", "mainproducts").
  1005. setTableAlias("t1");
  1006. querySQL.addJoinTable(JOINTYPE.left, "sys_enterprise", "t2", "t1.siteid = t2.siteid and t1.sys_enterpriseid = t2.sys_enterpriseid",
  1007. "enterprisename", "province", "city", "county", "address");
  1008. querySQL.addJoinTable(JOINTYPE.left, "sys_dataextend", "t3", "t1.sys_enterpriseid = t3.ownerid and ownertable = 'sys_enterprise' and t1.siteid = t3.siteid",
  1009. "erpagentnum");
  1010. querySQL.addJoinTable(JOINTYPE.left, "sys_dataextend", "t4", "t1.siteid = t4.siteid and t1.sa_agentsid = t4.ownerid and t4.ownertable = 'sa_agents'",
  1011. "deletereason");
  1012. querySQL.addJoinTable(JOINTYPE.left, sqlFactory, "t5", "t5.sa_agentsid = t1.sa_agentsid", "salernames");
  1013. querySQL.addQueryFields("deletechangedate", "t4.changedate");
  1014. querySQL.addQueryFields("deletechangeby", "t4.changeby");
  1015. querySQL.setSiteid(siteid);
  1016. querySQL.setWhere(where);
  1017. querySQL.setPage(pageSize, pageNumber);
  1018. querySQL.setOrderBy("t1.createdate desc");
  1019. Rows rows = querySQL.query();
  1020. RowsMap areaRowsMap = CommonHepler.getAreaRowsMap(this, rows.toArrayList("sa_agentsid", new ArrayList<>()));
  1021. for (Row row : rows) {
  1022. row.put("p_c_c", row.getString("province") + "-" + row.getString("city") + "-" + row.getString("county"));
  1023. Rows areaRows = areaRowsMap.getOrDefault(row.getString("sa_agentsid"), new Rows());
  1024. row.put("areanames", StringUtils.join(areaRows.toArrayList("areaname"), ","));
  1025. }
  1026. return getSucReturnObject().setData(rows).toString();
  1027. }
  1028. public ArrayList<Long> getUserAreas() throws YosException {
  1029. Rows rows = dbConnect.runSqlQuery("SELECT sa_saleareaid from sa_salearea_hr WHERE siteid='" + siteid + "' and hrid=" + hrid);
  1030. ArrayList<Long> sa_saleareaids = rows.toArrayList("sa_saleareaid", new ArrayList<>());
  1031. ArrayList<Long> subSaleAreaIds = SaleArea.getSubSaleAreaIds(this, sa_saleareaids);
  1032. subSaleAreaIds.addAll(sa_saleareaids);
  1033. subSaleAreaIds.add(-1L);
  1034. return subSaleAreaIds;
  1035. }
  1036. }