OrderItemsHelper.java 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773
  1. package restcontroller.webmanage.sale.order;
  2. import beans.accountbalance.Accountbalance;
  3. import beans.accountbalance.CashbillEntity;
  4. import beans.datacontrllog.DataContrlLog;
  5. import beans.itemclass.ItemClass;
  6. import beans.itemprice.ItemPrice;
  7. import beans.order.Order;
  8. import beans.parameter.Parameter;
  9. import com.alibaba.fastjson.JSONArray;
  10. import com.alibaba.fastjson.JSONObject;
  11. import common.BaseClass;
  12. import common.Controller;
  13. import common.DataFunction;
  14. import common.YosException;
  15. import common.data.*;
  16. import org.apache.commons.lang.StringUtils;
  17. import org.apache.poi.util.StringUtil;
  18. import java.math.BigDecimal;
  19. import java.math.BigInteger;
  20. import java.text.SimpleDateFormat;
  21. import java.util.ArrayList;
  22. import java.util.List;
  23. import java.util.stream.Collectors;
  24. public class OrderItemsHelper extends BaseClass {
  25. Controller controller;
  26. JSONObject content;
  27. public OrderItemsHelper(Controller controller) {
  28. this.controller = controller;
  29. this.content = controller.content;
  30. }
  31. public void isAccountCanUsed(Long sa_accountclassid) throws YosException {
  32. if (dbConnect.runSqlQuery("select * from sa_accountclass WHERE isused=1 and isorder=1 and sa_accountclassid=" + sa_accountclassid).isEmpty()) {
  33. throw new YosException(false, "当资金账户未启用或者不支持订货");
  34. }
  35. }
  36. public long getAccountClassId(String type) throws YosException {
  37. Long sa_accountclassid = content.getLong("sa_accountclassid");
  38. if (controller.siteid.equalsIgnoreCase("CCYOSG")) {
  39. if ((type.equals("标准订单") || type.equals("特殊订单")) && content.getString("tradefield").equals("GC工程")) {
  40. return 69L;
  41. }
  42. if ((type.equals("标准订单") || type.equals("特殊订单")) && content.getString("tradefield").equals("整装工程")) {
  43. return 96L;
  44. }
  45. } else {
  46. if ((type.equals("标准订单") || type.equals("特殊订单")) && sa_accountclassid > 0) {
  47. return sa_accountclassid;
  48. }
  49. }
  50. if (type.equals("促销订单")) {
  51. Rows accountclassRows = dbConnect.runSqlQuery("select sa_accountclassid from sa_promotion where siteid='" + controller.siteid + "' and sa_promotionid=" + content.getLongValue("sa_promotionid"));
  52. if (!accountclassRows.isEmpty()) {
  53. return accountclassRows.get(0).getLong("sa_accountclassid");
  54. } else {
  55. return beans.order.Order.getDefaultAccount(controller.siteid, type);
  56. }
  57. }
  58. return beans.order.Order.getDefaultAccount(controller.siteid, type);
  59. }
  60. //执行是否自动返利结算
  61. public void executeAutoRebate(Long sa_orderid, Long sys_enterpriseid) throws YosException {
  62. Rows orderRows = Order.getOrderRows(controller, sa_orderid);
  63. if (orderRows.get(0).getString("type").equals("促销订单")) {
  64. return;
  65. }
  66. //是否自动返利结算
  67. String isrebate = Parameter.get(controller.siteid, "isrebate");
  68. if (isrebate.equals("1")) {
  69. return;
  70. }
  71. //查询有效期内,余额大于0 的经销商装修补贴返利
  72. String sql = "select * from sa_agentdecorationtrebate WHERE sys_enterpriseid=" + sys_enterpriseid + " and siteid='" + controller.siteid + "' and begindate <= current_date and enddate>=current_date and balance>0";
  73. Rows agentdecorationtrebatRows = dbConnect.runSqlQuery(sql);
  74. if (agentdecorationtrebatRows.isEmpty()) {
  75. return;
  76. }
  77. //查询装修返利方案
  78. Rows rebateschemeRows = dbConnect.runSqlQuery("select * from sa_rebatescheme where siteid='" + controller.siteid + "'");
  79. if (rebateschemeRows.isEmpty()) {
  80. return;
  81. }
  82. ArrayList<String> sqlList = new ArrayList<>();
  83. Long sa_rebateschemeid = rebateschemeRows.get(0).getLong("sa_rebateschemeid");
  84. Long sa_accountclassid = rebateschemeRows.get(0).getLong("sa_accountclassid");
  85. Rows rebatecategorys = dbConnect.runSqlQuery("select itemclassid from sa_rebatecategory where siteid='" + controller.siteid + "' and sa_rebateschemeid=" + sa_rebateschemeid);
  86. Rows rebateunproducts = dbConnect.runSqlQuery("select itemid from sa_rebateunproducts where siteid='" + controller.siteid + "' and sa_rebateschemeid=" + sa_rebateschemeid);
  87. ArrayList<Long> itemclsids = rebatecategorys.toArrayList("itemclassid", new ArrayList<Long>());
  88. itemclsids.addAll(ItemClass.getSubItemClassIds(controller, itemclsids));
  89. itemclsids.add(0l);
  90. ArrayList<Long> itemids = rebateunproducts.toArrayList("itemid", new ArrayList<Long>());
  91. itemids.add(0l);
  92. SQLFactory sqlFactory = new SQLFactory(controller, "查询返利数据");
  93. sqlFactory.addParameter("sa_orderid", sa_orderid);
  94. sqlFactory.addParameter("siteid", controller.siteid);
  95. sqlFactory.addParameter("siteid", controller.siteid);
  96. sqlFactory.addParameter_in("itemclassid", itemclsids);
  97. sqlFactory.addParameter_in("itemid", itemids);
  98. Rows rows = controller.dbConnect.runSqlQuery(sqlFactory);
  99. BigDecimal saorderamount = BigDecimal.ZERO;
  100. for (Row row : rows) {
  101. saorderamount = saorderamount.add(row.getBigDecimal("amount"));
  102. }
  103. //查询定制费用
  104. sql = "SELECT ifnull(sum(costamount),0) costamount from sa_order_cost WHERE sa_orderid=" + sa_orderid;
  105. BigDecimal costamount = dbConnect.runSqlQuery(0, sql).getBigDecimal("costamount");
  106. saorderamount = saorderamount.add(costamount);
  107. BigDecimal balance = agentdecorationtrebatRows.get(0).getBigDecimal("balance");
  108. BigDecimal brate = agentdecorationtrebatRows.get(0).getBigDecimal("brate");
  109. BigDecimal approvedamount = BigDecimal.ZERO;
  110. if (balance.compareTo(saorderamount.multiply(brate)) >= 0) {
  111. approvedamount = saorderamount.multiply(brate);
  112. } else if (balance.compareTo(BigDecimal.ZERO) > 0) {
  113. approvedamount = balance;
  114. }
  115. System.out.println(saorderamount);
  116. System.out.println(approvedamount);
  117. if (approvedamount.compareTo(BigDecimal.ZERO) > 0) {
  118. ArrayList<Long> sa_orderitemsids = rows.toArrayList("sa_orderitemsid", new ArrayList<>());
  119. sa_orderitemsids.add(0l);
  120. //更新订单明细的装修返利标志
  121. UpdateSQL updateSQL = SQLFactory.createUpdateSQL(controller, "sa_orderitems");
  122. updateSQL.setWhere("sa_orderitemsid", sa_orderitemsids);
  123. updateSQL.setValue("decorationrebateflag", "1");
  124. sqlList.add(updateSQL.getSQL());
  125. //更新sa_agentdecorationtrebate
  126. updateSQL = SQLFactory.createUpdateSQL(controller, "sa_agentdecorationtrebate");
  127. updateSQL.setWhere("sys_enterpriseid", sys_enterpriseid);
  128. updateSQL.setSiteid(controller.siteid);
  129. updateSQL.setValue("balance", balance.subtract(approvedamount));
  130. sqlList.add(updateSQL.getSQL());
  131. //生成收入凭证
  132. CashbillEntity entity = new CashbillEntity();
  133. entity.setAmount(approvedamount);
  134. entity.setOwnerid(sa_orderid);
  135. entity.setOwnertable("sa_order");
  136. entity.setSource("订单自动返利");
  137. entity.setSourcenote(orderRows.get(0).getString("sonum"));
  138. entity.setRemarks(orderRows.get(0).getString("sonum") + "订单自动返利");
  139. JSONObject cashbillIncome = Accountbalance.createCashbillIncome(controller, sys_enterpriseid, sa_accountclassid, entity, true, true);
  140. sqlList.addAll(cashbillIncome.getJSONArray("sqlList").toJavaList(String.class));
  141. dbConnect.runSqlUpdate(sqlList);
  142. }
  143. }
  144. public JSONArray toJsonArray(String column, List<Row> list) {
  145. JSONArray array = new JSONArray();
  146. array.add("0");
  147. for (Row row : list) {
  148. Object value = row.get(column);
  149. array.add(value);
  150. }
  151. return array;
  152. }
  153. public RowsMap CalculateAmount(ArrayList<Long> itemclsids, Long sys_enterpriseid,
  154. String itemids) throws YosException {
  155. Rows rows = null;
  156. itemclsids.addAll(ItemClass.getSubItemClassIds(controller, itemclsids));
  157. itemclsids.add(0l);
  158. if (itemids.equals("()")) {
  159. rows = dbConnect.runSqlQuery("select t2.closedate,t2.sys_enterpriseid,sum(if(t1.isclose,t1.amount,t1.price*(t1.qty-t1.undeliqty))) amount from sa_orderitems t1 \n" +
  160. "inner join sa_order t2 on t1.sa_orderid=t2.sa_orderid and t1.siteid=t2.siteid\n" +
  161. "inner join plm_item t3 on t1.itemid=t3.itemid and t1.siteid=t3.siteid where t2.type !='促销订单' and ifnull( t2.closedate,'')!='' and t2.sa_accountclassid!=0 and t2.sys_enterpriseid =" + sys_enterpriseid + " and t2.status in('关闭') and t1.itemid in(select itemid from sa_itemsaleclass where itemclassid in" + itemclsids.toString().replace("[", "(").replace("]", ")") + " ) and t1.DECORATIONREBATEFLAG=0 and t1.siteid='" + controller.siteid + "' group by t2.sys_enterpriseid,t2.closedate");
  162. } else {
  163. rows = dbConnect.runSqlQuery("select t2.closedate,t2.sys_enterpriseid,sum(if(t1.isclose,t1.amount,t1.price*(t1.qty-t1.undeliqty))) amount from sa_orderitems t1 \n" +
  164. "inner join sa_order t2 on t1.sa_orderid=t2.sa_orderid and t1.siteid=t2.siteid\n" +
  165. "inner join plm_item t3 on t1.itemid=t3.itemid and t1.siteid=t3.siteid where t2.type !='促销订单' and ifnull( t2.closedate,'')!='' and t2.sa_accountclassid!=0 and t2.sys_enterpriseid =" + sys_enterpriseid + " and t2.status in('关闭') and t1.itemid not in" + itemids + " and t1.itemid in(select itemid from sa_itemsaleclass where itemclassid in" + itemclsids.toString().replace("[", "(").replace("]", ")") + " ) and t1.DECORATIONREBATEFLAG=0 and t1.siteid='" + controller.siteid + "' group by t2.sys_enterpriseid,t2.closedate");
  166. }
  167. return rows.toRowsMap("sys_enterpriseid");
  168. }
  169. public RowsMap QuerySaorderNum(ArrayList<Long> itemclsids, Long sys_enterpriseid,
  170. String itemids) throws YosException {
  171. Rows rows = null;
  172. itemclsids.addAll(ItemClass.getSubItemClassIds(controller, itemclsids));
  173. itemclsids.add(0l);
  174. if (itemids.equals("()")) {
  175. rows = dbConnect.runSqlQuery("select t2.closedate,t2.sys_enterpriseid,t2.sa_orderid,SUM(if(t1.isclose,t1.amount,t1.price*(t1.qty-t1.undeliqty))) amount from sa_orderitems t1 \n" +
  176. "inner join sa_order t2 on t1.sa_orderid=t2.sa_orderid and t1.siteid=t2.siteid\n" +
  177. "inner join plm_item t3 on t1.itemid=t3.itemid and t1.siteid=t3.siteid where t2.type !='促销订单' and ifnull( t2.closedate,'')!='' and t2.sa_accountclassid!=0 and t2.sys_enterpriseid =" + sys_enterpriseid + " and t2.status in('关闭') and t1.itemid in(select itemid from sa_itemsaleclass where itemclassid in" + itemclsids.toString().replace("[", "(").replace("]", ")") + " ) and t1.DECORATIONREBATEFLAG=0 and t1.siteid='" + controller.siteid + "' group by t2.sa_orderid,t2.sys_enterpriseid,t2.closedate");
  178. } else {
  179. rows = dbConnect.runSqlQuery("select t2.closedate,t2.sys_enterpriseid,t2.sa_orderid,SUM(if(t1.isclose,t1.amount,t1.price*(t1.qty-t1.undeliqty))) amount from sa_orderitems t1 \n" +
  180. "inner join sa_order t2 on t1.sa_orderid=t2.sa_orderid and t1.siteid=t2.siteid\n" +
  181. "inner join plm_item t3 on t1.itemid=t3.itemid and t1.siteid=t3.siteid where t2.type !='促销订单' and ifnull( t2.closedate,'')!='' and t2.sa_accountclassid!=0 and t2.sys_enterpriseid =" + sys_enterpriseid + " and t2.status in('关闭') and t1.itemid not in" + itemids + " and t1.itemid in(select itemid from sa_itemsaleclass where itemclassid in" + itemclsids.toString().replace("[", "(").replace("]", ")") + " ) and t1.DECORATIONREBATEFLAG=0 and t1.siteid='" + controller.siteid + "' group by t2.sa_orderid,t2.sys_enterpriseid,t2.closedate");
  182. }
  183. return rows.toRowsMap("sys_enterpriseid");
  184. }
  185. public RowsMap QuerySaorderDetailId(ArrayList<Long> itemclsids, Long sys_enterpriseid,
  186. String itemids) throws YosException {
  187. Rows rows = null;
  188. itemclsids.addAll(ItemClass.getSubItemClassIds(controller, itemclsids));
  189. itemclsids.add(0l);
  190. String sql = "select t2.closedate,t2.sys_enterpriseid,t1.sa_orderitemsid from sa_orderitems t1 " +
  191. "inner join sa_order t2 on t1.sa_orderid=t2.sa_orderid and t1.siteid=t2.siteid " +
  192. "inner join plm_item t3 on t1.itemid=t3.itemid and t1.siteid=t3.siteid " +
  193. "where t2.type !='促销订单' " +
  194. "and ifnull( t2.closedate,'')!='' " +
  195. "and t2.sa_accountclassid!=0 and t2.sys_enterpriseid =" + sys_enterpriseid + " " +
  196. "and t2.status in('关闭') " +
  197. "and t1.itemid in(select itemid from sa_itemsaleclass where itemclassid in" + itemclsids.toString().replace("[", "(").replace("]", ")") + " ) " +
  198. "and t1.DECORATIONREBATEFLAG=0 and t1.siteid='" + controller.siteid + "' ";
  199. if (!itemids.equals("()")) {
  200. sql = sql + " and t1.itemid not in" + itemids;
  201. }
  202. sql = sql + "group by t2.sys_enterpriseid,t2.closedate,t1.sa_orderitemsid";
  203. System.err.println(sql);
  204. rows = dbConnect.runSqlQuery(sql);
  205. return rows.toRowsMap("sys_enterpriseid");
  206. }
  207. // //创建返利结算单表头
  208. // public InsertSQL getrebateaccounthead(Long sa_rebateaccountheadid) throws YosException {
  209. // InsertSQL insertSQL = SQLFactory.createInsertSQL(controller, "sa_rebateaccounthead");
  210. // insertSQL.setUniqueid(sa_rebateaccountheadid).setSiteid(controller.siteid);
  211. // insertSQL.setValue("billdate", getDate_Str());
  212. // insertSQL.setValue("status", "新建");
  213. // insertSQL.setValue("billno", controller.createBillCode("rebateaccountheadbill"));
  214. // return insertSQL;
  215. // }
  216. //
  217. // //创建返利结算单表体
  218. // public InsertSQL getrebateaccount(Long sa_rebateaccountid, Long sa_rebateaccountheadid, Long sys_enterpriseid) throws YosException {
  219. // InsertSQL insertSQL = SQLFactory.createInsertSQL(controller, "sa_rebateaccount");
  220. // insertSQL.setUniqueid(sa_rebateaccountid).setSiteid(controller.siteid);
  221. // //核准金额
  222. // insertSQL.setValue("approvedamount", 10);
  223. // //装修返利金额
  224. // insertSQL.setValue("rebateamount", 10);
  225. // insertSQL.setValue("sa_rebateaccountheadid", sa_rebateaccountheadid);
  226. // //合作企业档案ID
  227. // insertSQL.setValue("sys_enterpriseid", sys_enterpriseid);
  228. // //行号
  229. // insertSQL.setValue("rowno", 1);
  230. // //累计订购返利商品金额
  231. // insertSQL.setValue("accumulatedamount", 10);
  232. // return insertSQL;
  233. // }
  234. //
  235. // //创建返利结算单表体
  236. // public InsertSQL getrebateaccountdetail(Long sa_orderid, Long sa_rebateaccountid) throws YosException {
  237. // InsertSQL insertSQL = SQLFactory.createInsertSQL(controller, "sa_rebateaccountdetail");
  238. // insertSQL.setUniqueid(createTableID("sa_rebateaccountdetail")).setSiteid(controller.siteid);
  239. // //核准金额
  240. // insertSQL.setValue("sa_orderid", sa_orderid);
  241. // //装修返利金额
  242. // insertSQL.setValue("sa_rebateaccountid", sa_rebateaccountid);
  243. // insertSQL.setValue("rateamount", 10);
  244. // //合作企业档案ID
  245. // insertSQL.setValue("amount", 10);
  246. // return insertSQL;
  247. // }
  248. //查询并执行商品费用方案方法
  249. public void executeDataFunction(Long sa_orderid) throws YosException {
  250. SQLFactory sqlFactory = new SQLFactory(this, "查询商品费用方案方法");
  251. sqlFactory.addParameter("siteid", controller.siteid);
  252. sqlFactory.addParameter("sa_orderid", sa_orderid);
  253. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  254. for (Row row : rows) {
  255. DataFunction df = DataFunction.get(controller, row.getString("functionname"));
  256. df.addParameter("sa_orderid", sa_orderid);
  257. df.action();
  258. }
  259. }
  260. public void checkOffOrderItems(Long sa_orderid, String tablename, Long sa_promotionid) throws YosException {
  261. String sql = "select t2.itemid from sa_orderitems t1 inner join " + tablename + " t2 on t1.siteid=t2.siteid and t1.itemid=t2.itemid where t1.sa_orderid="
  262. + sa_orderid + " and t1.siteid='" + controller.siteid + "' and t2.isonsale!=1";
  263. if (tablename.equals("sa_promotion_items")) {
  264. sql = sql + " and t2.sa_promotionid=" + sa_promotionid;
  265. }
  266. Rows iteminfos = dbConnect.runSqlQuery(sql);
  267. if (iteminfos.isNotEmpty()) {
  268. Row itemRow = dbConnect.runSqlQuery(0, "SELECT itemno from plm_item WHERE itemid=" + iteminfos.get(0).getString("itemid"));
  269. throw new YosException(false, "检测到品号" + itemRow.getString("itemno") + "未上架,请删除后重试");
  270. }
  271. }
  272. public void checkOffOrderItems(String tablename, Long itemid, Long sa_promotionid) throws YosException {
  273. String sql = "select t1.itemid from " + tablename + " t1 where t1.siteid='" + controller.siteid + "' and t1.isonsale!=1 and t1.itemid=" + itemid;
  274. if (tablename.equals("sa_promotion_items")) {
  275. sql = sql + " and t1.sa_promotionid=" + sa_promotionid;
  276. }
  277. Rows iteminfos = dbConnect.runSqlQuery(sql);
  278. if (iteminfos.isNotEmpty()) {
  279. Row itemRow = dbConnect.runSqlQuery(0, "SELECT itemno from plm_item WHERE itemid=" + iteminfos.get(0).getString("itemid"));
  280. throw new YosException(false, "检测到品号" + itemRow.getString("itemno") + "未上架,请删除后重试");
  281. }
  282. }
  283. /**
  284. * 是否符合商品起订量和增量判断
  285. *
  286. * @param type
  287. * @param itemRowsMap
  288. * @param item
  289. * @param itemRow
  290. * @param promotionitems
  291. * @throws YosException
  292. */
  293. public void compareQty(String type, RowsMap itemRowsMap, JSONObject item, Row itemRow, Rows promotionitems) throws YosException {
  294. BigDecimal qty = item.getBigDecimalValue("qty");
  295. String itemid = item.getString("itemid");
  296. Rows itemRows = itemRowsMap.getOrDefault(itemid, new Rows());
  297. if (qty.compareTo(BigDecimal.ZERO) == 0) {
  298. throw new YosException(false, "品号为" + itemRows.get(0).getString("itemno") + "的商品的添加数量为0,不允许添加");
  299. }
  300. if (!type.equals("促销订单")) {
  301. if (!type.equals("特殊订单")) {
  302. if (itemRowsMap.containsKey(itemid)) {
  303. if (itemRows.isNotEmpty()) {
  304. BigDecimal orderaddqty = itemRows.get(0).getBigDecimal("orderaddqty");
  305. BigDecimal orderminqty = itemRows.get(0).getBigDecimal("orderminqty");
  306. if (orderaddqty.compareTo(BigDecimal.ZERO) != 0) {
  307. if (((qty.subtract(orderminqty)).remainder(orderaddqty)).compareTo(BigDecimal.ZERO) != 0 || qty.compareTo(orderminqty) < 0) {
  308. throw new YosException(false, "品号为" + itemRows.get(0).getString("itemno") + "的商品数量不符合该商品的起订量和增量");
  309. }
  310. }
  311. }
  312. }
  313. } else {
  314. if (qty.compareTo(BigDecimal.ZERO) <= 0) {
  315. throw new YosException(false, "品号为" + itemRows.get(0).getString("itemno") + "的商品数量必须大于0");
  316. }
  317. }
  318. }
  319. RowsMap pRowsMap = promotionitems.toRowsMap("sa_promotion_itemsid");
  320. if (type.equals("促销订单")) {
  321. if (pRowsMap.containsKey(item.getString("sa_promotion_itemsid"))) {
  322. String saPromotionItemsid = item.getString("sa_promotion_itemsid");
  323. if (pRowsMap.get(saPromotionItemsid).isNotEmpty()) {
  324. BigDecimal saledqty = pRowsMap.get(saPromotionItemsid).get(0).getBigDecimal("saledqty");
  325. BigDecimal groupqty = pRowsMap.get(saPromotionItemsid).get(0).getBigDecimal("groupqty");
  326. BigDecimal orderaddqty = pRowsMap.get(saPromotionItemsid).get(0).getBigDecimal("orderaddqty");
  327. BigDecimal orderminqty = pRowsMap.get(saPromotionItemsid).get(0).getBigDecimal("orderminqty");
  328. boolean islimit = pRowsMap.get(saPromotionItemsid).get(0).getBoolean("islimit");
  329. if (orderaddqty.compareTo(BigDecimal.ZERO) != 0) {
  330. if (((qty.subtract(orderminqty)).remainder(orderaddqty)).compareTo(BigDecimal.ZERO) != 0 || qty.compareTo(orderminqty) < 0) {
  331. throw new YosException(false, "品号为" + itemRowsMap.get(itemid).get(0).getString("itemno") + "的商品数量不符合该商品的起订量和增量");
  332. }
  333. }
  334. if (islimit) {
  335. if (groupqty.compareTo(saledqty.add(qty)) < 0) {
  336. throw new YosException(false, "品号:" + itemRow.getString("itemno") + "已超过限购数量:" + groupqty.subtract(saledqty));
  337. }
  338. }
  339. }
  340. }
  341. }
  342. }
  343. /**
  344. * 获取定制属性
  345. *
  346. * @param itemRowsMap
  347. * @param item
  348. * @return
  349. * @throws YosException
  350. */
  351. public JSONArray getCustomProperties(RowsMap itemRowsMap, JSONObject item) throws YosException {
  352. JSONArray customproperties = new JSONArray();
  353. Rows customschemeRows = dbConnect.runSqlQuery("select * from sa_customscheme_items where siteid='" + controller.siteid + "'");
  354. RowsMap customschemeRowsMap = customschemeRows.toRowsMap("sa_customschemeid");
  355. String itemid = item.getString("itemid");
  356. if (itemRowsMap.containsKey(itemid)) {
  357. if (itemRowsMap.get(itemid).isNotEmpty()) {
  358. if (itemRowsMap.get(itemid).get(0).getLong("sa_customschemeid") > 0 && !itemRowsMap.get(itemid).get(0).getBoolean("iscustomsize")) {
  359. // System.out.println(0000);
  360. if (customschemeRowsMap.containsKey(itemRowsMap.get(itemid).get(0).getString("sa_customschemeid"))) {
  361. // System.out.println(111111);
  362. for (Row customschemeItem : (customschemeRowsMap.get(itemRowsMap.get(itemid).get(0).getString("sa_customschemeid")))) {
  363. // System.out.println(customschemeItem.getString("description"));
  364. // System.out.println(2222);
  365. customproperties.add(customschemeItem.getString("description") + ":" + itemRowsMap.get(itemid).get(0).getString(customschemeItem.getString("value")));
  366. }
  367. }
  368. } else if (itemRowsMap.get(itemid).get(0).getBoolean("iscustomsize")) {
  369. // System.out.println(3333);
  370. if (customschemeRowsMap.containsKey(itemRowsMap.get(itemid).get(0).getString("sa_customschemeid"))) {
  371. // System.out.println(4444);
  372. for (Row customschemeItem : (customschemeRowsMap.get(itemRowsMap.get(itemid).get(0).getString("sa_customschemeid")))) {
  373. // System.out.println(5555);
  374. // System.out.println((customschemeRowsMap.get(itemRowsMap.get(itemid).get(0).getString("sa_customschemeid"))).size());
  375. if (!customschemeItem.getString("value").equals("spec")) {
  376. // customproperties.add(customschemeItem.getString("description") + ":" + itemRowsMap.get(itemid).get(0).getString(customschemeItem.getString("value")));
  377. } else {
  378. customproperties.add(getcustomproperties(item));
  379. }
  380. }
  381. } else {
  382. customproperties.add(getcustomproperties(item));
  383. }
  384. }
  385. }
  386. }
  387. return customproperties;
  388. }
  389. public String getcustomproperties(JSONObject item) {
  390. String material = item.getStringValue("custommaterial");
  391. String colors = item.getStringValue("customcolors");
  392. String cheek = item.getStringValue("customcheek");
  393. String length = item.getStringValue("length", false, "0");
  394. String width = item.getStringValue("width", false, "0");
  395. String str = "";
  396. if (!StringUtils.isBlank(material) && !material.equals("0")) {
  397. str = "选项:" + material;
  398. }
  399. if (!StringUtils.isBlank(colors) && !colors.equals("0")) {
  400. if (str.isEmpty()) {
  401. str = "颜色:" + colors;
  402. } else {
  403. str = str + ";" + "颜色:" + colors;
  404. }
  405. }
  406. if (!StringUtils.isBlank(cheek) && !cheek.equals("0")) {
  407. if (str.isEmpty()) {
  408. str = "工艺:" + cheek;
  409. } else {
  410. str = str + ";" + "工艺:" + cheek;
  411. }
  412. }
  413. if (!length.equals("0") && !width.equals("0")) {
  414. String size = "尺寸:" + length + "×" + width;
  415. if (str.isEmpty()) {
  416. str = size;
  417. } else {
  418. str = str + ";" + size;
  419. }
  420. }
  421. return str;
  422. }
  423. /**
  424. * 获取定制尺寸信息
  425. *
  426. * @param itemRowsMap
  427. * @param item
  428. * @return
  429. * @throws YosException
  430. */
  431. public String getCustomSpec(RowsMap itemRowsMap, JSONObject item) throws YosException {
  432. String spec = "";
  433. Rows customschemeRows = dbConnect.runSqlQuery("select * from sa_customscheme_items where siteid='" + controller.siteid + "'");
  434. RowsMap customschemeRowsMap = customschemeRows.toRowsMap("sa_customschemeid");
  435. String itemid = item.getString("itemid");
  436. if (itemRowsMap.containsKey(itemid)) {
  437. if (itemRowsMap.get(itemid).isNotEmpty()) {
  438. if (!itemRowsMap.get(itemid).get(0).getBoolean("iscustomsize")) {
  439. spec = itemRowsMap.get(itemid).get(0).getString("spec");
  440. } else {
  441. spec = item.getStringValue("length") + "*" + item.getStringValue("width");
  442. }
  443. }
  444. }
  445. return spec;
  446. }
  447. /**
  448. * 批量查询商品信息
  449. *
  450. * @param items
  451. * @return
  452. * @throws YosException
  453. */
  454. public RowsMap getItemRowsMap(JSONArray items) throws YosException {
  455. ArrayList<Long> itemids = new ArrayList<>();
  456. for (Object obj : items) {
  457. JSONObject item = (JSONObject) obj;
  458. itemids.add(item.getLong("itemid"));
  459. }
  460. String sql = "select t1.*,t2.material from plm_item t1 left join plm_itemextend t2 ON t2.itemid = t1.itemid AND t2.siteid = t1.siteid where t1.siteid='" + controller.siteid + "' and t1.itemid in " + itemids;
  461. sql = sql.replace("[", "(").replace("]", ")");
  462. return dbConnect.runSqlQuery(sql).toRowsMap("itemid");
  463. }
  464. public UpdateSQL getUpdateSql() throws YosException {
  465. System.err.println("123");
  466. UpdateSQL updateSQL = SQLFactory.createUpdateSQL(controller, "sa_order");
  467. if (controller.content.containsKey("sa_order_v")) {
  468. updateSQL.setDataVersion(content.getIntValue("sa_order_v"));
  469. }
  470. updateSQL.setValue("changeby", controller.username);
  471. updateSQL.setWhere("sa_orderid", content.getLongValue("sa_orderid"));
  472. updateSQL.setWhere("siteid", controller.siteid);
  473. System.err.println(updateSQL.getSQL());
  474. return updateSQL;
  475. }
  476. String sa_orderitems = "sa_orderitems";
  477. public InsertSQL getInsertSQL(JSONArray customproperties, long sa_orderitemsid, JSONObject item, Row itemRow, String type, BigDecimal defaultprice, BigDecimal price, BigDecimal saleprice, BigDecimal marketprice, String spec, Rows promotionitems) throws YosException {
  478. Long itemid = item.getLong("itemid");
  479. BigDecimal qty = item.getBigDecimalValue("qty");
  480. RowsMap promotionitemsRowsMap = promotionitems.toRowsMap("sa_promotion_itemsid");
  481. String signaturecode = "";
  482. if (type.equals("促销订单")) {
  483. if (promotionitemsRowsMap.containsKey(item.getString("sa_promotion_itemsid"))) {
  484. if (promotionitemsRowsMap.get(item.getString("sa_promotion_itemsid")).isNotEmpty()) {
  485. signaturecode = promotionitemsRowsMap.get(item.getString("sa_promotion_itemsid")).get(0).getString("signaturecode");
  486. }
  487. }
  488. }
  489. InsertSQL insertSQL = SQLFactory.createInsertSQL(controller, sa_orderitems);
  490. insertSQL.setValue("customproperties", customproperties.toJSONString().replace("[", "").replace("]", "").replace("\"", ""));
  491. insertSQL.setValue("siteid", controller.siteid);
  492. insertSQL.setValue("sa_orderitemsid", sa_orderitemsid);
  493. insertSQL.setValue("sa_orderid", content.getLongValue("sa_orderid"));
  494. insertSQL.setValue("rowno", 1);
  495. insertSQL.setValue("itemid", itemid);
  496. insertSQL.setValue("remarks", item.getStringValue("remarks") + signaturecode);
  497. insertSQL.setValue("itemno", itemRow.getString("itemno"));
  498. insertSQL.setValue("itemname", itemRow.getString("itemname"));
  499. insertSQL.setValue("model", itemRow.getString("model"));
  500. insertSQL.setValue("unit", itemRow.getString("unit"));
  501. insertSQL.setValue("auxunit", itemRow.getString("auxunit"));
  502. insertSQL.setValue("batchcontrol", itemRow.getLong("batchcontrol"));
  503. insertSQL.setValue("stockno", item.getOrDefault("stockno", "null"));
  504. insertSQL.setValue("position", item.getOrDefault("position", "null"));
  505. insertSQL.setValue("batchno", item.getOrDefault("batchno", "null"));
  506. insertSQL.setValue("spec", spec);
  507. insertSQL.setValue("sa_promotion_itemsid", item.getLongValue("sa_promotion_itemsid"));
  508. String deliverydate = item.getStringValue("deliverydate");
  509. Rows rows = dbConnect.runSqlQuery("SELECT deliverydate,defaultprice from sa_orderitems WHERE sa_orderitemsid =" + sa_orderitemsid);
  510. if (deliverydate.isEmpty()) {
  511. if (rows.isNotEmpty()) {
  512. deliverydate = rows.get(0).getString("deliverydate");
  513. } else {
  514. deliverydate = "null";
  515. }
  516. }
  517. String needdate = item.getStringValue("needdate");
  518. insertSQL.setValue("needdate", needdate.equals("") ? "null" : needdate);
  519. insertSQL.setValue("deliverydate", deliverydate.equals("") ? "null" : deliverydate);
  520. BigDecimal conversionrate = itemRow.getBigDecimal("conversionrate");
  521. if (conversionrate.compareTo(BigDecimal.ZERO) <= 0) {
  522. conversionrate = BigDecimal.valueOf(1);
  523. }
  524. insertSQL.setValue("conversionrate", conversionrate);
  525. //订购数量
  526. insertSQL.setValue("qty", qty);
  527. insertSQL.setValue("undeliqty", qty);
  528. //辅助单位数量
  529. insertSQL.setValue("auxqty", qty.divide(conversionrate));
  530. if (type.equals("特殊订单")) {
  531. if (item.containsKey("defaultprice")) {
  532. if (item.getBigDecimalValue("price").compareTo(BigDecimal.ZERO) > 0 && item.getBigDecimalValue("amount").compareTo(BigDecimal.ZERO) <= 0) {
  533. insertSQL.setValue("price", item.getBigDecimalValue("price"));
  534. //折前金额(元)
  535. insertSQL.setValue("amount", price.multiply(qty));
  536. } else if (item.getBigDecimalValue("price").compareTo(BigDecimal.ZERO) <= 0 && item.getBigDecimalValue("amount").compareTo(BigDecimal.ZERO) > 0) {
  537. insertSQL.setValue("price", item.getBigDecimalValue("amount").divide(qty, 6, BigDecimal.ROUND_HALF_UP));
  538. //折前金额(元)
  539. insertSQL.setValue("amount", item.getBigDecimalValue("amount"));
  540. } else {
  541. insertSQL.setValue("price", price);
  542. //折前金额(元)
  543. insertSQL.setValue("amount", price.multiply(qty));
  544. }
  545. } else {
  546. insertSQL.setValue("price", price);
  547. //折前金额(元)
  548. insertSQL.setValue("amount", price.multiply(qty));
  549. }
  550. } else {
  551. insertSQL.setValue("price", price);
  552. //折前金额(元)
  553. insertSQL.setValue("amount", price.multiply(qty));
  554. }
  555. //单价,折后价(元),取合同价
  556. insertSQL.setValue("defaultprice", defaultprice);
  557. insertSQL.setValue("saleprice", saleprice);
  558. //金额,折后金额(元)
  559. insertSQL.setValue("defaultamount", defaultprice.multiply(qty));
  560. //牌价、市场价(元),标准订单牌价取商品价格,项目订单取合同里的牌价
  561. insertSQL.setValue("marketprice", marketprice);
  562. return insertSQL;
  563. }
  564. public UpdateSQL getUpdateSQL(long sa_orderitemsid, JSONObject item, Row itemRow, String type, BigDecimal defaultprice, BigDecimal price, BigDecimal saleprice) throws YosException {
  565. BigDecimal qty = item.getBigDecimalValue("qty");
  566. UpdateSQL updateSQL = SQLFactory.createUpdateSQL(controller, sa_orderitems);
  567. //订购数量
  568. updateSQL.setValue("qty", qty);
  569. //辅助单位数量
  570. BigDecimal conversionrate = itemRow.getBigDecimal("conversionrate");
  571. if (conversionrate.compareTo(BigDecimal.ZERO) <= 0) {
  572. conversionrate = BigDecimal.valueOf(1);
  573. }
  574. updateSQL.setValue("auxqty", qty.divide(conversionrate));
  575. updateSQL.setValue("undeliqty", qty.subtract(itemRow.getBigDecimal("delivery")));
  576. updateSQL.setValue("remarks", item.getStringValue("remarks"));
  577. updateSQL.setValue("stockno", item.getOrDefault("stockno", "null"));
  578. updateSQL.setValue("position", item.getOrDefault("position", "null"));
  579. updateSQL.setValue("batchno", item.getOrDefault("batchno", "null"));
  580. String deliverydate = item.getStringValue("deliverydate");
  581. Rows rows = dbConnect.runSqlQuery("SELECT deliverydate,defaultprice from sa_orderitems WHERE sa_orderitemsid =" + sa_orderitemsid);
  582. if (deliverydate.isEmpty()) {
  583. if (rows.isNotEmpty()) {
  584. deliverydate = rows.get(0).getString("deliverydate");
  585. } else {
  586. deliverydate = "null";
  587. }
  588. }
  589. String needdate = item.getStringValue("needdate");
  590. updateSQL.setValue("needdate", needdate.equals("") ? "null" : needdate);
  591. updateSQL.setValue("deliverydate", deliverydate.equals("") ? "null" : deliverydate);
  592. if (type.equals("特殊订单")) {
  593. if (item.containsKey("defaultprice")) {
  594. if (item.getBigDecimalValue("price").compareTo(BigDecimal.ZERO) > 0 && item.getBigDecimalValue("amount").compareTo(BigDecimal.ZERO) <= 0) {
  595. updateSQL.setValue("price", item.getBigDecimalValue("price"));
  596. //折前金额(元)
  597. updateSQL.setValue("amount", price.multiply(qty));
  598. } else if (item.getBigDecimalValue("price").compareTo(BigDecimal.ZERO) <= 0 && item.getBigDecimalValue("amount").compareTo(BigDecimal.ZERO) > 0) {
  599. updateSQL.setValue("price", item.getBigDecimalValue("amount").divide(qty, 6, BigDecimal.ROUND_HALF_UP));
  600. //折前金额(元)
  601. updateSQL.setValue("amount", item.getBigDecimalValue("amount"));
  602. } else {
  603. updateSQL.setValue("price", price);
  604. //折前金额(元)
  605. updateSQL.setValue("amount", price.multiply(qty));
  606. }
  607. } else {
  608. updateSQL.setValue("price", price);
  609. //折前金额(元)
  610. updateSQL.setValue("amount", price.multiply(qty));
  611. }
  612. } else {
  613. updateSQL.setValue("price", price);
  614. //折前金额(元)
  615. updateSQL.setValue("amount", price.multiply(qty));
  616. }
  617. //单价,折后价(元),取合同价
  618. updateSQL.setValue("defaultprice", defaultprice);
  619. //金额,折后金额(元)
  620. updateSQL.setValue("defaultamount", defaultprice.multiply(qty));
  621. updateSQL.setValue("saleprice", saleprice);
  622. updateSQL.setWhere("siteid", controller.siteid);
  623. updateSQL.setWhere("sa_orderitemsid", sa_orderitemsid);
  624. return updateSQL;
  625. }
  626. public BigDecimal getDefaultprice(ItemPrice itemPrice) throws YosException {
  627. return itemPrice.getGraderateprice();
  628. }
  629. public BigDecimal getPrice(Row orderRow, ItemPrice itemPrice, JSONObject item, RowsMap itemRowsMap) throws YosException {
  630. String type = orderRow.getString("type");
  631. Long sa_promotionid = orderRow.getLong("sa_promotionid");
  632. BigDecimal price;
  633. switch (type) {
  634. case "促销订单":
  635. price = itemPrice.getPromotionPrice(sa_promotionid);
  636. if (itemRowsMap.containsKey(item.getString("itemid"))) {
  637. if (itemRowsMap.get(item.getString("itemid")).isNotEmpty()) {
  638. if (itemRowsMap.get(item.getString("itemid")).get(0).getBoolean("iscustomsize") && itemRowsMap.get(item.getString("itemid")).get(0).getLong("pricingmetod") == 1) {
  639. price = price.multiply(item.getBigDecimalValue("length").multiply(item.getBigDecimalValue("width")).divide(new BigDecimal("1000000"), 4, BigDecimal.ROUND_HALF_UP));
  640. }
  641. }
  642. }
  643. break;
  644. default:
  645. price = itemPrice.getGraderateprice();
  646. if (itemRowsMap.containsKey(item.getString("itemid"))) {
  647. if (itemRowsMap.get(item.getString("itemid")).isNotEmpty()) {
  648. if (itemRowsMap.get(item.getString("itemid")).get(0).getBoolean("iscustomsize") && itemRowsMap.get(item.getString("itemid")).get(0).getLong("pricingmetod") == 1) {
  649. price = price.multiply(item.getBigDecimalValue("length").multiply(item.getBigDecimalValue("width")).divide(new BigDecimal("1000000"), 4, BigDecimal.ROUND_HALF_UP));
  650. }
  651. }
  652. }
  653. }
  654. return price;
  655. }
  656. public BigDecimal getSalePrice(Row orderRow, ItemPrice itemPrice) throws YosException {
  657. String type = orderRow.getString("type");
  658. Long sa_promotionid = orderRow.getLong("sa_promotionid");
  659. BigDecimal price;
  660. switch (type) {
  661. case "促销订单":
  662. price = itemPrice.getPromotionPrice(sa_promotionid);
  663. break;
  664. default:
  665. price = itemPrice.getGraderateprice();
  666. }
  667. return price;
  668. }
  669. }