OrderItemsHelper.java 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794
  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. entity.setType("公司支持");
  140. entity.setTypemx("装修返利");
  141. JSONObject cashbillIncome = Accountbalance.createCashbillIncome(controller, sys_enterpriseid, sa_accountclassid, entity, true, true);
  142. sqlList.addAll(cashbillIncome.getJSONArray("sqlList").toJavaList(String.class));
  143. dbConnect.runSqlUpdate(sqlList);
  144. }
  145. }
  146. public JSONArray toJsonArray(String column, List<Row> list) {
  147. JSONArray array = new JSONArray();
  148. array.add("0");
  149. for (Row row : list) {
  150. Object value = row.get(column);
  151. array.add(value);
  152. }
  153. return array;
  154. }
  155. public RowsMap CalculateAmount(ArrayList<Long> itemclsids, Long sys_enterpriseid,
  156. String itemids) throws YosException {
  157. Rows rows = null;
  158. itemclsids.addAll(ItemClass.getSubItemClassIds(controller, itemclsids));
  159. itemclsids.add(0l);
  160. if (itemids.equals("()")) {
  161. 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" +
  162. "inner join sa_order t2 on t1.sa_orderid=t2.sa_orderid and t1.siteid=t2.siteid\n" +
  163. "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");
  164. } else {
  165. 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" +
  166. "inner join sa_order t2 on t1.sa_orderid=t2.sa_orderid and t1.siteid=t2.siteid\n" +
  167. "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");
  168. }
  169. return rows.toRowsMap("sys_enterpriseid");
  170. }
  171. public RowsMap QuerySaorderNum(ArrayList<Long> itemclsids, Long sys_enterpriseid,
  172. String itemids) throws YosException {
  173. Rows rows = null;
  174. itemclsids.addAll(ItemClass.getSubItemClassIds(controller, itemclsids));
  175. itemclsids.add(0l);
  176. if (itemids.equals("()")) {
  177. 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" +
  178. "inner join sa_order t2 on t1.sa_orderid=t2.sa_orderid and t1.siteid=t2.siteid\n" +
  179. "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");
  180. } else {
  181. 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" +
  182. "inner join sa_order t2 on t1.sa_orderid=t2.sa_orderid and t1.siteid=t2.siteid\n" +
  183. "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");
  184. }
  185. return rows.toRowsMap("sys_enterpriseid");
  186. }
  187. public RowsMap QuerySaorderDetailId(ArrayList<Long> itemclsids, Long sys_enterpriseid,
  188. String itemids) throws YosException {
  189. Rows rows = null;
  190. itemclsids.addAll(ItemClass.getSubItemClassIds(controller, itemclsids));
  191. itemclsids.add(0l);
  192. String sql = "select t2.closedate,t2.sys_enterpriseid,t1.sa_orderitemsid from sa_orderitems t1 " +
  193. "inner join sa_order t2 on t1.sa_orderid=t2.sa_orderid and t1.siteid=t2.siteid " +
  194. "inner join plm_item t3 on t1.itemid=t3.itemid and t1.siteid=t3.siteid " +
  195. "where t2.type !='促销订单' " +
  196. "and ifnull( t2.closedate,'')!='' " +
  197. "and t2.sa_accountclassid!=0 and t2.sys_enterpriseid =" + sys_enterpriseid + " " +
  198. "and t2.status in('关闭') " +
  199. "and t1.itemid in(select itemid from sa_itemsaleclass where itemclassid in" + itemclsids.toString().replace("[", "(").replace("]", ")") + " ) " +
  200. "and t1.DECORATIONREBATEFLAG=0 and t1.siteid='" + controller.siteid + "' ";
  201. if (!itemids.equals("()")) {
  202. sql = sql + " and t1.itemid not in" + itemids;
  203. }
  204. sql = sql + "group by t2.sys_enterpriseid,t2.closedate,t1.sa_orderitemsid";
  205. System.err.println(sql);
  206. rows = dbConnect.runSqlQuery(sql);
  207. return rows.toRowsMap("sys_enterpriseid");
  208. }
  209. // //创建返利结算单表头
  210. // public InsertSQL getrebateaccounthead(Long sa_rebateaccountheadid) throws YosException {
  211. // InsertSQL insertSQL = SQLFactory.createInsertSQL(controller, "sa_rebateaccounthead");
  212. // insertSQL.setUniqueid(sa_rebateaccountheadid).setSiteid(controller.siteid);
  213. // insertSQL.setValue("billdate", getDate_Str());
  214. // insertSQL.setValue("status", "新建");
  215. // insertSQL.setValue("billno", controller.createBillCode("rebateaccountheadbill"));
  216. // return insertSQL;
  217. // }
  218. //
  219. // //创建返利结算单表体
  220. // public InsertSQL getrebateaccount(Long sa_rebateaccountid, Long sa_rebateaccountheadid, Long sys_enterpriseid) throws YosException {
  221. // InsertSQL insertSQL = SQLFactory.createInsertSQL(controller, "sa_rebateaccount");
  222. // insertSQL.setUniqueid(sa_rebateaccountid).setSiteid(controller.siteid);
  223. // //核准金额
  224. // insertSQL.setValue("approvedamount", 10);
  225. // //装修返利金额
  226. // insertSQL.setValue("rebateamount", 10);
  227. // insertSQL.setValue("sa_rebateaccountheadid", sa_rebateaccountheadid);
  228. // //合作企业档案ID
  229. // insertSQL.setValue("sys_enterpriseid", sys_enterpriseid);
  230. // //行号
  231. // insertSQL.setValue("rowno", 1);
  232. // //累计订购返利商品金额
  233. // insertSQL.setValue("accumulatedamount", 10);
  234. // return insertSQL;
  235. // }
  236. //
  237. // //创建返利结算单表体
  238. // public InsertSQL getrebateaccountdetail(Long sa_orderid, Long sa_rebateaccountid) throws YosException {
  239. // InsertSQL insertSQL = SQLFactory.createInsertSQL(controller, "sa_rebateaccountdetail");
  240. // insertSQL.setUniqueid(createTableID("sa_rebateaccountdetail")).setSiteid(controller.siteid);
  241. // //核准金额
  242. // insertSQL.setValue("sa_orderid", sa_orderid);
  243. // //装修返利金额
  244. // insertSQL.setValue("sa_rebateaccountid", sa_rebateaccountid);
  245. // insertSQL.setValue("rateamount", 10);
  246. // //合作企业档案ID
  247. // insertSQL.setValue("amount", 10);
  248. // return insertSQL;
  249. // }
  250. //查询并执行商品费用方案方法
  251. public void executeDataFunction(Long sa_orderid) throws YosException {
  252. SQLFactory sqlFactory = new SQLFactory(this, "查询商品费用方案方法");
  253. sqlFactory.addParameter("siteid", controller.siteid);
  254. sqlFactory.addParameter("sa_orderid", sa_orderid);
  255. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  256. if(rows.isEmpty()){
  257. //清空费用表
  258. DeleteSQL deleteSQL = SQLFactory.createDeleteSQL(controller, "sa_order_cost");
  259. deleteSQL.setWhere("sa_orderid", sa_orderid);
  260. deleteSQL.delete();
  261. }
  262. if(rows.isNotEmpty()){
  263. DataFunction df = DataFunction.get(controller, rows.get(0).getString("functionname"));
  264. df.addParameter("sa_orderid", sa_orderid);
  265. df.action();
  266. }
  267. }
  268. public void checkOffOrderItems(Long sa_orderid, String tablename, Long sa_promotionid) throws YosException {
  269. 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="
  270. + sa_orderid + " and t1.siteid='" + controller.siteid + "' and t2.isonsale!=1";
  271. if (tablename.equals("sa_promotion_items")) {
  272. sql = sql + " and t2.sa_promotionid=" + sa_promotionid;
  273. }
  274. Rows iteminfos = dbConnect.runSqlQuery(sql);
  275. if (iteminfos.isNotEmpty()) {
  276. Row itemRow = dbConnect.runSqlQuery(0, "SELECT itemno from plm_item WHERE itemid=" + iteminfos.get(0).getString("itemid"));
  277. throw new YosException(false, "检测到品号" + itemRow.getString("itemno") + "未上架,请删除后重试");
  278. }
  279. }
  280. public void checkOffOrderItems(String tablename, Long itemid, Long sa_promotionid) throws YosException {
  281. String sql = "select t1.itemid from " + tablename + " t1 where t1.siteid='" + controller.siteid + "' and t1.isonsale!=1 and t1.itemid=" + itemid;
  282. if (tablename.equals("sa_promotion_items")) {
  283. sql = sql + " and t1.sa_promotionid=" + sa_promotionid;
  284. }
  285. Rows iteminfos = dbConnect.runSqlQuery(sql);
  286. if (iteminfos.isNotEmpty()) {
  287. Row itemRow = dbConnect.runSqlQuery(0, "SELECT itemno from plm_item WHERE itemid=" + iteminfos.get(0).getString("itemid"));
  288. throw new YosException(false, "检测到品号" + itemRow.getString("itemno") + "未上架,请删除后重试");
  289. }
  290. }
  291. /**
  292. * 是否符合商品起订量和增量判断
  293. *
  294. * @param type
  295. * @param itemRowsMap
  296. * @param item
  297. * @param itemRow
  298. * @param promotionitems
  299. * @throws YosException
  300. */
  301. public void compareQty(String type, RowsMap itemRowsMap, JSONObject item, Row itemRow, Rows promotionitems) throws YosException {
  302. BigDecimal qty = item.getBigDecimalValue("qty");
  303. String itemid = item.getString("itemid");
  304. Rows itemRows = itemRowsMap.getOrDefault(itemid, new Rows());
  305. if (qty.compareTo(BigDecimal.ZERO) == 0) {
  306. throw new YosException(false, "品号为" + itemRows.get(0).getString("itemno") + "的商品的添加数量为0,不允许添加");
  307. }
  308. if (!type.equals("促销订单")) {
  309. if (!type.equals("特殊订单")) {
  310. if (itemRowsMap.containsKey(itemid)) {
  311. if (itemRows.isNotEmpty()) {
  312. BigDecimal orderaddqty = itemRows.get(0).getBigDecimal("orderaddqty");
  313. BigDecimal orderminqty = itemRows.get(0).getBigDecimal("orderminqty");
  314. if (orderaddqty.compareTo(BigDecimal.ZERO) != 0) {
  315. if (((qty.subtract(orderminqty)).remainder(orderaddqty)).compareTo(BigDecimal.ZERO) != 0 || qty.compareTo(orderminqty) < 0) {
  316. throw new YosException(false, "品号为" + itemRows.get(0).getString("itemno") + "的商品数量不符合该商品的起订量和增量");
  317. }
  318. }
  319. }
  320. }
  321. } else {
  322. if (qty.compareTo(BigDecimal.ZERO) <= 0) {
  323. throw new YosException(false, "品号为" + itemRows.get(0).getString("itemno") + "的商品数量必须大于0");
  324. }
  325. }
  326. }
  327. RowsMap pRowsMap = promotionitems.toRowsMap("sa_promotion_itemsid");
  328. if (type.equals("促销订单")) {
  329. if (pRowsMap.containsKey(item.getString("sa_promotion_itemsid"))) {
  330. String saPromotionItemsid = item.getString("sa_promotion_itemsid");
  331. if (pRowsMap.get(saPromotionItemsid).isNotEmpty()) {
  332. BigDecimal saledqty = pRowsMap.get(saPromotionItemsid).get(0).getBigDecimal("saledqty");
  333. BigDecimal groupqty = pRowsMap.get(saPromotionItemsid).get(0).getBigDecimal("groupqty");
  334. BigDecimal orderaddqty = pRowsMap.get(saPromotionItemsid).get(0).getBigDecimal("orderaddqty");
  335. BigDecimal orderminqty = pRowsMap.get(saPromotionItemsid).get(0).getBigDecimal("orderminqty");
  336. boolean islimit = pRowsMap.get(saPromotionItemsid).get(0).getBoolean("islimit");
  337. if (orderaddqty.compareTo(BigDecimal.ZERO) != 0) {
  338. if (((qty.subtract(orderminqty)).remainder(orderaddqty)).compareTo(BigDecimal.ZERO) != 0 || qty.compareTo(orderminqty) < 0) {
  339. throw new YosException(false, "品号为" + itemRowsMap.get(itemid).get(0).getString("itemno") + "的商品数量不符合该商品的起订量和增量");
  340. }
  341. }
  342. if (islimit) {
  343. if (groupqty.compareTo(saledqty.add(qty)) < 0) {
  344. throw new YosException(false, "品号:" + itemRow.getString("itemno") + "已超过限购数量:" + groupqty.subtract(saledqty));
  345. }
  346. }
  347. }
  348. }
  349. }
  350. }
  351. /**
  352. * 获取定制属性
  353. *
  354. * @param itemRowsMap
  355. * @param item
  356. * @return
  357. * @throws YosException
  358. */
  359. public JSONArray getCustomProperties(RowsMap itemRowsMap, JSONObject item) throws YosException {
  360. JSONArray customproperties = new JSONArray();
  361. Rows customschemeRows = dbConnect.runSqlQuery("select * from sa_customscheme_items where siteid='" + controller.siteid + "'");
  362. RowsMap customschemeRowsMap = customschemeRows.toRowsMap("sa_customschemeid");
  363. String itemid = item.getString("itemid");
  364. if (itemRowsMap.containsKey(itemid)) {
  365. if (itemRowsMap.get(itemid).isNotEmpty()) {
  366. if (itemRowsMap.get(itemid).get(0).getLong("sa_customschemeid") > 0 && !itemRowsMap.get(itemid).get(0).getBoolean("iscustomsize")) {
  367. // System.out.println(0000);
  368. if (customschemeRowsMap.containsKey(itemRowsMap.get(itemid).get(0).getString("sa_customschemeid"))) {
  369. // System.out.println(111111);
  370. for (Row customschemeItem : (customschemeRowsMap.get(itemRowsMap.get(itemid).get(0).getString("sa_customschemeid")))) {
  371. // System.out.println(customschemeItem.getString("description"));
  372. // System.out.println(2222);
  373. customproperties.add(customschemeItem.getString("description") + ":" + itemRowsMap.get(itemid).get(0).getString(customschemeItem.getString("value")));
  374. }
  375. }
  376. } else if (itemRowsMap.get(itemid).get(0).getBoolean("iscustomsize")) {
  377. // System.out.println(3333);
  378. if (customschemeRowsMap.containsKey(itemRowsMap.get(itemid).get(0).getString("sa_customschemeid"))) {
  379. // System.out.println(4444);
  380. for (Row customschemeItem : (customschemeRowsMap.get(itemRowsMap.get(itemid).get(0).getString("sa_customschemeid")))) {
  381. // System.out.println(5555);
  382. // System.out.println((customschemeRowsMap.get(itemRowsMap.get(itemid).get(0).getString("sa_customschemeid"))).size());
  383. if (!customschemeItem.getString("value").equals("spec")) {
  384. // customproperties.add(customschemeItem.getString("description") + ":" + itemRowsMap.get(itemid).get(0).getString(customschemeItem.getString("value")));
  385. } else {
  386. customproperties.add(getcustomproperties(item));
  387. }
  388. }
  389. } else {
  390. customproperties.add(getcustomproperties(item));
  391. }
  392. }
  393. }
  394. }
  395. return customproperties;
  396. }
  397. public String getcustomproperties(JSONObject item) {
  398. String material = item.getStringValue("custommaterial");
  399. String colors = item.getStringValue("customcolors");
  400. String cheek = item.getStringValue("customcheek");
  401. String length = item.getStringValue("length", false, "0");
  402. String width = item.getStringValue("width", false, "0");
  403. String str = "";
  404. if (!StringUtils.isBlank(material) && !material.equals("0")) {
  405. str = "选项:" + material;
  406. }
  407. if (!StringUtils.isBlank(colors) && !colors.equals("0")) {
  408. if (str.isEmpty()) {
  409. str = "颜色:" + colors;
  410. } else {
  411. str = str + ";" + "颜色:" + colors;
  412. }
  413. }
  414. if (!StringUtils.isBlank(cheek) && !cheek.equals("0")) {
  415. if (str.isEmpty()) {
  416. str = "工艺:" + cheek;
  417. } else {
  418. str = str + ";" + "工艺:" + cheek;
  419. }
  420. }
  421. if (!length.equals("0") && !width.equals("0")) {
  422. String size = "尺寸:" + length + "×" + width;
  423. if (str.isEmpty()) {
  424. str = size;
  425. } else {
  426. str = str + ";" + size;
  427. }
  428. }
  429. return str;
  430. }
  431. /**
  432. * 获取定制尺寸信息
  433. *
  434. * @param itemRowsMap
  435. * @param item
  436. * @return
  437. * @throws YosException
  438. */
  439. public String getCustomSpec(RowsMap itemRowsMap, JSONObject item) throws YosException {
  440. String spec = "";
  441. Rows customschemeRows = dbConnect.runSqlQuery("select * from sa_customscheme_items where siteid='" + controller.siteid + "'");
  442. RowsMap customschemeRowsMap = customschemeRows.toRowsMap("sa_customschemeid");
  443. String itemid = item.getString("itemid");
  444. if (itemRowsMap.containsKey(itemid)) {
  445. if (itemRowsMap.get(itemid).isNotEmpty()) {
  446. if (!itemRowsMap.get(itemid).get(0).getBoolean("iscustomsize")) {
  447. spec = itemRowsMap.get(itemid).get(0).getString("spec");
  448. } else {
  449. spec = item.getStringValue("length") + "*" + item.getStringValue("width");
  450. }
  451. }
  452. }
  453. return spec;
  454. }
  455. /**
  456. * 批量查询商品信息
  457. *
  458. * @param items
  459. * @return
  460. * @throws YosException
  461. */
  462. public RowsMap getItemRowsMap(JSONArray items) throws YosException {
  463. ArrayList<Long> itemids = new ArrayList<>();
  464. for (Object obj : items) {
  465. JSONObject item = (JSONObject) obj;
  466. itemids.add(item.getLong("itemid"));
  467. }
  468. if (itemids.size() == 0) {
  469. itemids.add(-1L);
  470. }
  471. 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;
  472. sql = sql.replace("[", "(").replace("]", ")");
  473. return dbConnect.runSqlQuery(sql).toRowsMap("itemid");
  474. }
  475. public UpdateSQL getUpdateSql() throws YosException {
  476. System.err.println("123");
  477. UpdateSQL updateSQL = SQLFactory.createUpdateSQL(controller, "sa_order");
  478. if (controller.content.containsKey("sa_order_v")) {
  479. updateSQL.setDataVersion(content.getIntValue("sa_order_v"));
  480. }
  481. updateSQL.setValue("changeby", controller.username);
  482. updateSQL.setWhere("sa_orderid", content.getLongValue("sa_orderid"));
  483. updateSQL.setWhere("siteid", controller.siteid);
  484. System.err.println(updateSQL.getSQL());
  485. return updateSQL;
  486. }
  487. String sa_orderitems = "sa_orderitems";
  488. public InsertSQL getInsertSQL(JSONArray customproperties, long sa_orderitemsid, JSONObject item, Row itemRow, String type,
  489. BigDecimal defaultprice, BigDecimal price, BigDecimal saleprice, BigDecimal marketprice,
  490. String spec, Rows promotionitems,long width,long length) throws YosException {
  491. Long itemid = item.getLong("itemid");
  492. BigDecimal qty = item.getBigDecimalValue("qty");
  493. RowsMap promotionitemsRowsMap = promotionitems.toRowsMap("sa_promotion_itemsid");
  494. String signaturecode = "";
  495. if (type.equals("促销订单")) {
  496. if (promotionitemsRowsMap.containsKey(item.getString("sa_promotion_itemsid"))) {
  497. if (promotionitemsRowsMap.get(item.getString("sa_promotion_itemsid")).isNotEmpty()) {
  498. signaturecode = promotionitemsRowsMap.get(item.getString("sa_promotion_itemsid")).get(0).getString("signaturecode");
  499. }
  500. }
  501. }
  502. InsertSQL insertSQL = SQLFactory.createInsertSQL(controller, sa_orderitems);
  503. insertSQL.setValue("customproperties", customproperties.toJSONString().replace("[", "").replace("]", "").replace("\"", ""));
  504. insertSQL.setValue("siteid", controller.siteid);
  505. insertSQL.setValue("sa_orderitemsid", sa_orderitemsid);
  506. insertSQL.setValue("sa_orderid", content.getLongValue("sa_orderid"));
  507. insertSQL.setValue("rowno", 1);
  508. insertSQL.setValue("itemid", itemid);
  509. insertSQL.setValue("remarks", item.getStringValue("remarks") + signaturecode);
  510. insertSQL.setValue("itemno", itemRow.getString("itemno"));
  511. insertSQL.setValue("itemname", itemRow.getString("itemname"));
  512. insertSQL.setValue("model", itemRow.getString("model"));
  513. insertSQL.setValue("unit", itemRow.getString("unit"));
  514. insertSQL.setValue("auxunit", itemRow.getString("auxunit"));
  515. insertSQL.setValue("batchcontrol", itemRow.getLong("batchcontrol"));
  516. insertSQL.setValue("stockno", item.getOrDefault("stockno", "null"));
  517. insertSQL.setValue("position", item.getOrDefault("position", "null"));
  518. insertSQL.setValue("batchno", item.getOrDefault("batchno", "null"));
  519. insertSQL.setValue("spec", spec);
  520. insertSQL.setValue("sa_promotion_itemsid", item.getLongValue("sa_promotion_itemsid"));
  521. String deliverydate = item.getStringValue("deliverydate");
  522. Rows rows = dbConnect.runSqlQuery("SELECT deliverydate,defaultprice from sa_orderitems WHERE sa_orderitemsid =" + sa_orderitemsid);
  523. if (deliverydate.isEmpty()) {
  524. if (rows.isNotEmpty()) {
  525. deliverydate = rows.get(0).getString("deliverydate");
  526. } else {
  527. deliverydate = "null";
  528. }
  529. }
  530. String needdate = item.getStringValue("needdate");
  531. insertSQL.setValue("needdate", needdate.equals("") ? "null" : needdate);
  532. insertSQL.setValue("deliverydate", deliverydate.equals("") ? "null" : deliverydate);
  533. BigDecimal conversionrate = itemRow.getBigDecimal("conversionrate");
  534. if (conversionrate.compareTo(BigDecimal.ZERO) <= 0) {
  535. conversionrate = BigDecimal.valueOf(1);
  536. }
  537. insertSQL.setValue("conversionrate", conversionrate);
  538. //订购数量
  539. insertSQL.setValue("qty", qty);
  540. insertSQL.setValue("undeliqty", qty);
  541. //辅助单位数量
  542. insertSQL.setValue("auxqty", qty.divide(conversionrate));
  543. if (type.equals("特殊订单")) {
  544. if (item.containsKey("defaultprice")) {
  545. if (item.getBigDecimalValue("price").compareTo(BigDecimal.ZERO) > 0 && item.getBigDecimalValue("amount").compareTo(BigDecimal.ZERO) <= 0) {
  546. insertSQL.setValue("price", item.getBigDecimalValue("price"));
  547. //折前金额(元)
  548. insertSQL.setValue("amount", price.multiply(qty));
  549. } else if (item.getBigDecimalValue("price").compareTo(BigDecimal.ZERO) <= 0 && item.getBigDecimalValue("amount").compareTo(BigDecimal.ZERO) > 0) {
  550. insertSQL.setValue("price", item.getBigDecimalValue("amount").divide(qty, 6, BigDecimal.ROUND_HALF_UP));
  551. //折前金额(元)
  552. insertSQL.setValue("amount", item.getBigDecimalValue("amount"));
  553. } else {
  554. insertSQL.setValue("price", price);
  555. //折前金额(元)
  556. insertSQL.setValue("amount", price.multiply(qty));
  557. }
  558. } else {
  559. insertSQL.setValue("price", price);
  560. //折前金额(元)
  561. insertSQL.setValue("amount", price.multiply(qty));
  562. }
  563. } else {
  564. insertSQL.setValue("price", price);
  565. //折前金额(元)
  566. insertSQL.setValue("amount", price.multiply(qty));
  567. }
  568. //单价,折后价(元),取合同价
  569. insertSQL.setValue("defaultprice", defaultprice);
  570. insertSQL.setValue("saleprice", saleprice);
  571. //金额,折后金额(元)
  572. insertSQL.setValue("defaultamount", defaultprice.multiply(qty));
  573. //牌价、市场价(元),标准订单牌价取商品价格,项目订单取合同里的牌价
  574. insertSQL.setValue("marketprice", marketprice);
  575. insertSQL.setValue("width", width);
  576. insertSQL.setValue("length", length);
  577. return insertSQL;
  578. }
  579. public UpdateSQL getUpdateSQL(long sa_orderitemsid, JSONObject item, Row itemRow, String type, BigDecimal defaultprice, BigDecimal price, BigDecimal saleprice,long width,long length) throws YosException {
  580. BigDecimal qty = item.getBigDecimalValue("qty");
  581. UpdateSQL updateSQL = SQLFactory.createUpdateSQL(controller, sa_orderitems);
  582. //订购数量
  583. updateSQL.setValue("qty", qty);
  584. //辅助单位数量
  585. BigDecimal conversionrate = itemRow.getBigDecimal("conversionrate");
  586. if (conversionrate.compareTo(BigDecimal.ZERO) <= 0) {
  587. conversionrate = BigDecimal.valueOf(1);
  588. }
  589. updateSQL.setValue("auxqty", qty.divide(conversionrate));
  590. updateSQL.setValue("undeliqty", qty.subtract(itemRow.getBigDecimal("delivery")));
  591. updateSQL.setValue("remarks", item.getStringValue("remarks"));
  592. updateSQL.setValue("stockno", item.getOrDefault("stockno", "null"));
  593. updateSQL.setValue("position", item.getOrDefault("position", "null"));
  594. updateSQL.setValue("batchno", item.getOrDefault("batchno", "null"));
  595. String deliverydate = item.getStringValue("deliverydate");
  596. Rows rows = dbConnect.runSqlQuery("SELECT deliverydate,defaultprice from sa_orderitems WHERE sa_orderitemsid =" + sa_orderitemsid);
  597. if (deliverydate.isEmpty()) {
  598. if (rows.isNotEmpty()) {
  599. deliverydate = rows.get(0).getString("deliverydate");
  600. } else {
  601. deliverydate = "null";
  602. }
  603. }
  604. String needdate = item.getStringValue("needdate");
  605. updateSQL.setValue("needdate", needdate.equals("") ? "null" : needdate);
  606. updateSQL.setValue("deliverydate", deliverydate.equals("") ? "null" : deliverydate);
  607. if (type.equals("特殊订单")) {
  608. if (item.containsKey("defaultprice")) {
  609. if (item.getBigDecimalValue("price").compareTo(BigDecimal.ZERO) > 0 && item.getBigDecimalValue("amount").compareTo(BigDecimal.ZERO) <= 0) {
  610. updateSQL.setValue("price", item.getBigDecimalValue("price"));
  611. //折前金额(元)
  612. updateSQL.setValue("amount", price.multiply(qty));
  613. } else if (item.getBigDecimalValue("price").compareTo(BigDecimal.ZERO) <= 0 && item.getBigDecimalValue("amount").compareTo(BigDecimal.ZERO) > 0) {
  614. updateSQL.setValue("price", item.getBigDecimalValue("amount").divide(qty, 6, BigDecimal.ROUND_HALF_UP));
  615. //折前金额(元)
  616. updateSQL.setValue("amount", item.getBigDecimalValue("amount"));
  617. } else {
  618. updateSQL.setValue("price", price);
  619. //折前金额(元)
  620. updateSQL.setValue("amount", price.multiply(qty));
  621. }
  622. } else {
  623. updateSQL.setValue("price", price);
  624. //折前金额(元)
  625. updateSQL.setValue("amount", price.multiply(qty));
  626. }
  627. } else {
  628. updateSQL.setValue("price", price);
  629. //折前金额(元)
  630. updateSQL.setValue("amount", price.multiply(qty));
  631. }
  632. //单价,折后价(元),取合同价
  633. updateSQL.setValue("defaultprice", defaultprice);
  634. //金额,折后金额(元)
  635. updateSQL.setValue("defaultamount", defaultprice.multiply(qty));
  636. updateSQL.setValue("saleprice", saleprice);
  637. updateSQL.setValue("width", width);
  638. updateSQL.setValue("length", length);
  639. updateSQL.setWhere("siteid", controller.siteid);
  640. updateSQL.setWhere("sa_orderitemsid", sa_orderitemsid);
  641. return updateSQL;
  642. }
  643. public BigDecimal getDefaultprice(ItemPrice itemPrice) throws YosException {
  644. return itemPrice.getGraderateprice();
  645. }
  646. public BigDecimal getPrice(Row orderRow, ItemPrice itemPrice, JSONObject item, RowsMap itemRowsMap) throws YosException {
  647. String type = orderRow.getString("type");
  648. Long sa_promotionid = orderRow.getLong("sa_promotionid");
  649. BigDecimal price;
  650. switch (type) {
  651. case "促销订单":
  652. price = itemPrice.getPromotionPrice(sa_promotionid);
  653. if (itemRowsMap.containsKey(item.getString("itemid"))) {
  654. if (itemRowsMap.get(item.getString("itemid")).isNotEmpty()) {
  655. if (itemRowsMap.get(item.getString("itemid")).get(0).getBoolean("iscustomsize") && itemRowsMap.get(item.getString("itemid")).get(0).getLong("pricingmetod") == 1) {
  656. price = price.multiply(item.getBigDecimalValue("length").multiply(item.getBigDecimalValue("width")).divide(new BigDecimal("1000000"), 4, BigDecimal.ROUND_HALF_UP));
  657. }
  658. }
  659. }
  660. break;
  661. default:
  662. price = itemPrice.getGraderateprice();
  663. if (itemRowsMap.containsKey(item.getString("itemid"))) {
  664. if (itemRowsMap.get(item.getString("itemid")).isNotEmpty()) {
  665. if (itemRowsMap.get(item.getString("itemid")).get(0).getBoolean("iscustomsize") && itemRowsMap.get(item.getString("itemid")).get(0).getLong("pricingmetod") == 1) {
  666. price = price.multiply(item.getBigDecimalValue("length").multiply(item.getBigDecimalValue("width")).divide(new BigDecimal("1000000"), 4, BigDecimal.ROUND_HALF_UP));
  667. }
  668. }
  669. }
  670. }
  671. return price;
  672. }
  673. public BigDecimal getSalePrice(Row orderRow, ItemPrice itemPrice,JSONObject item,RowsMap itemRowsMap) throws YosException {
  674. BigDecimal price = itemPrice.getGraderateprice();
  675. if (itemRowsMap.containsKey(item.getString("itemid"))) {
  676. if (itemRowsMap.get(item.getString("itemid")).isNotEmpty()) {
  677. if (itemRowsMap.get(item.getString("itemid")).get(0).getBoolean("iscustomsize") && itemRowsMap.get(item.getString("itemid")).get(0).getLong("pricingmetod") == 1) {
  678. price = price.multiply(item.getBigDecimalValue("length").multiply(item.getBigDecimalValue("width")).divide(new BigDecimal("1000000"), 4, BigDecimal.ROUND_HALF_UP));
  679. }
  680. }
  681. }
  682. return price;
  683. }
  684. }