OrderItems.java 91 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633
  1. package restcontroller.webmanage.sale.order;
  2. import beans.Item.Item;
  3. import beans.attachment.Attachment;
  4. import beans.brand.Brand;
  5. import beans.datacontrllog.DataContrlLog;
  6. import beans.enterprise.Enterprise;
  7. import beans.itemprice.ItemPrice;
  8. import com.alibaba.fastjson2.JSONArray;
  9. import com.alibaba.fastjson2.JSONObject;
  10. import common.Controller;
  11. import common.YosException;
  12. import common.annotation.API;
  13. import common.annotation.CACHEING;
  14. import common.annotation.CACHEING_CLEAN;
  15. import common.data.*;
  16. import org.apache.commons.lang.StringUtils;
  17. import restcontroller.R;
  18. import restcontroller.webmanage.sale.accessoryorder.accessoryorder;
  19. import restcontroller.webmanage.sale.rebate.Rebate;
  20. import restcontroller.webmanage.sale.toolbill.ToolBill;
  21. import utility.ERPDocking;
  22. import java.io.IOException;
  23. import java.math.BigDecimal;
  24. import java.math.RoundingMode;
  25. import java.time.Year;
  26. import java.time.YearMonth;
  27. import java.time.temporal.IsoFields;
  28. import java.util.ArrayList;
  29. import java.util.Date;
  30. import java.util.HashMap;
  31. import static beans.order.Order.*;
  32. /**
  33. * 销售订单商品明细表
  34. */
  35. public class OrderItems extends Controller {
  36. /**
  37. * 构造函数
  38. *
  39. * @param content
  40. */
  41. public OrderItems(JSONObject content) throws YosException {
  42. super(content);
  43. }
  44. @API(title = "新增或更新", apiversion = R.ID20221109093602.v1.class, intervaltime = 200)
  45. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class, ToolBill.class, accessoryorder.class})
  46. public String insertOrUpdate() throws YosException {
  47. Long sa_orderid = content.getLong("sa_orderid");
  48. Long sys_enterpriseid = content.getLong("sys_enterpriseid");
  49. JSONArray items = content.getJSONArray("items");
  50. //辅助类
  51. OrderItemsHelper orderItemsHelper = new OrderItemsHelper(this);
  52. ArrayList<String> sqlList = new ArrayList<>();
  53. Rows orderRows = getOrderRows(this, sa_orderid);
  54. if (orderRows.isEmpty()) {
  55. return getErrReturnObject().setErrMsg("数据不存在,无法添加").toString();
  56. } else {
  57. if (!orderRows.get(0).getString("status").equals("新建") && !orderRows.get(0).getString("status").equals("预提交")) {
  58. return getErrReturnObject().setErrMsg("非新建或预提交状态无法操作").toString();
  59. }
  60. }
  61. //通过版本更新订单表头数据
  62. beans.order.Order.updateOrderWithVersion(this);
  63. String type = orderRows.get(0).getString("type");
  64. Long sa_promotionid = orderRows.get(0).getLong("sa_promotionid");
  65. //查询活动
  66. Rows promotionitems = dbConnect.runSqlQuery("select * from sa_promotion_items where siteid='" + siteid + "' and sa_promotionid=" + sa_promotionid);
  67. //批量查询商品信息
  68. RowsMap itemRowsMap = orderItemsHelper.getItemRowsMap(items);
  69. BigDecimal sumqty = BigDecimal.ZERO;
  70. for (Object obj : items) {
  71. JSONObject item = (JSONObject) obj;
  72. Long itemid = item.getLong("itemid");
  73. Long sa_orderitemsid = item.getLong("sa_orderitemsid");
  74. BigDecimal qty = item.getBigDecimal("qty");
  75. sumqty = sumqty.add(qty);
  76. //商品信息
  77. Row itemRow = getItemRow(itemid);
  78. long width = itemRow.getLong("width");
  79. long length = itemRow.getLong("length");
  80. if (item.containsKey("width")) {
  81. width = Long.parseLong(item.getString("width"));
  82. }
  83. if (item.containsKey("length")) {
  84. length = Long.parseLong(item.getString("length"));
  85. }
  86. if (sa_promotionid > 0 && dbConnect.runSqlQuery("SELECT 1 from sa_promotion_items WHERE islimit=1 and groupqty <= saledqty and sa_promotion_itemsid=" + item.getLong("sa_promotion_itemsid") + " and siteid='" + siteid + "' and sa_promotionid='" + sa_promotionid + "'").isNotEmpty()) {
  87. return getErrReturnObject().setErrMsg("商品【" + itemRow.getString("itemno") + "】已售罄,不能添加。").toString();
  88. }
  89. BigDecimal price1 = new BigDecimal(0);
  90. // SQLFactory sqlFactory = new SQLFactory(this, "订单商品明细_新增");
  91. Boolean isInsert = true;
  92. JSONArray customproperties = new JSONArray();
  93. String spec = "";
  94. if (sa_orderitemsid <= 0) {
  95. //获取定制属性
  96. customproperties = orderItemsHelper.getCustomProperties(itemRowsMap, item);
  97. if (itemRow.getString("iscustomsize").equals("1") && customproperties.isEmpty()) {
  98. return getErrReturnObject().setErrMsg(itemRow.getString("itemno") + "的定制信息为空,无法添加").toString();
  99. }
  100. spec = orderItemsHelper.getCustomSpec(itemRowsMap, item);
  101. Rows rows = dbConnect.runSqlQuery("SELECT sa_orderitemsid,price from sa_orderitems WHERE siteid='" + siteid + "' and itemid=" + itemid + " and sa_orderid=" + sa_orderid + " and sa_promotion_itemsid=" + item.getLongValue("sa_promotion_itemsid"));
  102. if (rows.isEmpty()) {
  103. sa_orderitemsid = createTableID("sa_orderitems");
  104. } else {
  105. //System.out.println(beans.order.Order.getDefaultIsRepeatValue(siteid, type));
  106. if (beans.order.Order.getDefaultIsRepeatValue(siteid, type)) {
  107. sa_orderitemsid = createTableID("sa_orderitems");
  108. isInsert = true;
  109. } else {
  110. price1 = rows.get(0).getBigDecimal("price");
  111. sa_orderitemsid = rows.get(0).getLong("sa_orderitemsid");
  112. isInsert = false;
  113. }
  114. }
  115. } else {
  116. Rows rows = dbConnect.runSqlQuery("SELECT sa_orderitemsid,price from sa_orderitems WHERE siteid='" + siteid + "' and sa_orderitemsid=" + sa_orderitemsid);
  117. if (rows.isNotEmpty()) {
  118. price1 = rows.get(0).getBigDecimal("price");
  119. }
  120. isInsert = false;
  121. }
  122. if (!isInsert) {
  123. if (dbConnect.runSqlQuery("SELECT 1 from sa_orderitems WHERE itemid=" + itemid + " and sa_orderid=" + sa_orderid + " and siteid='" + siteid + "'").isEmpty()) {
  124. continue;
  125. }
  126. }
  127. //是否符合商品起订量和增量判断
  128. orderItemsHelper.compareQty(type, itemRowsMap, item, itemRow, promotionitems);
  129. BigDecimal defaultprice;
  130. BigDecimal price;
  131. BigDecimal saleprice;
  132. BigDecimal custamount = new BigDecimal(0);
  133. BigDecimal rwpricerate = new BigDecimal(1);
  134. BigDecimal pricerate = new BigDecimal(1);
  135. SQLFactory sqlFactory = new SQLFactory(this, "商品等级价格查询");
  136. sqlFactory.addParameter("siteid", siteid);
  137. sqlFactory.addParameter("itemid", itemid);
  138. sqlFactory.addParameter("sys_enterpriseid", sys_enterpriseid);
  139. Rows rows = dbConnect.runSqlQuery(sqlFactory.getSQL());
  140. if (rows.isNotEmpty()) {
  141. pricerate = rows.get(0).getBigDecimal("discountrate");
  142. //如果折扣率为0,则默认按照1计算
  143. pricerate = (pricerate.compareTo(BigDecimal.ZERO) == 0 ? new BigDecimal(1) : pricerate);
  144. }
  145. custamount = item.getBigDecimal("custamount");
  146. int year = Year.now().getValue();
  147. int quarter = YearMonth.now().get(IsoFields.QUARTER_OF_YEAR);
  148. Rows custamountrows = dbConnect.runSqlQuery("select * from sa_agents where sys_enterpriseid=" + sys_enterpriseid + " and siteid='" + siteid + "'");
  149. if (!custamountrows.isEmpty()) {
  150. if (custamountrows.get(0).getInteger("year") == year && custamountrows.get(0).getInteger("quarter") == quarter) {
  151. if (custamountrows.get(0).getBigDecimal("pricerate").compareTo(BigDecimal.ZERO) > 0) {
  152. rwpricerate = custamountrows.get(0).getBigDecimal("pricerate");
  153. }
  154. }
  155. }
  156. //价格
  157. ItemPrice itemPrice = ItemPrice.getItemPrice(this, sys_enterpriseid, itemid);
  158. price = orderItemsHelper.getPrice(orderRows.get(0), itemPrice, item);
  159. saleprice = orderItemsHelper.getSalePrice(orderRows.get(0), itemPrice, item, itemRowsMap);
  160. if (price.compareTo(BigDecimal.ZERO) < 0) {
  161. return getErrReturnObject().setErrMsg("价格不可小于0").toString();
  162. }
  163. defaultprice = price.multiply(rwpricerate);
  164. if (isInsert) {
  165. price = price.multiply(rwpricerate).add(custamount);
  166. sqlList.add(orderItemsHelper.getInsertSQL(customproperties, sa_orderitemsid, item, itemRow, type, defaultprice, price, saleprice, itemPrice.getMarketprice(), spec, promotionitems, width, length, custamount, rwpricerate, pricerate).getSQL());
  167. if (item.getLongValue("sa_workorderid") != 0) {
  168. sqlList.add("update sa_workorder_node_items set sourceid=" + sa_orderid + ",sourcetable='sa_order' where sa_workorderid=" + item.getLongValue("sa_workorderid") + " and itemid=" + item.getLong("itemid"));
  169. }
  170. } else {
  171. price = price.multiply(rwpricerate).add(item.getBigDecimal("custamount"));
  172. if(item.containsKey("defaultprice")){
  173. defaultprice=item.getBigDecimal("defaultprice");
  174. price = defaultprice.multiply(pricerate).add(custamount);
  175. }
  176. sqlList.add(orderItemsHelper.getUpdateSQL(sa_orderitemsid, item, itemRow, type, defaultprice, price, saleprice, width, length).getSQL());
  177. }
  178. }
  179. if (type.equals("促销订单")) {
  180. Rows promotionRows = dbConnect.runSqlQuery("select * from sa_promotion where siteid='" + siteid + "' and sa_promotionid=" + sa_promotionid);
  181. if (!promotionRows.isEmpty()) {
  182. if (promotionRows.get(0).getString("type").equals("打包促销")) {
  183. BigDecimal orderaddqty = promotionRows.get(0).getBigDecimal("orderaddqty");
  184. BigDecimal orderminqty = promotionRows.get(0).getBigDecimal("orderminqty");
  185. if (((sumqty.subtract(orderminqty)).remainder(orderaddqty)).compareTo(BigDecimal.ZERO) != 0 || sumqty.compareTo(orderminqty) < 0) {
  186. return getErrReturnObject().setErrMsg("不符合促销活动订购数量规则,修改不成功").toString();
  187. }
  188. }
  189. }
  190. }
  191. dbConnect.runSqlUpdate(sqlList);
  192. //重新排序
  193. updateRowNo(sa_orderid);
  194. //居间费设置
  195. updateRebateFee(sa_orderid);
  196. //调整价格(返利金)
  197. if (orderRows.get(0).getBoolean("rebate_used")) {
  198. setRebateAmount(this, sa_orderid, getMaxUsedRebateAmount(this, sa_orderid));
  199. adjustLastRebateAmount(this, sa_orderid);
  200. }
  201. //更新订单扣款信息
  202. updateAccountclassinfos(sa_orderid);
  203. //查询商品费用方案方法
  204. orderItemsHelper.executeDataFunction(sa_orderid);
  205. //生成摘要
  206. SQLFactory sqlFactory = new SQLFactory(this, "查询定制费用统计");
  207. sqlFactory.addParameter("sa_orderid", sa_orderid);
  208. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  209. if (rows.isNotEmpty()) {
  210. String remarks = StringUtils.join(rows.toArray("remarks"), ";");
  211. dbConnect.runSqlUpdate("UPDATE sa_order set abstract ='" + remarks + "' WHERE sa_orderid='" + sa_orderid + "'");
  212. } else {
  213. dbConnect.runSqlUpdate("UPDATE sa_order set abstract ='' WHERE sa_orderid='" + sa_orderid + "'");
  214. }
  215. if (systemclient.equalsIgnoreCase("wechatsaletool")) {
  216. rows = dbConnect.runSqlQuery("SELECT sa_orderitemsid,sa_orderitems_v,itemid from sa_orderitems WHERE sa_orderid=" + sa_orderid + " and siteid='" + siteid + "'");
  217. return getSucReturnObject().setData(rows).toString();
  218. }
  219. if(type.equals("配件订单")){
  220. dbConnect.runSqlUpdate("UPDATE sa_order o JOIN (SELECT sa_orderid,GROUP_CONCAT(DISTINCT delivery SEPARATOR '+') AS delivery FROM sa_orderitems where sa_orderid="+sa_orderid+" GROUP BY sa_orderid) od ON o.sa_orderid = od.sa_orderid SET o.delivery = od.delivery ");
  221. }
  222. sqlList=new ArrayList<>();
  223. if (type.equals("配件订单")) {
  224. Rows rowsdetails = dbConnect.runSqlQuery("select t1.price,t1.amount,t1.sa_orderitemsid,t1.itemid,ifnull(t2.iswriteoff,0) iswriteoff,t3.begdate,t3.enddate from sa_orderitems t1 " +
  225. "left join plm_item t2 on t1.itemid=t2.itemid and t1.siteid=t2.siteid " +
  226. "left join sa_warrantycard t3 on t1.cardno=t3.cardno and t1.siteid=t3.siteid and t3.isvoid=0 and t3.deleted=0 where t1.sa_orderid=" + sa_orderid);
  227. for (Row rowsdetail : rowsdetails) {
  228. String billingstatus = "";
  229. BigDecimal price = rowsdetail.getBigDecimal("price");
  230. BigDecimal amount = rowsdetail.getBigDecimal("amount");
  231. String begdate = rowsdetail.getString("begdate");
  232. String enddate = rowsdetail.getString("enddate");
  233. if (StringUtils.isBlank(begdate) || StringUtils.isBlank(enddate)) {
  234. billingstatus = "保外收费";
  235. } else {
  236. Date date = new Date();
  237. if (date.before(rowsdetail.getDate("enddate"))) {
  238. if (rowsdetail.getBoolean("iswriteoff")) {
  239. billingstatus = "保内收费";
  240. } else {
  241. billingstatus = "保内免费";
  242. price = BigDecimal.ZERO;
  243. amount = BigDecimal.ZERO;
  244. }
  245. }else{
  246. billingstatus = "保外收费";
  247. }
  248. }
  249. if(!billingstatus.equals("保内收费")){
  250. sqlList.add("update sa_orderitems set canoffqty=0 where sa_orderitemsid=" + rowsdetail.getLong("sa_orderitemsid"));
  251. }
  252. sqlList.add("update sa_orderitems set price=" + price + ",amount=" + amount + ",billingstatus='" + billingstatus + "' where sa_orderitemsid=" + rowsdetail.getLong("sa_orderitemsid"));
  253. }
  254. }
  255. dbConnect.runSqlUpdate(sqlList);
  256. return getSucReturnObject().toString();
  257. }
  258. @API(title = "更新可核销数", apiversion = R.ID2025111710122903.v1.class)
  259. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class, ToolBill.class, accessoryorder.class})
  260. public String updatecanoffqty() throws YosException {
  261. Long sa_orderid = content.getLong("sa_orderid");
  262. Long sa_orderitemsid = content.getLong("sa_orderitemsid");
  263. BigDecimal canoffqty = content.getBigDecimal("canoffqty");
  264. Rows orderRows = dbConnect.runSqlQuery("SELECT status,sonum,type from sa_order WHERE sa_orderid=" + sa_orderid + " and siteid='" + siteid + "'");
  265. Rows orderitemsRows = dbConnect.runSqlQuery("SELECT sa_orderitemsid,qty,billingstatus,rowno from sa_orderitems WHERE sa_orderid=" + sa_orderid + " and sa_orderitemsid='" + sa_orderitemsid + "'");
  266. if(orderRows.isEmpty()){
  267. return getErrReturnObject().setErrMsg("配件订单不存在").toString();
  268. }
  269. if(!orderRows.get(0).getString("type").equals("配件订单")){
  270. return getErrReturnObject().setErrMsg("非配件订单无法更新可核销数").toString();
  271. }
  272. if(orderRows.get(0).getString("status").equals("审核")){
  273. return getErrReturnObject().setErrMsg("配件订单【"+orderRows.get(0).getString("sonum")+"】已审核,无法更新可核销数").toString();
  274. }
  275. if(orderitemsRows.isEmpty()){
  276. return getErrReturnObject().setErrMsg("订单明细不存在").toString();
  277. }
  278. if(!orderitemsRows.get(0).getString("billingstatus").equals("保内收费")){
  279. return getErrReturnObject().setErrMsg("行号【"+orderitemsRows.get(0).getString("rowno")+"】为非保内收费配件,无法更新可核销数").toString();
  280. }
  281. if(orderitemsRows.get(0).getBigDecimal("qty").compareTo(canoffqty)<0){
  282. return getErrReturnObject().setErrMsg("可核销数不可大于商品明细行数量").toString();
  283. }
  284. dbConnect.runSqlUpdate("update sa_orderitems set canoffqty="+canoffqty+" where sa_orderitemsid="+sa_orderitemsid);
  285. return getSucReturnObject().toString();
  286. }
  287. @API(title = "查询订单重复商品", apiversion = R.ID2024020201095102.v1.class)
  288. public String get() throws YosException {
  289. Long sa_orderid = content.getLongValue("sa_orderid");
  290. JSONArray items = content.getJSONArray("items");
  291. OrderItemsHelper orderItemsHelper = new OrderItemsHelper(this);
  292. //批量查询商品信息
  293. RowsMap itemRowsMap = orderItemsHelper.getItemRowsMap(items);
  294. Rows rows = new Rows();
  295. for (Object obj : items) {
  296. JSONObject item = (JSONObject) obj;
  297. Long itemid = item.getLongValue("itemid");
  298. JSONArray customproperties = new JSONArray();
  299. customproperties = orderItemsHelper.getCustomProperties(itemRowsMap, item);
  300. String custompropertie = customproperties.toJSONString().replace("[", "").replace("]", "").replace("\"", "");
  301. Rows temprows = dbConnect.runSqlQuery("SELECT itemname from sa_orderitems WHERE sa_orderid=" + sa_orderid + " and siteid='" + siteid + "' and itemid=" + itemid + " and ifnull(customproperties,'')='" + custompropertie + "'");
  302. rows.addAll(temprows);
  303. }
  304. Rows orderRows = beans.order.Order.getOrderRows(this, sa_orderid);
  305. String type = orderRows.get(0).getString("type");
  306. Row resRow = new Row();
  307. resRow.put("items", rows);
  308. resRow.put("isrepeat", beans.order.Order.getDefaultIsRepeatValue(siteid, type));
  309. return getSucReturnObject().setData(resRow).toString();
  310. }
  311. /**
  312. * 更新订单扣款信息
  313. */
  314. public String updateAccountclassinfos(Long sa_orderid) throws YosException {
  315. Rows orderRows = getOrderRows(this, sa_orderid);
  316. if (orderRows.isEmpty()) {
  317. return "订单不存在";
  318. }
  319. String type = "";
  320. Rows promotionrows = dbConnect.runSqlQuery("select * from sa_promotion where siteid='" + siteid + "' and sa_promotionid=" + orderRows.get(0).getLong("sa_promotionid"));
  321. Rows promotionenterpriserows = dbConnect.runSqlQuery("select * from sa_promotion_auth where siteid='" + siteid + "'and sys_enterpriseid=" + orderRows.get(0).getLong("pay_enterpriseid") + " and sa_promotionid=" + orderRows.get(0).getLong("sa_promotionid"));
  322. if (promotionrows.isNotEmpty()) {
  323. type = promotionrows.get(0).getString("type");
  324. }
  325. JSONArray jsonArray = new JSONArray();
  326. BigDecimal orderamount = getAmount(this, sa_orderid);
  327. //System.out.println(orderamount);
  328. Rows accountclassrows = dbConnect.runSqlQuery("select t1.*,ifnull(t2.balance,0) balance,ifnull(t2.creditquota,0) creditquota from sa_accountclass t1 left join sa_accountbalance t2 on t1.sa_accountclassid=t2.sa_accountclassid and t1.siteid=t2.siteid and t2.sys_enterpriseid=" + orderRows.get(0).getLong("pay_enterpriseid") + " where isused=1 and t1.siteid='" + siteid + "' and t1.sa_accountclassid=" + orderRows.get(0).getLong("sa_accountclassid"));
  329. if (accountclassrows.isEmpty()) {
  330. return "未找到扣款账户";
  331. }
  332. JSONObject jsonObject = new JSONObject();
  333. if (type.equals("返利促销")) {
  334. BigDecimal associationamount = promotionrows.get(0).getBigDecimal("associationamount");
  335. long associationaccountclassid = promotionrows.get(0).getLong("associationaccountclassid");
  336. Rows associationaccountclassrows = dbConnect.runSqlQuery("select t1.*,ifnull(t2.balance,0) balance,ifnull(t2.creditquota,0) creditquota from sa_accountclass t1 left join sa_accountbalance t2 on t1.sa_accountclassid=t2.sa_accountclassid and t1.siteid=t2.siteid and t2.sys_enterpriseid=" + orderRows.get(0).getLong("pay_enterpriseid") + " where isused=1 and t1.siteid='" + siteid + "' and t1.sa_accountclassid=" + associationaccountclassid);
  337. if (promotionenterpriserows.isNotEmpty()) {
  338. if (promotionenterpriserows.get(0).getBoolean("islimit")) {
  339. BigDecimal limitamount = promotionenterpriserows.get(0).getBigDecimal("limitamount");
  340. BigDecimal saledamount = promotionenterpriserows.get(0).getBigDecimal("saledamount");
  341. if (orderamount.compareTo(limitamount.subtract(saledamount)) <= 0) {
  342. //全部优先账户扣款
  343. jsonObject.put("amount", orderamount);
  344. jsonObject.put("sa_accountclassid", accountclassrows.get(0).getLong("sa_accountclassid"));
  345. jsonObject.put("accountname", accountclassrows.get(0).getString("accountname"));
  346. jsonObject.put("balance", accountclassrows.get(0).getBigDecimal("balance"));
  347. jsonObject.put("creditquota", accountclassrows.get(0).getBigDecimal("creditquota"));
  348. jsonArray.add(jsonObject);
  349. } else if (orderamount.compareTo(limitamount.subtract(saledamount)) > 0) {
  350. //全部优先账户扣款
  351. jsonObject.put("amount", limitamount.subtract(saledamount));
  352. jsonObject.put("sa_accountclassid", accountclassrows.get(0).getLong("sa_accountclassid"));
  353. jsonObject.put("accountname", accountclassrows.get(0).getString("accountname"));
  354. jsonObject.put("balance", accountclassrows.get(0).getBigDecimal("balance"));
  355. jsonObject.put("creditquota", accountclassrows.get(0).getBigDecimal("creditquota"));
  356. jsonArray.add(jsonObject);
  357. JSONObject associationjsonObject = new JSONObject();
  358. associationjsonObject.put("amount", orderamount.subtract((limitamount.subtract(saledamount))));
  359. associationjsonObject.put("sa_accountclassid", associationaccountclassrows.get(0).getLong("sa_accountclassid"));
  360. associationjsonObject.put("accountname", associationaccountclassrows.get(0).getString("accountname"));
  361. associationjsonObject.put("balance", associationaccountclassrows.get(0).getBigDecimal("balance"));
  362. associationjsonObject.put("creditquota", associationaccountclassrows.get(0).getBigDecimal("creditquota"));
  363. jsonArray.add(associationjsonObject);
  364. } else {
  365. return "未知错误,请联系管理员";
  366. }
  367. }
  368. } else {
  369. //全部优先账户扣款
  370. jsonObject.put("amount", orderamount);
  371. jsonObject.put("sa_accountclassid", accountclassrows.get(0).getLong("sa_accountclassid"));
  372. jsonObject.put("accountname", accountclassrows.get(0).getString("accountname"));
  373. jsonObject.put("balance", accountclassrows.get(0).getBigDecimal("balance"));
  374. jsonObject.put("creditquota", accountclassrows.get(0).getBigDecimal("creditquota"));
  375. jsonArray.add(jsonObject);
  376. }
  377. } else {
  378. //全部优先账户扣款
  379. jsonObject.put("amount", orderamount);
  380. jsonObject.put("sa_accountclassid", accountclassrows.get(0).getLong("sa_accountclassid"));
  381. jsonObject.put("accountname", accountclassrows.get(0).getString("accountname"));
  382. jsonObject.put("balance", accountclassrows.get(0).getBigDecimal("balance"));
  383. jsonObject.put("creditquota", accountclassrows.get(0).getBigDecimal("creditquota"));
  384. jsonArray.add(jsonObject);
  385. }
  386. //System.out.println(jsonArray.toJSONString());
  387. dbConnect.runSqlUpdate("update sa_order set sa_accountclassinfos='" + jsonArray + "' where sa_orderid=" + sa_orderid + " and siteid='" + siteid + "'");
  388. return "true";
  389. }
  390. /**
  391. * 更新居间费信息
  392. */
  393. public void updateRebateFee(Long sa_orderid) throws YosException {
  394. Rows orderRows = getOrderRows(this, sa_orderid);
  395. if (orderRows.isEmpty()) {
  396. return;
  397. }
  398. Long sa_projectid = orderRows.get(0).getLong("sa_projectid");
  399. Rows contractRows = dbConnect.runSqlQuery("SELECT * from sa_contract WHERE sa_projectid = " + sa_projectid + " and type='居间' and status='审核'");
  400. if (contractRows.isEmpty()) {
  401. return;
  402. }
  403. Long sa_contractid = contractRows.get(0).getLong("sa_contractid");
  404. Rows partiesRows = dbConnect.runSqlQuery("SELECT sys_enterpriseid from sa_project_parties WHERE type ='居间服务商' and sa_projectid = " + sa_projectid + " and siteid ='" + siteid + "'");
  405. if (partiesRows.isEmpty()) {
  406. return;
  407. }
  408. Long sys_enterpriseid_temp = partiesRows.get(0).getLong("sys_enterpriseid");
  409. content.put("sys_enterpriseid", sys_enterpriseid_temp);
  410. content.put("ownertable", "sa_order");
  411. content.put("ownerid", sa_orderid);
  412. content.put("billdate", "");
  413. content.put("remarks", "");
  414. content.put("sa_contractid", sa_contractid);
  415. content.put("settlementmode", "线上");
  416. content.put("sa_rebatesettlementid", 0);
  417. new Rebate(content).insertOrUpdate();
  418. }
  419. @API(title = "详情", apiversion = R.ID20221110134302.v1.class)
  420. @CACHEING
  421. public String selectDetail() throws YosException {
  422. Long sa_orderitemsid = content.getLong("sa_orderitemsid");
  423. SQLFactory sqlFactory = new SQLFactory(this, "订单商品明细_详情");
  424. sqlFactory.addParameter("siteid", siteid);
  425. sqlFactory.addParameter_in("sa_orderitemsid", sa_orderitemsid);
  426. String sql = sqlFactory.getSQL();
  427. Rows rows = dbConnect.runSqlQuery(sql);
  428. Row row = rows.isNotEmpty() ? rows.get(0) : new Row();
  429. return getSucReturnObject().setData(row).toString();
  430. }
  431. @API(title = "删除", apiversion = R.ID20221109093702.v1.class)
  432. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class, ToolBill.class, accessoryorder.class})
  433. public String delete() throws YosException {
  434. Long sa_orderid = content.getLong("sa_orderid");
  435. Rows orderRows = getOrderRows(this, sa_orderid);
  436. if (orderRows.isEmpty()) {
  437. return getErrReturnObject().setErrMsg("数据不存在,无法添加").toString();
  438. } else {
  439. if (!orderRows.get(0).getString("status").equals("新建")) {
  440. return getErrReturnObject().setErrMsg("非新建状态无法删除").toString();
  441. }
  442. }
  443. //通过版本更新订单表头数据
  444. beans.order.Order.updateOrderWithVersion(this);
  445. JSONArray sa_orderitemsids = content.getJSONArray("sa_orderitemsids");
  446. String packagetypemxsql = "select t1.sa_orderitemsid from sa_orderitems t1 inner join sa_promotion_items t2 on t1.sa_promotion_itemsid=t2.sa_promotion_itemsid and t1.siteid=t2.siteid where t1.siteid='" + siteid + "' and t1.sa_orderid in(select sa_orderid from sa_orderitems where sa_orderitemsid in" + sa_orderitemsids.toJSONString() + ") and t2.packagetypemx in(select distinct t2.packagetypemx from sa_orderitems t1 inner join sa_promotion_items t2 on t1.sa_promotion_itemsid=t2.sa_promotion_itemsid and t1.siteid=t2.siteid where t1.siteid='" + siteid + "' and t1.sa_orderitemsid in" + sa_orderitemsids.toJSONString() + " and ifnull(t2.packagetypemx,'')!='')";
  447. packagetypemxsql = packagetypemxsql.replace("[", "(").replace("]", ")");
  448. Rows packagetypemxrows = dbConnect.runSqlQuery(packagetypemxsql);
  449. sa_orderitemsids.addAll(packagetypemxrows.toJsonArray("sa_orderitemsid"));
  450. String sqldetail = "select sa_workorderid,itemid from sa_orderitems where siteid='" + siteid + "' and sa_orderitemsid in" + sa_orderitemsids.toJSONString();
  451. sqldetail = sqldetail.replace("[", "(").replace("]", ")");
  452. Rows rowsdetail = dbConnect.runSqlQuery(sqldetail);
  453. for (Row row : rowsdetail) {
  454. if (row.getLong("sa_workorderid") != 0) {
  455. dbConnect.runSqlUpdate("update sa_workorder_node_items set sourceid=0,sourcetable='' where sa_workorderid=" + row.getLong("sa_workorderid") + " and itemid=" + row.getLong("itemid"));
  456. }
  457. }
  458. SQLFactory sqlFactory = new SQLFactory(this, "订单商品明细_删除");
  459. sqlFactory.addParameter("siteid", siteid);
  460. sqlFactory.addParameter("sa_orderid", sa_orderid);
  461. sqlFactory.addParameter_in("sa_orderitemsid", sa_orderitemsids.toArray());
  462. String sql = sqlFactory.getSQL();
  463. dbConnect.runSqlUpdate(sql);
  464. // DeleteSQL deleteSQL = SQLFactory.createDeleteSQL(this, "sa_order_cost");
  465. // deleteSQL.setSiteid(siteid);
  466. // deleteSQL.setWhere("sa_orderitemsid", sa_orderitemsids.toArray());
  467. // deleteSQL.delete();
  468. //重新排序
  469. updateRowNo(sa_orderid);
  470. //居间费设置
  471. updateRebateFee(sa_orderid);
  472. //调整价格(返利金)
  473. if (orderRows.get(0).getBoolean("rebate_used")) {
  474. setRebateAmount(this, sa_orderid, getMaxUsedRebateAmount(this, sa_orderid));
  475. adjustLastRebateAmount(this, sa_orderid);
  476. }
  477. // else {
  478. // dbConnect.runSqlUpdate("UPDATE sa_orderitems SET amount=amount-rebateamount,price=amount/qty WHERE sa_orderid='" + sa_orderid + "' and siteid='" + siteid + "' and qty!=0");
  479. // dbConnect.runSqlUpdate("UPDATE sa_orderitems SET amount=0 WHERE sa_orderid='" + sa_orderid + "' and siteid='" + siteid + "' and qty=0");
  480. // }
  481. updateAccountclassinfos(sa_orderid);
  482. new OrderItemsHelper(this).executeDataFunction(sa_orderid);
  483. //生成摘要
  484. sqlFactory = new SQLFactory(this, "查询定制费用统计");
  485. sqlFactory.addParameter("sa_orderid", sa_orderid);
  486. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  487. if (rows.isNotEmpty()) {
  488. String remarks = StringUtils.join(rows.toArray("remarks"), ";");
  489. dbConnect.runSqlUpdate("UPDATE sa_order set abstract ='" + remarks + "' WHERE sa_orderid='" + sa_orderid + "'");
  490. } else {
  491. dbConnect.runSqlUpdate("UPDATE sa_order set abstract ='' WHERE sa_orderid='" + sa_orderid + "'");
  492. }
  493. return getSucReturnObject().toString();
  494. }
  495. @API(title = "商品行冻结", apiversion = R.ID20230508093003.v1.class)
  496. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class, ToolBill.class, accessoryorder.class})
  497. public String freeze() throws YosException {
  498. Long sa_orderid = content.getLong("sa_orderid");
  499. //通过版本更新订单表头数据
  500. beans.order.Order.updateOrderWithVersion(this);
  501. JSONArray sa_orderitemsids = content.getJSONArray("sa_orderitemsids");
  502. boolean isfreeze = content.getBooleanValue("isfreeze");
  503. Rows orderRows = dbConnect.runSqlQuery("select * from sa_order where sa_orderid=" + sa_orderid + " and siteid='" + siteid + "'");
  504. if (!orderRows.isEmpty()) {
  505. if (!orderRows.get(0).getString("status").equals("审核")) {
  506. if (isfreeze) {
  507. return getErrReturnObject().setErrMsg("非审核状态无法进行冻结").toString();
  508. } else {
  509. return getErrReturnObject().setErrMsg("非审核状态无法进行反冻结").toString();
  510. }
  511. }
  512. } else {
  513. return getErrReturnObject().setErrMsg("该订单不存在").toString();
  514. }
  515. SQLFactory sqlFactory;
  516. if (isfreeze) {
  517. sqlFactory = new SQLFactory(this, "订单商品明细_冻结");
  518. } else {
  519. sqlFactory = new SQLFactory(this, "订单商品明细_反冻结");
  520. }
  521. sqlFactory.addParameter("siteid", siteid);
  522. sqlFactory.addParameter_in("sa_orderitemsid", sa_orderitemsids.toArray());
  523. String sql = sqlFactory.getSQL();
  524. //System.out.println(sql);
  525. dbConnect.runSqlUpdate(sql);
  526. return getSucReturnObject().toString();
  527. }
  528. @API(title = "商品行折扣变更", apiversion = R.ID20230508101703.v1.class)
  529. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class, ToolBill.class, accessoryorder.class})
  530. public String updateOrderItemsDiscountrate() throws YosException {
  531. Long sa_orderid = content.getLong("sa_orderid");
  532. BigDecimal discountrate = content.getBigDecimal("discountrate");
  533. JSONArray itemids = content.getJSONArray("itemids");
  534. Rows orderRows = dbConnect.runSqlQuery("select * from sa_order where sa_orderid=" + sa_orderid + " and siteid='" + siteid + "'");
  535. if (!orderRows.isEmpty()) {
  536. if (!orderRows.get(0).getString("status").equals("新建") && !orderRows.get(0).getString("status").equals("预提交")) {
  537. return getErrReturnObject().setErrMsg("非新建或预提交状态无法进行商品行折扣变更").toString();
  538. }
  539. } else {
  540. return getErrReturnObject().setErrMsg("该订单不存在").toString();
  541. }
  542. if (!(discountrate.compareTo(BigDecimal.ZERO) > 0 && discountrate.compareTo(new BigDecimal(1)) <= 0)) {
  543. return getErrReturnObject().setErrMsg("折扣必须在0-100之间").toString();
  544. }
  545. //通过版本更新订单表头数据
  546. beans.order.Order.updateOrderWithVersion(this);
  547. String sql;
  548. if (itemids.size() == 0) {
  549. sql = "select * from sa_orderitems where sa_orderid=" + sa_orderid + " and siteid='" + siteid + "'";
  550. } else {
  551. sql = "select * from sa_orderitems where sa_orderid=" + sa_orderid + " and siteid='" + siteid + "' and itemid in " + itemids.toJSONString();
  552. sql = sql.replace("[", "(").replace("]", ")");
  553. }
  554. Rows orderItemsRows = dbConnect.runSqlQuery(sql);
  555. ArrayList<String> sqlList = new ArrayList<>();
  556. if (!orderItemsRows.isEmpty()) {
  557. for (Row row : orderItemsRows) {
  558. BigDecimal price = row.getBigDecimal("price").multiply(discountrate);
  559. BigDecimal amount = row.getBigDecimal("amount").multiply(discountrate);
  560. sqlList.add("update sa_orderitems set price=" + price + ",amount=" + amount + " where sa_orderitemsid=" + row.getLong("sa_orderitemsid"));
  561. }
  562. }
  563. sqlList.add(DataContrlLog.createLog(this, "sa_order", sa_orderid, "订单整单折扣变更【" + discountrate + "】", "整单折扣").getSQL());
  564. dbConnect.runSqlUpdate(sqlList);
  565. updateAccountclassinfos(sa_orderid);
  566. return getSucReturnObject().toString();
  567. }
  568. @API(title = "商品行价格刷新(变为原价)", apiversion = R.ID20230518151803.v1.class)
  569. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class, ToolBill.class, accessoryorder.class})
  570. public String updateOrderItemsPrice() throws YosException {
  571. Long sa_orderid = content.getLong("sa_orderid");
  572. JSONArray itemids = content.getJSONArray("itemids");
  573. Rows orderRows = dbConnect.runSqlQuery("select * from sa_order where sa_orderid=" + sa_orderid + " and siteid='" + siteid + "'");
  574. if (!orderRows.isEmpty()) {
  575. if (!orderRows.get(0).getString("status").equals("新建") && !orderRows.get(0).getString("status").equals("预提交")) {
  576. return getErrReturnObject().setErrMsg("非新建或预提交状态无法进行商品行价格刷新").toString();
  577. }
  578. } else {
  579. return getErrReturnObject().setErrMsg("该订单不存在").toString();
  580. }
  581. //通过版本更新订单表头数据
  582. beans.order.Order.updateOrderWithVersion(this);
  583. String sql;
  584. if (itemids.size() == 0) {
  585. sql = "select * from sa_orderitems where sa_orderid=" + sa_orderid + " and siteid='" + siteid + "'";
  586. } else {
  587. sql = "select * from sa_orderitems where sa_orderid=" + sa_orderid + " and siteid='" + siteid + "' and itemid in " + itemids.toJSONString();
  588. sql = sql.replace("[", "(").replace("]", ")");
  589. }
  590. Rows orderItemsRows = dbConnect.runSqlQuery(sql);
  591. ArrayList<String> sqlList = new ArrayList<>();
  592. if (!orderItemsRows.isEmpty()) {
  593. for (Row row : orderItemsRows) {
  594. //价格
  595. ItemPrice itemPrice = ItemPrice.getItemPrice(this, orderRows.get(0).getLong("sys_enterpriseid"), row.getLong("itemid"));
  596. BigDecimal price = itemPrice.getPrice();
  597. BigDecimal amount = row.getBigDecimal("qty").multiply(price);
  598. sqlList.add("update sa_orderitems set price=" + price + ",amount=" + amount + " where sa_orderitemsid=" + row.getLong("sa_orderitemsid"));
  599. }
  600. }
  601. sqlList.add(DataContrlLog.createLog(this, "sa_order", sa_orderid, "订单商品行价格刷新(恢复原价)", "订单商品行价格刷新").getSQL());
  602. dbConnect.runSqlUpdate(sqlList);
  603. updateAccountclassinfos(sa_orderid);
  604. return getSucReturnObject().toString();
  605. }
  606. @API(title = "查询列表", apiversion = R.ID20221109093902.v1.class)
  607. public String selectList() throws YosException, IOException {
  608. Long sa_orderid = content.getLong("sa_orderid");
  609. Rows orderRows = getOrderRows(this, sa_orderid);
  610. if (orderRows.isNotEmpty()) {
  611. sys_enterpriseid = orderRows.get(0).getLong("sys_enterpriseid");
  612. }
  613. Long sa_promotionid = orderRows.get(0).getLong("sa_promotionid");//大于0表示为促销订单
  614. String type = orderRows.get(0).getString("type");//订单类型
  615. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sa_orderitems", "*");
  616. querySQL.setTableAlias("t1");
  617. querySQL.addJoinTable(JOINTYPE.left, "st_invbal_sale", "t2", "t2.siteid = t1.siteid AND t2.itemid = t1.itemid", "cansaleqty", "candispatchqty");
  618. querySQL.addJoinTable(JOINTYPE.left, "plm_item", "t3", "t3.itemid = t1.itemid and t3.siteid = t1.siteid", "orderminqty_auxunit", "orderaddqty_auxunit", "spec", "iscustomsize", "widthschemeid", "lengthschemeid", "standards", "k3outcode","outplace","aftersalesitemno");
  619. if (sa_promotionid > 0) {
  620. querySQL.addJoinTable(JOINTYPE.left, "sa_promotion_items", "t4", "t4.sa_promotion_itemsid = t1.sa_promotion_itemsid and t4.siteid = t1.siteid and t4.sa_promotionid=" + sa_promotionid, "packagetypemx", "saledqty", "groupqty");
  621. }
  622. if (type.equals("配件订单")) {
  623. querySQL.addJoinTable(JOINTYPE.left, "sa_workorder", "t5", "t1.sa_workorderid=t5.sa_workorderid and t1.siteid=t5.siteid");
  624. querySQL.addJoinTable(JOINTYPE.left, "sa_warrantycard", "t6", "t6.cardno=t1.cardno and t6.siteid=t1.siteid", "sku");
  625. querySQL.addJoinTable(JOINTYPE.left, "plm_item", "t7", "t7.itemid=t6.itemid and t7.siteid=t6.siteid");
  626. }
  627. querySQL.addQueryFields("candispatchqty", "ifnull(t2.candispatchqty, 0)");
  628. querySQL.addQueryFields("cansaleqty", "ifnull(t2.cansaleqty, 0)");
  629. querySQL.addQueryFields("totalaty", "ifnull(t2.qty, 0)");
  630. querySQL.addQueryFields("stockstatus", "(SELECT (CASE WHEN t2.cansaleqty>=t3.stockstatus1 THEN '充足' WHEN t2.cansaleqty<=t3.stockstatus2 THEN '缺货' ELSE '紧缺' END))");
  631. if (sa_promotionid > 0) {
  632. querySQL.addQueryFields("packageqty", "ifnull(t4.packageqty, 0)");
  633. querySQL.addQueryFields("orderaddqty", "t4.orderaddqty");
  634. querySQL.addQueryFields("orderminqty", "t4.orderminqty");
  635. } else {
  636. querySQL.addQueryFields("packageqty", "ifnull(t3.packageqty, 0)");
  637. querySQL.addQueryFields("orderaddqty", "t3.orderaddqty");
  638. querySQL.addQueryFields("orderminqty", "t3.orderminqty");
  639. }
  640. querySQL.addQueryFields("itemdelivery", "ifnull(t3.delivery, 0)");
  641. if (type.equals("配件订单")) {
  642. querySQL.addQueryFields("workorderbillno", "t5.billno");
  643. querySQL.addQueryFields("workorderdate", "t5.createdate");
  644. querySQL.addQueryFields("workorderstatus", "t5.status");
  645. querySQL.addQueryFields("cardname", "t6.name");
  646. querySQL.addQueryFields("cardphonenumber", "t6.phonenumber");
  647. querySQL.addQueryFields("cardbegdate", "t6.begdate");
  648. querySQL.addQueryFields("cardenddate", "t6.enddate");
  649. querySQL.addQueryFields("machineitemno", "t7.itemno");
  650. querySQL.addQueryFields("machineitemname", "t7.itemname");
  651. querySQL.addQueryFields("machinemodel", "t7.model");
  652. querySQL.addQueryFields("machinespec", "t7.spec");
  653. querySQL.addQueryFields("warrantystatus", "CASE WHEN ifnull(t6.enddate,'')='' then '' else CASE WHEN t6.enddate >= CURDATE() THEN '保内' ELSE '保外' END end");
  654. }
  655. querySQL.setCondition("t1.itemno", "t1.itemname", "t1.model", "t3.spec", "t1.remarks");
  656. querySQL.setWhere("t1.siteid", siteid);
  657. querySQL.setWhere("t1.sa_orderid", sa_orderid);
  658. if (content.containsKey("where")) {
  659. JSONObject whereObject = content.getJSONObject("where");
  660. if (sa_promotionid > 0 && whereObject.containsKey("packagetypemx") && !"".equals(whereObject.getString("packagetypemx"))) {
  661. querySQL.setWhere("t4.packagetypemx", whereObject.getString("packagetypemx"));
  662. }
  663. }
  664. querySQL.setPage(pageSize, pageNumber).setOrderBy("t1.rowno asc");
  665. Rows rows = querySQL.query();
  666. ArrayList<Long> ids = rows.toArrayList("itemid", new ArrayList<>());
  667. ArrayList<Long> itemnos = rows.toArrayList("itemno", new ArrayList<>());
  668. // SQLFactory sqlFactory1 = new SQLFactory(this, "商品发货数量汇总");
  669. // sqlFactory1.addParameter("siteid", siteid);
  670. // sqlFactory1.addParameter_in("itemnos", itemnos);
  671. // Rows sumQtyRows = dbConnect.runSqlQuery(sqlFactory1);
  672. // RowsMap sumQtyRowsMap = sumQtyRows.toRowsMap("itemno");
  673. //
  674. // SQLFactory sqlFactory2 = new SQLFactory(this, "商品未发货数量汇总");
  675. // sqlFactory2.addParameter("siteid", siteid);
  676. // sqlFactory2.addParameter_in("itemnos", itemnos);
  677. // Rows sumUnQtyRows = dbConnect.runSqlQuery(sqlFactory2);
  678. // RowsMap sumUnQtyRowsMap = sumUnQtyRows.toRowsMap("itemno");
  679. //
  680. //
  681. SQLFactory sqlFactory3 = new SQLFactory(this, "商品原价汇总");
  682. sqlFactory3.addParameter("siteid", siteid);
  683. sqlFactory3.addParameter("sys_enterpriseid", sys_enterpriseid);
  684. sqlFactory3.addParameter_in("itemnos", itemnos);
  685. Rows itempriceRows = dbConnect.runSqlQuery(sqlFactory3);
  686. RowsMap itempriceRowsMap = itempriceRows.toRowsMap("itemno");
  687. //查询附件
  688. RowsMap attinfoRowsMap = getAttachmentUrl("plm_item", ids);
  689. //默认商品图片
  690. Rows defaultImageRows = Item.getItemdefaultImage(this);
  691. // 封面cover
  692. RowsMap defaultItemCoverRowsMap = getAttachmentUrl("plm_item", ids, "cover");
  693. for (Row row : rows) {
  694. if (itempriceRowsMap.get(row.getString("itemno")).isNotEmpty()) {
  695. row.put("originalprice", itempriceRowsMap.get(row.getString("itemno")).get(0).getBigDecimal("price"));
  696. } else {
  697. row.put("originalprice", BigDecimal.ZERO);
  698. }
  699. // if (sumQtyRowsMap.get(row.getString("itemno")).isNotEmpty()) {
  700. // row.put("unsoldqty", sumQtyRowsMap.get(row.getString("itemno")).get(0).getBigDecimal("qty"));
  701. // } else {
  702. // row.put("unsoldqty", BigDecimal.ZERO);
  703. // }
  704. // if (sumUnQtyRowsMap.get(row.getString("itemno")).isNotEmpty()) {
  705. // row.put("undeliqtysum", sumUnQtyRowsMap.get(row.getString("itemno")).get(0).getBigDecimal("undeliqty"));
  706. // } else {
  707. // row.put("undeliqtysum", BigDecimal.ZERO);
  708. // }
  709. // if (!row.containsKey("invbalqty")) {
  710. // row.put("invbalqty", BigDecimal.ZERO);
  711. // }
  712. row.put("attinfos", attinfoRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  713. row.put("contractprice", 0);
  714. //处理日期字段空的情况
  715. row.putIfAbsent("needdate", "");
  716. row.putIfAbsent("deliverydate", "");
  717. //设置默认商品图片
  718. Rows coverRows = defaultItemCoverRowsMap.get(row.getString("itemid"));
  719. if (coverRows.isNotEmpty()) {
  720. row.put("cover", coverRows.get(0).getString("url"));
  721. } else if (defaultImageRows.isNotEmpty()) {
  722. row.put("cover", defaultImageRows.get(0).getString("url"));
  723. } else {
  724. row.put("cover", "");
  725. }
  726. }
  727. return getSucReturnObject().setData(rows).toString();
  728. }
  729. @API(title = "查询订单所有明细列表", apiversion = R.ID20230508111703.v1.class)
  730. public String selectAllList() throws YosException, IOException {
  731. StringBuffer where = new StringBuffer(" 1=1 ");
  732. if (sys_enterpriseid > 0) {
  733. where.append(" and t5.sys_enterpriseid ='").append(sys_enterpriseid).append("' ");
  734. }
  735. if (content.containsKey("where")) {
  736. JSONObject whereObject = content.getJSONObject("where");
  737. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  738. where.append(" and(");
  739. where.append(" t5.sonum like'%").append(whereObject.getString("condition")).append("%' ");
  740. where.append("or t1.itemno like'%").append(whereObject.getString("condition")).append("%' ");
  741. where.append("or t1.itemname like'%").append(whereObject.getString("condition")).append("%' ");
  742. where.append("or t6.agentnum like'%").append(whereObject.getString("condition")).append("%' ");
  743. where.append("or t7.enterprisename like'%").append(whereObject.getString("condition")).append("%' ");
  744. where.append("or t1.remarks like'%").append(whereObject.getString("condition")).append("%' ");
  745. where.append("or t5.remarks like'%").append(whereObject.getString("condition")).append("%' ");
  746. where.append(")");
  747. }
  748. if (whereObject.containsKey("iteminfo") && !"".equals(whereObject.getString("iteminfo"))) {
  749. where.append(" and(");
  750. where.append("t1.itemno like'%").append(whereObject.getString("iteminfo")).append("%' ");
  751. where.append("or t1.itemname like'%").append(whereObject.getString("iteminfo")).append("%' ");
  752. where.append(")");
  753. }
  754. if (whereObject.containsKey("agentinfo") && !"".equals(whereObject.getString("agentinfo"))) {
  755. where.append(" and(");
  756. where.append("t6.agentnum like'%").append(whereObject.getString("agentinfo")).append("%' ");
  757. where.append("or t7.enterprisename like'%").append(whereObject.getString("agentinfo")).append("%' ");
  758. where.append(")");
  759. }
  760. if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
  761. where.append(" and t5.billdate >='").append(whereObject.getString("begindate")).append("' ");
  762. }
  763. if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
  764. where.append(" and t5.billdate <='").append(whereObject.getString("enddate")).append("' ");
  765. }
  766. if (whereObject.containsKey("begindate1") && !"".equals(whereObject.getString("begindate1"))) {
  767. where.append(" and t5.submitdate >='").append(whereObject.getString("begindate1")).append("' ");
  768. }
  769. if (whereObject.containsKey("enddate1") && !"".equals(whereObject.getString("enddate1"))) {
  770. where.append(" and t5.submitdate <='").append(getDate_Str(whereObject.getDate("enddate1"), 1)).append("' ");
  771. }
  772. if (whereObject.containsKey("begindate2") && !"".equals(whereObject.getString("begindate2"))) {
  773. where.append(" and t5.checkdate >='").append(whereObject.getString("begindate2")).append("' ");
  774. }
  775. if (whereObject.containsKey("enddate2") && !"".equals(whereObject.getString("enddate2"))) {
  776. where.append(" and t5.checkdate <='").append(getDate_Str(whereObject.getDate("enddate2"), 1)).append("' ");
  777. }
  778. if (whereObject.containsKey("status") && !"".equals(whereObject.getString("status"))) {
  779. where.append(" and t5.status ='").append(whereObject.getString("status")).append("' ");
  780. }
  781. if (whereObject.containsKey("isfreeze") && !"".equals(whereObject.getString("isfreeze"))) {
  782. where.append(" and t1.isfreeze ='").append(whereObject.getString("isfreeze")).append("' ");
  783. }
  784. if (whereObject.containsKey("typemx") && !"".equals(whereObject.getString("typemx"))) {
  785. where.append(" and t5.typemx ='").append(whereObject.getString("typemx")).append("' ");
  786. }
  787. if (whereObject.containsKey("isuncheckout") && !"".equals(whereObject.getString("isuncheckout"))) {
  788. String begindate = "";
  789. String enddate = "";
  790. if (whereObject.containsKey("datetype") && !"".equals(whereObject.getString("datetype"))) {
  791. String datetype = whereObject.getStringValue("datetype");
  792. switch (datetype) {
  793. case "7":
  794. begindate = getDate_Str(-7);
  795. enddate = getDate_Str();
  796. break;
  797. case "30":
  798. begindate = getDate_Str(-30);
  799. enddate = getDate_Str();
  800. break;
  801. case "90":
  802. begindate = getDate_Str(-90);
  803. enddate = getDate_Str();
  804. break;
  805. default:
  806. break;
  807. }
  808. }
  809. if (!begindate.equals("")) {
  810. where.append(" and DATE_FORMAT(t5.submitdate, '%Y-%m-%d') >='").append(begindate).append("' ");
  811. }
  812. if (!enddate.equals("")) {
  813. where.append(" and DATE_FORMAT(t5.submitdate, '%Y-%m-%d') <='").append(enddate).append("' ");
  814. }
  815. String isuncheckout = whereObject.getStringValue("isuncheckout");
  816. if (isuncheckout.equals("1")) {
  817. 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>ifnull(t2.sumoutwarehouseqty,0) or t1.undeliqty>0)");
  818. } else {
  819. where.append(" and t1.sa_orderitemsid not 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>ifnull(t2.sumoutwarehouseqty,0) or t1.undeliqty>0)");
  820. }
  821. }
  822. if (whereObject.containsKey("iscancel") && !"".equals(whereObject.getString("iscancel"))) {
  823. String iscancel = whereObject.getStringValue("iscancel");
  824. if (iscancel.equals("1")) {
  825. where.append(" and t5.status ='手工关闭' and not exists(select 1 from st_stockbill_items s1 inner join st_stockbill s2 on s1.st_stockbillid=s2.st_stockbillid and s1.siteid=s2.siteid where s2.status='审核' and s2.rb=1 and s1.sa_orderitemsid=t1.sa_orderitemsid)");
  826. }
  827. }
  828. if (whereObject.containsKey("convenient") && !"".equals(whereObject.getString("convenient"))) {
  829. String convenient = whereObject.getStringValue("convenient");
  830. if (convenient.equals("待确认")) {
  831. where.append(" and t5.status ='预提交' ");
  832. } else if (convenient.equals("待审核")) {
  833. where.append(" and t5.status ='提交' ");
  834. } else if (convenient.equals("待发货")) {
  835. where.append(" and t5.status in ('审核') and not exists(select 1 from st_stockbill_items s1 inner join st_stockbill s2 on s1.st_stockbillid=s2.st_stockbillid and s1.siteid=s2.siteid where s2.status='审核' and s2.rb=1 and s1.sa_orderitemsid=t1.sa_orderitemsid)");
  836. } else if (convenient.equals("已发货")) {
  837. where.append(" and exists(select 1 from st_stockbill_items s1 inner join st_stockbill s2 on s1.st_stockbillid=s2.st_stockbillid and s1.siteid=s2.siteid where s2.status='审核' and s2.rb=1 and s1.sa_orderitemsid=t1.sa_orderitemsid)");
  838. } else if (convenient.equals("已取消")) {
  839. where.append(" and t5.status ='手工关闭' and exists(select 1 from (\n" + "select s1.sa_orderitemsid,s1.siteid,sum(s1.qty) qty from st_stockbill_items s1 inner join st_stockbill s2 on s1.st_stockbillid=s2.st_stockbillid and s1.siteid=s2.siteid where s2.status='审核' and s2.rb=1 group by s1.sa_orderitemsid,s1.siteid) s right join sa_orderitems s1 on s.sa_orderitemsid=s1.sa_orderitemsid and s.siteid=s1.siteid where s1.qty>ifnull(s.qty,0) and s1.sa_orderitemsid=t1.sa_orderitemsid)");
  840. }
  841. }
  842. }
  843. QuerySQL querySQL = queryAllListManage(where.toString());
  844. querySQL.setPage(pageSize, pageNumber);
  845. Rows rows = querySQL.query();
  846. ArrayList<Long> ids = rows.toArrayList("itemid", new ArrayList<>());
  847. RowsMap rowsMap = rows.toRowsMap("itemno");
  848. ArrayList<Long> sa_orderitemsid = rows.toArrayList("sa_orderitemsid", new ArrayList<>());
  849. QuerySQL t11 = SQLFactory.createQuerySQL(this, "sa_dispatch_items", "sa_orderitemsid", "siteid");
  850. t11.addQueryFields("outwarehouseqty", "sum(outwarehouseqty)");
  851. t11.setSiteid(siteid);
  852. t11.setWhere("sa_orderitemsid", sa_orderitemsid);
  853. t11.addGroupBy("sa_orderitemsid,siteid");
  854. RowsMap outwarehouseqtyRowsMap = t11.query().toRowsMap("sa_orderitemsid");
  855. SQLFactory sqlFactory1 = new SQLFactory(this, "订单明细出库数量汇总");
  856. sqlFactory1.addParameter("siteid", siteid);
  857. sqlFactory1.addParameter_in("sa_orderitemsids", rows.toArrayList("sa_orderitemsid", new ArrayList<>()));
  858. Rows sumQtyRows = dbConnect.runSqlQuery(sqlFactory1);
  859. RowsMap sumQtyRowsMap = sumQtyRows.toRowsMap("sa_orderitemsid");
  860. ERPDocking erpDocking = new ERPDocking(siteid);
  861. JSONArray jsonArray = new JSONArray();
  862. if (rows.toJsonArray("itemno").size() != 0) {
  863. // if (Parameter.getBoolean("system.ccerp_dockswitch")) {
  864. // jsonArray = erpDocking.getErpIcinvbalRows(200000, 1, rows.toJsonArray("itemno"));
  865. // }
  866. }
  867. if (!jsonArray.isEmpty()) {
  868. for (Object object : jsonArray) {
  869. JSONObject jsonObject = (JSONObject) object;
  870. if (rowsMap.containsKey(jsonObject.getString("fitemno"))) {
  871. if (rowsMap.get(jsonObject.getString("fitemno")).isNotEmpty()) {
  872. for (Row row : rowsMap.get(jsonObject.getString("fitemno"))) {
  873. row.put("invbalqty", jsonObject.getBigDecimal("fqty"));
  874. }
  875. }
  876. }
  877. }
  878. }
  879. //查询附件
  880. RowsMap attinfoRowsMap = getAttachmentUrl("plm_item", ids);
  881. for (Row row : rows) {
  882. if (sumQtyRowsMap.get(row.getString("sa_orderitemsid")).isNotEmpty()) {
  883. row.put("unsoldqty", row.getBigDecimal("qty").subtract(sumQtyRowsMap.get(row.getString("sa_orderitemsid")).get(0).getBigDecimal("sumqty")));
  884. } else {
  885. row.put("unsoldqty", row.getBigDecimal("qty"));
  886. }
  887. if (!row.containsKey("invbalqty")) {
  888. row.put("invbalqty", BigDecimal.ZERO);
  889. }
  890. row.put("attinfos", attinfoRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  891. row.put("contractprice", 0);
  892. if (outwarehouseqtyRowsMap.get(row.getString("sa_orderitemsid")).isNotEmpty()) {
  893. row.put("outwarehouseqty", outwarehouseqtyRowsMap.get(row.getString("sa_orderitemsid")).get(0).getBigDecimal("outwarehouseqty"));
  894. } else {
  895. row.put("outwarehouseqty", 0);
  896. }
  897. }
  898. return getSucReturnObject().setData(rows).toString();
  899. }
  900. //查询订单列表(管理端)
  901. public QuerySQL queryAllListManage(String where) throws YosException {
  902. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sa_orderitems", "sa_orderitemsid", "itemid", "rowno", "itemno", "itemname", "unit", "qty", "undeliqty", "saleprice", "defaultprice", "price", "amount", "remarks", "customproperties", "batchcontrol", "model", "conversionrate", "marketprice", "defaultprice", "defaultamount", "auxqty", "needdate", "deliedqty", "rebateamount", "invoiceamount", "writeoffamount", "auxunit", "sa_orderid", "deliverydate", "returnqty", "stockno", "position", "batchno", "isfreeze", "decorationrebateflag");
  903. querySQL.setTableAlias("t1");
  904. querySQL.addJoinTable(JOINTYPE.left, "plm_item", "t3", "t3.itemid = t1.itemid and t3.siteid = t1.siteid", "orderminqty_auxunit", "orderminqty", "orderaddqty_auxunit", "orderaddqty", "spec", "standards", "packageqty", "delivery", "k3outcode");
  905. querySQL.addJoinTable(JOINTYPE.left, "sa_order", "t5", "t5.sa_orderid = t1.sa_orderid and t5.siteid = t1.siteid", "sonum", "type", "typemx", "status", "billdate", "submitdate", "checkdate", "tradefield", "closedate");
  906. querySQL.addJoinTable(JOINTYPE.left, "sa_agents", "t6", "t6.sys_enterpriseid = t5.sys_enterpriseid and t6.siteid = t5.siteid", "agentnum");
  907. querySQL.addJoinTable(JOINTYPE.left, "sys_enterprise", "t7", "t7.sys_enterpriseid = t5.sys_enterpriseid and t7.siteid = t5.siteid", "enterprisename", "abbreviation");
  908. querySQL.addJoinTable(JOINTYPE.left, "plm_itemclass", "t8", "t8.itemclassid = t3.marketingcategory and t8.siteid = t3.siteid", "itemclassname");
  909. querySQL.addJoinTable(JOINTYPE.left, "sys_enterprise_tradefield", "t9", "t9.sys_enterpriseid = t5.sys_enterpriseid and t9.tradefield=t5.tradefield and t9.siteid = t5.siteid", "sys_enterprise_tradefieldid");
  910. querySQL.addJoinTable(JOINTYPE.left, "sa_salearea", "t10", "t10.sa_saleareaid = t9.sa_saleareaid and t10.siteid = t9.siteid", "areaname");
  911. // querySQL.addJoinTable(JOINTYPE.left, t11, "t11", "t11.sa_orderitemsid = t1.sa_orderitemsid and t11.siteid = t1.siteid");
  912. querySQL.addJoinTable(JOINTYPE.left, "sa_accountclass", "t12", "t12.sa_accountclassid=t5.sa_accountclassid and t12.siteid=t5.siteid");
  913. querySQL.addJoinTable(JOINTYPE.left, "sa_promotion", "t13", "t13.sa_promotionid=t5.sa_promotionid and t13.siteid=t5.siteid", "promnum", "promname");
  914. querySQL.addQueryFields("accountnames", "if(ifnull(replace(replace(replace(JSON_EXTRACT (t5.sa_accountclassinfos, '$**.accountname' ),'[',''),']',''),'\\\"',''),'')='',t12.accountname,replace(replace(replace(JSON_EXTRACT (t5.sa_accountclassinfos, '$**.accountname' ),'[',''),']',''),'\\\"',''))");
  915. querySQL.addQueryFields("orderremarks", "t5.remarks");
  916. // querySQL.addQueryFields("outwarehouseqty", "ifnull(t11.outwarehouseqty,0)");
  917. //querySQL.addQueryFields("accountclassinfos", "REPLACE(SUBSTRING(JSON_EXTRACT(t5.sa_accountclassinfos, '$[*].accountname'), 2, CHAR_LENGTH(JSON_EXTRACT(t5.sa_accountclassinfos, '$[*].accountname'))-2),'\"','')");
  918. querySQL.setWhere("t1.siteid", siteid);
  919. querySQL.setWhere(where);
  920. querySQL.setWhere("t5.status in ('审核', '关闭','手工关闭')");
  921. return querySQL;
  922. }
  923. //返回导出的标题
  924. public HashMap<String, String> getTitleMap() {
  925. HashMap<String, String> titleMap = new HashMap<>();
  926. titleMap.put("rowno", "行号");
  927. titleMap.put("batchcontrol", "是否批次管理");
  928. titleMap.put("itemno", "产品编号");
  929. titleMap.put("itemname", "产品名称");
  930. titleMap.put("model", "型号");
  931. titleMap.put("conversionrate", "换算率(辅助数量=主单位数量/换算率)");
  932. titleMap.put("price", "单价,折后价(元)");
  933. titleMap.put("amount", "金额,折后金额(元)");
  934. titleMap.put("marketprice", "牌价、市场价(元)");
  935. titleMap.put("defaultprice", "折前价(元)");
  936. titleMap.put("defaultamount", "折前金额(元)");
  937. titleMap.put("qty", "订购数量");
  938. titleMap.put("auxqty", "辅助单位数量");
  939. titleMap.put("needdate", "需求日期");
  940. titleMap.put("deliedqty", "已交货量(主单位)");
  941. titleMap.put("rebateamount", "返利分摊金额");
  942. titleMap.put("undeliqty", "未交货量(主单位)");
  943. titleMap.put("invoiceamount", "已开票金额");
  944. titleMap.put("writeoffamount", "已核销金额");
  945. titleMap.put("unit", "计量单位名称");
  946. titleMap.put("auxunit", "辅助计量单位名称");
  947. titleMap.put("deliverydate", "交货日期");
  948. titleMap.put("returnqty", "退货数量");
  949. titleMap.put("remarks", "备注");
  950. titleMap.put("submitdate", "提交时间");
  951. titleMap.put("checkdate", "审核时间");
  952. return titleMap;
  953. }
  954. //返回导出的标题
  955. public HashMap<String, String> getTitleMapAgent() throws YosException {
  956. HashMap<String, String> titleMap = new HashMap<>();
  957. titleMap.put("rowno", "行号");
  958. titleMap.put("sonum", "订单号");
  959. titleMap.put("status", "订单状态");
  960. titleMap.put("type", "订单类型");
  961. titleMap.put("billdate", "单据日期");
  962. titleMap.put("tradefield", "领域");
  963. titleMap.put("itemno", "产品编码");
  964. titleMap.put("itemname", "品名");
  965. titleMap.put("unit", "单位");
  966. titleMap.put("qty", "数量");
  967. titleMap.put("undeliqty", "未发货数量");
  968. 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);
  969. if (rowsrolename.isEmpty()) {
  970. titleMap.put("price", "单价");
  971. titleMap.put("amount", "金额");
  972. }
  973. titleMap.put("remarks", "订单行备注");
  974. return titleMap;
  975. }
  976. @API(title = "查询可添加商品列表", apiversion = R.ID20221109153502.v1.class)
  977. @CACHEING
  978. public String selectItemList() throws YosException {
  979. Long sa_orderid = content.getLong("sa_orderid");
  980. String type = "";
  981. Long order_sys_enterpriseid = 0L;
  982. JSONArray sa_accountclassinfos = new JSONArray();
  983. Rows orderRows = getOrderRows(this, sa_orderid);
  984. if (orderRows.isNotEmpty()) {
  985. type = orderRows.get(0).getString("type");
  986. order_sys_enterpriseid = orderRows.get(0).getLong("sys_enterpriseid");
  987. sa_accountclassinfos = orderRows.get(0).getJSONArray("sa_accountclassinfos");
  988. }
  989. boolean iswuliao = false;
  990. for (Object sa_accountclassinfo : sa_accountclassinfos) {
  991. JSONObject jsonObject = (JSONObject) sa_accountclassinfo;
  992. if (jsonObject.getString("accountname").equals("物料账户")) {
  993. iswuliao = true;
  994. }
  995. }
  996. QuerySQL itemquery = SQLFactory.createQuerySQL(this, "plm_item", "itemid", "itemno", "itemname", "model", "batchcontrol", "orderminqty_auxunit", "orderminqty", "orderaddqty_auxunit", "orderaddqty", "spec", "standards", "delistingstatus", "marketprice", "packageqty", "iscustomsize", "widthschemeid", "lengthschemeid", "materialschemeid", "colorschemeid", "cheekschemeid", "sa_customschemeid", "custamount", "isonsale").setTableAlias("t1");
  997. itemquery.addJoinTable(JOINTYPE.left, "plm_unitgroup", "t2", "t1.unitgroupid=t2.unitgroupid ", "conversionrate");
  998. itemquery.addJoinTable(JOINTYPE.left, "plm_itemextend", "t3", "t1.itemid=t3.itemid ", "material", "erpitemno", "erpitemname", "specalnote", "prodline", "device");
  999. itemquery.addJoinTable(JOINTYPE.left, "plm_unit", "t4", "t1.unitid=t4.unitid ");
  1000. itemquery.addJoinTable(JOINTYPE.left, "plm_unit", "t5", "t5.unitid=t2.auxunitid ");
  1001. if (!type.equals("特殊订单") && Enterprise.getEnterprise(this, order_sys_enterpriseid).getBoolean("saleclassauth")) {
  1002. itemquery.addJoinTable(JOINTYPE.inner, "sys_enterprise_itemauth_view", "t6", "t1.itemid=t6.itemid and t6.sys_enterpriseid=" + order_sys_enterpriseid);
  1003. }
  1004. itemquery.addQueryFields("unit", "t4.unitname");
  1005. itemquery.addQueryFields("auxunit", "t5.unitname");
  1006. itemquery.setSiteid(siteid);
  1007. itemquery.setCondition("t1.itemno", "t1.itemname", "t1.model", "t1.spec", "t1.standards", "t3.material", "t3.erpitemno");
  1008. itemquery.setWhere("status", "审核");
  1009. if (sys_enterpriseid > 0 || !type.equals("特殊订单")) {
  1010. itemquery.setWhere("t1.isonsale", true);
  1011. } else if (content_where.containsKey("isonsale")) {
  1012. itemquery.setWhere("t1.isonsale", content_where.getBooleanValue("isonsale"));
  1013. }
  1014. if (!type.equals("特殊订单")) {
  1015. itemquery.setWhere("t1.istool", false);
  1016. }
  1017. if (iswuliao) {
  1018. itemquery.setWhere("t1.iswuliao", true);
  1019. }
  1020. itemquery.setPage(pageSize, pageNumber);
  1021. Rows rows = itemquery.query();
  1022. ArrayList<Long> ids = rows.toArrayList("itemid", new ArrayList<>());
  1023. //默认商品图片
  1024. Rows defaultImageRows = Item.getItemdefaultImage(this);
  1025. //查询附件
  1026. RowsMap attinfoRowsMap = Attachment.get(this, "plm_item", ids);
  1027. // 封面cover
  1028. RowsMap defaultItemCoverRowsMap = getAttachmentUrl("plm_item", ids, "cover");
  1029. //商品领域
  1030. RowsMap tradefieldRowsMap = Item.getTradefieldRowsMap(this, ids);
  1031. //品牌
  1032. RowsMap brandRowsMap = Brand.getBrandRowsMap(this, ids);
  1033. //价格
  1034. HashMap<Long, ItemPrice> itemPriceRowsMap = ItemPrice.getItemPrice(this, order_sys_enterpriseid, ids);
  1035. for (Row row : rows) {
  1036. row.put("attinfos", attinfoRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  1037. row.put("tradefield", tradefieldRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  1038. row.put("brand", brandRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  1039. if (itemPriceRowsMap.containsKey(row.getLong("itemid"))) {
  1040. row.put("price", itemPriceRowsMap.get(row.getLong("itemid")).getPrice());
  1041. } else {
  1042. row.put("price", 0);
  1043. }
  1044. //设置默认商品图片
  1045. Rows coverRows = defaultItemCoverRowsMap.get(row.getString("itemid"));
  1046. if (coverRows.isNotEmpty()) {
  1047. row.put("cover", coverRows.get(0).getString("url"));
  1048. } else if (defaultImageRows.isNotEmpty()) {
  1049. row.put("cover", defaultImageRows.get(0).getString("url"));
  1050. } else {
  1051. row.put("cover", "");
  1052. }
  1053. }
  1054. return getSucReturnObject().setData(rows).toString();
  1055. }
  1056. @API(title = "判断订单中是否存在某个套餐", apiversion = R.ID2024062715055803.v1.class)
  1057. @CACHEING
  1058. public String jundgePackagetypemx() throws YosException {
  1059. String packagetypemx = content.getString("packagetypemx");
  1060. long sa_orderid = content.getLong("sa_orderid");
  1061. Rows rows = dbConnect.runSqlQuery("select t1.sa_orderitemsid from sa_orderitems t1 inner join sa_promotion_items t2 on t1.sa_promotion_itemsid=t2.sa_promotion_itemsid and t1.siteid=t2.siteid where t1.siteid='" + siteid + "' and t1.sa_orderid=" + sa_orderid + " and t2.packagetypemx=" + packagetypemx);
  1062. if (rows.isNotEmpty()) {
  1063. return getSucReturnObject().setData(true).toString();
  1064. } else {
  1065. return getSucReturnObject().setData(false).toString();
  1066. }
  1067. }
  1068. //获取非工具数据
  1069. public String getOrderItemsList(Long sa_orderid, String tradefield, Long sys_enterpriseid, Long sa_brandid) throws YosException {
  1070. StringBuffer where = new StringBuffer(" 1=1 ");
  1071. Row enterpriseRow = Enterprise.getEnterprise(this, sys_enterpriseid);
  1072. boolean saleclassauth = enterpriseRow.getBoolean("saleclassauth");
  1073. //需要经营授权
  1074. if (saleclassauth) {
  1075. where.append(" and itemclassid in (SELECT itemclassid from sys_enterprise_saleclass WHERE sys_enterpriseid = " + sys_enterpriseid + " and siteid = '" + siteid + "')");
  1076. }
  1077. SQLFactory sqlFactory = new SQLFactory(this, "商品范围");
  1078. sqlFactory.addParameter("siteid", siteid);
  1079. sqlFactory.addParameter("sa_orderid", sa_orderid);
  1080. sqlFactory.addParameter_in("tradefield", tradefield);
  1081. sqlFactory.addParameter("sys_enterpriseid", sys_enterpriseid);
  1082. sqlFactory.addParameter("sa_brandid", sa_brandid);
  1083. sqlFactory.addParameter_SQL("where", where);
  1084. return sqlFactory.getSQL();
  1085. }
  1086. // //获取特殊数据
  1087. // public String getOrderItemsListSpec(Long sa_orderid, String tradefield, Long sys_enterpriseid) throws YosException {
  1088. // SQLFactory sqlFactory = new SQLFactory(this, "商品范围_特殊");
  1089. // sqlFactory.addParameter("siteid", siteid);
  1090. // sqlFactory.addParameter("sa_orderid", sa_orderid);
  1091. // sqlFactory.addParameter_in("tradefield", tradefield);
  1092. // sqlFactory.addParameter("sys_enterpriseid", sys_enterpriseid);
  1093. // return sqlFactory.getSQL(false);
  1094. // }
  1095. // @API(title = "订单商品变更", apiversion = R.ID20221110145302.v1.class)
  1096. // @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class})
  1097. // public String changeItem() throws YosException {
  1098. // boolean isjiean = content.getBooleanValue("isjiean");
  1099. // Long sa_orderid = content.getLong("sa_orderid");
  1100. // //通过版本更新订单表头数据
  1101. // beans.order.Order.updateOrderWithVersion(this);
  1102. //
  1103. // String type = content.getString("type");
  1104. // Long sa_orderitems_changeid = createTableID("sa_orderitems_change");
  1105. // JSONArray itemifnos = content.getJSONArray("itemifnos");
  1106. // BigDecimal oldValue = new BigDecimal(0);
  1107. // Rows Rowstatus = dbConnect.runSqlQuery(
  1108. // "select * from sa_order where sa_orderid=" + sa_orderid + " and siteid='" + siteid + "'");
  1109. // if (Rowstatus.isEmpty()) {
  1110. // return "订单不存在";
  1111. // } else {
  1112. // if (!Rowstatus.get(0).getString("status").equals("审核")) {
  1113. // return getErrReturnObject().setErrMsg("非审核状态的订单无法进行商品变更").toString();
  1114. // }
  1115. // }
  1116. // ArrayList<String> sqlList = new ArrayList<>();
  1117. // // 订单商品变更
  1118. // SQLFactory sqlFactory = new SQLFactory(this, "订单商品变更_新增");
  1119. // sqlFactory.addParameter("siteid", siteid);
  1120. // sqlFactory.addParameter("userid", userid);
  1121. // sqlFactory.addParameter("username", username);
  1122. // sqlFactory.addParameter("sa_orderitems_changeid", sa_orderitems_changeid);
  1123. // sqlFactory.addParameter("sa_orderid", sa_orderid);
  1124. // sqlFactory.addParameter("remarks", content.getStringValue("remarks"));
  1125. // sqlList.add(sqlFactory.getSQL());
  1126. //
  1127. // HashMap<Long, Row> orderdetailmap = new HashMap<>();
  1128. // HashMap<Long, BigDecimal> orderdetailchangeamount = new HashMap<>();
  1129. // Rows rowsOrder = dbConnect.runSqlQuery("select * from sa_order t1 where t1.sa_orderid=" + sa_orderid);
  1130. //
  1131. // BigDecimal ce = new BigDecimal(0);
  1132. //
  1133. // for (Object obj : itemifnos) {
  1134. // JSONObject jsonObject = (JSONObject) obj;
  1135. // Rows rows = dbConnect.runSqlQuery(
  1136. // "SELECT sa_orderitemsid,qty,deliedqty,undeliqty,writeoffamount,price from sa_orderitems WHERE sa_orderitemsid="
  1137. // + jsonObject.getLongValue("sa_orderitemsid"));
  1138. // if (rows.isNotEmpty()) {
  1139. // oldValue = rows.get(0).getBigDecimal("qty");
  1140. // } else {
  1141. // return getErrReturnObject().setErrMsg("订单行不存在").toString();
  1142. // }
  1143. // if (type.equals("数量")) {
  1144. // // 更新数量
  1145. // BigDecimal newqty = jsonObject.getBigDecimal("newvalue");
  1146. // BigDecimal oldqty = rows.get(0).getBigDecimal("qty");
  1147. // BigDecimal oldundeliqty = rows.get(0).getBigDecimal("undeliqty");
  1148. // BigDecimal addqty = newqty.subtract(oldqty);// 新增的数量
  1149. // if (newqty.compareTo(oldqty) >= 0) {
  1150. // return getErrReturnObject().setErrMsg("修改数量必须小于原订单数量" + oldqty).toString();
  1151. // }
  1152. // if (newqty.compareTo(oldqty.subtract(oldundeliqty)) < 0) {
  1153. // return getErrReturnObject().setErrMsg("修改数量必须大于等于已发货数量" + oldqty.subtract(oldundeliqty)).toString();
  1154. // }
  1155. // if (newqty.compareTo(BigDecimal.ZERO) < 0) {
  1156. // return getErrReturnObject().setErrMsg("修改数量不可小于0").toString();
  1157. // }
  1158. //
  1159. // sqlFactory = new SQLFactory(this, "订单商品明细变更_更新");
  1160. // sqlFactory.addParameter("siteid", siteid);
  1161. // sqlFactory.addParameter("sa_orderitemsid", jsonObject.getLongValue("sa_orderitemsid"));
  1162. // sqlFactory.addParameter("qty", jsonObject.getStringValue("newvalue"));
  1163. //// sqlFactory.addParameter("undeliqty", oldundeliqty.add(addqty));
  1164. // ce = ce.add(addqty.multiply(rows.get(0).getBigDecimal("price")));
  1165. // sqlList.add(sqlFactory.getSQL());
  1166. // /**
  1167. // * * 核销对冲计算
  1168. // */
  1169. // {
  1170. // /**
  1171. // * * 核销对冲计算
  1172. // */
  1173. // BigDecimal writeoffamount = rows.get(0).getBigDecimal("writeoffamount");// 订单行已核销金额
  1174. // //System.out.println(newqty.multiply(rows.get(0).getBigDecimal("price")));
  1175. // //System.out.println(writeoffamount);
  1176. // if (writeoffamount.compareTo(BigDecimal.ZERO) > 0
  1177. // && (newqty.multiply(rows.get(0).getBigDecimal("price"))).compareTo(writeoffamount) < 0) {
  1178. // // 如果已核销金额大于0 且调整后折后金额小于已核销金额,则需要将差价进行回冲
  1179. // orderdetailmap.put(rows.get(0).getLong("sa_orderitemsid"), rows.get(0));
  1180. // //System.out.println(writeoffamount.subtract(newqty.multiply(rows.get(0).getBigDecimal("price"))));
  1181. // //System.out.println("sa_orderitemsid:"+rows.get(0).getLong("sa_orderitemsid"));
  1182. // orderdetailchangeamount.put(rows.get(0).getLong("sa_orderitemsid"),
  1183. // writeoffamount.subtract(newqty.multiply(rows.get(0).getBigDecimal("price"))));
  1184. // }
  1185. //
  1186. // }
  1187. // }
  1188. // // 订单商品变更明细
  1189. // sqlFactory = new SQLFactory(this, "订单商品变更明细_新增");
  1190. // sqlFactory.addParameter("siteid", siteid);
  1191. // sqlFactory.addParameter("sa_orderitems_changemxid", createTableID("sa_orderitems_changemx"));
  1192. // sqlFactory.addParameter("itemid", jsonObject.getLongValue("itemid"));
  1193. // sqlFactory.addParameter("sa_orderitemsid", jsonObject.getLongValue("sa_orderitemsid"));
  1194. // sqlFactory.addParameter("sa_orderitems_changeid", sa_orderitems_changeid);
  1195. // sqlFactory.addParameter("type", type);
  1196. // sqlFactory.addParameter("oldvalue", oldValue);
  1197. // sqlFactory.addParameter("newvalue", jsonObject.getStringValue("newvalue"));
  1198. //
  1199. // sqlList.add(sqlFactory.getSQL());
  1200. //
  1201. //// content.put("sa_orderitemsid", sa_orderitemsid);
  1202. //
  1203. // }
  1204. //
  1205. // Long sa_cashbillid = 0L;
  1206. // if (ce.compareTo(BigDecimal.ZERO) != 0) {
  1207. // CashbillEntity cashbillEntity = new CashbillEntity();
  1208. // cashbillEntity.setAmount(ce);
  1209. // cashbillEntity.setDiscountamountamount(BigDecimal.ZERO);
  1210. // cashbillEntity.setOwnerid(sa_orderid);
  1211. // cashbillEntity.setOwnertable("sa_order");
  1212. // cashbillEntity
  1213. // .setRemarks("订单变更:" + rowsOrder.get(0).getString("sonum") + "订单变更单id:" + sa_orderitems_changeid);
  1214. // JSONObject cashbillPay = Accountbalance.createCashbillPay(this, rowsOrder.get(0).getLong("sys_enterpriseid"),
  1215. // rowsOrder.get(0).getLong("sa_accountclassid"), cashbillEntity, true);
  1216. // sqlList.addAll(cashbillPay.getJSONArray("sqlList").toJavaList(String.class));
  1217. // sa_cashbillid = cashbillPay.getLong("sa_cashbillid");
  1218. // }
  1219. //
  1220. // /**
  1221. // * * 核销对冲
  1222. // */
  1223. // if (!orderdetailmap.isEmpty()) {
  1224. // //System.out.println("测试");
  1225. // sqlList.addAll(
  1226. // new twriteoffbill_orderchange(rowsOrder.get(0), orderdetailmap, orderdetailchangeamount).hedging());
  1227. // }
  1228. // for (String string : sqlList) {
  1229. // //System.out.println(string);
  1230. // }
  1231. // dbConnect.runSqlUpdate(sqlList);
  1232. // // 居间费设置
  1233. // updateRebateFee(sa_orderid);
  1234. // if (!isjiean) {
  1235. // if (Parameter.getBoolean("system.erp_dockswitch")) {
  1236. // UploadDataToERP uploadDataToERP = new UploadDataToERP(this, sa_orderitems_changeid, "订单变更");
  1237. // boolean issuccess = uploadDataToERP.upload();
  1238. // if (!issuccess) {
  1239. // return getErrReturnObject().setErrMsg("上传ERP失败,请检查!").toString();
  1240. // }
  1241. // }
  1242. // }
  1243. //
  1244. // if (ce.compareTo(BigDecimal.ZERO) != 0) {
  1245. // Accountbalance.remindSend(this, rowsOrder.get(0).getLong("sys_enterpriseid"), sa_cashbillid);
  1246. // }
  1247. // return getSucReturnObject().toString();
  1248. // }
  1249. // @API(title = "订单商品变更(手动推erp)", apiversion = R.ID20230306161703.v1.class)
  1250. // @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class})
  1251. // public String changeItem1() throws YosException {
  1252. // if (Parameter.getBoolean("system.erp_dockswitch")) {
  1253. // UploadDataToERP uploadDataToERP = new UploadDataToERP(this, content.getLong("sa_orderitems_changeid"), "订单变更");
  1254. // boolean issuccess = uploadDataToERP.upload();
  1255. // if (!issuccess) {
  1256. // return getErrReturnObject().setErrMsg("上传ERP失败,请检查!").toString();
  1257. // } else {
  1258. // return getSucReturnObject().toString();
  1259. // }
  1260. // } else {
  1261. // return getErrReturnObject().setErrMsg("erp对接开关未开!").toString();
  1262. // }
  1263. //
  1264. // }
  1265. @API(title = "行关闭", apiversion = R.ID2025102210393903.v1.class)
  1266. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class})
  1267. public String close() throws YosException {
  1268. boolean isclose= content.getBoolean("isclose");
  1269. long sa_orderid=content.getLong("sa_orderid");
  1270. JSONArray sa_orderitemsids = content.getJSONArray("sa_orderitemsids");
  1271. ArrayList<String> sqlList = new ArrayList<>();
  1272. Rows rows = getOrderRows(this, sa_orderid);
  1273. if (rows.isEmpty()) {
  1274. return getErrReturnObject().setErrMsg("订单不存在").toString();
  1275. }
  1276. Row row = rows.get(0);
  1277. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sa_orderitems", "*").setTableAlias("t1");
  1278. querySQL.addJoinTable(JOINTYPE.inner, "sa_order", "t2", "t1.siteid = t2.siteid and t1.sa_orderid = t2.sa_orderid");
  1279. querySQL.setSiteid(siteid);
  1280. querySQL.setWhere("t1.sa_orderitemsid",sa_orderitemsids);
  1281. querySQL.setWhere("t2.sa_orderid",sa_orderid);
  1282. Rows rowsdetails = querySQL.query();
  1283. closevalidate(isclose,row,rowsdetails);
  1284. /******** 行关闭状态更新 ********/
  1285. Date date = getDate();
  1286. BigDecimal returnamount =BigDecimal.ZERO;// 退还金额
  1287. for(Row rowsdetail :rowsdetails){
  1288. BigDecimal amount = rowsdetail.getBigDecimal("amount");// 订单金额
  1289. BigDecimal price = rowsdetail.getBigDecimal("price");// 单价
  1290. BigDecimal qty = rowsdetail.getBigDecimal("qty");// 订单数量
  1291. BigDecimal undeliqty = rowsdetail.getBigDecimal("undeliqty");;// 订单未发货数量
  1292. BigDecimal sendqty = qty.subtract(undeliqty);
  1293. BigDecimal sendamount =price.multiply(sendqty).setScale(2, RoundingMode.HALF_UP);
  1294. returnamount = returnamount.add(amount.subtract(sendamount));
  1295. sqlList.add("update sa_orderitems set isclose="+isclose+" where sa_orderitemsid="+rowsdetail.getLong("sa_orderitemsid"));
  1296. }
  1297. Rows freezRows = dbConnect.runSqlQuery("select * from sa_accountbalance_freez where sourcetable='sa_order' and sourceid="+sa_orderid);
  1298. Row freezRow= null;
  1299. if (!freezRows.isEmpty()) {
  1300. freezRow = freezRows.get(0);
  1301. }
  1302. if (isclose) {
  1303. if (freezRow != null) {
  1304. BigDecimal amount = freezRow.getBigDecimal("amount");// 冻结金额
  1305. sqlList.add("update sa_accountbalance_freez set amount="+amount.subtract(returnamount)+" where sa_accountbalance_freezid="+freezRow.getLong("sa_accountbalance_freezid"));
  1306. if (amount.subtract(returnamount).compareTo(BigDecimal.ZERO)<=0) {
  1307. sqlList.add("delete from sa_accountbalance_freez where sa_accountbalance_freezid="+freezRow.getLong("sa_accountbalance_freezid"));
  1308. }
  1309. }
  1310. } else {
  1311. if (freezRow == null) {
  1312. Rows accountbalanceRows = dbConnect.runSqlQuery("select * from sa_accountbalance where sys_enterpriseid="+row.getLong("sys_enterpriseid")+" and sa_accountclassid="+row.getLong("sa_accountclassid"));
  1313. if(accountbalanceRows.isNotEmpty()){
  1314. InsertSQL frezzInsertSQL = SQLFactory.createInsertSQL(this, "sa_accountbalance_freez");
  1315. frezzInsertSQL.setUniqueid(createTableID("sa_accountbalance_freez"));
  1316. frezzInsertSQL.setSiteid(siteid);
  1317. frezzInsertSQL.setValue("sa_accountbalanceid", accountbalanceRows.get(0).getLong("sa_accountbalanceid"));
  1318. frezzInsertSQL.setValue("sourcetable", "sa_order");
  1319. frezzInsertSQL.setValue("sourceid", sa_orderid);
  1320. frezzInsertSQL.setValue("amount", returnamount);
  1321. frezzInsertSQL.setValue("remarks", "订单反关闭冻结");
  1322. frezzInsertSQL.setValue("createby", username);
  1323. frezzInsertSQL.setDateValue("createdate");
  1324. sqlList.add(frezzInsertSQL.getSQL());
  1325. }else{
  1326. return getErrReturnObject().setErrMsg("账户不存在").toString();
  1327. }
  1328. } else {
  1329. BigDecimal amount = freezRow.getBigDecimal("amount");// 冻结金额
  1330. sqlList.add("update sa_accountbalance_freez set amount="+amount.add(returnamount)+" where sa_accountbalance_freezid="+freezRow.getLong("sa_accountbalance_freezid"));
  1331. }
  1332. }
  1333. /******** 增加总仓可销售量 ********/
  1334. if (isclose) {
  1335. sqlList.addAll(updateIcinvbal_sale(rowsdetails,true, true));
  1336. } else {
  1337. sqlList.addAll(updateIcinvbal_sale(rowsdetails,false, true));
  1338. }
  1339. dbConnect.runSqlUpdate(sqlList);
  1340. return getSucReturnObject().toString();
  1341. }
  1342. public void closevalidate(boolean isclose,Row order,Rows orderdetails) throws YosException {
  1343. if (isclose && !order.getString("status").equals("审核")) {
  1344. throw new YosException("非审核状态下不可关闭");
  1345. }
  1346. if (isclose && orderdetails.size() == 0) {
  1347. throw new YosException("请购选行再进行关闭操作");
  1348. }
  1349. if (!isclose && orderdetails.size() == 0) {
  1350. throw new YosException("请购选行再进行取消关闭操作");
  1351. }
  1352. int i = 0;
  1353. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "st_stockbill_items", "*").setTableAlias("t1");
  1354. querySQL.addJoinTable(JOINTYPE.inner, "st_stockbill", "t2", "t1.siteid = t2.siteid and t1.st_stockbillid = t2.st_stockbillid");
  1355. querySQL.setSiteid(siteid);
  1356. querySQL.setWhere("t1.sa_orderitemsid",orderdetails.toArrayList("sa_orderitemsid"));
  1357. querySQL.setWhere("t2.status='新建'");
  1358. Rows rows = querySQL.query();
  1359. RowsMap rowsMap = rows.toRowsMap("sa_orderitemsid");
  1360. for(Row row :orderdetails){
  1361. int rownum = row.getInteger("rowno");
  1362. if (isclose) {
  1363. if (row.getBoolean("isclose")) {
  1364. throw new YosException("行" + rownum
  1365. + "已经关闭,不可重复关闭");
  1366. }
  1367. if (row.getBigDecimal("undeliqty").compareTo(BigDecimal.ZERO)==0) {
  1368. throw new YosException("行" + rownum
  1369. + "已发货完毕,不可关闭");
  1370. }
  1371. if (rowsMap.containsKey(row.getString("sa_orderitemsid"))) {
  1372. throw new YosException("行" + rownum
  1373. + "存在新建的销售出库单,不可关闭");
  1374. }
  1375. // if (saorderdetail.getPao(i).getPaoSet("SAINVOICEDETAIL")
  1376. // .count() > 0) {
  1377. // throw new YosException("行" + rownum
  1378. // + "存在发货单,不可关闭");
  1379. // }
  1380. } else {
  1381. if (!row.getBoolean("isclose")) {
  1382. throw new YosException("行" + rownum
  1383. + "未关闭,不可取消关闭");
  1384. }
  1385. if (row.getDouble("undeliqty") == 0) {
  1386. throw new YosException("行" + rownum
  1387. + "已发货完毕,不可取消关闭");
  1388. }
  1389. }
  1390. }
  1391. }
  1392. /**
  1393. * 获取当前订单的最大行号
  1394. *
  1395. * @param sa_orderid
  1396. * @return
  1397. * @throws YosException
  1398. */
  1399. public Long getRowNo(Long sa_orderid) throws YosException {
  1400. Rows rows = dbConnect.runSqlQuery("SELECT COUNT(0) count from sa_orderitems WHERE sa_orderid = " + sa_orderid + " AND siteid = '" + siteid + "'");
  1401. return rows.get(0).getLong("count") + 1;
  1402. }
  1403. /**
  1404. * 查询商品信息
  1405. *
  1406. * @param itemid
  1407. * @return
  1408. * @throws YosException
  1409. */
  1410. public Row getItemRow(Long itemid) throws YosException {
  1411. SQLFactory sqlFactory = new SQLFactory(this, "查询商品信息");
  1412. sqlFactory.addParameter("siteid", siteid);
  1413. sqlFactory.addParameter("itemid", itemid);
  1414. Rows rows = dbConnect.runSqlQuery(sqlFactory.getSQL());
  1415. return rows.isNotEmpty() ? rows.get(0) : new Row();
  1416. }
  1417. /**
  1418. * 重新对商品行排序
  1419. *
  1420. * @param sa_orderid
  1421. * @throws YosException
  1422. */
  1423. public void updateRowNo(Long sa_orderid) throws YosException {
  1424. String sql = "SELECT sa_orderitemsid from sa_orderitems WHERE sa_orderid= " + sa_orderid + " and siteid = '" + siteid + "' ORDER BY createdate ";
  1425. ArrayList<Long> sa_orderitemsids = dbConnect.runSqlQuery(sql).toArrayList("sa_orderitemsid", new ArrayList<>(), false);
  1426. if (sa_orderitemsids.size() > 0) {
  1427. int rowno = 1;
  1428. StringBuffer where = new StringBuffer("");
  1429. for (Long id : sa_orderitemsids) {
  1430. where.append(" WHEN " + id + " THEN " + rowno);
  1431. rowno++;
  1432. }
  1433. SQLFactory sqlFactory = new SQLFactory(this, "更新行号");
  1434. sqlFactory.addParameter("siteid", siteid);
  1435. sqlFactory.addParameter_SQL("where", where);
  1436. sqlFactory.addParameter_in("sa_orderitemsid", sa_orderitemsids);
  1437. sql = sqlFactory.getSQL();
  1438. dbConnect.runSqlUpdate(sql);
  1439. }
  1440. }
  1441. /**
  1442. * @param isinstock 是否增加库存
  1443. * @throws YosException
  1444. */
  1445. public ArrayList<String> updateIcinvbal_sale(Rows rowsdetails, boolean isinstock, boolean close) throws YosException {
  1446. Rows ICINVBAL_SALE = SQLFactory.createQuerySQL(this, "st_invbal_sale").setSiteid(siteid).setWhere("itemid", rowsdetails.toArrayList("itemid")).query();
  1447. RowsMap ICINVBAL_SALERowsMap = ICINVBAL_SALE.toRowsMap("itemid");
  1448. int i = 0;
  1449. ArrayList<String> sqlList = new ArrayList<>();
  1450. for (Row row : rowsdetails) {
  1451. long st_invbal_saleid;
  1452. if (ICINVBAL_SALERowsMap.containsKey(row.getString("itemid"))) {
  1453. st_invbal_saleid = ICINVBAL_SALERowsMap.get(row.getString("itemid")).get(0).getLong("st_invbal_saleid");
  1454. } else {
  1455. st_invbal_saleid = createTableID("st_invbal_sale");
  1456. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, "st_invbal_sale");
  1457. insertSQL.setUniqueid(st_invbal_saleid);
  1458. insertSQL.setSiteid(siteid);
  1459. insertSQL.setValue("itemid", row.getString("itemid"));
  1460. insertSQL.setValue("candispatchqty", 0);
  1461. insertSQL.setValue("cansaleqty", 0);
  1462. insertSQL.setValue("qty", 0);
  1463. insertSQL.setValue("changeuserid", userid);
  1464. insertSQL.setValue("changeby", username);
  1465. insertSQL.setDateValue("changedate");
  1466. sqlList.add(insertSQL.getSQL());
  1467. }
  1468. BigDecimal qty = BigDecimal.ZERO;
  1469. if (close) {
  1470. qty = isinstock ? row.getBigDecimal("undeliqty") : row.getBigDecimal("undeliqty").negate();// 如果是扣减则根据数量进行扣减,反之根据未发货数量进行增加
  1471. } else {
  1472. qty = isinstock ? row.getBigDecimal("undeliqty")
  1473. : row.getBigDecimal("qty").negate();// 如果是扣减则根据数量进行扣减,反之根据未发货数量进行增加
  1474. }
  1475. sqlList.add("update st_invbal_sale set cansaleqty=cansaleqty+" + qty + " where st_invbal_saleid=" + st_invbal_saleid);
  1476. }
  1477. return sqlList;
  1478. }
  1479. }