sendplandetail.java 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729
  1. package restcontroller.webmanage.sale.sendplan;
  2. import com.alibaba.fastjson2.JSONArray;
  3. import com.alibaba.fastjson2.JSONObject;
  4. import common.Controller;
  5. import common.YosException;
  6. import common.annotation.API;
  7. import common.annotation.CACHEING;
  8. import common.annotation.CACHEING_CLEAN;
  9. import common.data.*;
  10. import org.apache.commons.lang.StringUtils;
  11. import restcontroller.R;
  12. import java.math.BigDecimal;
  13. import java.util.*;
  14. @API(title = "发货计划明细")
  15. public class sendplandetail extends Controller {
  16. public sendplandetail(JSONObject content) throws YosException {
  17. super(content);
  18. }
  19. @API(title = "订单信息刷新(新)", apiversion = R.ID2025122609083103.v1.class)
  20. public String orderRefresh_newtest() throws YosException {
  21. long sa_sendplanid = content.getLongValue("sa_sendplanid");
  22. Rows sendplanRows = dbConnect.runSqlQuery("select * from sa_sendplan where sa_sendplanid='" + sa_sendplanid + "' and siteid='" + siteid + "'");
  23. if (sendplanRows.isEmpty()) {
  24. return getErrReturnObject().setErrMsg("发货计划不存在,无法进行订单信息刷新").toString();
  25. }
  26. dbConnect.runSqlUpdate("delete from sa_sendplandetail where sa_sendplanid='" + sa_sendplanid + "' and siteid='" + siteid + "'");
  27. /*
  28. 过滤条件设置
  29. */
  30. StringBuffer where = new StringBuffer(" 1=1 and t1.undeliqty>0 and t3.type='" + sendplanRows.get(0).getString("type")
  31. + "' and DATE_FORMAT(t3.checkdate, '%Y-%m-%d') >='" + sendplanRows.get(0).getString("begindate")
  32. + "' and DATE_FORMAT(t3.checkdate, '%Y-%m-%d') <='" + sendplanRows.get(0).getString("enddate")
  33. + "' and ( \n" +
  34. "\t\t(t3.type in('标准订单','网销订单')) or\n" +
  35. "\t\t(\n" +
  36. "\t\t\tt3.type='配件订单'\n" +
  37. "\t\t\tand t3.sys_enterpriseid in (\n" +
  38. "\t\t\tselect distinct sys_enterpriseid from st_stockbill \n" +
  39. "\t\t\twhere type='销售出库' and status='审核' and \n" +
  40. "\t\t\tbilldate= '" + sendplanRows.get(0).getString("senddate") + "'\n" +
  41. "\t\t\t)\n" +
  42. "\t\t))");
  43. SQLFactory sqlFactory = new SQLFactory(this, "发货计划订单未发货量(新)");
  44. sqlFactory.addParameter_SQL("where", where);
  45. sqlFactory.addParameter("siteid", siteid);
  46. Rows rows = dbConnect.runSqlQuery(sqlFactory.getSQL());
  47. Rows stockbillrows = dbConnect.runSqlQuery("select t2.itemid,sum(t2.undeliqty) qty from sa_order t1 " +
  48. " inner join sa_orderitems t2 on t1.sa_orderid=t2.sa_orderid " +
  49. " where t1.status='审核' and t2.isclose=0 and t2.undeliqty>0 and t1.siteid='" + siteid + "' " +
  50. " group by t2.itemid ");
  51. Rows invbalSalerows = dbConnect.runSqlQuery("select itemid,qty from st_invbal_sale");
  52. RowsMap stockbillrowsMap = stockbillrows.toRowsMap("itemid");
  53. RowsMap invbalSalerowsMap = invbalSalerows.toRowsMap("itemid");
  54. ArrayList<String> list = new ArrayList<>();
  55. long oldItemid= 0;
  56. BigDecimal oldWilloutqty = BigDecimal.ZERO;
  57. BigDecimal oldCanuseqty = BigDecimal.ZERO;
  58. BigDecimal oldSendqty = BigDecimal.ZERO;
  59. long[] sendplandetailids = createTableID("sa_sendplandetail", rows.size());
  60. int i=0;
  61. for (Row row :rows) {
  62. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, "sa_sendplandetail");
  63. insertSQL.setUniqueid(sendplandetailids[i++]);
  64. insertSQL.setSiteid(siteid);
  65. insertSQL.setValue("sa_sendplanid", sa_sendplanid);
  66. insertSQL.setValue("sa_orderid", row.getLong("sa_orderid"));
  67. insertSQL.setValue("sa_orderitemsid", row.getLong("sa_orderitemsid"));
  68. insertSQL.setValue("outplace", row.getString("outplace"));
  69. insertSQL.setValue("sa_agentsid", row.getString("sa_agentsid"));
  70. BigDecimal willoutqty = BigDecimal.ZERO;
  71. BigDecimal invbalqty = BigDecimal.ZERO;
  72. if (stockbillrowsMap.containsKey(row.getString("itemid"))) {
  73. willoutqty = stockbillrowsMap.get(row.getString("itemid")).get(0).getBigDecimal("qty");
  74. }
  75. if (invbalSalerowsMap.containsKey(row.getString("itemid"))) {
  76. // 查询库存总量
  77. invbalqty = invbalSalerowsMap.get(row.getString("itemid")).get(0).getBigDecimal("qty");
  78. }
  79. insertSQL.setValue("willinqty", 0);
  80. insertSQL.setValue("willoutqty", willoutqty);
  81. insertSQL.setValue("sendqty", getBigDecimalOrZero(row.getBigDecimal("sendqty")));
  82. long currentitemid = row.getLong("itemid");
  83. if (oldItemid == 0 || oldItemid!=currentitemid) {
  84. // 新物料
  85. oldWilloutqty =willoutqty;
  86. oldCanuseqty = invbalqty.subtract(oldWilloutqty);
  87. } else {
  88. // 相同物料
  89. oldCanuseqty = oldCanuseqty.subtract(oldSendqty);
  90. oldWilloutqty = oldWilloutqty.add(oldSendqty);
  91. }
  92. // 设置计算后的值
  93. insertSQL.setValue("canuseqty",oldCanuseqty);
  94. insertSQL.setValue("willoutqty",oldWilloutqty);
  95. // 如果可用量<=0,设置发货量为0
  96. if (oldCanuseqty.compareTo(BigDecimal.ZERO) <= 0) {
  97. insertSQL.setValue("sendqty",BigDecimal.ZERO);
  98. insertSQL.setValue("colorflag", 0);
  99. }else{
  100. if (oldCanuseqty.compareTo(row.getBigDecimal("sendqty")) >= 0) {
  101. insertSQL.setValue("colorflag", 2);
  102. } else {
  103. insertSQL.setValue("colorflag", 3);
  104. }
  105. }
  106. // 保存当前值供下次循环使用
  107. oldItemid = currentitemid;
  108. oldSendqty = getBigDecimalOrZero(row.getBigDecimal("sendqty")).compareTo(BigDecimal.ZERO)>0?getBigDecimalOrZero(row.getBigDecimal("sendqty")):BigDecimal.ZERO;
  109. list.add(insertSQL.getSQL());
  110. }
  111. dbConnect.runSqlUpdate(list);
  112. list = new ArrayList<>();
  113. Rows rows1 = dbConnect.runSqlQuery("select t1.sa_orderid from (select sa_orderid,count(0)count from sa_sendplandetail where sa_sendplanid=" + sa_sendplanid + " group by sa_orderid) t1 inner join (select sa_orderid,count(0)count from sa_sendplandetail where colorflag='2' and sa_sendplanid=" + sa_sendplanid + " group by sa_orderid) t2 on t1.sa_orderid=t2.sa_orderid and t1.count=t2.count");
  114. for (Row row : rows1) {
  115. list.add("update sa_sendplandetail set colorflag=1 where sa_sendplanid=" + sa_sendplanid + " and sa_orderid =" + row.getLong("sa_orderid"));
  116. }
  117. return getSucReturnObject().toString();
  118. }
  119. //ID2025120110193103
  120. @API(title = "订单信息刷新(新)", apiversion = R.ID2025120110193103.v1.class)
  121. public String orderRefresh_new() throws YosException {
  122. long sa_sendplanid = content.getLongValue("sa_sendplanid");
  123. Rows sendplanRows = dbConnect.runSqlQuery("select * from sa_sendplan where sa_sendplanid='" + sa_sendplanid + "' and siteid='" + siteid + "'");
  124. if (sendplanRows.isEmpty()) {
  125. return getErrReturnObject().setErrMsg("发货计划不存在,无法进行订单信息刷新").toString();
  126. }
  127. dbConnect.runSqlUpdate("delete from sa_sendplandetail where sa_sendplanid='" + sa_sendplanid + "' and siteid='" + siteid + "'");
  128. /*
  129. 过滤条件设置
  130. */
  131. StringBuffer where = new StringBuffer(" 1=1 and t1.undeliqty>0 and t3.type='" + sendplanRows.get(0).getString("type")
  132. + "' and DATE_FORMAT(t3.checkdate, '%Y-%m-%d') >='" + sendplanRows.get(0).getString("begindate")
  133. + "' and DATE_FORMAT(t3.checkdate, '%Y-%m-%d') <='" + sendplanRows.get(0).getString("enddate")
  134. + "' and ( \n" +
  135. "\t\t(t3.type in('标准订单','网销订单')) or\n" +
  136. "\t\t(\n" +
  137. "\t\t\tt3.type='配件订单'\n" +
  138. "\t\t\tand t3.sys_enterpriseid in (\n" +
  139. "\t\t\tselect distinct sys_enterpriseid from st_stockbill \n" +
  140. "\t\t\twhere type='销售出库' and status='审核' and \n" +
  141. "\t\t\tbilldate= '" + sendplanRows.get(0).getString("senddate") + "'\n" +
  142. "\t\t\t)\n" +
  143. "\t\t))");
  144. SQLFactory sqlFactory = new SQLFactory(this, "发货计划订单未发货量(新)");
  145. sqlFactory.addParameter_SQL("where", where);
  146. sqlFactory.addParameter("siteid", siteid);
  147. Rows rows = dbConnect.runSqlQuery(sqlFactory.getSQL());
  148. Rows stockbillrows = dbConnect.runSqlQuery("select t2.itemid,sum(t2.undeliqty) qty from sa_order t1 " +
  149. " inner join sa_orderitems t2 on t1.sa_orderid=t2.sa_orderid " +
  150. " where t1.status='审核' and t2.isclose=0 and t2.undeliqty>0 and t1.siteid='" + siteid + "' " +
  151. " group by t2.itemid ");
  152. Rows invbalSalerows = dbConnect.runSqlQuery("select itemid,qty from st_invbal_sale");
  153. RowsMap stockbillrowsMap = stockbillrows.toRowsMap("itemid");
  154. RowsMap invbalSalerowsMap = invbalSalerows.toRowsMap("itemid");
  155. ArrayList<String> list = new ArrayList<>();
  156. long olditemid = 0;
  157. BigDecimal oldcanuseqty = BigDecimal.ZERO;
  158. BigDecimal oldwilloutqty = BigDecimal.ZERO;
  159. BigDecimal oldsendqty = BigDecimal.ZERO;
  160. long[] sendplandetailids = createTableID("sa_sendplandetail", rows.size());
  161. int i = 0;
  162. for (Row row : rows) {
  163. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, "sa_sendplandetail");
  164. insertSQL.setUniqueid(sendplandetailids[i++]);
  165. insertSQL.setSiteid(siteid);
  166. insertSQL.setValue("sa_sendplanid", sa_sendplanid);
  167. insertSQL.setValue("sa_orderid", row.getLong("sa_orderid"));
  168. insertSQL.setValue("sa_orderitemsid", row.getLong("sa_orderitemsid"));
  169. insertSQL.setValue("outplace", row.getString("outplace"));
  170. insertSQL.setValue("sa_agentsid", row.getString("sa_agentsid"));
  171. BigDecimal canuseqty = BigDecimal.ZERO;
  172. BigDecimal newcanuseqty = BigDecimal.ZERO;
  173. BigDecimal willoutqty = BigDecimal.ZERO;
  174. BigDecimal invbalqty = BigDecimal.ZERO;
  175. BigDecimal sendqty = BigDecimal.ZERO;
  176. if (stockbillrowsMap.containsKey(row.getString("itemid"))) {
  177. willoutqty = stockbillrowsMap.get(row.getString("itemid")).get(0).getBigDecimal("qty");
  178. }
  179. if (invbalSalerowsMap.containsKey(row.getString("itemid"))) {
  180. invbalqty = invbalSalerowsMap.get(row.getString("itemid")).get(0).getBigDecimal("qty");
  181. }
  182. canuseqty = invbalqty.subtract(willoutqty);
  183. insertSQL.setValue("willinqty", 0);
  184. insertSQL.setValue("canuseqty", canuseqty);
  185. if (row.getLong("itemid") == olditemid) {
  186. insertSQL.setValue("willoutqty", (oldwilloutqty.compareTo(BigDecimal.ZERO) == 0 ? willoutqty : oldwilloutqty).add(oldsendqty));
  187. insertSQL.setValue("canuseqty", (oldcanuseqty.compareTo(BigDecimal.ZERO) == 0 ? canuseqty : oldcanuseqty).subtract(oldsendqty));
  188. newcanuseqty=(oldcanuseqty.compareTo(BigDecimal.ZERO) == 0 ? canuseqty : oldcanuseqty).subtract(oldsendqty);
  189. oldcanuseqty=(oldcanuseqty.compareTo(BigDecimal.ZERO) == 0 ? canuseqty : oldcanuseqty).subtract(oldsendqty);
  190. } else {
  191. insertSQL.setValue("willoutqty", willoutqty);
  192. insertSQL.setValue("canuseqty", canuseqty);
  193. newcanuseqty=canuseqty;
  194. }
  195. if (newcanuseqty.compareTo(BigDecimal.ZERO) <= 0) {
  196. sendqty=BigDecimal.ZERO;
  197. insertSQL.setValue("sendqty", sendqty);
  198. insertSQL.setValue("colorflag", 0);
  199. } else {
  200. sendqty = row.getBigDecimal("sendqty");
  201. insertSQL.setValue("sendqty", sendqty);
  202. if (newcanuseqty.compareTo(row.getBigDecimal("sendqty")) >= 0) {
  203. insertSQL.setValue("colorflag", 2);
  204. } else {
  205. insertSQL.setValue("colorflag", 3);
  206. }
  207. }
  208. if (row.getLong("itemid") != olditemid) {
  209. oldcanuseqty = BigDecimal.ZERO;
  210. }
  211. olditemid = row.getLong("itemid");
  212. oldsendqty = sendqty;
  213. list.add(insertSQL.getSQL());
  214. }
  215. dbConnect.runSqlUpdate(list);
  216. list = new ArrayList<>();
  217. Rows rows1 = dbConnect.runSqlQuery("select t1.sa_orderid from (select sa_orderid,count(0)count from sa_sendplandetail where sa_sendplanid=" + sa_sendplanid + " group by sa_orderid) t1 inner join (select sa_orderid,count(0)count from sa_sendplandetail where colorflag='2' and sa_sendplanid=" + sa_sendplanid + " group by sa_orderid) t2 on t1.sa_orderid=t2.sa_orderid and t1.count=t2.count");
  218. for (Row row : rows1) {
  219. list.add("update sa_sendplandetail set colorflag=1 where sa_sendplanid=" + sa_sendplanid + " and sa_orderid =" + row.getLong("sa_orderid"));
  220. }
  221. return getSucReturnObject().toString();
  222. }
  223. //ID2025032709331803
  224. @API(title = "订单信息刷新", apiversion = R.ID2025032709331803.v1.class)
  225. @CACHEING_CLEAN(apiClass = {sendplandetail.class})
  226. public String orderRefresh() throws YosException {
  227. long sa_sendplanid = content.getLongValue("sa_sendplanid");
  228. Rows sendplanRows = dbConnect.runSqlQuery("select * from sa_sendplan where sa_sendplanid='" + sa_sendplanid + "' and siteid='" + siteid + "'");
  229. if (sendplanRows.isEmpty()) {
  230. return getErrReturnObject().setErrMsg("发货计划不存在,无法进行订单信息刷新").toString();
  231. }
  232. dbConnect.runSqlUpdate("delete from sa_sendplandetail where sa_sendplanid='" + sa_sendplanid + "' and siteid='" + siteid + "'");
  233. /*
  234. 过滤条件设置
  235. */
  236. StringBuffer where = new StringBuffer(" 1=1 and t1.undeliqty>0 and t3.type='" + sendplanRows.get(0).getString("type")
  237. + "' and DATE_FORMAT(t3.checkdate, '%Y-%m-%d') >='" + sendplanRows.get(0).getString("begindate")
  238. + "' and DATE_FORMAT(t3.checkdate, '%Y-%m-%d') <='" + sendplanRows.get(0).getString("enddate")
  239. + "' and ( \n" +
  240. "\t\t(t3.type in('标准订单','网销订单')) or\n" +
  241. "\t\t(\n" +
  242. "\t\t\tt3.type='配件订单'\n" +
  243. "\t\t\tand t3.sys_enterpriseid in (\n" +
  244. "\t\t\tselect distinct sys_enterpriseid from st_stockbill \n" +
  245. "\t\t\twhere type='销售出库' and status='审核' and \n" +
  246. "\t\t\tbilldate= '" + sendplanRows.get(0).getString("senddate") + "'\n" +
  247. "\t\t\t)\n" +
  248. "\t\t))");
  249. SQLFactory sqlFactory = new SQLFactory(this, "发货计划订单未发货量");
  250. sqlFactory.addParameter_SQL("where", where);
  251. sqlFactory.addParameter("siteid", siteid);
  252. Rows rows = dbConnect.runSqlQuery(sqlFactory.getSQL());
  253. ArrayList<String> list = new ArrayList<>();
  254. //计划发货插入明细
  255. int i = 0;
  256. long[] sendplandetailids = createTableID("sa_sendplandetail", rows.size());
  257. for (Row row : rows) {
  258. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, "sa_sendplandetail");
  259. insertSQL.setUniqueid(sendplandetailids[i++]);
  260. insertSQL.setSiteid(siteid);
  261. insertSQL.setValue("sa_sendplanid", sa_sendplanid);
  262. insertSQL.setValue("sendqty", row.getBigDecimal("sendqty"));
  263. insertSQL.setValue("sa_orderid", row.getLong("sa_orderid"));
  264. insertSQL.setValue("sa_orderitemsid", row.getLong("sa_orderitemsid"));
  265. insertSQL.setValue("outplace", row.getString("outplace"));
  266. insertSQL.setValue("sa_agentsid", row.getString("sa_agentsid"));
  267. insertSQL.setValue("canuseqty", 0);
  268. list.add(insertSQL.getSQL());
  269. }
  270. dbConnect.runSqlUpdate(list);
  271. //计划发货明细计算
  272. list = new ArrayList<>();
  273. // Rows stockbillrows = dbConnect.runSqlQuery("\t\tselect itemid,sum(t2.qty) qty from st_stockbill t1\n" +
  274. // "\t\t\tinner join st_stockbill_items t2 on t1.st_stockbillid=t2.st_stockbillid\n" +
  275. // "\t\t\twhere t1.type='销售出库'and t1.status='新建' and t1.siteid='" + siteid + "'\n" +
  276. // "\t\t\tand billdate <='" + sendplanRows.get(0).getString("senddate") + "'\n" +
  277. // "\t\t\tgroup by itemid");
  278. Rows stockbillrows = dbConnect.runSqlQuery("select t2.itemid,sum(t2.undeliqty) qty from sa_order t1 " +
  279. " inner join sa_orderitems t2 on t1.sa_orderid=t2.sa_orderid " +
  280. " where t1.status='审核' and t2.isclose=0 and t2.undeliqty>0 and t1.siteid='" + siteid + "' " +
  281. " group by t2.itemid ");
  282. Rows invbalSalerows = dbConnect.runSqlQuery("select itemid,qty from st_invbal_sale");
  283. Rows sendplandetails = dbConnect.runSqlQuery("select t1.sa_sendplandetailid,t1.sa_orderid,t2.itemid,t1.sendqty from sa_sendplandetail t1 inner join sa_orderitems t2 on t1.sa_orderitemsid=t2.sa_orderitemsid and t1.siteid=t2.siteid where t1.sa_sendplanid=" + sa_sendplanid + " and t1.siteid='" + siteid + "' order by t2.sa_orderid desc");
  284. RowsMap stockbillrowsMap = stockbillrows.toRowsMap("itemid");
  285. RowsMap invbalSalerowsMap = invbalSalerows.toRowsMap("itemid");
  286. for (Row row : sendplandetails) {
  287. BigDecimal canuseqty = BigDecimal.ZERO;
  288. BigDecimal willoutqty = BigDecimal.ZERO;
  289. BigDecimal invbalqty = BigDecimal.ZERO;
  290. UpdateSQL updateSQL = SQLFactory.createUpdateSQL(this, "sa_sendplandetail");
  291. updateSQL.setUniqueid(row.getLong("sa_sendplandetailid"));
  292. if (stockbillrowsMap.containsKey(row.getString("itemid"))) {
  293. willoutqty = stockbillrowsMap.get(row.getString("itemid")).get(0).getBigDecimal("qty");
  294. }
  295. if (invbalSalerowsMap.containsKey(row.getString("itemid"))) {
  296. invbalqty = invbalSalerowsMap.get(row.getString("itemid")).get(0).getBigDecimal("qty");
  297. }
  298. canuseqty = invbalqty.subtract(willoutqty);
  299. updateSQL.setValue("willoutqty", willoutqty);
  300. updateSQL.setValue("willinqty", 0);
  301. updateSQL.setValue("canuseqty", canuseqty);
  302. if (canuseqty.compareTo(BigDecimal.ZERO) <= 0) {
  303. updateSQL.setValue("sendqty", 0);
  304. updateSQL.setValue("colorflag", 0);
  305. } else {
  306. if (canuseqty.compareTo(row.getBigDecimal("sendqty")) >= 0) {
  307. updateSQL.setValue("colorflag", 2);
  308. } else {
  309. updateSQL.setValue("colorflag", 3);
  310. }
  311. }
  312. list.add(updateSQL.getSQL());
  313. }
  314. dbConnect.runSqlUpdate(list);
  315. list = new ArrayList<>();
  316. Rows rows1 = dbConnect.runSqlQuery("select t1.sa_orderid from (select sa_orderid,count(0)count from sa_sendplandetail where sa_sendplanid=" + sa_sendplanid + " group by sa_orderid) t1 inner join (select sa_orderid,count(0)count from sa_sendplandetail where colorflag='2' and sa_sendplanid=" + sa_sendplanid + " group by sa_orderid) t2 on t1.sa_orderid=t2.sa_orderid and t1.count=t2.count");
  317. for (Row row : rows1) {
  318. list.add("update sa_sendplandetail set colorflag=1 where sa_sendplanid=" + sa_sendplanid + " and sa_orderid =" + row.getLong("sa_orderid"));
  319. }
  320. Rows sendplandetailsgroupitemid = dbConnect.runSqlQuery("select t2.itemid,count(1) count from sa_sendplandetail t1 inner join sa_orderitems t2 on t1.sa_orderitemsid=t2.sa_orderitemsid and t1.siteid=t2.siteid where t1.sa_sendplanid=" + sa_sendplanid + " and t1.siteid='" + siteid + "' group by t2.itemid HAVING COUNT(1) > 1");
  321. RowsMap sendplandetailsrowsMap = sendplandetails.toRowsMap("itemid");
  322. for (Row row : sendplandetailsgroupitemid) {
  323. if (sendplandetailsrowsMap.containsKey(row.getString("itemid"))) {
  324. BigDecimal sendqty = BigDecimal.ZERO;
  325. for (int a = 0; a < sendplandetailsrowsMap.get(row.getString("itemid")).size(); a++) {
  326. if (a > 0) {
  327. list.add("update sa_sendplandetail set canuseqty=canuseqty-" + sendqty + " where sa_sendplandetailid=" + sendplandetailsrowsMap.get(row.getString("itemid")).get(a).getLong("sa_sendplandetailid"));
  328. }
  329. sendqty = sendqty.add(sendplandetailsrowsMap.get(row.getString("itemid")).get(a).getBigDecimal("sendqty"));
  330. }
  331. }
  332. }
  333. dbConnect.runSqlUpdate(list);
  334. return getSucReturnObject().toString();
  335. }
  336. @API(title = "计划清空", apiversion = R.ID2025032709342503.v1.class)
  337. @CACHEING_CLEAN(apiClass = {sendplandetail.class})
  338. public String clearPlan() throws YosException {
  339. Long sa_sendplanid = content.getLongValue("sa_sendplanid");
  340. dbConnect.runSqlUpdate("delete from sa_sendplandetail where sa_sendplanid='" + sa_sendplanid + "' and siteid='" + siteid + "'");
  341. return getSucReturnObject().toString();
  342. }
  343. @API(title = "更新计划发货数量", apiversion = R.ID2025101709333503.v1.class)
  344. @CACHEING_CLEAN(apiClass = {sendplandetail.class})
  345. public String updatesendqty() throws YosException {
  346. long sa_sendplandetailid = content.getLong("sa_sendplandetailid");
  347. BigDecimal sendqty = content.getBigDecimal("sendqty");
  348. String outplace = content.getString("outplace");
  349. Rows sendplandetails = dbConnect.runSqlQuery("select t2.itemid,t1.sa_sendplanid from sa_sendplandetail t1 inner join sa_orderitems t2 on t1.sa_orderitemsid=t2.sa_orderitemsid and t1.siteid=t2.siteid where t1.sa_sendplandetailid=" + sa_sendplandetailid + " and t1.siteid='" + siteid + "'");
  350. if (sendplandetails.isEmpty()) {
  351. return getErrReturnObject().setErrMsg("发货计划明细不存在").toString();
  352. }
  353. dbConnect.runSqlUpdate("update sa_sendplandetail set sendqty=" + sendqty + ",outplace='" + outplace + "' where sa_sendplandetailid=" + sa_sendplandetailid);
  354. ArrayList<String> list = new ArrayList<>();
  355. Rows sendplandetailsgroupitemid = dbConnect.runSqlQuery("select t2.itemid,t1.sa_sendplandetailid,t1.sendqty,t1.canuseqty from sa_sendplandetail t1 inner join sa_orderitems t2 on t1.sa_orderitemsid=t2.sa_orderitemsid and t1.siteid=t2.siteid where t1.sa_sendplanid=" + sendplandetails.get(0).getLong("sa_sendplanid") + " and t2.itemid=" + sendplandetails.get(0).getLong("itemid") + " and t1.siteid='" + siteid + "' order by t2.sa_orderid desc");
  356. BigDecimal sendqtyold = BigDecimal.ZERO;
  357. BigDecimal canuseqty = sendplandetailsgroupitemid.max("canuseqty");
  358. for (int a = 0; a < sendplandetailsgroupitemid.size(); a++) {
  359. if (a > 0) {
  360. list.add("update sa_sendplandetail set canuseqty=" + canuseqty.subtract(sendqtyold) + " where sa_sendplandetailid=" + sendplandetailsgroupitemid.get(a).getLong("sa_sendplandetailid"));
  361. }
  362. sendqtyold = sendqtyold.add(sendplandetailsgroupitemid.get(a).getBigDecimal("sendqty"));
  363. }
  364. dbConnect.runSqlUpdate(list);
  365. return getSucReturnObject().toString();
  366. }
  367. @API(title = "生成销售出库单", apiversion = R.ID2025032709355603.v1.class)
  368. @CACHEING_CLEAN(apiClass = {sendplandetail.class})
  369. public String createIcstockBill() throws YosException {
  370. long sa_sendplanid = content.getLong("sa_sendplanid");
  371. Rows rows = dbConnect.runSqlQuery("select * from sa_sendplan where sa_sendplanid=" + sa_sendplanid);
  372. ArrayList<Long> sa_orderitemsids = new ArrayList<>();
  373. String billdate = "";
  374. if (rows.isNotEmpty()) {
  375. departmentid = rows.get(0).getLong("departmentid");
  376. billdate=rows.get(0).getString("senddate");
  377. }
  378. JSONArray detailarray = content.getJSONArray("details");
  379. ArrayList<String> sqlList = new ArrayList<>();
  380. HashMap<String, HashMap<String, List<JSONObject>>> agentmap = new HashMap<String, HashMap<String, List<JSONObject>>>();
  381. ArrayList<String> sys_enterpriseidList = new ArrayList<>();
  382. for (Object object : detailarray) {
  383. JSONObject jsonObject = (JSONObject) object;
  384. if (jsonObject.getDouble("sendqty") <= 0) {
  385. continue;
  386. }
  387. sa_orderitemsids.add(jsonObject.getLongValue("sa_orderitemsid"));
  388. String key = "";
  389. String sys_enterpriseid = jsonObject.getString("sys_enterpriseid");
  390. sys_enterpriseidList.add(sys_enterpriseid);
  391. String outplace = jsonObject.getString("outplace");
  392. String topclassnum = jsonObject.getString("topclassnum");
  393. String invoicename = jsonObject.getString("invoicename");
  394. key = outplace+topclassnum+invoicename;
  395. HashMap<String, List<JSONObject>> agent = null;
  396. List<JSONObject> paolist = null;
  397. if (agentmap.containsKey(sys_enterpriseid)) {
  398. agent = agentmap.get(sys_enterpriseid);
  399. if (agent.containsKey(key)) {
  400. paolist = agent.get(key);
  401. } else {
  402. paolist = new ArrayList<JSONObject>();
  403. }
  404. } else {
  405. agent = new HashMap<String, List<JSONObject>>();
  406. paolist = new ArrayList<JSONObject>();
  407. }
  408. paolist.add(jsonObject);
  409. agent.put(key, paolist);
  410. agentmap.put(sys_enterpriseid, agent);
  411. }
  412. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sa_orderitems", "*");
  413. querySQL.setTableAlias("t1");
  414. querySQL.setSiteid(siteid);
  415. querySQL.setWhere("sa_orderitemsid", sa_orderitemsids);
  416. Rows orderdetails = querySQL.query();
  417. RowsMap orderdetailsRowsMap = orderdetails.toRowsMap("sa_orderitemsid");
  418. Iterator<Map.Entry<String, HashMap<String, List<JSONObject>>>> iter = agentmap
  419. .entrySet().iterator();
  420. ArrayList<Long> st_stockbillids = new ArrayList<Long>();
  421. RowsMap itemRowsMap = SQLFactory.createQuerySQL(this, "plm_item", "*").setTableAlias("t1").addJoinTable(JOINTYPE.left, "st_stock", "t2", "t1.siteid = t2.siteid and t1.stockno = t2.stockno","stockid").setWhere("itemid", orderdetails.toArrayList("itemid")).query().toRowsMap("itemid");
  422. RowsMap agentsRowsMap = SQLFactory.createQuerySQL(this, "sa_agents", "*").setWhere("sys_enterpriseid", sys_enterpriseidList).query().toRowsMap("sys_enterpriseid");
  423. while (iter.hasNext()) {
  424. Map.Entry entry = (Map.Entry) iter.next();
  425. String sys_enterpriseid = (String) entry.getKey();
  426. HashMap<String, List<JSONObject>> keymap = (HashMap<String, List<JSONObject>>) entry
  427. .getValue();
  428. Iterator<Map.Entry<String, List<JSONObject>>> iter2 = keymap
  429. .entrySet().iterator();
  430. while (iter2.hasNext()) {
  431. Map.Entry entry2 = (Map.Entry) iter2.next();
  432. String key = (String) entry2.getKey();
  433. List<JSONObject> paolist = (List<JSONObject>) entry2
  434. .getValue();
  435. Iterator<JSONObject> senddetailpaoit1 = paolist.iterator();
  436. Iterator<JSONObject> senddetailpaoit = paolist.iterator();
  437. Iterator<JSONObject> senddetailpaoit2 = paolist.iterator();
  438. List<JSONObject> list = new ArrayList<>();
  439. senddetailpaoit2.forEachRemaining(list::add);
  440. System.err.println(list.size());
  441. SQLFactory sqlFactory = new SQLFactory(this, "销售出库单新增");
  442. long st_stockbillid = createTableID("st_stockbill");
  443. st_stockbillids.add(st_stockbillid);
  444. sqlFactory.addParameter("siteid", siteid);
  445. sqlFactory.addParameter("st_stockbillid", st_stockbillid);
  446. sqlFactory.addParameter("sys_enterpriseid", sys_enterpriseid);
  447. sqlFactory.addParameter("logisticsmethod", agentsRowsMap.containsKey(sys_enterpriseid)?agentsRowsMap.get(sys_enterpriseid).get(0).getString("delivery"):"");
  448. sqlFactory.addParameter("billno", createBillCode("stockbill"));
  449. sqlFactory.addParameter("type", "销售出库");
  450. sqlFactory.addParameter("rb", 1);
  451. sqlFactory.addParameter("departmentid", departmentid);
  452. JSONObject firstItem = senddetailpaoit1.hasNext() ? senddetailpaoit1.next() : null;
  453. if (firstItem != null) {
  454. sqlFactory.addParameter("outplace", firstItem.getStringValue("outplace"));
  455. sqlFactory.addParameter("rec_contactsid", firstItem.getStringValue("rec_contactsid"));
  456. sqlFactory.addParameter("delivery", "");
  457. //sqlFactory.addParameter("logisticsmethod", firstItem.getStringValue("logisticsmethod"));
  458. sqlFactory.addParameter("invoice_enterprisename", firstItem.getStringValue("invoicename"));
  459. sqlFactory.addParameter("invoice_address", firstItem.getStringValue("invoiceaddress"));
  460. sqlFactory.addParameter("invoice_taxno", firstItem.getStringValue("invoicetaxno"));
  461. sqlFactory.addParameter("name", firstItem.getStringValue("contact"));
  462. sqlFactory.addParameter("phonenumber", firstItem.getStringValue("phonenumber"));
  463. sqlFactory.addParameter("address", firstItem.getStringValue("address"));
  464. sqlFactory.addParameter("province", firstItem.getString("province"));
  465. sqlFactory.addParameter("city", firstItem.getString("city"));
  466. sqlFactory.addParameter("county", firstItem.getString("county"));
  467. sqlFactory.addParameter("remarks", mergeStrings(list,";"));
  468. } else {
  469. sqlFactory.addParameter("outplace", "");
  470. sqlFactory.addParameter("rec_contactsid", 0);
  471. sqlFactory.addParameter("delivery", "");
  472. //sqlFactory.addParameter("logisticsmethod", "");
  473. sqlFactory.addParameter("invoice_enterprisename", "");
  474. sqlFactory.addParameter("invoice_address","");
  475. sqlFactory.addParameter("invoice_taxno", "");
  476. sqlFactory.addParameter("name", "");
  477. sqlFactory.addParameter("phonenumber", "");
  478. sqlFactory.addParameter("address", "");
  479. sqlFactory.addParameter("province","");
  480. sqlFactory.addParameter("city","");
  481. sqlFactory.addParameter("county", "");
  482. sqlFactory.addParameter("remarks", "");
  483. }
  484. sqlFactory.addParameter("billdate", StringUtils.isBlank(billdate)?getDateTime_Str():billdate);
  485. sqlFactory.addParameter("createby", username);
  486. sqlFactory.addParameter("createdate", getDateTime_Str());
  487. sqlFactory.addParameter("changeby", username);
  488. sqlFactory.addParameter("changedate", getDateTime_Str());
  489. sqlFactory.addParameter("checkby", "");
  490. sqlFactory.addParameter("checkdate", "null");
  491. sqlList.add(sqlFactory.getSQL());
  492. int rowno = 1;
  493. while (senddetailpaoit.hasNext()) {
  494. JSONObject jsonObject = senddetailpaoit.next();
  495. BigDecimal qty = new BigDecimal(jsonObject.getString("sendqty"));
  496. qty = qty.compareTo(BigDecimal.ZERO) < 0 ? qty.negate() : qty;
  497. //String fdetailstockno = jsonObject.getString("fstockno");
  498. //String fbatchno = jsonObject.getString("fbatchno");
  499. SQLFactory sqlFactorydetail = new SQLFactory(this, "销售出库单明细新增");
  500. sqlFactorydetail.addParameter("siteid", siteid);
  501. sqlFactorydetail.addParameter("st_stockbill_itemsid", createTableID("st_stockbill_items"));
  502. sqlFactorydetail.addParameter("st_stockbillid", st_stockbillid);
  503. if (orderdetailsRowsMap.containsKey(jsonObject.getLongValue("sa_orderitemsid"))) {
  504. BigDecimal defaultprice = orderdetailsRowsMap.get(jsonObject.getLongValue("sa_orderitemsid")).get(0).getBigDecimal("price").subtract(orderdetailsRowsMap.get(jsonObject.getLongValue("sa_orderitemsid")).get(0).getBigDecimal("custamount"));
  505. sqlFactorydetail.addParameter("remarks", orderdetailsRowsMap.get(jsonObject.getLongValue("sa_orderitemsid")).get(0).getString("remarks"));
  506. sqlFactorydetail.addParameter("price", defaultprice);
  507. sqlFactorydetail.addParameter("amount", defaultprice.multiply(qty));
  508. sqlFactorydetail.addParameter("defaultprice", defaultprice);
  509. sqlFactorydetail.addParameter("custamount", orderdetailsRowsMap.get(jsonObject.getLongValue("sa_orderitemsid")).get(0).getBigDecimal("custamount"));
  510. } else {
  511. sqlFactorydetail.addParameter("remarks", "");
  512. sqlFactorydetail.addParameter("price", 0);
  513. sqlFactorydetail.addParameter("amount", 0);
  514. sqlFactorydetail.addParameter("defaultprice", 0);
  515. sqlFactorydetail.addParameter("custamount", 0);
  516. }
  517. sqlFactorydetail.addParameter("itemid", jsonObject.getLongValue("itemid"));
  518. sqlFactorydetail.addParameter("itemname", itemRowsMap.containsKey(jsonObject.getStringValue("itemid"))?itemRowsMap.get(jsonObject.getStringValue("itemid")).get(0).getString("itemname"):jsonObject.getStringValue("itemname"));
  519. sqlFactorydetail.addParameter("itemno", itemRowsMap.containsKey(jsonObject.getStringValue("itemid"))?itemRowsMap.get(jsonObject.getStringValue("itemid")).get(0).getString("itemno"):jsonObject.getStringValue("itemno"));
  520. sqlFactorydetail.addParameter("model", itemRowsMap.containsKey(jsonObject.getStringValue("itemid"))?itemRowsMap.get(jsonObject.getStringValue("itemid")).get(0).getString("model"):jsonObject.getStringValue("model"));
  521. sqlFactorydetail.addParameter("skucontrol", itemRowsMap.containsKey(jsonObject.getStringValue("itemid"))?itemRowsMap.get(jsonObject.getStringValue("itemid")).get(0).getLong("skucontrol"):jsonObject.getLongValue("skucontrol"));
  522. sqlFactorydetail.addParameter("qty", qty);
  523. sqlFactorydetail.addParameter("sa_dispatch_itemsid", 0);
  524. sqlFactorydetail.addParameter("rowno", rowno);
  525. sqlFactorydetail.addParameter("stockid", 1603);
  526. sqlFactorydetail.addParameter("sa_orderitemsid", jsonObject.getLongValue("sa_orderitemsid"));
  527. sqlFactorydetail.addParameter("sa_orderid", jsonObject.getLongValue("sa_orderid"));
  528. sqlList.add(sqlFactorydetail.getSQL());
  529. rowno++;
  530. }
  531. }
  532. }
  533. dbConnect.runSqlUpdate(sqlList);
  534. ArrayList<String> sqlList1 = new ArrayList<>();
  535. QuerySQL detailquerySQL = SQLFactory.createQuerySQL(this, "st_stockbill_items", "amount", "qty", "st_stockbillid");
  536. detailquerySQL.setTableAlias("t1");
  537. detailquerySQL.setSiteid(siteid);
  538. detailquerySQL.setWhere("t1.st_stockbillid", st_stockbillids);
  539. Rows rowsdetail = detailquerySQL.query();
  540. RowsMap rowsdetailMap = rowsdetail.toRowsMap("st_stockbillid");
  541. for (long st_stockbillid : st_stockbillids) {
  542. if (rowsdetailMap.containsKey(String.valueOf(st_stockbillid))) {
  543. sqlList1.add("update st_stockbill set payamount=" + rowsdetailMap.get(String.valueOf(st_stockbillid)).sum("amount") + " where st_stockbillid=" + st_stockbillid);
  544. }
  545. }
  546. dbConnect.runSqlUpdate(sqlList1);
  547. return getSucReturnObject().toString();
  548. }
  549. @API(title = "发货计划明细列表", apiversion = R.ID2025032709373303.v1.class)
  550. @CACHEING
  551. public String queryList_sendplan() throws YosException {
  552. Long sa_sendplanid = content.getLongValue("sa_sendplanid");
  553. SQLFactory sqlFactory = new SQLFactory(this, "发货计划订单未发货量(简略)");
  554. sqlFactory.addParameter_SQL("where", "1=1");
  555. sqlFactory.addParameter("siteid", siteid);
  556. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sa_sendplandetail", "sa_sendplanid", "sa_sendplandetailid", "colorflag", "outplace", "sendqty", "willoutqty", "willinqty", "canuseqty");
  557. querySQL.setTableAlias("t1");
  558. querySQL.addJoinTable(JOINTYPE.left, "sa_order", "t2", "t1.siteid = t2.siteid and t1.sa_orderid = t2.sa_orderid", "sonum", "checkdate", "sys_enterpriseid", "sa_orderid", "rec_contactsid", "delivery","logisticsmethod"
  559. , "invoicename", "invoiceaddress","invoicetaxno","contact","phonenumber","address","province","city","county","remarks");
  560. querySQL.addJoinTable(JOINTYPE.left, "sa_orderitems", "t3", "t3.siteid = t1.siteid and t3.sa_orderitemsid = t1.sa_orderitemsid", "rowno", "sa_orderitemsid","custamount");
  561. querySQL.addJoinTable(JOINTYPE.left, "sa_agents", "t4", "t4.siteid = t1.siteid and t4.sa_agentsid = t1.sa_agentsid", "agentnum");
  562. querySQL.addJoinTable(JOINTYPE.left, "sys_enterprise", "t5", "t5.siteid = t4.siteid and t5.sys_enterpriseid = t4.sys_enterpriseid", "enterprisename", "abbreviation");
  563. querySQL.addJoinTable(JOINTYPE.left, "plm_item", "t6", "t6.siteid = t3.siteid and t6.itemid = t3.itemid", "itemno", "itemname", "model", "itemid", "topclassnum");
  564. querySQL.addJoinTable(JOINTYPE.left, sqlFactory, "t7", "t7.sa_orderitemsid = t3.sa_orderitemsid", "undeliqty");
  565. querySQL.addQueryFields("willoutqty_jh", "t7.willoutqty");
  566. querySQL.addQueryFields("sendqty_canzhao", "t1.sendqty");
  567. querySQL.addQueryFields("remarksdetail", "t3.remarks");
  568. querySQL.setSiteid(siteid);
  569. querySQL.setCondition("t1.outplace", "t2.sonum", "t4.agentnum", "t5.enterprisename");
  570. querySQL.setPage(pageSize, pageNumber);
  571. querySQL.setWhere("sa_sendplanid", sa_sendplanid);
  572. querySQL.setOrderBy("t2.sa_orderid desc");
  573. Rows rows = querySQL.query();
  574. QuerySQL querySQL_ck = SQLFactory.createQuerySQL(this, "st_invbal", "itemid", "qty");
  575. querySQL_ck.setTableAlias("t1");
  576. querySQL_ck.addJoinTable(JOINTYPE.left, "st_stock", "t2", "t1.siteid = t2.siteid and t1.stockid = t2.stockid", "stockno");
  577. querySQL_ck.setSiteid(siteid);
  578. querySQL_ck.setWhere("t1.itemid", rows.toArrayList("itemid"));
  579. Rows rows_ck = querySQL_ck.query();
  580. RowsMap rowsCkRowsMap = rows_ck.toRowsMap("stockno");
  581. QuerySQL querySQL_cksale = SQLFactory.createQuerySQL(this, "st_invbal_sale", "itemid", "qty");
  582. querySQL_cksale.setTableAlias("t1");
  583. querySQL_cksale.setSiteid(siteid);
  584. querySQL_cksale.setWhere("t1.itemid", rows.toArrayList("itemid"));
  585. Rows rows_cksale = querySQL_cksale.query();
  586. RowsMap rows_cksaleRowsMap = rows_cksale.toRowsMap("itemid");
  587. for (Row row : rows) {
  588. if (rowsCkRowsMap.containsKey("101")) {
  589. if (rowsCkRowsMap.get("101").toRowsMap("itemid").containsKey(row.getString("itemid"))) {
  590. row.put("qty_xs", rowsCkRowsMap.get("101").toRowsMap("itemid").get(row.getString("itemid")).get(0).getBigDecimal("qty"));
  591. } else {
  592. row.put("qty_xs", 0);
  593. }
  594. } else {
  595. row.put("qty_xs", 0);
  596. }
  597. if (rowsCkRowsMap.containsKey("103")) {
  598. if (rowsCkRowsMap.get("103").toRowsMap("itemid").containsKey(row.getString("itemid"))) {
  599. row.put("qty_tq", rowsCkRowsMap.get("103").toRowsMap("itemid").get(row.getString("itemid")).get(0).getBigDecimal("qty"));
  600. } else {
  601. row.put("qty_tq", 0);
  602. }
  603. } else {
  604. row.put("qty_tq", 0);
  605. }
  606. if (rowsCkRowsMap.containsKey("109")) {
  607. if (rowsCkRowsMap.get("109").toRowsMap("itemid").containsKey(row.getString("itemid"))) {
  608. row.put("qty_mq", rowsCkRowsMap.get("109").toRowsMap("itemid").get(row.getString("itemid")).get(0).getBigDecimal("qty"));
  609. } else {
  610. row.put("qty_mq", 0);
  611. }
  612. } else {
  613. row.put("qty_mq", 0);
  614. }
  615. if (rows_cksaleRowsMap.containsKey(row.getString("itemid"))) {
  616. row.put("qty_total", rows_cksaleRowsMap.get(row.getString("itemid")).get(0).getBigDecimal("qty"));
  617. } else{
  618. row.put("qty_total", 0);
  619. }
  620. }
  621. return getSucReturnObject().setData(rows).toString();
  622. }
  623. @API(title = "删除明细", apiversion = R.ID2025032709370703.v1.class)
  624. @CACHEING_CLEAN(apiClass = {sendplandetail.class})
  625. public String deletemx() throws YosException {
  626. long sa_sendplandetailid = content.getLongValue("sa_sendplandetailid");
  627. ArrayList<String> list = new ArrayList<>();
  628. list.add("delete from sa_sendplandetail where siteid='" + siteid
  629. + "' and sa_sendplandetailid=" + sa_sendplandetailid);
  630. dbConnect.runSqlUpdate(list);
  631. return getSucReturnObject().toString();
  632. }
  633. public static String mergeStrings(List<JSONObject> list, String delimiter) throws YosException {
  634. StringBuilder result = new StringBuilder();
  635. Set<String> seen = new LinkedHashSet<>(); // 使用LinkedHashSet保持顺序
  636. for (JSONObject jsonObject : list) {
  637. System.err.println("1111");
  638. String remark = jsonObject.getString("remarks");
  639. if (remark != null && !remark.isEmpty()) {
  640. seen.add(remark);
  641. }
  642. }
  643. // 构建结果字符串
  644. for (String remark : seen) {
  645. if (result.length() > 0) {
  646. result.append(delimiter);
  647. }
  648. result.append(remark);
  649. }
  650. return result.toString();
  651. }
  652. private BigDecimal getBigDecimalOrZero(BigDecimal value) {
  653. return value != null ? value : BigDecimal.ZERO;
  654. }
  655. }