OrderItems.java 111 KB

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