OrderItems.java 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739
  1. package restcontroller.webmanage.sale.order;
  2. import beans.accountbalance.Accountbalance;
  3. import beans.accountbalance.CashbillEntity;
  4. import beans.brand.Brand;
  5. import beans.datacontrllog.DataContrlLog;
  6. import beans.dataextend.DataExtend;
  7. import beans.datateam.DataTeam;
  8. import beans.enterprise.Enterprise;
  9. import beans.itemprice.ItemPrice;
  10. import beans.parameter.Parameter;
  11. import beans.uploaderpdata.UploadDataToERP;
  12. import com.alibaba.fastjson.JSONArray;
  13. import com.alibaba.fastjson.JSONObject;
  14. import common.Controller;
  15. import common.YosException;
  16. import common.annotation.API;
  17. import common.annotation.CACHEING;
  18. import common.annotation.CACHEING_CLEAN;
  19. import common.data.Row;
  20. import common.data.Rows;
  21. import common.data.RowsMap;
  22. import common.data.SQLFactory;
  23. import restcontroller.R;
  24. import restcontroller.webmanage.sale.aftersalesmag.twriteoffbill_orderchange;
  25. import restcontroller.webmanage.sale.rebate.Rebate;
  26. import restcontroller.webmanage.sale.toolbill.ToolBilItem;
  27. import restcontroller.webmanage.sale.toolbill.ToolBill;
  28. import java.io.IOException;
  29. import java.math.BigDecimal;
  30. import java.util.ArrayList;
  31. import java.util.HashMap;
  32. import static beans.order.Order.*;
  33. /**
  34. * 销售订单商品明细表
  35. */
  36. public class OrderItems extends Controller {
  37. /**
  38. * 构造函数
  39. *
  40. * @param content
  41. */
  42. public OrderItems(JSONObject content) throws YosException {
  43. super(content);
  44. }
  45. @API(title = "新增或更新", apiversion = R.ID20221109093602.v1.class)
  46. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class, ToolBill.class})
  47. public String insertOrUpdate() throws YosException {
  48. Long sa_orderid = content.getLong("sa_orderid");
  49. Long sys_enterpriseid = content.getLong("sys_enterpriseid");
  50. // Long sa_contractid = content.getLongValue("sa_contractid");
  51. Rows orderRows = getOrderRows(this, sa_orderid);
  52. if (orderRows.isEmpty()) {
  53. return getErrReturnObject().setErrMsg("数据不存在,无法添加").toString();
  54. }
  55. // sa_contractid = orderRows.get(0).getLong("sa_contractid");
  56. String type = orderRows.get(0).getString("type");
  57. JSONArray items = content.getJSONArray("items");
  58. Long sa_promotionid=orderRows.get(0).getLong("sa_promotionid");
  59. ArrayList<String> sqlList = new ArrayList<>();
  60. //查询erp库存
  61. // Invbal.selectErpInvbal(this, items);
  62. Rows itemRows =dbConnect.runSqlQuery("select itemid,orderaddqty,orderminqty,itemno from plm_item where siteid='"+siteid+"'");
  63. RowsMap itemRowsMap= itemRows.toRowsMap("itemid");
  64. for (Object obj : items) {
  65. JSONObject item = (JSONObject) obj;
  66. Long itemid = item.getLong("itemid");
  67. Long sa_orderitemsid = item.getLong("sa_orderitemsid");
  68. BigDecimal qty = item.getBigDecimalValue("qty");
  69. if(!type.equals("促销订单")){
  70. if(itemRowsMap.containsKey(item.getString("itemid"))){
  71. if(itemRowsMap.get(item.getString("itemid")).isNotEmpty()){
  72. BigDecimal orderaddqty =itemRowsMap.get(item.getString("itemid")).get(0).getBigDecimal("orderaddqty");
  73. BigDecimal orderminqty =itemRowsMap.get(item.getString("itemid")).get(0).getBigDecimal("orderminqty");
  74. if(((qty.subtract(orderminqty)).remainder(orderaddqty)).compareTo(BigDecimal.ZERO)!=0){
  75. return getErrReturnObject().setErrMsg("品号为"+itemRowsMap.get(item.getString("itemid")).get(0).getString("itemno")+"的商品数量不符合该商品的起订量和增量").toString();
  76. }
  77. }
  78. }
  79. }
  80. //商品信息
  81. Row itemRow = getItemRow(itemid);
  82. Rows promotionitems =dbConnect.runSqlQuery("select * from sa_promotion_items where siteid='"+siteid+"' and sa_promotionid="+sa_promotionid);
  83. RowsMap promotionitemsRowsMap = promotionitems.toRowsMap("itemid");
  84. if(type.equals("促销订单")){
  85. if(promotionitemsRowsMap.containsKey(itemid)){
  86. if(promotionitemsRowsMap.get(itemid).isNotEmpty()){
  87. BigDecimal saledqty =promotionitemsRowsMap.get(itemid).get(0).getBigDecimal("saledqty");
  88. BigDecimal groupqty =promotionitemsRowsMap.get(itemid).get(0).getBigDecimal("groupqty");
  89. boolean islimit =promotionitemsRowsMap.get(itemid).get(0).getBoolean("islimit");
  90. if(islimit){
  91. if(groupqty.compareTo(saledqty.add(qty))<0){
  92. return getErrReturnObject().setErrMsg(itemRow.getString("itemno")+"商品数量已超过促销活动的限定数量【"+groupqty.subtract(saledqty)+"】,无法新建").toString();
  93. }
  94. }
  95. }
  96. }
  97. }
  98. BigDecimal price1=new BigDecimal(0);
  99. SQLFactory sqlFactory = new SQLFactory(this, "订单商品明细_新增");
  100. if (sa_orderitemsid <= 0) {
  101. Rows rows = dbConnect.runSqlQuery("SELECT sa_orderitemsid,price from sa_orderitems WHERE siteid='" + siteid + "' and itemid=" + itemid + " and sa_orderid=" + sa_orderid);
  102. if (rows.isEmpty()) {
  103. sa_orderitemsid = createTableID("sa_orderitems");
  104. } else {
  105. price1=rows.get(0).getBigDecimal("price");
  106. sa_orderitemsid = rows.get(0).getLong("sa_orderitemsid");
  107. sqlFactory = new SQLFactory(this, "订单商品明细_更新");
  108. }
  109. } else {
  110. sqlFactory = new SQLFactory(this, "订单商品明细_更新");
  111. }
  112. sqlFactory.addParameter("siteid", siteid);
  113. sqlFactory.addParameter("userid", userid);
  114. sqlFactory.addParameter("username", username);
  115. sqlFactory.addParameter("sa_orderitemsid", sa_orderitemsid);
  116. sqlFactory.addParameter("sa_orderid", sa_orderid);
  117. sqlFactory.addParameter("rowno", 1);
  118. sqlFactory.addParameter("itemid", itemid);
  119. sqlFactory.addParameter("remarks", item.getStringValue("remarks"));
  120. BigDecimal conversionrate = itemRow.getBigDecimal("conversionrate");
  121. if (conversionrate.compareTo(BigDecimal.ZERO) <= 0) {
  122. conversionrate = BigDecimal.valueOf(1);
  123. }
  124. sqlFactory.addParameter("itemno", itemRow.getString("itemno"));
  125. sqlFactory.addParameter("itemname", itemRow.getString("itemname"));
  126. sqlFactory.addParameter("model", itemRow.getString("model"));
  127. sqlFactory.addParameter("unit", itemRow.getString("unit"));
  128. sqlFactory.addParameter("auxunit", itemRow.getString("auxunit"));
  129. sqlFactory.addParameter("batchcontrol", itemRow.getLong("batchcontrol"));
  130. sqlFactory.addParameter("delivery", itemRow.getLong("delivery"));
  131. sqlFactory.addParameter("stockno", item.getOrDefault("stockno", "null"));
  132. sqlFactory.addParameter("position", item.getOrDefault("position", "null"));
  133. sqlFactory.addParameter("batchno", item.getOrDefault("batchno", "null"));
  134. String deliverydate = item.getStringValue("deliverydate");
  135. Rows rows = dbConnect.runSqlQuery("SELECT deliverydate,defaultprice from sa_orderitems WHERE sa_orderitemsid =" + sa_orderitemsid);
  136. if (deliverydate.isEmpty()) {
  137. if (rows.isNotEmpty()) {
  138. deliverydate = rows.get(0).getString("deliverydate");
  139. } else {
  140. deliverydate = "null";
  141. }
  142. }
  143. String needdate = item.getStringValue("needdate");
  144. sqlFactory.addParameter("needdate", needdate.equals("") ? "null" : needdate);
  145. sqlFactory.addParameter("deliverydate", deliverydate.equals("") ? "null" : deliverydate);
  146. sqlFactory.addParameter("conversionrate", conversionrate);
  147. //订购数量
  148. sqlFactory.addParameter("qty", qty);
  149. //辅助单位数量
  150. sqlFactory.addParameter("auxqty", qty.divide(conversionrate));
  151. BigDecimal defaultprice;
  152. BigDecimal price;
  153. //价格
  154. ItemPrice itemPrice = ItemPrice.getItemPrice(this, sys_enterpriseid, itemid);
  155. if (!item.containsKey("defaultprice")) {
  156. switch (type) {
  157. // case "项目订单":
  158. // defaultprice = itemPrice.getContractprice(sa_contractid);
  159. // break;
  160. // case "工具订单":
  161. // defaultprice = itemPrice.getMarketprice();
  162. // break;
  163. case "促销订单":
  164. defaultprice = itemPrice.getGraderateprice();
  165. price= itemPrice.getPromotionPrice(sa_promotionid);
  166. break;
  167. default:
  168. defaultprice = itemPrice.getGraderateprice();
  169. price= itemPrice.getGraderateprice();
  170. }
  171. } else {
  172. price = item.getBigDecimalValue("price");
  173. if(price.compareTo(price1)!=0){
  174. sqlList.add(DataContrlLog.createLog(this, "sa_order", sa_orderid, "订单商品【"+itemRow.getString("itemname")+"】由单价:"+price1+"修改为单价:"+price, "订单修改单价").getSQL());
  175. }
  176. defaultprice = item.getBigDecimalValue("defaultprice");
  177. // if (!type.equals("特殊订单") && defaultprice.compareTo(rows.get(0).getBigDecimal("defaultprice")) != 0 && defaultprice.compareTo(itemPrice.getContractprice()) < 0) {
  178. // return getErrReturnObject().setErrMsg("调整价格不可小于协议价").toString();
  179. // }
  180. }
  181. //单价,折后价(元),取合同价
  182. sqlFactory.addParameter("defaultprice", defaultprice);
  183. //金额,折后金额(元)
  184. sqlFactory.addParameter("defaultamount", defaultprice.multiply(qty));
  185. //牌价、市场价(元),标准订单牌价取商品价格,项目订单取合同里的牌价
  186. sqlFactory.addParameter("marketprice", itemPrice.getMarketprice());
  187. sqlFactory.addParameter("price", price);
  188. //折前金额(元)
  189. sqlFactory.addParameter("amount", price.multiply(qty));
  190. sqlList.add(sqlFactory.getSQL());
  191. }
  192. dbConnect.runSqlUpdate(sqlList);
  193. //重新排序
  194. updateRowNo(sa_orderid);
  195. //居间费设置
  196. updateRebateFee(sa_orderid);
  197. //调整价格(返利金)
  198. if (orderRows.get(0).getBoolean("rebate_used")) {
  199. setRebateAmount(this, sa_orderid, getMaxUsedRebateAmount(this, sa_orderid));
  200. adjustLastRebateAmount(this, sa_orderid);
  201. }
  202. // else {
  203. // dbConnect.runSqlUpdate("UPDATE sa_orderitems SET amount=amount-rebateamount,price=amount/qty WHERE sa_orderid='" + sa_orderid + "' and siteid='" + siteid + "' and qty!=0");
  204. // dbConnect.runSqlUpdate("UPDATE sa_orderitems SET amount=0 WHERE sa_orderid='" + sa_orderid + "' and siteid='" + siteid + "' and qty=0");
  205. // }
  206. return getSucReturnObject().toString();
  207. }
  208. /**
  209. * 更新居间费信息
  210. */
  211. public void updateRebateFee(Long sa_orderid) throws YosException {
  212. Rows orderRows = getOrderRows(this, sa_orderid);
  213. if (orderRows.isEmpty()) {
  214. return;
  215. }
  216. Long sa_projectid = orderRows.get(0).getLong("sa_projectid");
  217. Rows contractRows = dbConnect.runSqlQuery("SELECT * from sa_contract WHERE sa_projectid = " + sa_projectid + " and type='居间' and status='审核'");
  218. if (contractRows.isEmpty()) {
  219. return;
  220. }
  221. Long sa_contractid = contractRows.get(0).getLong("sa_contractid");
  222. Rows partiesRows = dbConnect.runSqlQuery("SELECT sys_enterpriseid from sa_project_parties WHERE type ='居间服务商' and sa_projectid = " + sa_projectid + " and siteid ='" + siteid + "'");
  223. if (partiesRows.isEmpty()) {
  224. return;
  225. }
  226. Long sys_enterpriseid_temp = partiesRows.get(0).getLong("sys_enterpriseid");
  227. content.put("sys_enterpriseid", sys_enterpriseid_temp);
  228. content.put("ownertable", "sa_order");
  229. content.put("ownerid", sa_orderid);
  230. content.put("billdate", "");
  231. content.put("remarks", "");
  232. content.put("sa_contractid", sa_contractid);
  233. content.put("settlementmode", "线上");
  234. content.put("sa_rebatesettlementid", 0);
  235. new Rebate(content).insertOrUpdate();
  236. }
  237. @API(title = "详情", apiversion = R.ID20221110134302.v1.class)
  238. @CACHEING
  239. public String selectDetail() throws YosException {
  240. Long sa_orderitemsid = content.getLong("sa_orderitemsid");
  241. SQLFactory sqlFactory = new SQLFactory(this, "订单商品明细_详情");
  242. sqlFactory.addParameter("siteid", siteid);
  243. sqlFactory.addParameter_in("sa_orderitemsid", sa_orderitemsid);
  244. String sql = sqlFactory.getSQL();
  245. Rows rows = dbConnect.runSqlQuery(sql);
  246. Row row = rows.isNotEmpty() ? rows.get(0) : new Row();
  247. return getSucReturnObject().setData(row).toString();
  248. }
  249. @API(title = "删除", apiversion = R.ID20221109093702.v1.class)
  250. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class, ToolBill.class})
  251. public String delete() throws YosException {
  252. Long sa_orderid = content.getLong("sa_orderid");
  253. JSONArray sa_orderitemsids = content.getJSONArray("sa_orderitemsids");
  254. SQLFactory sqlFactory = new SQLFactory(this, "订单商品明细_删除");
  255. sqlFactory.addParameter("siteid", siteid);
  256. sqlFactory.addParameter_in("sa_orderitemsid", sa_orderitemsids.toArray());
  257. String sql = sqlFactory.getSQL();
  258. dbConnect.runSqlUpdate(sql);
  259. //重新排序
  260. updateRowNo(sa_orderid);
  261. //居间费设置
  262. updateRebateFee(sa_orderid);
  263. //调整价格(返利金)
  264. Rows orderRows = getOrderRows(this, sa_orderid);
  265. if (orderRows.get(0).getBoolean("rebate_used")) {
  266. setRebateAmount(this, sa_orderid, getMaxUsedRebateAmount(this, sa_orderid));
  267. adjustLastRebateAmount(this, sa_orderid);
  268. }
  269. // else {
  270. // dbConnect.runSqlUpdate("UPDATE sa_orderitems SET amount=amount-rebateamount,price=amount/qty WHERE sa_orderid='" + sa_orderid + "' and siteid='" + siteid + "' and qty!=0");
  271. // dbConnect.runSqlUpdate("UPDATE sa_orderitems SET amount=0 WHERE sa_orderid='" + sa_orderid + "' and siteid='" + siteid + "' and qty=0");
  272. // }
  273. return getSucReturnObject().toString();
  274. }
  275. @API(title = "关闭", apiversion = R.ID20221109093802.v1.class)
  276. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class})
  277. public String close() throws YosException {
  278. Long sa_orderid = content.getLong("sa_orderid");
  279. JSONArray sa_orderitemsids = content.getJSONArray("sa_orderitemsids");
  280. SQLFactory sqlFactory = new SQLFactory(this, "订单商品明细_行关闭");
  281. sqlFactory.addParameter("siteid", siteid);
  282. sqlFactory.addParameter("userid", userid);
  283. sqlFactory.addParameter("username", username);
  284. sqlFactory.addParameter("closereason", content.getStringValue("closereason"));
  285. sqlFactory.addParameter_in("sa_orderitemsid", sa_orderitemsids.toArray());
  286. dbConnect.runSqlUpdate(sqlFactory);
  287. //重新排序
  288. updateRowNo(sa_orderid);
  289. return getSucReturnObject().toString();
  290. }
  291. @API(title = "查询列表", apiversion = R.ID20221109093902.v1.class)
  292. public String selectList() throws YosException, IOException {
  293. StringBuffer where = new StringBuffer(" 1=1 ");
  294. if (content.containsKey("where")) {
  295. JSONObject whereObject = content.getJSONObject("where");
  296. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  297. where.append(" and(");
  298. where.append("t1.itemno like'%").append(whereObject.getString("condition")).append("%' ");
  299. where.append("or t1.itemname like'%").append(whereObject.getString("condition")).append("%' ");
  300. where.append("or t1.model like'%").append(whereObject.getString("condition")).append("%' ");
  301. where.append("or t1.spec like'%").append(whereObject.getString("condition")).append("%' ");
  302. where.append(")");
  303. }
  304. }
  305. Long sa_orderid = content.getLong("sa_orderid");
  306. Rows orderRows = getOrderRows(this, sa_orderid);
  307. if (orderRows.isNotEmpty()) {
  308. sys_enterpriseid = orderRows.get(0).getLong("sys_enterpriseid");
  309. }
  310. boolean isExport = content.getBooleanValue("isExport");
  311. SQLFactory sqlFactory = new SQLFactory(this, "订单商品明细_列表", pageSize, pageNumber, pageSorting);
  312. if (isExport) {
  313. sqlFactory = new SQLFactory(this, "订单商品明细_列表");
  314. }
  315. sqlFactory.addParameter("siteid", siteid);
  316. sqlFactory.addParameter("sa_orderid", sa_orderid);
  317. sqlFactory.addParameter_SQL("where", where);
  318. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  319. ArrayList<Long> ids = rows.toArrayList("itemid", new ArrayList<>());
  320. //查询附件
  321. RowsMap attinfoRowsMap = getAttachmentUrl("plm_item", ids);
  322. for (Row row : rows) {
  323. row.put("attinfos", attinfoRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  324. row.put("contractprice", 0);
  325. }
  326. if (isExport) {
  327. //去除不需要导出项
  328. String[] removeFieldList = {"sa_orderitemsid", "itemid", "sa_orderid", "candispatchqty", "cansaleqty",
  329. "totalaty", "orderminqty_auxunit", "orderminqty", "orderaddqty_auxunit", "orderaddqty",
  330. "spec", "delivery", "erpitemno", "erpitemname", "material", "standards", "stockstatus"};
  331. for (String key : removeFieldList) {
  332. rows.getFieldList().remove(key);
  333. }
  334. Rows uploadRows = uploadExcelToObs("order", "订单商品明细_列表", rows, getTitleMap());
  335. return getSucReturnObject().setData(uploadRows).toString();
  336. }
  337. return getSucReturnObject().setData(rows).toString();
  338. }
  339. //返回导出的标题
  340. public HashMap<String, String> getTitleMap() {
  341. HashMap<String, String> titleMap = new HashMap<>();
  342. titleMap.put("rowno", "行号");
  343. titleMap.put("batchcontrol", "是否批次管理");
  344. titleMap.put("itemno", "产品编号");
  345. titleMap.put("itemname", "产品名称");
  346. titleMap.put("model", "型号");
  347. titleMap.put("conversionrate", "换算率(辅助数量=主单位数量/换算率)");
  348. titleMap.put("price", "单价,折后价(元)");
  349. titleMap.put("amount", "金额,折后金额(元)");
  350. titleMap.put("marketprice", "牌价、市场价(元)");
  351. titleMap.put("defaultprice", "折前价(元)");
  352. titleMap.put("defaultamount", "折前金额(元)");
  353. titleMap.put("qty", "订购数量");
  354. titleMap.put("auxqty", "辅助单位数量");
  355. titleMap.put("needdate", "需求日期");
  356. titleMap.put("deliedqty", "已交货量(主单位)");
  357. titleMap.put("rebateamount", "返利分摊金额");
  358. titleMap.put("undeliqty", "未交货量(主单位)");
  359. titleMap.put("invoiceamount", "已开票金额");
  360. titleMap.put("writeoffamount", "已核销金额");
  361. titleMap.put("unit", "计量单位名称");
  362. titleMap.put("auxunit", "辅助计量单位名称");
  363. titleMap.put("deliverydate", "交货日期");
  364. titleMap.put("returnqty", "退货数量");
  365. titleMap.put("remarks", "备注");
  366. return titleMap;
  367. }
  368. @API(title = "查询可添加商品列表", apiversion = R.ID20221109153502.v1.class)
  369. @CACHEING
  370. public String selectItemList() throws YosException {
  371. StringBuffer where = new StringBuffer(" 1=1 ");
  372. if (content.containsKey("where")) {
  373. JSONObject whereObject = content.getJSONObject("where");
  374. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  375. where.append(" and(");
  376. where.append("t1.itemno like'%").append(whereObject.getString("condition")).append("%' ");
  377. where.append("or t1.itemname like'%").append(whereObject.getString("condition")).append("%' ");
  378. where.append("or t1.model like'%").append(whereObject.getString("condition")).append("%' ");
  379. where.append("or t1.spec like'%").append(whereObject.getString("condition")).append("%' ");
  380. where.append("or t3.material like'%").append(whereObject.getString("condition")).append("%' ");
  381. where.append("or t3.erpitemno like'%").append(whereObject.getString("condition")).append("%' ");
  382. where.append(")");
  383. }
  384. }
  385. Long sa_orderid = content.getLong("sa_orderid");
  386. Rows orderRows = getOrderRows(this, sa_orderid);
  387. Long sa_brandid = 0L;
  388. String tradefield = "";
  389. String type = "";
  390. Long sys_enterpriseid = 0L;
  391. if (orderRows.isNotEmpty()) {
  392. sa_brandid = orderRows.get(0).getLong("sa_brandid");
  393. tradefield = orderRows.get(0).getString("tradefield");
  394. type = orderRows.get(0).getString("type");
  395. sys_enterpriseid = orderRows.get(0).getLong("sys_enterpriseid");
  396. }
  397. SQLFactory sqlFactory = new SQLFactory(this, "查询可添加商品列表", pageSize, pageNumber, pageSorting);
  398. switch (type) {
  399. // case "工具订单":
  400. // sqlFactory = new SQLFactory(this, "查询可添加商品列表_工具订单", pageSize, pageNumber, pageSorting);
  401. // break;
  402. case "特殊订单":
  403. sqlFactory = new SQLFactory(this, "查询可添加商品列表_特殊订单", pageSize, pageNumber, pageSorting);
  404. sqlFactory.addParameter("tradefield", tradefield);
  405. break;
  406. default:
  407. StringBuffer where2 = new StringBuffer(" 1=1 ");
  408. Row enterpriseRow = Enterprise.getEnterprise(this, sys_enterpriseid);
  409. boolean saleclassauth = enterpriseRow.getBoolean("saleclassauth");
  410. //需要经营授权
  411. if (saleclassauth) {
  412. where2.append(" and t1.itemclassid in (SELECT itemclassid from sys_enterprise_saleclass WHERE sys_enterpriseid = " + sys_enterpriseid + " and siteid = '" + siteid + "')");
  413. }
  414. sqlFactory.addParameter("sa_brandid", sa_brandid);
  415. sqlFactory.addParameter("tradefield", tradefield);
  416. sqlFactory.addParameter_SQL("where2", where2);
  417. break;
  418. }
  419. sqlFactory.addParameter("siteid", siteid);
  420. sqlFactory.addParameter_SQL("where", where);
  421. String sql = sqlFactory.getSQL(false);
  422. Rows rows = dbConnect.runSqlQuery(sql);
  423. ArrayList<Long> ids = rows.toArrayList("itemid", new ArrayList<>());
  424. //查询附件
  425. RowsMap attinfoRowsMap = getAttachmentUrl("plm_item", ids);
  426. //商品领域
  427. RowsMap tradefieldRowsMap = beans.Item.Item.getTradefieldRowsMap(this, ids);
  428. //品牌
  429. RowsMap brandRowsMap = Brand.getBrandRowsMap(this, ids);
  430. //价格
  431. HashMap<Long, ItemPrice> itemPriceRowsMap = ItemPrice.getItemPrice(this, sys_enterpriseid, ids);
  432. for (Row row : rows) {
  433. row.put("attinfos", attinfoRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  434. row.put("tradefield", tradefieldRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  435. row.put("brand", brandRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  436. if( itemPriceRowsMap.containsKey(row.getLong("itemid"))){
  437. row.put("price", itemPriceRowsMap.get(row.getLong("itemid")).getPrice());
  438. }else {
  439. row.put("price", 0);
  440. }
  441. }
  442. return getSucReturnObject().setData(rows).toString();
  443. }
  444. //获取非工具数据
  445. public String getOrderItemsList(Long sa_orderid, String tradefield, Long sys_enterpriseid, Long sa_brandid) throws YosException {
  446. StringBuffer where = new StringBuffer(" 1=1 ");
  447. Row enterpriseRow = Enterprise.getEnterprise(this, sys_enterpriseid);
  448. boolean saleclassauth = enterpriseRow.getBoolean("saleclassauth");
  449. //需要经营授权
  450. if (saleclassauth) {
  451. where.append(" and itemclassid in (SELECT itemclassid from sys_enterprise_saleclass WHERE sys_enterpriseid = " + sys_enterpriseid + " and siteid = '" + siteid + "')");
  452. }
  453. SQLFactory sqlFactory = new SQLFactory(this, "商品范围");
  454. sqlFactory.addParameter("siteid", siteid);
  455. sqlFactory.addParameter("sa_orderid", sa_orderid);
  456. sqlFactory.addParameter_in("tradefield", tradefield);
  457. sqlFactory.addParameter("sys_enterpriseid", sys_enterpriseid);
  458. sqlFactory.addParameter("sa_brandid", sa_brandid);
  459. sqlFactory.addParameter_SQL("where", where);
  460. return sqlFactory.getSQL(false);
  461. }
  462. // //获取特殊数据
  463. // public String getOrderItemsListSpec(Long sa_orderid, String tradefield, Long sys_enterpriseid) throws YosException {
  464. // SQLFactory sqlFactory = new SQLFactory(this, "商品范围_特殊");
  465. // sqlFactory.addParameter("siteid", siteid);
  466. // sqlFactory.addParameter("sa_orderid", sa_orderid);
  467. // sqlFactory.addParameter_in("tradefield", tradefield);
  468. // sqlFactory.addParameter("sys_enterpriseid", sys_enterpriseid);
  469. // return sqlFactory.getSQL(false);
  470. // }
  471. @API(title = "订单商品变更", apiversion = R.ID20221110145302.v1.class)
  472. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class})
  473. public String changeItem() throws YosException {
  474. boolean isjiean = content.getBooleanValue("isjiean");
  475. Long sa_orderid = content.getLong("sa_orderid");
  476. String type = content.getString("type");
  477. Long sa_orderitems_changeid = createTableID("sa_orderitems_change");
  478. JSONArray itemifnos = content.getJSONArray("itemifnos");
  479. BigDecimal oldValue = new BigDecimal(0);
  480. Rows Rowstatus = dbConnect.runSqlQuery(
  481. "select * from sa_order where sa_orderid=" + sa_orderid + " and siteid='" + siteid + "'");
  482. if (Rowstatus.isEmpty()) {
  483. return "订单不存在";
  484. } else {
  485. if (!Rowstatus.get(0).getString("status").equals("审核")) {
  486. return getErrReturnObject().setErrMsg("非审核状态的订单无法进行商品变更").toString();
  487. }
  488. }
  489. ArrayList<String> sqlList = new ArrayList<>();
  490. // 订单商品变更
  491. SQLFactory sqlFactory = new SQLFactory(this, "订单商品变更_新增");
  492. sqlFactory.addParameter("siteid", siteid);
  493. sqlFactory.addParameter("userid", userid);
  494. sqlFactory.addParameter("username", username);
  495. sqlFactory.addParameter("sa_orderitems_changeid", sa_orderitems_changeid);
  496. sqlFactory.addParameter("sa_orderid", sa_orderid);
  497. sqlFactory.addParameter("remarks", content.getStringValue("remarks"));
  498. sqlList.add(sqlFactory.getSQL());
  499. HashMap<Long, Row> orderdetailmap = new HashMap<>();
  500. HashMap<Long, BigDecimal> orderdetailchangeamount = new HashMap<>();
  501. Rows rowsOrder = dbConnect.runSqlQuery("select * from sa_order t1 where t1.sa_orderid=" + sa_orderid);
  502. BigDecimal ce = new BigDecimal(0);
  503. for (Object obj : itemifnos) {
  504. JSONObject jsonObject = (JSONObject) obj;
  505. Rows rows = dbConnect.runSqlQuery(
  506. "SELECT sa_orderitemsid,qty,deliedqty,undeliqty,writeoffamount,price from sa_orderitems WHERE sa_orderitemsid="
  507. + jsonObject.getLongValue("sa_orderitemsid"));
  508. if (rows.isNotEmpty()) {
  509. oldValue = rows.get(0).getBigDecimal("qty");
  510. } else {
  511. return getErrReturnObject().setErrMsg("订单行不存在").toString();
  512. }
  513. if (type.equals("数量")) {
  514. // 更新数量
  515. BigDecimal newqty = jsonObject.getBigDecimal("newvalue");
  516. BigDecimal oldqty = rows.get(0).getBigDecimal("qty");
  517. BigDecimal oldundeliqty = rows.get(0).getBigDecimal("undeliqty");
  518. BigDecimal addqty = newqty.subtract(oldqty);// 新增的数量
  519. if (newqty.compareTo(oldqty) >= 0) {
  520. return getErrReturnObject().setErrMsg("修改数量必须小于原订单数量" + oldqty).toString();
  521. }
  522. if (newqty.compareTo(oldqty.subtract(oldundeliqty)) < 0) {
  523. return getErrReturnObject().setErrMsg("修改数量必须大于等于已发货数量" + oldqty.subtract(oldundeliqty)).toString();
  524. }
  525. if (newqty.compareTo(BigDecimal.ZERO) < 0) {
  526. return getErrReturnObject().setErrMsg("修改数量不可小于0").toString();
  527. }
  528. sqlFactory = new SQLFactory(this, "订单商品明细变更_更新");
  529. sqlFactory.addParameter("siteid", siteid);
  530. sqlFactory.addParameter("sa_orderitemsid", jsonObject.getLongValue("sa_orderitemsid"));
  531. sqlFactory.addParameter("qty", jsonObject.getStringValue("newvalue"));
  532. // sqlFactory.addParameter("undeliqty", oldundeliqty.add(addqty));
  533. ce = ce.add(addqty.multiply(rows.get(0).getBigDecimal("price")));
  534. sqlList.add(sqlFactory.getSQL());
  535. /**
  536. * * 核销对冲计算
  537. */
  538. {
  539. /**
  540. * * 核销对冲计算
  541. */
  542. BigDecimal writeoffamount = rows.get(0).getBigDecimal("writeoffamount");// 订单行已核销金额
  543. //System.out.println(newqty.multiply(rows.get(0).getBigDecimal("price")));
  544. //System.out.println(writeoffamount);
  545. if (writeoffamount.compareTo(BigDecimal.ZERO) > 0
  546. && (newqty.multiply(rows.get(0).getBigDecimal("price"))).compareTo(writeoffamount) < 0) {
  547. // 如果已核销金额大于0 且调整后折后金额小于已核销金额,则需要将差价进行回冲
  548. orderdetailmap.put(rows.get(0).getLong("sa_orderitemsid"), rows.get(0));
  549. //System.out.println(writeoffamount.subtract(newqty.multiply(rows.get(0).getBigDecimal("price"))));
  550. //System.out.println("sa_orderitemsid:"+rows.get(0).getLong("sa_orderitemsid"));
  551. orderdetailchangeamount.put(rows.get(0).getLong("sa_orderitemsid"),
  552. writeoffamount.subtract(newqty.multiply(rows.get(0).getBigDecimal("price"))));
  553. }
  554. }
  555. }
  556. // 订单商品变更明细
  557. sqlFactory = new SQLFactory(this, "订单商品变更明细_新增");
  558. sqlFactory.addParameter("siteid", siteid);
  559. sqlFactory.addParameter("sa_orderitems_changemxid", createTableID("sa_orderitems_changemx"));
  560. sqlFactory.addParameter("itemid", jsonObject.getLongValue("itemid"));
  561. sqlFactory.addParameter("sa_orderitemsid", jsonObject.getLongValue("sa_orderitemsid"));
  562. sqlFactory.addParameter("sa_orderitems_changeid", sa_orderitems_changeid);
  563. sqlFactory.addParameter("type", type);
  564. sqlFactory.addParameter("oldvalue", oldValue);
  565. sqlFactory.addParameter("newvalue", jsonObject.getStringValue("newvalue"));
  566. sqlList.add(sqlFactory.getSQL());
  567. // content.put("sa_orderitemsid", sa_orderitemsid);
  568. }
  569. if (ce.compareTo(BigDecimal.ZERO) != 0) {
  570. CashbillEntity cashbillEntity = new CashbillEntity();
  571. cashbillEntity.setAmount(ce);
  572. cashbillEntity.setOwnerid(sa_orderid);
  573. cashbillEntity.setOwnertable("sa_order");
  574. cashbillEntity
  575. .setRemarks("订单变更:" + rowsOrder.get(0).getString("sonum") + "订单变更单id:" + sa_orderitems_changeid);
  576. sqlList.addAll(Accountbalance.createCashbillPay(this, rowsOrder.get(0).getLong("sys_enterpriseid"),
  577. rowsOrder.get(0).getLong("sa_accountclassid"), cashbillEntity, true));
  578. }
  579. /**
  580. * * 核销对冲
  581. */
  582. if (!orderdetailmap.isEmpty()) {
  583. //System.out.println("测试");
  584. sqlList.addAll(
  585. new twriteoffbill_orderchange(rowsOrder.get(0), orderdetailmap, orderdetailchangeamount).hedging());
  586. }
  587. for (String string : sqlList) {
  588. //System.out.println(string);
  589. }
  590. dbConnect.runSqlUpdate(sqlList);
  591. // 居间费设置
  592. updateRebateFee(sa_orderid);
  593. if (!isjiean) {
  594. if (Parameter.get("system.erp_dockswitch").equalsIgnoreCase("true")) {
  595. UploadDataToERP uploadDataToERP = new UploadDataToERP(this, sa_orderitems_changeid, "订单变更");
  596. boolean issuccess = uploadDataToERP.upload();
  597. if (!issuccess) {
  598. return getErrReturnObject().setErrMsg("上传ERP失败,请检查!").toString();
  599. }
  600. }
  601. }
  602. return getSucReturnObject().toString();
  603. }
  604. @API(title = "订单商品变更(手动推erp)", apiversion = R.ID20230306161703.v1.class)
  605. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class})
  606. public String changeItem1() throws YosException {
  607. if (Parameter.get("system.erp_dockswitch").equalsIgnoreCase("true")) {
  608. UploadDataToERP uploadDataToERP = new UploadDataToERP(this, content.getLong("sa_orderitems_changeid"), "订单变更");
  609. boolean issuccess = uploadDataToERP.upload();
  610. if (!issuccess) {
  611. return getErrReturnObject().setErrMsg("上传ERP失败,请检查!").toString();
  612. } else {
  613. return getSucReturnObject().toString();
  614. }
  615. } else {
  616. return getErrReturnObject().setErrMsg("erp对接开关未开!").toString();
  617. }
  618. }
  619. /**
  620. * 获取当前订单的最大行号
  621. *
  622. * @param sa_orderid
  623. * @return
  624. * @throws YosException
  625. */
  626. public Long getRowNo(Long sa_orderid) throws YosException {
  627. Rows rows = dbConnect.runSqlQuery("SELECT COUNT(0) count from sa_orderitems WHERE sa_orderid = " + sa_orderid + " AND siteid = '" + siteid + "'");
  628. return rows.get(0).getLong("count") + 1;
  629. }
  630. /**
  631. * 查询商品信息
  632. *
  633. * @param itemid
  634. * @return
  635. * @throws YosException
  636. */
  637. public Row getItemRow(Long itemid) throws YosException {
  638. SQLFactory sqlFactory = new SQLFactory(this, "查询商品信息");
  639. sqlFactory.addParameter("siteid", siteid);
  640. sqlFactory.addParameter("itemid", itemid);
  641. Rows rows = dbConnect.runSqlQuery(sqlFactory.getSQL(false));
  642. return rows.isNotEmpty() ? rows.get(0) : new Row();
  643. }
  644. /**
  645. * 重新对商品行排序
  646. *
  647. * @param sa_orderid
  648. * @throws YosException
  649. */
  650. public void updateRowNo(Long sa_orderid) throws YosException {
  651. String sql = "SELECT sa_orderitemsid from sa_orderitems WHERE sa_orderid= " + sa_orderid + " and siteid = '" + siteid + "' ORDER BY createdate ";
  652. ArrayList<Long> sa_orderitemsids = dbConnect.runSqlQuery(sql).toArrayList("sa_orderitemsid", new ArrayList<>());
  653. if (sa_orderitemsids.size() > 0) {
  654. int rowno = 1;
  655. StringBuffer where = new StringBuffer("");
  656. for (Long id : sa_orderitemsids) {
  657. where.append(" WHEN " + id + " THEN " + rowno);
  658. rowno++;
  659. }
  660. SQLFactory sqlFactory = new SQLFactory(this, "更新行号");
  661. sqlFactory.addParameter("siteid", siteid);
  662. sqlFactory.addParameter_SQL("where", where);
  663. sqlFactory.addParameter_in("sa_orderitemsid", sa_orderitemsids);
  664. sql = sqlFactory.getSQL(false);
  665. dbConnect.runSqlUpdate(sql);
  666. }
  667. }
  668. }