OrderItems.java 40 KB

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