OrderItems.java 62 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204
  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.*;
  20. import org.apache.poi.ss.usermodel.CellStyle;
  21. import org.apache.poi.ss.usermodel.DataFormat;
  22. import org.apache.poi.xssf.usermodel.XSSFCellStyle;
  23. import org.apache.poi.xssf.usermodel.XSSFSheet;
  24. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  25. import restcontroller.R;
  26. import restcontroller.webmanage.sale.aftersalesmag.twriteoffbill_orderchange;
  27. import restcontroller.webmanage.sale.rebate.Rebate;
  28. import restcontroller.webmanage.sale.toolbill.ToolBilItem;
  29. import restcontroller.webmanage.sale.toolbill.ToolBill;
  30. import utility.ERPDocking;
  31. import java.io.IOException;
  32. import java.math.BigDecimal;
  33. import java.text.SimpleDateFormat;
  34. import java.util.ArrayList;
  35. import java.util.Date;
  36. import java.util.HashMap;
  37. import static beans.order.Order.*;
  38. /**
  39. * 销售订单商品明细表
  40. */
  41. public class OrderItems extends Controller {
  42. /**
  43. * 构造函数
  44. *
  45. * @param content
  46. */
  47. public OrderItems(JSONObject content) throws YosException {
  48. super(content);
  49. }
  50. @API(title = "新增或更新", apiversion = R.ID20221109093602.v1.class)
  51. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class, ToolBill.class})
  52. public String insertOrUpdate() throws YosException {
  53. Long sa_orderid = content.getLong("sa_orderid");
  54. Long sys_enterpriseid = content.getLong("sys_enterpriseid");
  55. // Long sa_contractid = content.getLongValue("sa_contractid");
  56. Rows orderRows = getOrderRows(this, sa_orderid);
  57. if (orderRows.isEmpty()) {
  58. return getErrReturnObject().setErrMsg("数据不存在,无法添加").toString();
  59. }
  60. BigDecimal data =BigDecimal.ZERO;
  61. // sa_contractid = orderRows.get(0).getLong("sa_contractid");
  62. String type = orderRows.get(0).getString("type");
  63. JSONArray items = content.getJSONArray("items");
  64. if(items.size()>100){
  65. return getErrReturnObject().setErrMsg("最多选择100条,您已超过100条,请重新选择").toString();
  66. }
  67. Long sa_promotionid = orderRows.get(0).getLong("sa_promotionid");
  68. ArrayList<String> sqlList = new ArrayList<>();
  69. //查询erp库存
  70. // Invbal.selectErpInvbal(this, items);
  71. Rows itemRows = dbConnect.runSqlQuery("select itemid,orderaddqty,orderminqty,itemno from plm_item where siteid='" + siteid + "'");
  72. RowsMap itemRowsMap = itemRows.toRowsMap("itemid");
  73. BigDecimal sumqty = BigDecimal.ZERO;
  74. for (Object obj : items) {
  75. JSONObject item = (JSONObject) obj;
  76. Long itemid = item.getLong("itemid");
  77. Long sa_orderitemsid = item.getLong("sa_orderitemsid");
  78. BigDecimal qty = item.getBigDecimalValue("qty");
  79. sumqty = sumqty.add(qty);
  80. if (!type.equals("促销订单")) {
  81. if (itemRowsMap.containsKey(item.getString("itemid"))) {
  82. if (itemRowsMap.get(item.getString("itemid")).isNotEmpty()) {
  83. BigDecimal orderaddqty = itemRowsMap.get(item.getString("itemid")).get(0).getBigDecimal("orderaddqty");
  84. BigDecimal orderminqty = itemRowsMap.get(item.getString("itemid")).get(0).getBigDecimal("orderminqty");
  85. if (((qty.subtract(orderminqty)).remainder(orderaddqty)).compareTo(BigDecimal.ZERO) != 0) {
  86. return getErrReturnObject().setErrMsg("品号为" + itemRowsMap.get(item.getString("itemid")).get(0).getString("itemno") + "的商品数量不符合该商品的起订量和增量").toString();
  87. }
  88. }
  89. }
  90. }
  91. //商品信息
  92. Row itemRow = getItemRow(itemid);
  93. Rows promotionitems = dbConnect.runSqlQuery("select * from sa_promotion_items where siteid='" + siteid + "' and sa_promotionid=" + sa_promotionid);
  94. RowsMap promotionitemsRowsMap = promotionitems.toRowsMap("itemid");
  95. if (type.equals("促销订单")) {
  96. if (promotionitemsRowsMap.containsKey(item.getString("itemid"))) {
  97. if (promotionitemsRowsMap.get(item.getString("itemid")).isNotEmpty()) {
  98. BigDecimal saledqty = promotionitemsRowsMap.get(item.getString("itemid")).get(0).getBigDecimal("saledqty");
  99. BigDecimal groupqty = promotionitemsRowsMap.get(item.getString("itemid")).get(0).getBigDecimal("groupqty");
  100. BigDecimal orderaddqty = promotionitemsRowsMap.get(item.getString("itemid")).get(0).getBigDecimal("orderaddqty");
  101. BigDecimal orderminqty = promotionitemsRowsMap.get(item.getString("itemid")).get(0).getBigDecimal("orderminqty");
  102. boolean islimit = promotionitemsRowsMap.get(item.getString("itemid")).get(0).getBoolean("islimit");
  103. if (((qty.subtract(orderminqty)).remainder(orderaddqty)).compareTo(BigDecimal.ZERO) != 0) {
  104. return getErrReturnObject().setErrMsg("品号为" + itemRowsMap.get(item.getString("itemid")).get(0).getString("itemno") + "的商品数量不符合该商品的起订量和增量").toString();
  105. }
  106. if (islimit) {
  107. if (groupqty.compareTo(saledqty.add(qty)) < 0) {
  108. return getErrReturnObject().setErrMsg(itemRow.getString("itemno") + "商品数量已超过促销活动的限定数量【" + groupqty.subtract(saledqty) + "】,无法新建").toString();
  109. }
  110. }
  111. }
  112. }
  113. }
  114. BigDecimal price1 = new BigDecimal(0);
  115. SQLFactory sqlFactory = new SQLFactory(this, "订单商品明细_新增");
  116. if (sa_orderitemsid <= 0) {
  117. Rows rows = dbConnect.runSqlQuery("SELECT sa_orderitemsid,price from sa_orderitems WHERE siteid='" + siteid + "' and itemid=" + itemid + " and sa_orderid=" + sa_orderid);
  118. if (rows.isEmpty()) {
  119. sa_orderitemsid = createTableID("sa_orderitems");
  120. } else {
  121. System.out.println(beans.order.Order.getDefaultIsRepeatValue(siteid, type));
  122. if (beans.order.Order.getDefaultIsRepeatValue(siteid, type)) {
  123. sa_orderitemsid = createTableID("sa_orderitems");
  124. sqlFactory = new SQLFactory(this, "订单商品明细_新增");
  125. } else {
  126. price1 = rows.get(0).getBigDecimal("price");
  127. sa_orderitemsid = rows.get(0).getLong("sa_orderitemsid");
  128. sqlFactory = new SQLFactory(this, "订单商品明细_更新");
  129. }
  130. }
  131. } else {
  132. sqlFactory = new SQLFactory(this, "订单商品明细_更新");
  133. }
  134. sqlFactory.addParameter("siteid", siteid);
  135. sqlFactory.addParameter("userid", userid);
  136. sqlFactory.addParameter("username", username);
  137. sqlFactory.addParameter("sa_orderitemsid", sa_orderitemsid);
  138. sqlFactory.addParameter("sa_orderid", sa_orderid);
  139. sqlFactory.addParameter("rowno", 1);
  140. sqlFactory.addParameter("itemid", itemid);
  141. sqlFactory.addParameter("remarks", item.getStringValue("remarks"));
  142. BigDecimal conversionrate = itemRow.getBigDecimal("conversionrate");
  143. if (conversionrate.compareTo(BigDecimal.ZERO) <= 0) {
  144. conversionrate = BigDecimal.valueOf(1);
  145. }
  146. sqlFactory.addParameter("itemno", itemRow.getString("itemno"));
  147. sqlFactory.addParameter("itemname", itemRow.getString("itemname"));
  148. sqlFactory.addParameter("model", itemRow.getString("model"));
  149. sqlFactory.addParameter("unit", itemRow.getString("unit"));
  150. sqlFactory.addParameter("auxunit", itemRow.getString("auxunit"));
  151. sqlFactory.addParameter("batchcontrol", itemRow.getLong("batchcontrol"));
  152. sqlFactory.addParameter("delivery", itemRow.getLong("delivery"));
  153. sqlFactory.addParameter("stockno", item.getOrDefault("stockno", "null"));
  154. sqlFactory.addParameter("position", item.getOrDefault("position", "null"));
  155. sqlFactory.addParameter("batchno", item.getOrDefault("batchno", "null"));
  156. String deliverydate = item.getStringValue("deliverydate");
  157. Rows rows = dbConnect.runSqlQuery("SELECT deliverydate,defaultprice from sa_orderitems WHERE sa_orderitemsid =" + sa_orderitemsid);
  158. if (deliverydate.isEmpty()) {
  159. if (rows.isNotEmpty()) {
  160. deliverydate = rows.get(0).getString("deliverydate");
  161. } else {
  162. deliverydate = "null";
  163. }
  164. }
  165. String needdate = item.getStringValue("needdate");
  166. sqlFactory.addParameter("needdate", needdate.equals("") ? "null" : needdate);
  167. sqlFactory.addParameter("deliverydate", deliverydate.equals("") ? "null" : deliverydate);
  168. sqlFactory.addParameter("conversionrate", conversionrate);
  169. //订购数量
  170. sqlFactory.addParameter("qty", qty);
  171. //辅助单位数量
  172. sqlFactory.addParameter("auxqty", qty.divide(conversionrate));
  173. BigDecimal defaultprice;
  174. BigDecimal price;
  175. //价格
  176. ItemPrice itemPrice = ItemPrice.getItemPrice(this, sys_enterpriseid, itemid);
  177. if (!item.containsKey("defaultprice")) {
  178. switch (type) {
  179. // case "项目订单":
  180. // defaultprice = itemPrice.getContractprice(sa_contractid);
  181. // break;
  182. // case "工具订单":
  183. // defaultprice = itemPrice.getMarketprice();
  184. // break;
  185. case "促销订单":
  186. defaultprice = itemPrice.getGraderateprice();
  187. price = itemPrice.getPromotionPrice(sa_promotionid);
  188. break;
  189. default:
  190. defaultprice = itemPrice.getGraderateprice();
  191. price = itemPrice.getGraderateprice();
  192. }
  193. } else {
  194. price = item.getBigDecimalValue("price");
  195. if (price.compareTo(price1) != 0) {
  196. sqlList.add(DataContrlLog.createLog(this, "sa_order", sa_orderid, "订单商品【" + itemRow.getString("itemname") + "】由单价:" + price1 + "修改为单价:" + price, "订单修改单价").getSQL());
  197. }
  198. defaultprice = item.getBigDecimalValue("defaultprice");
  199. // if (!type.equals("特殊订单") && defaultprice.compareTo(rows.get(0).getBigDecimal("defaultprice")) != 0 && defaultprice.compareTo(itemPrice.getContractprice()) < 0) {
  200. // return getErrReturnObject().setErrMsg("调整价格不可小于协议价").toString();
  201. // }
  202. }
  203. if (type.equals("特殊订单")) {
  204. if (item.containsKey("defaultprice")) {
  205. if (item.getBigDecimalValue("price").compareTo(BigDecimal.ZERO) > 0 && item.getBigDecimalValue("amount").compareTo(BigDecimal.ZERO) <= 0) {
  206. sqlFactory.addParameter("price", item.getBigDecimalValue("price"));
  207. data=price.multiply(qty);
  208. //折前金额(元)
  209. sqlFactory.addParameter("amount", price.multiply(qty));
  210. } else if (item.getBigDecimalValue("price").compareTo(BigDecimal.ZERO) <= 0 && item.getBigDecimalValue("amount").compareTo(BigDecimal.ZERO) > 0) {
  211. sqlFactory.addParameter("price", item.getBigDecimalValue("amount").divide(qty, 6, BigDecimal.ROUND_HALF_UP));
  212. data=item.getBigDecimalValue("amount").divide(qty, 6, BigDecimal.ROUND_HALF_UP);
  213. //折前金额(元)
  214. sqlFactory.addParameter("amount", item.getBigDecimalValue("amount"));
  215. } else {
  216. sqlFactory.addParameter("price", price);
  217. //折前金额(元)
  218. sqlFactory.addParameter("amount", price.multiply(qty));
  219. }
  220. } else {
  221. sqlFactory.addParameter("price", price);
  222. //折前金额(元)
  223. sqlFactory.addParameter("amount", price.multiply(qty));
  224. }
  225. } else {
  226. sqlFactory.addParameter("price", price);
  227. //折前金额(元)
  228. sqlFactory.addParameter("amount", price.multiply(qty));
  229. }
  230. //单价,折后价(元),取合同价
  231. sqlFactory.addParameter("defaultprice", defaultprice);
  232. //金额,折后金额(元)
  233. sqlFactory.addParameter("defaultamount", defaultprice.multiply(qty));
  234. //牌价、市场价(元),标准订单牌价取商品价格,项目订单取合同里的牌价
  235. sqlFactory.addParameter("marketprice", itemPrice.getMarketprice());
  236. sqlList.add(sqlFactory.getSQL());
  237. }
  238. if (type.equals("促销订单")) {
  239. Rows promotionRows = dbConnect.runSqlQuery("select * from sa_promotion where siteid='" + siteid + "' and sa_promotionid=" + sa_promotionid);
  240. if (!promotionRows.isEmpty()) {
  241. if (promotionRows.get(0).getString("type").equals("打包促销")) {
  242. BigDecimal orderaddqty = promotionRows.get(0).getBigDecimal("orderaddqty");
  243. BigDecimal orderminqty = promotionRows.get(0).getBigDecimal("orderminqty");
  244. if (((sumqty.subtract(orderminqty)).remainder(orderaddqty)).compareTo(BigDecimal.ZERO) != 0) {
  245. return getErrReturnObject().setErrMsg("不符合促销活动订购数量规则,修改不成功").toString();
  246. }
  247. }
  248. }
  249. }
  250. dbConnect.runSqlUpdate(sqlList);
  251. //重新排序
  252. updateRowNo(sa_orderid);
  253. //居间费设置
  254. updateRebateFee(sa_orderid);
  255. //调整价格(返利金)
  256. if (orderRows.get(0).getBoolean("rebate_used")) {
  257. setRebateAmount(this, sa_orderid, getMaxUsedRebateAmount(this, sa_orderid));
  258. adjustLastRebateAmount(this, sa_orderid);
  259. }
  260. // else {
  261. // dbConnect.runSqlUpdate("UPDATE sa_orderitems SET amount=amount-rebateamount,price=amount/qty WHERE sa_orderid='" + sa_orderid + "' and siteid='" + siteid + "' and qty!=0");
  262. // dbConnect.runSqlUpdate("UPDATE sa_orderitems SET amount=0 WHERE sa_orderid='" + sa_orderid + "' and siteid='" + siteid + "' and qty=0");
  263. // }
  264. return getSucReturnObject().setData(data).toString();
  265. }
  266. /**
  267. * 更新居间费信息
  268. */
  269. public void updateRebateFee(Long sa_orderid) throws YosException {
  270. Rows orderRows = getOrderRows(this, sa_orderid);
  271. if (orderRows.isEmpty()) {
  272. return;
  273. }
  274. Long sa_projectid = orderRows.get(0).getLong("sa_projectid");
  275. Rows contractRows = dbConnect.runSqlQuery("SELECT * from sa_contract WHERE sa_projectid = " + sa_projectid + " and type='居间' and status='审核'");
  276. if (contractRows.isEmpty()) {
  277. return;
  278. }
  279. Long sa_contractid = contractRows.get(0).getLong("sa_contractid");
  280. Rows partiesRows = dbConnect.runSqlQuery("SELECT sys_enterpriseid from sa_project_parties WHERE type ='居间服务商' and sa_projectid = " + sa_projectid + " and siteid ='" + siteid + "'");
  281. if (partiesRows.isEmpty()) {
  282. return;
  283. }
  284. Long sys_enterpriseid_temp = partiesRows.get(0).getLong("sys_enterpriseid");
  285. content.put("sys_enterpriseid", sys_enterpriseid_temp);
  286. content.put("ownertable", "sa_order");
  287. content.put("ownerid", sa_orderid);
  288. content.put("billdate", "");
  289. content.put("remarks", "");
  290. content.put("sa_contractid", sa_contractid);
  291. content.put("settlementmode", "线上");
  292. content.put("sa_rebatesettlementid", 0);
  293. new Rebate(content).insertOrUpdate();
  294. }
  295. @API(title = "详情", apiversion = R.ID20221110134302.v1.class)
  296. @CACHEING
  297. public String selectDetail() throws YosException {
  298. Long sa_orderitemsid = content.getLong("sa_orderitemsid");
  299. SQLFactory sqlFactory = new SQLFactory(this, "订单商品明细_详情");
  300. sqlFactory.addParameter("siteid", siteid);
  301. sqlFactory.addParameter_in("sa_orderitemsid", sa_orderitemsid);
  302. String sql = sqlFactory.getSQL();
  303. Rows rows = dbConnect.runSqlQuery(sql);
  304. Row row = rows.isNotEmpty() ? rows.get(0) : new Row();
  305. return getSucReturnObject().setData(row).toString();
  306. }
  307. @API(title = "删除", apiversion = R.ID20221109093702.v1.class)
  308. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class, ToolBill.class})
  309. public String delete() throws YosException {
  310. Long sa_orderid = content.getLong("sa_orderid");
  311. JSONArray sa_orderitemsids = content.getJSONArray("sa_orderitemsids");
  312. SQLFactory sqlFactory = new SQLFactory(this, "订单商品明细_删除");
  313. sqlFactory.addParameter("siteid", siteid);
  314. sqlFactory.addParameter_in("sa_orderitemsid", sa_orderitemsids.toArray());
  315. String sql = sqlFactory.getSQL();
  316. dbConnect.runSqlUpdate(sql);
  317. //重新排序
  318. updateRowNo(sa_orderid);
  319. //居间费设置
  320. updateRebateFee(sa_orderid);
  321. //调整价格(返利金)
  322. Rows orderRows = getOrderRows(this, sa_orderid);
  323. if (orderRows.get(0).getBoolean("rebate_used")) {
  324. setRebateAmount(this, sa_orderid, getMaxUsedRebateAmount(this, sa_orderid));
  325. adjustLastRebateAmount(this, sa_orderid);
  326. }
  327. // else {
  328. // dbConnect.runSqlUpdate("UPDATE sa_orderitems SET amount=amount-rebateamount,price=amount/qty WHERE sa_orderid='" + sa_orderid + "' and siteid='" + siteid + "' and qty!=0");
  329. // dbConnect.runSqlUpdate("UPDATE sa_orderitems SET amount=0 WHERE sa_orderid='" + sa_orderid + "' and siteid='" + siteid + "' and qty=0");
  330. // }
  331. return getSucReturnObject().toString();
  332. }
  333. @API(title = "商品行冻结", apiversion = R.ID20230508093003.v1.class)
  334. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class, ToolBill.class})
  335. public String freeze() throws YosException {
  336. Long sa_orderid = content.getLong("sa_orderid");
  337. JSONArray sa_orderitemsids = content.getJSONArray("sa_orderitemsids");
  338. boolean isfreeze = content.getBooleanValue("isfreeze");
  339. Rows orderRows = dbConnect.runSqlQuery("select * from sa_order where sa_orderid=" + sa_orderid + " and siteid='" + siteid + "'");
  340. if (!orderRows.isEmpty()) {
  341. if (!orderRows.get(0).getString("status").equals("审核")) {
  342. if (isfreeze) {
  343. return getErrReturnObject().setErrMsg("非审核状态无法进行冻结").toString();
  344. } else {
  345. return getErrReturnObject().setErrMsg("非审核状态无法进行反冻结").toString();
  346. }
  347. }
  348. } else {
  349. return getErrReturnObject().setErrMsg("该订单不存在").toString();
  350. }
  351. SQLFactory sqlFactory;
  352. if (isfreeze) {
  353. sqlFactory = new SQLFactory(this, "订单商品明细_冻结");
  354. } else {
  355. sqlFactory = new SQLFactory(this, "订单商品明细_反冻结");
  356. }
  357. sqlFactory.addParameter("siteid", siteid);
  358. sqlFactory.addParameter_in("sa_orderitemsid", sa_orderitemsids.toArray());
  359. String sql = sqlFactory.getSQL();
  360. System.out.println(sql);
  361. dbConnect.runSqlUpdate(sql);
  362. return getSucReturnObject().toString();
  363. }
  364. @API(title = "商品行折扣变更", apiversion = R.ID20230508101703.v1.class)
  365. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class, ToolBill.class})
  366. public String updateOrderItemsDiscountrate() throws YosException {
  367. Long sa_orderid = content.getLong("sa_orderid");
  368. BigDecimal discountrate = content.getBigDecimal("discountrate");
  369. JSONArray itemids = content.getJSONArray("itemids");
  370. Rows orderRows = dbConnect.runSqlQuery("select * from sa_order where sa_orderid=" + sa_orderid + " and siteid='" + siteid + "'");
  371. if (!orderRows.isEmpty()) {
  372. if (!orderRows.get(0).getString("status").equals("新建") && !orderRows.get(0).getString("status").equals("预提交")) {
  373. return getErrReturnObject().setErrMsg("非新建或预提交状态无法进行商品行折扣变更").toString();
  374. }
  375. } else {
  376. return getErrReturnObject().setErrMsg("该订单不存在").toString();
  377. }
  378. String sql;
  379. if (itemids.size() == 0) {
  380. sql = "select * from sa_orderitems where sa_orderid=" + sa_orderid + " and siteid='" + siteid + "'";
  381. } else {
  382. sql = "select * from sa_orderitems where sa_orderid=" + sa_orderid + " and siteid='" + siteid + "' and itemid in " + itemids.toJSONString();
  383. sql = sql.replace("[", "(").replace("]", ")");
  384. }
  385. Rows orderItemsRows = dbConnect.runSqlQuery(sql);
  386. ArrayList<String> sqlList = new ArrayList<>();
  387. if (!orderItemsRows.isEmpty()) {
  388. for (Row row : orderItemsRows) {
  389. BigDecimal price = row.getBigDecimal("price").multiply(discountrate);
  390. BigDecimal amount = row.getBigDecimal("amount").multiply(discountrate);
  391. sqlList.add("update sa_orderitems set price=" + price + ",amount=" + amount + " where sa_orderitemsid=" + row.getLong("sa_orderitemsid"));
  392. }
  393. }
  394. dbConnect.runSqlUpdate(sqlList);
  395. return getSucReturnObject().toString();
  396. }
  397. @API(title = "商品行价格刷新(变为原价)", apiversion = R.ID20230518151803.v1.class)
  398. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class, ToolBill.class})
  399. public String updateOrderItemsPrice() throws YosException {
  400. Long sa_orderid = content.getLong("sa_orderid");
  401. JSONArray itemids = content.getJSONArray("itemids");
  402. Rows orderRows = dbConnect.runSqlQuery("select * from sa_order where sa_orderid=" + sa_orderid + " and siteid='" + siteid + "'");
  403. if (!orderRows.isEmpty()) {
  404. if (!orderRows.get(0).getString("status").equals("新建") && !orderRows.get(0).getString("status").equals("预提交")) {
  405. return getErrReturnObject().setErrMsg("非新建或预提交状态无法进行商品行价格刷新").toString();
  406. }
  407. } else {
  408. return getErrReturnObject().setErrMsg("该订单不存在").toString();
  409. }
  410. String sql;
  411. if (itemids.size() == 0) {
  412. sql = "select * from sa_orderitems where sa_orderid=" + sa_orderid + " and siteid='" + siteid + "'";
  413. } else {
  414. sql = "select * from sa_orderitems where sa_orderid=" + sa_orderid + " and siteid='" + siteid + "' and itemid in " + itemids.toJSONString();
  415. sql = sql.replace("[", "(").replace("]", ")");
  416. }
  417. Rows orderItemsRows = dbConnect.runSqlQuery(sql);
  418. ArrayList<String> sqlList = new ArrayList<>();
  419. if (!orderItemsRows.isEmpty()) {
  420. for (Row row : orderItemsRows) {
  421. //价格
  422. ItemPrice itemPrice = ItemPrice.getItemPrice(this, orderRows.get(0).getLong("sys_enterpriseid"), row.getLong("itemid"));
  423. BigDecimal price = itemPrice.getPrice();
  424. BigDecimal amount = row.getBigDecimal("qty").multiply(price);
  425. sqlList.add("update sa_orderitems set price=" + price + ",amount=" + amount + " where sa_orderitemsid=" + row.getLong("sa_orderitemsid"));
  426. }
  427. }
  428. dbConnect.runSqlUpdate(sqlList);
  429. return getSucReturnObject().toString();
  430. }
  431. @API(title = "关闭", apiversion = R.ID20221109093802.v1.class)
  432. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class})
  433. public String close() throws YosException {
  434. Long sa_orderid = content.getLong("sa_orderid");
  435. JSONArray sa_orderitemsids = content.getJSONArray("sa_orderitemsids");
  436. SQLFactory sqlFactory = new SQLFactory(this, "订单商品明细_行关闭");
  437. sqlFactory.addParameter("siteid", siteid);
  438. sqlFactory.addParameter("userid", userid);
  439. sqlFactory.addParameter("username", username);
  440. sqlFactory.addParameter("closereason", content.getStringValue("closereason"));
  441. sqlFactory.addParameter_in("sa_orderitemsid", sa_orderitemsids.toArray());
  442. dbConnect.runSqlUpdate(sqlFactory);
  443. //重新排序
  444. updateRowNo(sa_orderid);
  445. return getSucReturnObject().toString();
  446. }
  447. @API(title = "查询列表", apiversion = R.ID20221109093902.v1.class)
  448. public String selectList() throws YosException, IOException {
  449. StringBuffer where = new StringBuffer(" 1=1 ");
  450. if (content.containsKey("where")) {
  451. JSONObject whereObject = content.getJSONObject("where");
  452. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  453. where.append(" and(");
  454. where.append("t1.itemno like'%").append(whereObject.getString("condition")).append("%' ");
  455. where.append("or t1.itemname like'%").append(whereObject.getString("condition")).append("%' ");
  456. where.append("or t1.model like'%").append(whereObject.getString("condition")).append("%' ");
  457. where.append("or t3.spec like'%").append(whereObject.getString("condition")).append("%' ");
  458. where.append(")");
  459. }
  460. }
  461. Long sa_orderid = content.getLong("sa_orderid");
  462. Rows orderRows = getOrderRows(this, sa_orderid);
  463. if (orderRows.isNotEmpty()) {
  464. sys_enterpriseid = orderRows.get(0).getLong("sys_enterpriseid");
  465. }
  466. boolean isExport = content.getBooleanValue("isExport");
  467. SQLFactory sqlFactory = new SQLFactory(this, "订单商品明细_列表", pageSize, pageNumber, pageSorting);
  468. if (isExport) {
  469. sqlFactory = new SQLFactory(this, "订单商品明细_列表");
  470. }
  471. sqlFactory.addParameter("siteid", siteid);
  472. sqlFactory.addParameter("sa_orderid", sa_orderid);
  473. sqlFactory.addParameter_SQL("where", where);
  474. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  475. ArrayList<Long> ids = rows.toArrayList("itemid", new ArrayList<>());
  476. RowsMap rowsMap = rows.toRowsMap("itemno");
  477. SQLFactory sqlFactory1 = new SQLFactory(this, "商品发货数量汇总");
  478. sqlFactory1.addParameter("siteid", siteid);
  479. sqlFactory1.addParameter_in("itemnos", rows.toArrayList("itemno", new ArrayList<>()));
  480. Rows sumQtyRows = dbConnect.runSqlQuery(sqlFactory1);
  481. RowsMap sumQtyRowsMap = sumQtyRows.toRowsMap("itemno");
  482. SQLFactory sqlFactory2 = new SQLFactory(this, "商品未发货数量汇总");
  483. sqlFactory2.addParameter("siteid", siteid);
  484. sqlFactory2.addParameter_in("itemnos", rows.toArrayList("itemno", new ArrayList<>()));
  485. Rows sumUnQtyRows = dbConnect.runSqlQuery(sqlFactory2);
  486. RowsMap sumUnQtyRowsMap = sumUnQtyRows.toRowsMap("itemno");
  487. ERPDocking erpDocking = new ERPDocking();
  488. JSONArray jsonArray = new JSONArray();
  489. if (rows.toJsonArray("itemno").size() != 0) {
  490. if (Parameter.get("system.ccerp_dockswitch").equalsIgnoreCase("true") && siteid.equalsIgnoreCase("ccyosg")) {
  491. jsonArray = erpDocking.getErpIcinvbalRows(1000, 1, rows.toJsonArray("itemno"));
  492. }
  493. }
  494. if (!jsonArray.isEmpty()) {
  495. for (Object object : jsonArray) {
  496. JSONObject jsonObject = (JSONObject) object;
  497. if (rowsMap.containsKey(jsonObject.getString("fitemno"))) {
  498. if (rowsMap.get(jsonObject.getString("fitemno")).isNotEmpty()) {
  499. rowsMap.get(jsonObject.getString("fitemno")).get(0).put("invbalqty", jsonObject.getBigDecimalValue("fqty"));
  500. }
  501. }
  502. }
  503. }
  504. //查询附件
  505. RowsMap attinfoRowsMap = getAttachmentUrl("plm_item", ids);
  506. for (Row row : rows) {
  507. if (sumQtyRowsMap.get(row.getString("itemno")).isNotEmpty()) {
  508. row.put("unsoldqty", sumQtyRowsMap.get(row.getString("itemno")).get(0).getBigDecimal("qty"));
  509. } else {
  510. row.put("unsoldqty", BigDecimal.ZERO);
  511. }
  512. if (sumUnQtyRowsMap.get(row.getString("itemno")).isNotEmpty()) {
  513. row.put("undeliqtysum", sumUnQtyRowsMap.get(row.getString("itemno")).get(0).getBigDecimal("undeliqty"));
  514. } else {
  515. row.put("undeliqtysum", BigDecimal.ZERO);
  516. }
  517. if (!row.containsKey("invbalqty")) {
  518. row.put("invbalqty", BigDecimal.ZERO);
  519. }
  520. row.put("attinfos", attinfoRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  521. row.put("contractprice", 0);
  522. }
  523. if (isExport) {
  524. //去除不需要导出项
  525. String[] removeFieldList = {"sa_orderitemsid", "itemid", "sa_orderid", "candispatchqty", "cansaleqty",
  526. "totalaty", "orderminqty_auxunit", "orderminqty", "orderaddqty_auxunit", "orderaddqty",
  527. "spec", "delivery", "erpitemno", "erpitemname", "material", "standards", "stockstatus"};
  528. for (String key : removeFieldList) {
  529. rows.getFieldList().remove(key);
  530. }
  531. Rows uploadRows = uploadExcelToObs("order", "订单商品明细_列表", rows, getTitleMap());
  532. return getSucReturnObject().setData(uploadRows).toString();
  533. }
  534. return getSucReturnObject().setData(rows).toString();
  535. }
  536. @API(title = "查询订单所有明细列表", apiversion = R.ID20230508111703.v1.class)
  537. public String selectAllList() throws YosException, IOException {
  538. StringBuffer where = new StringBuffer(" 1=1 ");
  539. if (sys_enterpriseid > 0) {
  540. where.append(" and t5.sys_enterpriseid ='").append(sys_enterpriseid).append("' ");
  541. }
  542. if (content.containsKey("where")) {
  543. JSONObject whereObject = content.getJSONObject("where");
  544. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  545. where.append(" and(");
  546. where.append(" t5.sonum like'%").append(whereObject.getString("condition")).append("%' ");
  547. where.append("or t1.itemno like'%").append(whereObject.getString("condition")).append("%' ");
  548. where.append("or t1.itemname like'%").append(whereObject.getString("condition")).append("%' ");
  549. where.append("or t6.agentnum like'%").append(whereObject.getString("condition")).append("%' ");
  550. where.append("or t7.enterprisename like'%").append(whereObject.getString("condition")).append("%' ");
  551. where.append(")");
  552. }
  553. if (whereObject.containsKey("iteminfo") && !"".equals(whereObject.getString("iteminfo"))) {
  554. where.append(" and(");
  555. where.append("t1.itemno like'%").append(whereObject.getString("iteminfo")).append("%' ");
  556. where.append("or t1.itemname like'%").append(whereObject.getString("iteminfo")).append("%' ");
  557. where.append(")");
  558. }
  559. if (whereObject.containsKey("agentinfo") && !"".equals(whereObject.getString("agentinfo"))) {
  560. where.append(" and(");
  561. where.append("t6.agentnum like'%").append(whereObject.getString("agentinfo")).append("%' ");
  562. where.append("or t7.enterprisename like'%").append(whereObject.getString("agentinfo")).append("%' ");
  563. where.append(")");
  564. }
  565. if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
  566. where.append(" and DATE_FORMAT(t5.billdate, '%Y-%m-%d') >='").append(whereObject.getString("begindate")).append("' ");
  567. }
  568. if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
  569. where.append(" and DATE_FORMAT(t5.billdate, '%Y-%m-%d') <='").append(whereObject.getString("enddate")).append("' ");
  570. }
  571. if (whereObject.containsKey("status") && !"".equals(whereObject.getString("status"))) {
  572. where.append(" and t5.status ='").append(whereObject.getString("status")).append("' ");
  573. }
  574. if (whereObject.containsKey("isfreeze") && !"".equals(whereObject.getString("isfreeze"))) {
  575. where.append(" and t1.isfreeze ='").append(whereObject.getString("isfreeze")).append("' ");
  576. }
  577. if (whereObject.containsKey("typemx") && !"".equals(whereObject.getString("typemx"))) {
  578. where.append(" and t5.typemx ='").append(whereObject.getString("typemx")).append("' ");
  579. }
  580. if (whereObject.containsKey("isuncheckout") && !"".equals(whereObject.getString("isuncheckout"))) {
  581. String begindate = "";
  582. String enddate = "";
  583. if(whereObject.containsKey("datetype") && !"".equals(whereObject.getString("datetype"))) {
  584. String datetype = whereObject.getStringValue("datetype");
  585. switch (datetype) {
  586. case "月":
  587. begindate = getMonthFirstDay();
  588. enddate = getMonthLastDay();
  589. break;
  590. case "年":
  591. begindate = new SimpleDateFormat("yyyy").format(new Date()) + "-01-01";
  592. enddate = new SimpleDateFormat("yyyy").format(new Date()) + "-12-31";
  593. break;
  594. case "周":
  595. begindate = getWeekFirstDay();
  596. enddate = getWeekLastDay();
  597. break;
  598. default:
  599. break;
  600. }
  601. }
  602. if (begindate != "") {
  603. where.append(" and DATE_FORMAT(t5.submitdate, '%Y-%m-%d') >='").append(begindate).append("' ");
  604. }
  605. if (enddate != "") {
  606. where.append(" and DATE_FORMAT(t5.submitdate, '%Y-%m-%d') <='").append(enddate).append("' ");
  607. }
  608. String isuncheckout = whereObject.getStringValue("isuncheckout");
  609. if (isuncheckout.equals("1")) {
  610. where.append(" and t1.sa_orderitemsid in (select t1.sa_orderitemsid from sa_orderitems t1 inner join (select t2.sa_orderitemsid,t2.siteid,sum(outwarehouseqty) sumoutwarehouseqty from sa_dispatch_items t2 inner join sa_dispatch t3 on t2.sa_dispatchid=t3.sa_dispatchid and t2.siteid=t3.siteid GROUP BY sa_orderitemsid,siteid) t2 on t1.sa_orderitemsid=t2.sa_orderitemsid and t1.siteid=t2.siteid where t1.qty>t2.sumoutwarehouseqty or t1.undeliqty>0)");
  611. } else {
  612. where.append(" and 1=1");
  613. }
  614. }
  615. }
  616. boolean isExport = content.getBooleanValue("isExport");
  617. SQLFactory sqlFactory = new SQLFactory(this, "订单商品明细_所有列表", pageSize, pageNumber, pageSorting);
  618. if (isExport) {
  619. sqlFactory = new SQLFactory(this, "订单商品明细_所有列表");
  620. }
  621. sqlFactory.addParameter("siteid", siteid);
  622. sqlFactory.addParameter_SQL("where", where);
  623. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  624. ArrayList<Long> ids = rows.toArrayList("itemid", new ArrayList<>());
  625. RowsMap rowsMap = rows.toRowsMap("itemno");
  626. SQLFactory sqlFactory1 = new SQLFactory(this, "订单明细发货数量汇总");
  627. sqlFactory1.addParameter("siteid", siteid);
  628. Rows sumQtyRows = dbConnect.runSqlQuery(sqlFactory1);
  629. RowsMap sumQtyRowsMap = sumQtyRows.toRowsMap("sa_orderitemsid");
  630. ERPDocking erpDocking = new ERPDocking();
  631. JSONArray jsonArray = new JSONArray();
  632. if (rows.toJsonArray("itemno").size() != 0) {
  633. if (Parameter.get("system.ccerp_dockswitch").equalsIgnoreCase("true") && siteid.equalsIgnoreCase("ccyosg")) {
  634. jsonArray = erpDocking.getErpIcinvbalRows(200000, 1, rows.toJsonArray("itemno"));
  635. }
  636. }
  637. if (!jsonArray.isEmpty()) {
  638. for (Object object : jsonArray) {
  639. JSONObject jsonObject = (JSONObject) object;
  640. if (rowsMap.containsKey(jsonObject.getString("fitemno"))) {
  641. if (rowsMap.get(jsonObject.getString("fitemno")).isNotEmpty()) {
  642. rowsMap.get(jsonObject.getString("fitemno")).get(0).put("invbalqty", jsonObject.getBigDecimalValue("fqty"));
  643. }
  644. }
  645. }
  646. }
  647. //查询附件
  648. RowsMap attinfoRowsMap = getAttachmentUrl("plm_item", ids);
  649. for (Row row : rows) {
  650. if (sumQtyRowsMap.get(row.getString("sa_orderitemsid")).isNotEmpty()) {
  651. row.put("unsoldqty", sumQtyRowsMap.get(row.getString("sa_orderitemsid")).get(0).getBigDecimal("qty"));
  652. } else {
  653. row.put("unsoldqty", BigDecimal.ZERO);
  654. }
  655. if (!row.containsKey("invbalqty")) {
  656. row.put("invbalqty", BigDecimal.ZERO);
  657. }
  658. row.put("attinfos", attinfoRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  659. row.put("contractprice", 0);
  660. }
  661. if (isExport) {
  662. //去除不需要导出项
  663. rows.getFieldList().remove("sa_orderitemsid");
  664. rows.getFieldList().remove("itemid");
  665. rows.getFieldList().remove("batchcontrol");
  666. rows.getFieldList().remove("model");
  667. rows.getFieldList().remove("conversionrate");
  668. rows.getFieldList().remove("marketprice");
  669. rows.getFieldList().remove("defaultprice");
  670. rows.getFieldList().remove("defaultamount");
  671. rows.getFieldList().remove("auxqty");
  672. rows.getFieldList().remove("needdate");
  673. rows.getFieldList().remove("deliedqty");
  674. rows.getFieldList().remove("rebateamount");
  675. rows.getFieldList().remove("invoiceamount");
  676. rows.getFieldList().remove("writeoffamount");
  677. rows.getFieldList().remove("auxunit");
  678. rows.getFieldList().remove("sa_orderid");
  679. rows.getFieldList().remove("deliverydate");
  680. rows.getFieldList().remove("returnqty");
  681. rows.getFieldList().remove("stockno");
  682. rows.getFieldList().remove("position");
  683. rows.getFieldList().remove("batchno");
  684. rows.getFieldList().remove("isfreeze");
  685. rows.getFieldList().remove("candispatchqty");
  686. rows.getFieldList().remove("cansaleqty");
  687. rows.getFieldList().remove("totalaty");
  688. rows.getFieldList().remove("orderminqty_auxunit");
  689. rows.getFieldList().remove("orderminqty");
  690. rows.getFieldList().remove("orderaddqty_auxunit");
  691. rows.getFieldList().remove("orderaddqty");
  692. rows.getFieldList().remove("spec");
  693. rows.getFieldList().remove("packageqty");
  694. rows.getFieldList().remove("delivery");
  695. rows.getFieldList().remove("erpitemno");
  696. rows.getFieldList().remove("erpitemname");
  697. rows.getFieldList().remove("prodline");
  698. rows.getFieldList().remove("material");
  699. rows.getFieldList().remove("device");
  700. rows.getFieldList().remove("specalnote");
  701. rows.getFieldList().remove("standards");
  702. rows.getFieldList().remove("agentnum");
  703. rows.getFieldList().remove("enterprisename");
  704. rows.getFieldList().remove("agentnum");
  705. rows.getFieldList().remove("stockstatus");
  706. rows.getFieldList().remove("submitdate");
  707. rows.getFieldList().remove("checkdate");
  708. Rows rowsrolename= dbConnect.runSqlQuery("select * from sys_userrole t1 inner join sys_role t2 on t1.roleid=t2.roleid and t1.siteid=t2.siteid where t2.rolename='经销商员工' and t1.userid="+userid);
  709. if(!rowsrolename.isEmpty()){
  710. rows.getFieldList().remove("price");
  711. rows.getFieldList().remove("amount");
  712. }
  713. Rows uploadRows = uploadExcelToObs("orderdetail", "订单明细列表", rows, getTitleMapAgent());
  714. return getSucReturnObject().setData(uploadRows).toString();
  715. }
  716. return getSucReturnObject().setData(rows).toString();
  717. }
  718. //返回导出的标题
  719. public HashMap<String, String> getTitleMap() {
  720. HashMap<String, String> titleMap = new HashMap<>();
  721. titleMap.put("rowno", "行号");
  722. titleMap.put("batchcontrol", "是否批次管理");
  723. titleMap.put("itemno", "产品编号");
  724. titleMap.put("itemname", "产品名称");
  725. titleMap.put("model", "型号");
  726. titleMap.put("conversionrate", "换算率(辅助数量=主单位数量/换算率)");
  727. titleMap.put("price", "单价,折后价(元)");
  728. titleMap.put("amount", "金额,折后金额(元)");
  729. titleMap.put("marketprice", "牌价、市场价(元)");
  730. titleMap.put("defaultprice", "折前价(元)");
  731. titleMap.put("defaultamount", "折前金额(元)");
  732. titleMap.put("qty", "订购数量");
  733. titleMap.put("auxqty", "辅助单位数量");
  734. titleMap.put("needdate", "需求日期");
  735. titleMap.put("deliedqty", "已交货量(主单位)");
  736. titleMap.put("rebateamount", "返利分摊金额");
  737. titleMap.put("undeliqty", "未交货量(主单位)");
  738. titleMap.put("invoiceamount", "已开票金额");
  739. titleMap.put("writeoffamount", "已核销金额");
  740. titleMap.put("unit", "计量单位名称");
  741. titleMap.put("auxunit", "辅助计量单位名称");
  742. titleMap.put("deliverydate", "交货日期");
  743. titleMap.put("returnqty", "退货数量");
  744. titleMap.put("remarks", "备注");
  745. titleMap.put("submitdate", "提交时间");
  746. titleMap.put("checkdate", "审核时间");
  747. return titleMap;
  748. }
  749. //返回导出的标题
  750. public HashMap<String, String> getTitleMapAgent() throws YosException {
  751. HashMap<String, String> titleMap = new HashMap<>();
  752. titleMap.put("rowno", "行号");
  753. titleMap.put("sonum", "订单号");
  754. titleMap.put("status", "订单状态");
  755. titleMap.put("type", "订单类型");
  756. titleMap.put("billdate", "单据日期");
  757. titleMap.put("tradefield", "领域");
  758. titleMap.put("itemno", "产品编码");
  759. titleMap.put("itemname", "品名");
  760. titleMap.put("unit", "单位");
  761. titleMap.put("qty", "数量");
  762. titleMap.put("undeliqty", "未发货数量");
  763. Rows rowsrolename= dbConnect.runSqlQuery("select * from sys_userrole t1 inner join sys_role t2 on t1.roleid=t2.roleid and t1.siteid=t2.siteid where t2.rolename='经销商员工' and t1.userid="+userid);
  764. if(rowsrolename.isEmpty()){
  765. titleMap.put("price", "单价");
  766. titleMap.put("amount", "金额");
  767. }
  768. titleMap.put("remarks", "订单行备注");
  769. return titleMap;
  770. }
  771. @API(title = "查询可添加商品列表", apiversion = R.ID20221109153502.v1.class)
  772. @CACHEING
  773. public String selectItemList() throws YosException {
  774. StringBuffer where = new StringBuffer(" 1=1 ");
  775. boolean isall = content.getBooleanValue("isall");
  776. if (content.containsKey("where")) {
  777. JSONObject whereObject = content.getJSONObject("where");
  778. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  779. where.append(" and(");
  780. where.append("t1.itemno like'%").append(whereObject.getString("condition")).append("%' ");
  781. where.append("or t1.itemname like'%").append(whereObject.getString("condition")).append("%' ");
  782. where.append("or t1.model like'%").append(whereObject.getString("condition")).append("%' ");
  783. where.append("or t1.spec like'%").append(whereObject.getString("condition")).append("%' ");
  784. where.append("or t3.material like'%").append(whereObject.getString("condition")).append("%' ");
  785. where.append("or t3.erpitemno like'%").append(whereObject.getString("condition")).append("%' ");
  786. where.append(")");
  787. }
  788. if (whereObject.containsKey("isonsale") && !"".equals(whereObject.getString("isonsale"))) {
  789. where.append(" and t1.isonsale ='").append(whereObject.getString("isonsale")).append("' ");
  790. }
  791. }
  792. Long sa_orderid = content.getLong("sa_orderid");
  793. Long sys_enterpriseid1 = sys_enterpriseid;
  794. Rows orderRows = getOrderRows(this, sa_orderid);
  795. Long sa_brandid = 0L;
  796. String tradefield = "";
  797. String type = "";
  798. String typemx = "";
  799. Long sys_enterpriseid = 0L;
  800. if (orderRows.isNotEmpty()) {
  801. sa_brandid = orderRows.get(0).getLong("sa_brandid");
  802. tradefield = orderRows.get(0).getString("tradefield");
  803. type = orderRows.get(0).getString("type");
  804. typemx = orderRows.get(0).getString("typemx");
  805. sys_enterpriseid = orderRows.get(0).getLong("sys_enterpriseid");
  806. }
  807. SQLFactory sqlFactory = new SQLFactory(this, "查询可添加商品列表", pageSize, pageNumber, pageSorting);
  808. if(isall){
  809. sqlFactory = new SQLFactory(this, "查询可添加商品列表");
  810. }
  811. switch (type) {
  812. // case "总部订单":
  813. // sqlFactory = new SQLFactory(this, "查询可添加商品列表_总部订单", pageSize, pageNumber, pageSorting);
  814. // break;
  815. case "特殊订单":
  816. if (typemx.equals("电商") || typemx.equals("工程")) {
  817. sqlFactory = new SQLFactory(this, "查询可添加商品列表_总部订单", pageSize, pageNumber, pageSorting);
  818. if(isall){
  819. sqlFactory = new SQLFactory(this, "查询可添加商品列表_总部订单");
  820. }
  821. } else {
  822. sqlFactory = new SQLFactory(this, "查询可添加商品列表_特殊订单", pageSize, pageNumber, pageSorting);
  823. if(isall){
  824. sqlFactory = new SQLFactory(this, "查询可添加商品列表_特殊订单");
  825. }
  826. }
  827. Rows rows =dbConnect.runSqlQuery("select * from sa_agents where agentnum in('2314','2315') and siteid='"+siteid+"'");
  828. if(!rows.isEmpty()){
  829. for (Row row:rows) {
  830. if(row.getLong("sys_enterpriseid")==sys_enterpriseid){
  831. sqlFactory = new SQLFactory(this, "查询可添加商品列表_总部订单", pageSize, pageNumber, pageSorting);
  832. if(isall){
  833. sqlFactory = new SQLFactory(this, "查询可添加商品列表_总部订单");
  834. }
  835. }
  836. }
  837. }
  838. sqlFactory.addParameter("tradefield", tradefield);
  839. if (sys_enterpriseid1 > 0) {
  840. where.append(" and t1.isonsale ='1' ");
  841. }
  842. break;
  843. default:
  844. StringBuffer where2 = new StringBuffer(" 1=1 ");
  845. Row enterpriseRow = Enterprise.getEnterprise(this, sys_enterpriseid);
  846. boolean saleclassauth = enterpriseRow.getBoolean("saleclassauth");
  847. //需要经营授权
  848. if (saleclassauth) {
  849. where2.append(" and t1.itemclassid in (SELECT itemclassid from sys_enterprise_saleclass WHERE sys_enterpriseid = " + sys_enterpriseid + " and siteid = '" + siteid + "')");
  850. }
  851. sqlFactory.addParameter("sa_brandid", sa_brandid);
  852. sqlFactory.addParameter("tradefield", tradefield);
  853. sqlFactory.addParameter_SQL("where2", where2);
  854. break;
  855. }
  856. sqlFactory.addParameter("siteid", siteid);
  857. sqlFactory.addParameter_SQL("where", where);
  858. String sql = sqlFactory.getSQL(false);
  859. Rows rows = dbConnect.runSqlQuery(sql);
  860. ArrayList<Long> ids = rows.toArrayList("itemid", new ArrayList<>());
  861. //查询附件
  862. RowsMap attinfoRowsMap = getAttachmentUrl("plm_item", ids);
  863. //商品领域
  864. RowsMap tradefieldRowsMap = beans.Item.Item.getTradefieldRowsMap(this, ids);
  865. //品牌
  866. RowsMap brandRowsMap = Brand.getBrandRowsMap(this, ids);
  867. //价格
  868. HashMap<Long, ItemPrice> itemPriceRowsMap = ItemPrice.getItemPrice(this, sys_enterpriseid, ids);
  869. for (Row row : rows) {
  870. row.put("attinfos", attinfoRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  871. row.put("tradefield", tradefieldRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  872. row.put("brand", brandRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  873. if (itemPriceRowsMap.containsKey(row.getLong("itemid"))) {
  874. row.put("price", itemPriceRowsMap.get(row.getLong("itemid")).getPrice());
  875. } else {
  876. row.put("price", 0);
  877. }
  878. }
  879. return getSucReturnObject().setData(rows).toString();
  880. }
  881. //获取非工具数据
  882. public String getOrderItemsList(Long sa_orderid, String tradefield, Long sys_enterpriseid, Long sa_brandid) throws YosException {
  883. StringBuffer where = new StringBuffer(" 1=1 ");
  884. Row enterpriseRow = Enterprise.getEnterprise(this, sys_enterpriseid);
  885. boolean saleclassauth = enterpriseRow.getBoolean("saleclassauth");
  886. //需要经营授权
  887. if (saleclassauth) {
  888. where.append(" and itemclassid in (SELECT itemclassid from sys_enterprise_saleclass WHERE sys_enterpriseid = " + sys_enterpriseid + " and siteid = '" + siteid + "')");
  889. }
  890. SQLFactory sqlFactory = new SQLFactory(this, "商品范围");
  891. sqlFactory.addParameter("siteid", siteid);
  892. sqlFactory.addParameter("sa_orderid", sa_orderid);
  893. sqlFactory.addParameter_in("tradefield", tradefield);
  894. sqlFactory.addParameter("sys_enterpriseid", sys_enterpriseid);
  895. sqlFactory.addParameter("sa_brandid", sa_brandid);
  896. sqlFactory.addParameter_SQL("where", where);
  897. return sqlFactory.getSQL(false);
  898. }
  899. // //获取特殊数据
  900. // public String getOrderItemsListSpec(Long sa_orderid, String tradefield, Long sys_enterpriseid) throws YosException {
  901. // SQLFactory sqlFactory = new SQLFactory(this, "商品范围_特殊");
  902. // sqlFactory.addParameter("siteid", siteid);
  903. // sqlFactory.addParameter("sa_orderid", sa_orderid);
  904. // sqlFactory.addParameter_in("tradefield", tradefield);
  905. // sqlFactory.addParameter("sys_enterpriseid", sys_enterpriseid);
  906. // return sqlFactory.getSQL(false);
  907. // }
  908. @API(title = "订单商品变更", apiversion = R.ID20221110145302.v1.class)
  909. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class})
  910. public String changeItem() throws YosException {
  911. boolean isjiean = content.getBooleanValue("isjiean");
  912. Long sa_orderid = content.getLong("sa_orderid");
  913. String type = content.getString("type");
  914. Long sa_orderitems_changeid = createTableID("sa_orderitems_change");
  915. JSONArray itemifnos = content.getJSONArray("itemifnos");
  916. BigDecimal oldValue = new BigDecimal(0);
  917. Rows Rowstatus = dbConnect.runSqlQuery(
  918. "select * from sa_order where sa_orderid=" + sa_orderid + " and siteid='" + siteid + "'");
  919. if (Rowstatus.isEmpty()) {
  920. return "订单不存在";
  921. } else {
  922. if (!Rowstatus.get(0).getString("status").equals("审核")) {
  923. return getErrReturnObject().setErrMsg("非审核状态的订单无法进行商品变更").toString();
  924. }
  925. }
  926. ArrayList<String> sqlList = new ArrayList<>();
  927. // 订单商品变更
  928. SQLFactory sqlFactory = new SQLFactory(this, "订单商品变更_新增");
  929. sqlFactory.addParameter("siteid", siteid);
  930. sqlFactory.addParameter("userid", userid);
  931. sqlFactory.addParameter("username", username);
  932. sqlFactory.addParameter("sa_orderitems_changeid", sa_orderitems_changeid);
  933. sqlFactory.addParameter("sa_orderid", sa_orderid);
  934. sqlFactory.addParameter("remarks", content.getStringValue("remarks"));
  935. sqlList.add(sqlFactory.getSQL());
  936. HashMap<Long, Row> orderdetailmap = new HashMap<>();
  937. HashMap<Long, BigDecimal> orderdetailchangeamount = new HashMap<>();
  938. Rows rowsOrder = dbConnect.runSqlQuery("select * from sa_order t1 where t1.sa_orderid=" + sa_orderid);
  939. BigDecimal ce = new BigDecimal(0);
  940. for (Object obj : itemifnos) {
  941. JSONObject jsonObject = (JSONObject) obj;
  942. Rows rows = dbConnect.runSqlQuery(
  943. "SELECT sa_orderitemsid,qty,deliedqty,undeliqty,writeoffamount,price from sa_orderitems WHERE sa_orderitemsid="
  944. + jsonObject.getLongValue("sa_orderitemsid"));
  945. if (rows.isNotEmpty()) {
  946. oldValue = rows.get(0).getBigDecimal("qty");
  947. } else {
  948. return getErrReturnObject().setErrMsg("订单行不存在").toString();
  949. }
  950. if (type.equals("数量")) {
  951. // 更新数量
  952. BigDecimal newqty = jsonObject.getBigDecimal("newvalue");
  953. BigDecimal oldqty = rows.get(0).getBigDecimal("qty");
  954. BigDecimal oldundeliqty = rows.get(0).getBigDecimal("undeliqty");
  955. BigDecimal addqty = newqty.subtract(oldqty);// 新增的数量
  956. if (newqty.compareTo(oldqty) >= 0) {
  957. return getErrReturnObject().setErrMsg("修改数量必须小于原订单数量" + oldqty).toString();
  958. }
  959. if (newqty.compareTo(oldqty.subtract(oldundeliqty)) < 0) {
  960. return getErrReturnObject().setErrMsg("修改数量必须大于等于已发货数量" + oldqty.subtract(oldundeliqty)).toString();
  961. }
  962. if (newqty.compareTo(BigDecimal.ZERO) < 0) {
  963. return getErrReturnObject().setErrMsg("修改数量不可小于0").toString();
  964. }
  965. sqlFactory = new SQLFactory(this, "订单商品明细变更_更新");
  966. sqlFactory.addParameter("siteid", siteid);
  967. sqlFactory.addParameter("sa_orderitemsid", jsonObject.getLongValue("sa_orderitemsid"));
  968. sqlFactory.addParameter("qty", jsonObject.getStringValue("newvalue"));
  969. // sqlFactory.addParameter("undeliqty", oldundeliqty.add(addqty));
  970. ce = ce.add(addqty.multiply(rows.get(0).getBigDecimal("price")));
  971. sqlList.add(sqlFactory.getSQL());
  972. /**
  973. * * 核销对冲计算
  974. */
  975. {
  976. /**
  977. * * 核销对冲计算
  978. */
  979. BigDecimal writeoffamount = rows.get(0).getBigDecimal("writeoffamount");// 订单行已核销金额
  980. //System.out.println(newqty.multiply(rows.get(0).getBigDecimal("price")));
  981. //System.out.println(writeoffamount);
  982. if (writeoffamount.compareTo(BigDecimal.ZERO) > 0
  983. && (newqty.multiply(rows.get(0).getBigDecimal("price"))).compareTo(writeoffamount) < 0) {
  984. // 如果已核销金额大于0 且调整后折后金额小于已核销金额,则需要将差价进行回冲
  985. orderdetailmap.put(rows.get(0).getLong("sa_orderitemsid"), rows.get(0));
  986. //System.out.println(writeoffamount.subtract(newqty.multiply(rows.get(0).getBigDecimal("price"))));
  987. //System.out.println("sa_orderitemsid:"+rows.get(0).getLong("sa_orderitemsid"));
  988. orderdetailchangeamount.put(rows.get(0).getLong("sa_orderitemsid"),
  989. writeoffamount.subtract(newqty.multiply(rows.get(0).getBigDecimal("price"))));
  990. }
  991. }
  992. }
  993. // 订单商品变更明细
  994. sqlFactory = new SQLFactory(this, "订单商品变更明细_新增");
  995. sqlFactory.addParameter("siteid", siteid);
  996. sqlFactory.addParameter("sa_orderitems_changemxid", createTableID("sa_orderitems_changemx"));
  997. sqlFactory.addParameter("itemid", jsonObject.getLongValue("itemid"));
  998. sqlFactory.addParameter("sa_orderitemsid", jsonObject.getLongValue("sa_orderitemsid"));
  999. sqlFactory.addParameter("sa_orderitems_changeid", sa_orderitems_changeid);
  1000. sqlFactory.addParameter("type", type);
  1001. sqlFactory.addParameter("oldvalue", oldValue);
  1002. sqlFactory.addParameter("newvalue", jsonObject.getStringValue("newvalue"));
  1003. sqlList.add(sqlFactory.getSQL());
  1004. // content.put("sa_orderitemsid", sa_orderitemsid);
  1005. }
  1006. if (ce.compareTo(BigDecimal.ZERO) != 0) {
  1007. CashbillEntity cashbillEntity = new CashbillEntity();
  1008. cashbillEntity.setAmount(ce);
  1009. cashbillEntity.setOwnerid(sa_orderid);
  1010. cashbillEntity.setOwnertable("sa_order");
  1011. cashbillEntity
  1012. .setRemarks("订单变更:" + rowsOrder.get(0).getString("sonum") + "订单变更单id:" + sa_orderitems_changeid);
  1013. sqlList.addAll(Accountbalance.createCashbillPay(this, rowsOrder.get(0).getLong("sys_enterpriseid"),
  1014. rowsOrder.get(0).getLong("sa_accountclassid"), cashbillEntity, true));
  1015. }
  1016. /**
  1017. * * 核销对冲
  1018. */
  1019. if (!orderdetailmap.isEmpty()) {
  1020. //System.out.println("测试");
  1021. sqlList.addAll(
  1022. new twriteoffbill_orderchange(rowsOrder.get(0), orderdetailmap, orderdetailchangeamount).hedging());
  1023. }
  1024. for (String string : sqlList) {
  1025. //System.out.println(string);
  1026. }
  1027. dbConnect.runSqlUpdate(sqlList);
  1028. // 居间费设置
  1029. updateRebateFee(sa_orderid);
  1030. if (!isjiean) {
  1031. if (Parameter.get("system.erp_dockswitch").equalsIgnoreCase("true")) {
  1032. UploadDataToERP uploadDataToERP = new UploadDataToERP(this, sa_orderitems_changeid, "订单变更");
  1033. boolean issuccess = uploadDataToERP.upload();
  1034. if (!issuccess) {
  1035. return getErrReturnObject().setErrMsg("上传ERP失败,请检查!").toString();
  1036. }
  1037. }
  1038. }
  1039. return getSucReturnObject().toString();
  1040. }
  1041. @API(title = "订单商品变更(手动推erp)", apiversion = R.ID20230306161703.v1.class)
  1042. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class})
  1043. public String changeItem1() throws YosException {
  1044. if (Parameter.get("system.erp_dockswitch").equalsIgnoreCase("true")) {
  1045. UploadDataToERP uploadDataToERP = new UploadDataToERP(this, content.getLong("sa_orderitems_changeid"), "订单变更");
  1046. boolean issuccess = uploadDataToERP.upload();
  1047. if (!issuccess) {
  1048. return getErrReturnObject().setErrMsg("上传ERP失败,请检查!").toString();
  1049. } else {
  1050. return getSucReturnObject().toString();
  1051. }
  1052. } else {
  1053. return getErrReturnObject().setErrMsg("erp对接开关未开!").toString();
  1054. }
  1055. }
  1056. /**
  1057. * 获取当前订单的最大行号
  1058. *
  1059. * @param sa_orderid
  1060. * @return
  1061. * @throws YosException
  1062. */
  1063. public Long getRowNo(Long sa_orderid) throws YosException {
  1064. Rows rows = dbConnect.runSqlQuery("SELECT COUNT(0) count from sa_orderitems WHERE sa_orderid = " + sa_orderid + " AND siteid = '" + siteid + "'");
  1065. return rows.get(0).getLong("count") + 1;
  1066. }
  1067. /**
  1068. * 查询商品信息
  1069. *
  1070. * @param itemid
  1071. * @return
  1072. * @throws YosException
  1073. */
  1074. public Row getItemRow(Long itemid) throws YosException {
  1075. SQLFactory sqlFactory = new SQLFactory(this, "查询商品信息");
  1076. sqlFactory.addParameter("siteid", siteid);
  1077. sqlFactory.addParameter("itemid", itemid);
  1078. Rows rows = dbConnect.runSqlQuery(sqlFactory.getSQL(false));
  1079. return rows.isNotEmpty() ? rows.get(0) : new Row();
  1080. }
  1081. /**
  1082. * 重新对商品行排序
  1083. *
  1084. * @param sa_orderid
  1085. * @throws YosException
  1086. */
  1087. public void updateRowNo(Long sa_orderid) throws YosException {
  1088. String sql = "SELECT sa_orderitemsid from sa_orderitems WHERE sa_orderid= " + sa_orderid + " and siteid = '" + siteid + "' ORDER BY createdate ";
  1089. ArrayList<Long> sa_orderitemsids = dbConnect.runSqlQuery(sql).toArrayList("sa_orderitemsid", new ArrayList<>());
  1090. if (sa_orderitemsids.size() > 0) {
  1091. int rowno = 1;
  1092. StringBuffer where = new StringBuffer("");
  1093. for (Long id : sa_orderitemsids) {
  1094. where.append(" WHEN " + id + " THEN " + rowno);
  1095. rowno++;
  1096. }
  1097. SQLFactory sqlFactory = new SQLFactory(this, "更新行号");
  1098. sqlFactory.addParameter("siteid", siteid);
  1099. sqlFactory.addParameter_SQL("where", where);
  1100. sqlFactory.addParameter_in("sa_orderitemsid", sa_orderitemsids);
  1101. sql = sqlFactory.getSQL(false);
  1102. dbConnect.runSqlUpdate(sql);
  1103. }
  1104. }
  1105. }