salestargetstatistics.java 61 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287
  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.ID2026010714131502.v1.class)
  848. public String mATargetCategory() throws YosException {
  849. int type = content.getIntValue("type", 1);
  850. int year = content.getIntValue("year");
  851. int befyear = year - 1;
  852. int month_start = content.getIntValue("month_start");
  853. int month_end = content.getIntValue("month_end");
  854. String yearMonthStr = year + "-12";
  855. Long sa_saleareaid = content.getLongValue("sa_saleareaid");
  856. Long userid = content.getLongValue("userid");
  857. Long sa_customersid = content.getLongValue("sa_customersid");
  858. Long sa_agentsid = content.getLongValue("sa_agentsid");
  859. ArrayList<Long> sa_saleareaids = new ArrayList<>();
  860. if (sa_saleareaid == 0) {
  861. Rows rows = dbConnect.runSqlQuery("SELECT sa_saleareaid from sa_salearea_hr WHERE siteid='" + siteid + "' and hrid=" + hrid);
  862. sa_saleareaids = rows.toArrayList("sa_saleareaid", new ArrayList<>());
  863. if (sa_saleareaids.size() == 0) {
  864. rows = dbConnect.runSqlQuery("SELECT sa_saleareaid from sa_salearea WHERE siteid='" + siteid + "' and level=1");
  865. sa_saleareaids = rows.toArrayList("sa_saleareaid", new ArrayList<>());
  866. }
  867. } else {
  868. sa_saleareaids.add(sa_saleareaid);
  869. }
  870. ArrayList<Long> subSaleAreaIds = SaleArea.getSubSaleAreaIds(this, sa_saleareaids);
  871. subSaleAreaIds.add(sa_saleareaid);
  872. StringBuffer where = new StringBuffer(" 1=1 ");
  873. String sql = " and t4.sa_saleareaid in " + subSaleAreaIds + " ";
  874. sql = sql.replace("[", "(").replace("]", ")");
  875. where.append(sql);
  876. Rows itemclassrows = dbConnect.runSqlQuery("SELECT DISTINCT itemclassname from plm_itemclass WHERE siteid='" + siteid + "' ");
  877. SQLFactory sqlFactory = new SQLFactory(this, "小程序人员订单-产品类别");
  878. if (type == 1) {
  879. sqlFactory = new SQLFactory(this, "小程序人员订单-产品类别");
  880. sqlFactory.addParameter_SQL("where", where);
  881. sqlFactory.addParameter("userid", userid);
  882. }
  883. if (type == 2) {
  884. sqlFactory = new SQLFactory(this, "小程序医院订单-产品类别");
  885. sqlFactory.addParameter("sa_customersid", sa_customersid);
  886. }
  887. if (type == 3) {
  888. sqlFactory = new SQLFactory(this, "小程序经销商订单-产品类别");
  889. sqlFactory.addParameter("sa_agentsid", sa_agentsid);
  890. }
  891. sqlFactory.addParameter("siteid", siteid);
  892. sqlFactory.addParameter("year", year);
  893. sqlFactory.addParameter("befyear", befyear);
  894. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  895. RowsMap salesRowsMap = rows.toRowsMap("itemclassname");
  896. sqlFactory = new SQLFactory(this, "小程序人员目标-产品类别");
  897. if (type == 1) {
  898. sqlFactory = new SQLFactory(this, "小程序人员目标-产品类别");
  899. sqlFactory.addParameter_SQL("where", where);
  900. sqlFactory.addParameter("userid", userid);
  901. }
  902. if (type == 2) {
  903. sqlFactory = new SQLFactory(this, "小程序医院目标-产品类别");
  904. sqlFactory.addParameter("sa_customersid", sa_customersid);
  905. }
  906. if (type == 3) {
  907. sqlFactory = new SQLFactory(this, "小程序经销商目标-产品类别");
  908. sqlFactory.addParameter("sa_agentsid", sa_agentsid);
  909. }
  910. sqlFactory.addParameter("siteid", siteid);
  911. sqlFactory.addParameter("year", year);
  912. Rows targetrows = dbConnect.runSqlQuery(sqlFactory);
  913. RowsMap targetRowsMap = targetrows.toRowsMap("itemclassname");
  914. ArrayList<String> itemclassnames = itemclassrows.toArrayList("itemclassname");
  915. ArrayList<String> alldates = yearToDate(yearMonthStr);
  916. Rows datas = new Rows();
  917. for (String itemclassname : itemclassnames) {
  918. Rows salesRows = salesRowsMap.getOrDefault(itemclassname, new Rows());
  919. RowsMap dateDateRow = salesRows.toRowsMap("ym");
  920. Rows targetRows = targetRowsMap.getOrDefault(itemclassname, new Rows());
  921. for (String date : alldates) {
  922. Rows dateDate = dateDateRow.getOrDefault(date, new Rows());
  923. Row row = new Row();
  924. row.put("itemclassname", itemclassname);
  925. processDataRows(datas, row, dateDate, targetRows, date);
  926. }
  927. }
  928. RowsMap dataRowsMap = datas.toRowsMap("itemclassname");
  929. for (Row arearow : itemclassrows) {
  930. Rows dataRows = dataRowsMap.getOrDefault(arearow.getString("itemclassname"), new Rows());
  931. //计算范围
  932. calculate("m", arearow, dataRows, getMonths(year, month_start, month_end));
  933. }
  934. return getSucReturnObject().setData(itemclassrows).toString();
  935. }
  936. @API(title = "查询当前账号的营销区域", apiversion = R.ID2026010513574702.v1.class)
  937. public String queryCurrentUserarea() throws YosException {
  938. 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 + "'");
  939. return getSucReturnObject().setData(rows).toString();
  940. }
  941. @API(title = "查询当前账号所在区域以及下级区域的医院", apiversion = R.ID2026010516151802.v1.class)
  942. public String hospitalList() throws YosException {
  943. String tablename = "sa_customers";
  944. StringBuffer where = new StringBuffer(" 1=1 ");
  945. if (content.containsKey("where")) {
  946. JSONObject whereObject = content.getJSONObject("where");
  947. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  948. where.append(" and(");
  949. where.append("t1.billno like'%").append(whereObject.getString("condition")).append("%' ");
  950. where.append("or t1.province like'%").append(whereObject.getString("condition")).append("%' ");
  951. where.append("or t1.city like'%").append(whereObject.getString("condition")).append("%' ");
  952. where.append("or t1.county like'%").append(whereObject.getString("condition")).append("%' ");
  953. where.append("or t1.address like'%").append(whereObject.getString("condition")).append("%' ");
  954. where.append("or t2.enterprisename like'%").append(whereObject.getString("condition")).append("%' ");
  955. where.append("or t2.abbreviation like'%").append(whereObject.getString("condition")).append("%' ");
  956. where.append("or t6.name like'%").append(whereObject.getString("condition")).append("%' ");
  957. where.append("or t8.depname like'%").append(whereObject.getString("condition")).append("%' ");
  958. where.append("or t3.areaname like'%").append(whereObject.getString("condition")).append("%' ");
  959. where.append(")");
  960. }
  961. //营销区域
  962. if (whereObject.containsKey("sa_saleareaid") && !"".equals(whereObject.getString("sa_saleareaid"))) {
  963. Long sa_saleareaid = whereObject.getLong("sa_saleareaid");
  964. ArrayList<Long> sa_saleareaids = SaleArea.getSubSaleAreaIds(this, sa_saleareaid);
  965. sa_saleareaids.add(sa_saleareaid);
  966. Rows rows = dbConnect.runSqlQuery("SELECT DISTINCT t2.userid from sa_salearea_hr t1 " +
  967. "inner join sys_hr t2 ON t2.hrid=t1.hrid and t2.siteid=t1.siteid " +
  968. "WHERE t1.siteid='" + siteid + "' and t1.sa_saleareaid in(" + StringUtils.join(sa_saleareaids, ",") + ") and t2.userid>0");
  969. HashSet<Long> userIds = new HashSet<>(rows.toArrayList("userid", new ArrayList<>()));
  970. userIds.add(-1L);
  971. where.append(" and(");
  972. where.append(" t6.userid in ").append(userIds.toString().replace("[", "(").replace("]", ")"));
  973. where.append(")");
  974. }
  975. }
  976. where.append(" and ( t1.datastatus in (0,2) )");
  977. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sa_customers", "sa_customersid", "createby", "createdate",
  978. "sys_enterpriseid", "status", "type", "tradingstatus", "datastatus", "billno", "province", "city", "county", "address", "stagename", "grade", "sa_saleareaid");
  979. querySQL.setTableAlias("t1");
  980. querySQL.addJoinTable(JOINTYPE.left, "sys_enterprise", "t2", "t2.sys_enterpriseid = t1.sys_enterpriseid AND t2.siteid = t1.siteid", "enterprisename");
  981. querySQL.addJoinTable(JOINTYPE.left, "sa_salearea", "t3", "t3.sa_saleareaid = t1.sa_saleareaid AND t3.siteid = t1.siteid", "areaname");
  982. QuerySQL t5 = SQLFactory.createQuerySQL(this, "sys_datafollowup", "ownerid");
  983. t5.setWhere("ownertable", "sa_customers");
  984. t5.setSiteid(siteid);
  985. t5.addGroupBy("ownerid");
  986. t5.addQueryFields("followdate", "max(createdate)");
  987. t5.setRoleDataLimit(false);
  988. querySQL.addJoinTable(JOINTYPE.left, t5, "t5", "t5.ownerid = t1.sa_customersid", "followdate");
  989. 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");
  990. querySQL.addJoinTable(JOINTYPE.left, "sys_hr", "t7", "t7.userid = t6.userid and t7.siteid = t6.siteid ");
  991. querySQL.addJoinTable(JOINTYPE.left, "sys_department", "t8", "t8.departmentid = t7.departmentid and t8.siteid = t7.siteid ");
  992. querySQL.addJoinTable(JOINTYPE.left, "sys_dataextend", "t10", "t1.siteid = t10.siteid and t1.sa_customersid = t10.ownerid and t10.ownertable = 'sa_customers'", "deletereason");
  993. querySQL.setSiteid(siteid);
  994. querySQL.setWhere(where);
  995. querySQL.setWhere("t1.sa_saleareaid", getUserAreas());
  996. querySQL.setPage(pageSize, pageNumber);
  997. if (pageSorting.equals("''")) {
  998. pageSorting = "t1.createdate desc";
  999. }
  1000. querySQL.setOrderBy(pageSorting);
  1001. querySQL.setRoleDataLimit(false);
  1002. querySQL.withDeleteData(true);
  1003. Rows rows = querySQL.query();
  1004. RowsMap leaderRows = DataTeam.getLeaderWithoutHeadpic(this, "sa_customers", rows.toArrayList("sa_customersid")).toRowsMap("ownerid");
  1005. ArrayList<Long> ids = rows.toArrayList("sa_customersid", new ArrayList<>());
  1006. //标签
  1007. HashMap<Long, ArrayList<String>> tagList = DataTag.queryTag(this, tablename, ids, false);
  1008. //系统标签
  1009. HashMap<Long, ArrayList<String>> sysTagList = DataTag.queryTag(this, tablename, ids, true);
  1010. Rows stageRows = dbConnect.runSqlQuery("SELECT stagename,sequence from sa_devstage WHERE siteid='" + siteid + "' order by sequence");
  1011. RowsMap AgentRowsMap = CommonHepler.getAgentRowsMap(this, ids);
  1012. RowsMap KeyDoctorsRowsMap = CommonHepler.getKeyDoctorsRowsMap(this, ids);
  1013. RowsMap opRowsMap = CommonHepler.getHospitalOPRowsMap(this);
  1014. for (Row row : rows) {
  1015. Long id = row.getLong("sa_customersid");
  1016. row.put("leader", leaderRows.get(String.valueOf(id)));
  1017. if (leaderRows.get(String.valueOf(id)).isNotEmpty()) {
  1018. row.put("name", leaderRows.get(String.valueOf(id)).get(0).getString("name"));
  1019. row.put("depname", leaderRows.get(String.valueOf(id)).get(0).getString("depname"));
  1020. }
  1021. ArrayList<String> tag = tagList.get(id) != null ? tagList.get(id) : new ArrayList<String>();
  1022. ArrayList<String> sys_tag = sysTagList.get(id) != null ? sysTagList.get(id) : new ArrayList<String>();
  1023. //非系统标签
  1024. row.put("tag", tag);
  1025. //系统标签
  1026. row.put("tag_sys", sys_tag);
  1027. ArrayList<String> tags = new ArrayList<>();
  1028. tags.addAll(tag);
  1029. tags.addAll(sys_tag);
  1030. row.put("tagstr", StringUtils.join(tags, ","));
  1031. row.putIfAbsent("followdate", "");
  1032. //预估手术总量
  1033. Rows totalop = opRowsMap.getOrDefault(String.valueOf(id), new Rows());
  1034. row.putIfAbsent("totalop", totalop.isNotEmpty() ? totalop.get(0).getInteger("qty") : 0);
  1035. //关键人
  1036. Rows KeyDoctors = KeyDoctorsRowsMap.getOrDefault(String.valueOf(id), new Rows());
  1037. row.putIfAbsent("keyperson", StringUtils.join(KeyDoctors.toArray("doctorname"), ","));
  1038. //签约经销商
  1039. Rows signagent = AgentRowsMap.getOrDefault(String.valueOf(id), new Rows());
  1040. row.putIfAbsent("signagent", StringUtils.join(signagent.toArray("enterprisename"), ","));
  1041. String stagename = row.getString("stagename");
  1042. for (Row stageRow : stageRows) {
  1043. if (stagename.equals(stageRow.getString("stagename"))) {
  1044. stageRow.put("active", 1);
  1045. }
  1046. stageRow.putIfAbsent("active", 0);
  1047. }
  1048. row.put("stages", stageRows);
  1049. }
  1050. return getSucReturnObject().setData(rows).toString();
  1051. }
  1052. @API(title = "查询当前账号所在区域以及下级区域的经销商", apiversion = R.ID2026010516152802.v1.class)
  1053. public String agentList() throws YosException {
  1054. /*
  1055. 过滤条件设置
  1056. */
  1057. StringBuffer where = new StringBuffer(" 1=1 ");
  1058. if (content.containsKey("where")) {
  1059. JSONObject whereObject = content.getJSONObject("where");
  1060. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  1061. where.append(" and(");
  1062. where.append("t1.agentnum like'%").append(whereObject.getString("condition")).append("%' ");
  1063. where.append("or t2.enterprisename like'%").append(whereObject.getString("condition")).append("%' ");
  1064. where.append("or t2.province like'%").append(whereObject.getString("condition")).append("%' ");
  1065. where.append("or t2.city like'%").append(whereObject.getString("condition")).append("%' ");
  1066. where.append("or t2.county like'%").append(whereObject.getString("condition")).append("%' ");
  1067. where.append("or t2.address like'%").append(whereObject.getString("condition")).append("%' ");
  1068. where.append("or t3.erpagentnum like'%").append(whereObject.getString("condition")).append("%' ");
  1069. where.append("or t5.salernames like'%").append(whereObject.getString("condition")).append("%' ");
  1070. where.append(")");
  1071. }
  1072. }
  1073. where.append(" and t1.status !='作废' ");
  1074. JSONArray sa_saleareaidsArray = content.getJSONArray("sa_saleareaids");
  1075. ArrayList<Long> sa_saleareaidsList = new ArrayList<>();
  1076. for (Object o : sa_saleareaidsArray) {
  1077. String sa_saleareaid = o.toString();
  1078. sa_saleareaidsList.add(Long.parseLong(sa_saleareaid));
  1079. sa_saleareaidsList.addAll(SaleArea.getSubSaleAreaIds(this, Long.parseLong(sa_saleareaid)));
  1080. }
  1081. if (sa_saleareaidsList.size() > 0) {
  1082. String sqlStr = " and t1.sys_enterpriseid in (SELECT DISTINCT sys_enterpriseid from sys_enterprise_tradefield WHERE sa_saleareaid in " + sa_saleareaidsList + " )";
  1083. sqlStr = sqlStr.replace("[", "(").replace("]", ")");
  1084. where.append(sqlStr);
  1085. } else {
  1086. String sqlStr = " and t1.sys_enterpriseid in (SELECT DISTINCT sys_enterpriseid from sys_enterprise_tradefield WHERE sa_saleareaid in " + getUserAreas() + " and hrid ='" + hrid + "' )";
  1087. sqlStr = sqlStr.replace("[", "(").replace("]", ")");
  1088. where.append(sqlStr);
  1089. }
  1090. SQLFactory sqlFactory = new SQLFactory(this, "查询经销商业务员");
  1091. sqlFactory.addParameter("siteid", siteid);
  1092. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sa_agents",
  1093. "sa_agentsid", "sys_enterpriseid", "gmname", "gmphonenumber", "agentnum", "cooperatetype", "remarks", "status", "createdate", "scale", "mainproducts").
  1094. setTableAlias("t1");
  1095. querySQL.addJoinTable(JOINTYPE.left, "sys_enterprise", "t2", "t1.siteid = t2.siteid and t1.sys_enterpriseid = t2.sys_enterpriseid",
  1096. "enterprisename", "province", "city", "county", "address");
  1097. querySQL.addJoinTable(JOINTYPE.left, "sys_dataextend", "t3", "t1.sys_enterpriseid = t3.ownerid and ownertable = 'sys_enterprise' and t1.siteid = t3.siteid",
  1098. "erpagentnum");
  1099. querySQL.addJoinTable(JOINTYPE.left, "sys_dataextend", "t4", "t1.siteid = t4.siteid and t1.sa_agentsid = t4.ownerid and t4.ownertable = 'sa_agents'",
  1100. "deletereason");
  1101. querySQL.addJoinTable(JOINTYPE.left, sqlFactory, "t5", "t5.sa_agentsid = t1.sa_agentsid", "salernames");
  1102. querySQL.addQueryFields("deletechangedate", "t4.changedate");
  1103. querySQL.addQueryFields("deletechangeby", "t4.changeby");
  1104. querySQL.setSiteid(siteid);
  1105. querySQL.setWhere(where);
  1106. querySQL.setPage(pageSize, pageNumber);
  1107. querySQL.setOrderBy("t1.createdate desc");
  1108. Rows rows = querySQL.query();
  1109. RowsMap areaRowsMap = CommonHepler.getAreaRowsMap(this, rows.toArrayList("sa_agentsid", new ArrayList<>()));
  1110. for (Row row : rows) {
  1111. row.put("p_c_c", row.getString("province") + "-" + row.getString("city") + "-" + row.getString("county"));
  1112. Rows areaRows = areaRowsMap.getOrDefault(row.getString("sa_agentsid"), new Rows());
  1113. row.put("areanames", StringUtils.join(areaRows.toArrayList("areaname"), ","));
  1114. }
  1115. return getSucReturnObject().setData(rows).toString();
  1116. }
  1117. public ArrayList<Long> getUserAreas() throws YosException {
  1118. Rows rows = dbConnect.runSqlQuery("SELECT sa_saleareaid from sa_salearea_hr WHERE siteid='" + siteid + "' and hrid=" + hrid);
  1119. ArrayList<Long> sa_saleareaids = rows.toArrayList("sa_saleareaid", new ArrayList<>());
  1120. ArrayList<Long> subSaleAreaIds = SaleArea.getSubSaleAreaIds(this, sa_saleareaids);
  1121. subSaleAreaIds.addAll(sa_saleareaids);
  1122. subSaleAreaIds.add(-1L);
  1123. return subSaleAreaIds;
  1124. }
  1125. }