OrderItemsHelper.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. package restcontroller.webmanage.sale.order;
  2. import beans.datacontrllog.DataContrlLog;
  3. import beans.itemprice.ItemPrice;
  4. import com.alibaba.fastjson.JSONArray;
  5. import com.alibaba.fastjson.JSONObject;
  6. import common.BaseClass;
  7. import common.Controller;
  8. import common.YosException;
  9. import common.data.*;
  10. import java.math.BigDecimal;
  11. import java.util.ArrayList;
  12. public class OrderItemsHelper extends BaseClass {
  13. Controller controller;
  14. JSONObject content;
  15. public OrderItemsHelper(Controller controller) {
  16. this.controller = controller;
  17. this.content = controller.content;
  18. }
  19. /**
  20. * 是否符合商品起订量和增量判断
  21. *
  22. * @param type
  23. * @param itemRowsMap
  24. * @param item
  25. * @param itemRow
  26. * @param promotionitems
  27. * @throws YosException
  28. */
  29. public void compareQty(String type, RowsMap itemRowsMap, JSONObject item, Row itemRow, Rows promotionitems) throws YosException {
  30. BigDecimal qty = item.getBigDecimalValue("qty");
  31. String itemid = item.getString("itemid");
  32. if (!type.equals("促销订单")) {
  33. if (itemRowsMap.containsKey(itemid)) {
  34. if (itemRowsMap.get(itemid).isNotEmpty()) {
  35. BigDecimal orderaddqty = itemRowsMap.get(itemid).get(0).getBigDecimal("orderaddqty");
  36. BigDecimal orderminqty = itemRowsMap.get(itemid).get(0).getBigDecimal("orderminqty");
  37. if (((qty.subtract(orderminqty)).remainder(orderaddqty)).compareTo(BigDecimal.ZERO) != 0 || qty.compareTo(orderminqty)<0) {
  38. throw new YosException("品号为" + itemRowsMap.get(itemid).get(0).getString("itemno") + "的商品数量不符合该商品的起订量和增量");
  39. }
  40. }
  41. }
  42. }
  43. RowsMap pRowsMap = promotionitems.toRowsMap("itemid");
  44. if (type.equals("促销订单")) {
  45. if (pRowsMap.containsKey(itemid)) {
  46. if (pRowsMap.get(itemid).isNotEmpty()) {
  47. BigDecimal saledqty = pRowsMap.get(itemid).get(0).getBigDecimal("saledqty");
  48. BigDecimal groupqty = pRowsMap.get(itemid).get(0).getBigDecimal("groupqty");
  49. BigDecimal orderaddqty = pRowsMap.get(itemid).get(0).getBigDecimal("orderaddqty");
  50. BigDecimal orderminqty = pRowsMap.get(itemid).get(0).getBigDecimal("orderminqty");
  51. boolean islimit = pRowsMap.get(itemid).get(0).getBoolean("islimit");
  52. if (((qty.subtract(orderminqty)).remainder(orderaddqty)).compareTo(BigDecimal.ZERO) != 0 || qty.compareTo(orderminqty)<0) {
  53. throw new YosException("品号为" + itemRowsMap.get(itemid).get(0).getString("itemno") + "的商品数量不符合该商品的起订量和增量");
  54. }
  55. if (islimit) {
  56. if (groupqty.compareTo(saledqty.add(qty)) < 0) {
  57. throw new YosException("品号:"+itemRow.getString("itemno") +"已超过限购数量:"+groupqty.subtract(saledqty));
  58. }
  59. }
  60. }
  61. }
  62. }
  63. }
  64. /**
  65. * 获取定制属性
  66. *
  67. * @param itemRowsMap
  68. * @param item
  69. * @return
  70. * @throws YosException
  71. */
  72. public JSONArray getCustomProperties(RowsMap itemRowsMap, JSONObject item) throws YosException {
  73. JSONArray customproperties = new JSONArray();
  74. Rows customschemeRows = dbConnect.runSqlQuery("select * from sa_customscheme_items where siteid='" + controller.siteid + "'");
  75. RowsMap customschemeRowsMap = customschemeRows.toRowsMap("sa_customschemeid");
  76. String itemid = item.getString("itemid");
  77. if (itemRowsMap.containsKey(itemid)) {
  78. if (itemRowsMap.get(itemid).isNotEmpty()) {
  79. if (itemRowsMap.get(itemid).get(0).getLong("sa_customschemeid") > 0 && !itemRowsMap.get(itemid).get(0).getBoolean("iscustomsize")) {
  80. // System.out.println(0000);
  81. if (customschemeRowsMap.containsKey(itemRowsMap.get(itemid).get(0).getString("sa_customschemeid"))) {
  82. // System.out.println(111111);
  83. for (Row customschemeItem : (customschemeRowsMap.get(itemRowsMap.get(itemid).get(0).getString("sa_customschemeid")))) {
  84. // System.out.println(customschemeItem.getString("description"));
  85. // System.out.println(2222);
  86. customproperties.add(customschemeItem.getString("description") + ":" + itemRowsMap.get(itemid).get(0).getString(customschemeItem.getString("value")));
  87. }
  88. }
  89. } else if (itemRowsMap.get(itemid).get(0).getBoolean("iscustomsize")) {
  90. // System.out.println(3333);
  91. if (customschemeRowsMap.containsKey(itemRowsMap.get(itemid).get(0).getString("sa_customschemeid"))) {
  92. // System.out.println(4444);
  93. for (Row customschemeItem : (customschemeRowsMap.get(itemRowsMap.get(itemid).get(0).getString("sa_customschemeid")))) {
  94. // System.out.println(5555);
  95. // System.out.println((customschemeRowsMap.get(itemRowsMap.get(itemid).get(0).getString("sa_customschemeid"))).size());
  96. if (!customschemeItem.getString("value").equals("spec")) {
  97. customproperties.add(customschemeItem.getString("description") + ":" + itemRowsMap.get(itemid).get(0).getString(customschemeItem.getString("value")));
  98. } else {
  99. customproperties.add("尺寸:" + item.getStringValue("length") + "*" + item.getStringValue("width"));
  100. }
  101. }
  102. } else {
  103. customproperties.add("尺寸:" + item.getStringValue("length") + "*" + item.getStringValue("width"));
  104. }
  105. }
  106. }
  107. }
  108. return customproperties;
  109. }
  110. /**
  111. * 批量查询商品信息
  112. *
  113. * @param items
  114. * @return
  115. * @throws YosException
  116. */
  117. public RowsMap getItemRowsMap(JSONArray items) throws YosException {
  118. ArrayList<Long> itemids = new ArrayList<>();
  119. for (Object obj : items) {
  120. JSONObject item = (JSONObject) obj;
  121. itemids.add(item.getLong("itemid"));
  122. }
  123. 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;
  124. sql = sql.replace("[", "(").replace("]", ")");
  125. return dbConnect.runSqlQuery(sql).toRowsMap("itemid");
  126. }
  127. public UpdateSQL getUpdateSql() throws YosException {
  128. System.err.println("123");
  129. UpdateSQL updateSQL = SQLFactory.createUpdateSQL(controller, "sa_order");
  130. if (controller.content.containsKey("sa_order_v")) {
  131. updateSQL.setDataVersion(content.getIntValue("sa_order_v"));
  132. }
  133. updateSQL.setValue("changeby",controller.username);
  134. updateSQL.setWhere("sa_orderid", content.getLongValue("sa_orderid"));
  135. updateSQL.setWhere("siteid", controller.siteid);
  136. System.err.println(updateSQL.getSQL());
  137. return updateSQL;
  138. }
  139. String sa_orderitems = "sa_orderitems";
  140. public InsertSQL getInsertSQL(JSONArray customproperties, long sa_orderitemsid, JSONObject item, Row itemRow, String type, BigDecimal defaultprice, BigDecimal price, BigDecimal marketprice) throws YosException {
  141. Long itemid = item.getLong("itemid");
  142. BigDecimal qty = item.getBigDecimalValue("qty");
  143. InsertSQL insertSQL = SQLFactory.createInsertSQL(controller, sa_orderitems);
  144. insertSQL.setValue("customproperties", customproperties.toJSONString().replace("[", "").replace("]", "").replace("\"", ""));
  145. insertSQL.setValue("siteid", controller.siteid);
  146. insertSQL.setValue("sa_orderitemsid", sa_orderitemsid);
  147. insertSQL.setValue("sa_orderid", content.getLongValue("sa_orderid"));
  148. insertSQL.setValue("rowno", 1);
  149. insertSQL.setValue("itemid", itemid);
  150. insertSQL.setValue("remarks", item.getStringValue("remarks"));
  151. insertSQL.setValue("itemno", itemRow.getString("itemno"));
  152. insertSQL.setValue("itemname", itemRow.getString("itemname"));
  153. insertSQL.setValue("model", itemRow.getString("model"));
  154. insertSQL.setValue("unit", itemRow.getString("unit"));
  155. insertSQL.setValue("auxunit", itemRow.getString("auxunit"));
  156. insertSQL.setValue("batchcontrol", itemRow.getLong("batchcontrol"));
  157. insertSQL.setValue("stockno", item.getOrDefault("stockno", "null"));
  158. insertSQL.setValue("position", item.getOrDefault("position", "null"));
  159. insertSQL.setValue("batchno", item.getOrDefault("batchno", "null"));
  160. String deliverydate = item.getStringValue("deliverydate");
  161. Rows rows = dbConnect.runSqlQuery("SELECT deliverydate,defaultprice from sa_orderitems WHERE sa_orderitemsid =" + sa_orderitemsid);
  162. if (deliverydate.isEmpty()) {
  163. if (rows.isNotEmpty()) {
  164. deliverydate = rows.get(0).getString("deliverydate");
  165. } else {
  166. deliverydate = "null";
  167. }
  168. }
  169. String needdate = item.getStringValue("needdate");
  170. insertSQL.setValue("needdate", needdate.equals("") ? "null" : needdate);
  171. insertSQL.setValue("deliverydate", deliverydate.equals("") ? "null" : deliverydate);
  172. BigDecimal conversionrate = itemRow.getBigDecimal("conversionrate");
  173. if (conversionrate.compareTo(BigDecimal.ZERO) <= 0) {
  174. conversionrate = BigDecimal.valueOf(1);
  175. }
  176. insertSQL.setValue("conversionrate", conversionrate);
  177. //订购数量
  178. insertSQL.setValue("qty", qty);
  179. insertSQL.setValue("undeliqty", qty);
  180. //辅助单位数量
  181. insertSQL.setValue("auxqty", qty.divide(conversionrate));
  182. if (type.equals("特殊订单")) {
  183. if (item.containsKey("defaultprice")) {
  184. if (item.getBigDecimalValue("price").compareTo(BigDecimal.ZERO) > 0 && item.getBigDecimalValue("amount").compareTo(BigDecimal.ZERO) <= 0) {
  185. insertSQL.setValue("price", item.getBigDecimalValue("price"));
  186. //折前金额(元)
  187. insertSQL.setValue("amount", price.multiply(qty));
  188. } else if (item.getBigDecimalValue("price").compareTo(BigDecimal.ZERO) <= 0 && item.getBigDecimalValue("amount").compareTo(BigDecimal.ZERO) > 0) {
  189. insertSQL.setValue("price", item.getBigDecimalValue("amount").divide(qty, 6, BigDecimal.ROUND_HALF_UP));
  190. //折前金额(元)
  191. insertSQL.setValue("amount", item.getBigDecimalValue("amount"));
  192. } else {
  193. insertSQL.setValue("price", price);
  194. //折前金额(元)
  195. insertSQL.setValue("amount", price.multiply(qty));
  196. }
  197. } else {
  198. insertSQL.setValue("price", price);
  199. //折前金额(元)
  200. insertSQL.setValue("amount", price.multiply(qty));
  201. }
  202. } else {
  203. insertSQL.setValue("price", price);
  204. //折前金额(元)
  205. insertSQL.setValue("amount", price.multiply(qty));
  206. }
  207. //单价,折后价(元),取合同价
  208. insertSQL.setValue("defaultprice", defaultprice);
  209. //金额,折后金额(元)
  210. insertSQL.setValue("defaultamount", defaultprice.multiply(qty));
  211. //牌价、市场价(元),标准订单牌价取商品价格,项目订单取合同里的牌价
  212. insertSQL.setValue("marketprice", marketprice);
  213. return insertSQL;
  214. }
  215. public UpdateSQL getUpdateSQL(long sa_orderitemsid, JSONObject item, Row itemRow, String type, BigDecimal defaultprice, BigDecimal price) throws YosException {
  216. BigDecimal qty = item.getBigDecimalValue("qty");
  217. UpdateSQL updateSQL = SQLFactory.createUpdateSQL(controller, sa_orderitems);
  218. //订购数量
  219. updateSQL.setValue("qty", qty);
  220. //辅助单位数量
  221. BigDecimal conversionrate = itemRow.getBigDecimal("conversionrate");
  222. if (conversionrate.compareTo(BigDecimal.ZERO) <= 0) {
  223. conversionrate = BigDecimal.valueOf(1);
  224. }
  225. updateSQL.setValue("auxqty", qty.divide(conversionrate));
  226. updateSQL.setValue("undeliqty", qty.subtract(itemRow.getBigDecimal("delivery")));
  227. updateSQL.setValue("remarks", item.getStringValue("remarks"));
  228. updateSQL.setValue("stockno", item.getOrDefault("stockno", "null"));
  229. updateSQL.setValue("position", item.getOrDefault("position", "null"));
  230. updateSQL.setValue("batchno", item.getOrDefault("batchno", "null"));
  231. String deliverydate = item.getStringValue("deliverydate");
  232. Rows rows = dbConnect.runSqlQuery("SELECT deliverydate,defaultprice from sa_orderitems WHERE sa_orderitemsid =" + sa_orderitemsid);
  233. if (deliverydate.isEmpty()) {
  234. if (rows.isNotEmpty()) {
  235. deliverydate = rows.get(0).getString("deliverydate");
  236. } else {
  237. deliverydate = "null";
  238. }
  239. }
  240. String needdate = item.getStringValue("needdate");
  241. updateSQL.setValue("needdate", needdate.equals("") ? "null" : needdate);
  242. updateSQL.setValue("deliverydate", deliverydate.equals("") ? "null" : deliverydate);
  243. if (type.equals("特殊订单")) {
  244. if (item.containsKey("defaultprice")) {
  245. if (item.getBigDecimalValue("price").compareTo(BigDecimal.ZERO) > 0 && item.getBigDecimalValue("amount").compareTo(BigDecimal.ZERO) <= 0) {
  246. updateSQL.setValue("price", item.getBigDecimalValue("price"));
  247. //折前金额(元)
  248. updateSQL.setValue("amount", price.multiply(qty));
  249. } else if (item.getBigDecimalValue("price").compareTo(BigDecimal.ZERO) <= 0 && item.getBigDecimalValue("amount").compareTo(BigDecimal.ZERO) > 0) {
  250. updateSQL.setValue("price", item.getBigDecimalValue("amount").divide(qty, 6, BigDecimal.ROUND_HALF_UP));
  251. //折前金额(元)
  252. updateSQL.setValue("amount", item.getBigDecimalValue("amount"));
  253. } else {
  254. updateSQL.setValue("price", price);
  255. //折前金额(元)
  256. updateSQL.setValue("amount", price.multiply(qty));
  257. }
  258. } else {
  259. updateSQL.setValue("price", price);
  260. //折前金额(元)
  261. updateSQL.setValue("amount", price.multiply(qty));
  262. }
  263. } else {
  264. updateSQL.setValue("price", price);
  265. //折前金额(元)
  266. updateSQL.setValue("amount", price.multiply(qty));
  267. }
  268. //单价,折后价(元),取合同价
  269. updateSQL.setValue("defaultprice", defaultprice);
  270. //金额,折后金额(元)
  271. updateSQL.setValue("defaultamount", defaultprice.multiply(qty));
  272. updateSQL.setWhere("siteid", controller.siteid);
  273. return updateSQL;
  274. }
  275. public BigDecimal getDefaultprice(ItemPrice itemPrice) throws YosException {
  276. return itemPrice.getGraderateprice();
  277. }
  278. public BigDecimal getPrice(Row orderRow, ItemPrice itemPrice, JSONObject item, RowsMap itemRowsMap) throws YosException {
  279. String type = orderRow.getString("type");
  280. Long sa_promotionid = orderRow.getLong("sa_promotionid");
  281. BigDecimal price;
  282. switch (type) {
  283. case "促销订单":
  284. price = itemPrice.getPromotionPrice(sa_promotionid);
  285. if (itemRowsMap.containsKey(item.getString("itemid"))) {
  286. if (itemRowsMap.get(item.getString("itemid")).isNotEmpty()) {
  287. if (itemRowsMap.get(item.getString("itemid")).get(0).getBoolean("iscustomsize") && itemRowsMap.get(item.getString("itemid")).get(0).getLong("pricingmetod")==1) {
  288. price = price.multiply(item.getBigDecimalValue("length").multiply(item.getBigDecimalValue("width")).divide(new BigDecimal("1000000"), 4, BigDecimal.ROUND_HALF_UP));
  289. }
  290. }
  291. }
  292. break;
  293. default:
  294. price = itemPrice.getGraderateprice();
  295. if (itemRowsMap.containsKey(item.getString("itemid"))) {
  296. if (itemRowsMap.get(item.getString("itemid")).isNotEmpty()) {
  297. if (itemRowsMap.get(item.getString("itemid")).get(0).getBoolean("iscustomsize") && itemRowsMap.get(item.getString("itemid")).get(0).getLong("pricingmetod")==1) {
  298. price = price.multiply(item.getBigDecimalValue("length").multiply(item.getBigDecimalValue("width")).divide(new BigDecimal("1000000"), 4, BigDecimal.ROUND_HALF_UP));
  299. }
  300. }
  301. }
  302. }
  303. return price;
  304. }
  305. }