XSCK.java 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. package beans.stockbill.bills;
  2. import beans.accountbalance.Accountbalance;
  3. import beans.accountbalance.CashbillEntity;
  4. import beans.parameter.Parameter;
  5. import com.alibaba.fastjson2.JSONObject;
  6. import common.BaseClass;
  7. import common.Controller;
  8. import common.YosException;
  9. import common.data.*;
  10. import org.apache.commons.lang.StringUtils;
  11. import java.math.BigDecimal;
  12. import java.util.ArrayList;
  13. public class XSCK extends BasicBill {
  14. long sys_enterpriseid;
  15. public XSCK(Controller controller, long st_stockbillid) throws YosException {
  16. super(controller, st_stockbillid);
  17. sys_enterpriseid = billRow.getLong("sys_enterpriseid");
  18. }
  19. @Override
  20. public void checkValidate(boolean ischeck) throws YosException {
  21. super.checkValidate(ischeck);
  22. 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=" + sys_enterpriseid);
  23. if (accountbalancerows.isEmpty()) {
  24. throw new YosException("账户不存在");
  25. }
  26. String order_paymentnode = Parameter.getString(siteid, "order_paymentnode");
  27. if (ischeck) {
  28. if (itemRows.min("payamount").doubleValue() < 0) {
  29. throw new YosException("扣款金额需大于0");
  30. }
  31. if (StringUtils.isBlank(billRow.getString("outplace"))) {
  32. throw new YosException("发货地不可为空");
  33. }
  34. if ((billRow.getBigDecimal("payamount").add(billRow.getBigDecimal("paydiscountamount"))).compareTo(itemRows.sum("amount")) != 0) {
  35. throw new YosException("扣款金额与应扣金额不符,不能审核");
  36. }
  37. BigDecimal discountamount = accountbalancerows.get(0).getBigDecimal("discountamount");
  38. if (billRow.getBigDecimal("paydiscountamount").compareTo(discountamount) > 0) {
  39. throw new YosException("优惠金额不能大于可用优惠金额");
  40. }
  41. if(billRow.getString("sourceobject").equals("tpartreimbursement")){
  42. QuerySQL querySQL = SQLFactory.createQuerySQL(controller, "sa_tpartreimbursementdetail", "sa_tpartreimbursementdetailid","isverified","qty","sa_orderitemsid");
  43. querySQL.setTableAlias("t1");
  44. querySQL.addJoinTable(BaseClass.JOINTYPE.inner, "sa_tpartreimbursement", "t3", "t1.sa_tpartreimbursementid = t3.sa_tpartreimbursementid AND t1.siteid = t3.siteid");
  45. querySQL.setSiteid(siteid);
  46. querySQL.setWhere("t1.hongbillno='"+billno+"'");
  47. Rows rows = querySQL.query();
  48. for (Row row : rows) {
  49. if (row.getBoolean("isverified")) {
  50. throw new YosException("存在记录已核销,请检查");
  51. }
  52. }
  53. }
  54. /*
  55. 库存校验
  56. */
  57. /*
  58. 其他校验
  59. */
  60. } else {
  61. if (billRow.getBoolean("isreceiver")) {
  62. throw new YosException("经销商已经确认收货,不可进行反审核");
  63. }
  64. /*
  65. 库存校验
  66. */
  67. /*
  68. 其他校验
  69. */
  70. }
  71. //库存校验
  72. RowsMap invbalsRowsMap = SQLFactory.createQuerySQL(dbConnect, "st_invbal").setWhere("siteid", siteid).setWhere("itemid", itemRows.toArrayList("itemid")).query().toRowsMap("itemid");
  73. for(Row row : itemRows){
  74. if(!row.getBoolean("isnegative") && row.getBoolean("ismodule")){
  75. long itemid = row.getLong("itemid");
  76. long stockid = row.getLong("stockid");
  77. BigDecimal qty =row.getBigDecimal("qty");
  78. if(!isInStock(ischeck)){
  79. if (!invbalsRowsMap.containsKey(String.valueOf(itemid)) || !invbalsRowsMap.get(String.valueOf(itemid)).toRowsMap("stockid").containsKey(String.valueOf(stockid))) {
  80. throw new YosException("行【"+row.getString("rowno")+"】不能负库存出库");
  81. } else {
  82. BigDecimal invbalqty = invbalsRowsMap.get(String.valueOf(itemid)).toRowsMap("stockid").get(String.valueOf(stockid)).get(0).getBigDecimal("qty");
  83. if(invbalqty.compareTo(qty)<0){
  84. throw new YosException("行【"+row.getString("rowno")+"】不能负库存出库");
  85. }
  86. }
  87. }
  88. }
  89. }
  90. if ((ischeck && rb == 1) || (!ischeck && rb == 0)) {
  91. // if (order_paymentnode.equals("3") && !Accountbalance.judgeBalance(dbConnect, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"), itemRows.toRowsMap("sa_orderitemsidnum").get("0").sum("amount"))) {
  92. // //throw new YosException("账户余额不足,还差" + Accountbalance.InsufficientBalance(dbConnect, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"), itemRows.toRowsMap("sa_orderitemsidnum").get("0").sum("amount")) + "元!");
  93. // }
  94. if(!billRow.getString("sourceobject").equals("tpartreimbursement")){
  95. Rows rowsjudge = dbConnect.runSqlQuery("select * from (select sa_orderitemsid,sum(qty) qty from st_stockbill_items where st_stockbillid ='" + st_stockbillid + "' group by sa_orderitemsid) t1 inner join sa_orderitems t2 on t1.sa_orderitemsid=t2.sa_orderitemsid where t1.qty>t2.undeliqty");
  96. if (rowsjudge.isNotEmpty()) {
  97. if(ischeck){
  98. throw new YosException("存在商品已完全出库,无法审核");
  99. }else{
  100. throw new YosException("存在商品已完全出库,无法反审核");
  101. }
  102. }
  103. }
  104. }
  105. }
  106. @Override
  107. public ArrayList<String> getCheckSql(boolean ischeck) throws YosException {
  108. ArrayList<String> sqlList = super.getCheckSql(ischeck);
  109. 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=" + sys_enterpriseid);
  110. if (ischeck) {
  111. String order_paymentnode = Parameter.getString(siteid, "order_paymentnode");
  112. if (rb == 1) {
  113. if (order_paymentnode.equals("3")) {
  114. CashbillEntity entity = getCashbillEntity(billRow.getBigDecimal("payamount"), billRow.getBigDecimal("paydiscountamount"), st_stockbillid, "销售出库单审核", billno, "由销售出库单" + billno + "审核时生成","货款");
  115. JSONObject createCashbillPay = Accountbalance.createCashbillPay(dbConnect, userInfo, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"), entity, true);
  116. if(!(billRow.getBigDecimal("payamount").compareTo(BigDecimal.ZERO)==0 && billRow.getBigDecimal("paydiscountamount").compareTo(BigDecimal.ZERO)==0)){
  117. sqlList.addAll(createCashbillPay.getJSONArray("sqlList").toJavaList(String.class));
  118. }
  119. }
  120. Rows rowsDispatchDetailGroup = dbConnect.runSqlQuery("select sum(t1.qty) qty,t1.sa_orderitemsid,t1.siteid from st_stockbill_items t1 where t1.sa_orderitemsid>0 and t1.st_stockbillid=" + st_stockbillid + " group by t1.sa_orderitemsid,t1.siteid");
  121. for (Row row : rowsDispatchDetailGroup) {
  122. sqlList.add("update sa_orderitems set undeliqty=undeliqty-" + row.getDouble("qty") + ",deliedqty=ifnull(deliedqty,0)+" + row.getDouble("qty") + ",offstatus=if(billingstatus='保内收费','待核销','不可核销'),offdate=CURRENT_TIME where sa_orderitemsid=" + row.getLong("sa_orderitemsid"));
  123. sqlList.add("update sa_orderitems set tobeoffqty=case when tobeoffqty+" + row.getDouble("qty") + ">canoffqty then canoffqty else tobeoffqty+" + row.getDouble("qty") + " end where billingstatus='保内收费' and sa_orderitemsid=" + row.getLong("sa_orderitemsid"));
  124. }
  125. for (Row row : itemRows) {
  126. if (row.getBoolean("skucontrol")) {
  127. sqlList.add("update st_stockbill_items set wmsuploadflag2=1 where st_stockbill_itemsid=" + row.getLong("st_stockbill_itemsid"));
  128. }
  129. }
  130. sqlList.addAll(updateAccountbalance_freez(isInStock(ischeck)));
  131. //判断是否关闭订单
  132. int orderautoclosepoint = Parameter.getInteger(siteid, "orderautoclosepoint");
  133. if(orderautoclosepoint==2){
  134. ArrayList<Long> sa_orderids = itemRows.toArrayList("sa_orderid",new ArrayList<>());
  135. QuerySQL querySQL = SQLFactory.createQuerySQL(controller, "sa_order", "sa_orderid");
  136. querySQL.addJoinTable(BaseClass.JOINTYPE.inner, "sa_orderitems", "t2", "t2.sa_orderid = t1.sa_orderid and t2.siteid = t1.siteid",
  137. "undeliqty","sa_orderitemsid");
  138. querySQL.setTableAlias("t1");
  139. querySQL.setWhere("t1.siteid", siteid);
  140. querySQL.setWhere("t1.sa_orderid", sa_orderids);
  141. querySQL.setWhere("t1.status='审核' and t2.undeliqty!=0");
  142. Rows rows = querySQL.query();
  143. RowsMap rowsMap =rows.toRowsMap("sa_orderid");
  144. RowsMap itemRowsMap=itemRows.toRowsMap("sa_orderid");
  145. for(Long sa_orderid : sa_orderids){
  146. Rows stockbillitemrows = itemRowsMap.getOrDefault(String.valueOf(sa_orderid),new Rows());
  147. Rows orderrows = rowsMap.getOrDefault(String.valueOf(sa_orderid),new Rows());
  148. RowsMap stockbillitemrowsMap =stockbillitemrows.toRowsMap("sa_orderitemsid");
  149. int count=0;
  150. for(Row row : orderrows){
  151. if(stockbillitemrowsMap.containsKey(row.getString("sa_orderitemsid"))){
  152. if(stockbillitemrowsMap.getOrDefault(row.getString("sa_orderitemsid"),new Rows()).sum("qty").compareTo(row.getBigDecimal("undeliqty"))==0){
  153. count++;
  154. }
  155. }
  156. }
  157. if(orderrows.size()==count){
  158. sqlList.add("update sa_order set status='关闭',closeby='"+controller.username+"',closedate=CURRENT_TIME where sa_orderid=" +sa_orderid);
  159. sqlList.add("UPDATE sa_accountbalance t1 " +
  160. "INNER JOIN sa_accountbalance_freez t2 ON t1.sa_accountbalanceid = t2.sa_accountbalanceid " +
  161. "SET t1.freezamount = case when ifnull(t1.freezamount,0)>t2.amount then t1.freezamount-t2.amount else 0 end " +
  162. "WHERE t1.sa_accountbalanceid="+accountbalancerows.get(0).getLong("sa_accountbalanceid")+" and t2.sourcetable='sa_order' and t2.sourceid="+sa_orderid);
  163. sqlList.add("delete from sa_accountbalance_freez t1 WHERE t1.sourcetable='sa_order' and t1.sourceid="+sa_orderid);
  164. }
  165. }
  166. }
  167. } else {
  168. if (order_paymentnode.equals("3")) {
  169. CashbillEntity entity = getCashbillEntity(billRow.getBigDecimal("payamount").negate(), billRow.getBigDecimal("paydiscountamount").negate(), st_stockbillid, "销售出库单审核", billno, "由销售出库单" + billno + "审核时生成","货款");
  170. JSONObject createCashbillPay = Accountbalance.createCashbillPay(dbConnect, userInfo, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"), entity, true);
  171. if(!(billRow.getBigDecimal("payamount").compareTo(BigDecimal.ZERO)==0 && billRow.getBigDecimal("paydiscountamount").compareTo(BigDecimal.ZERO)==0)){
  172. sqlList.addAll(createCashbillPay.getJSONArray("sqlList").toJavaList(String.class));
  173. }
  174. }
  175. if(!billRow.getString("sourceobject").equals("tpartreimbursement")){
  176. Rows rowsOrderDetail = dbConnect.runSqlQuery("select t1.undeliqty,t1.deliedqty,t1.qty,t1.sa_orderitemsid from sa_orderitems t1 where t1.sa_orderitemsid in (select sa_orderitemsid from st_stockbill_items where sa_orderitemsid>0 and st_stockbillid=" + st_stockbillid + ")");
  177. RowsMap rowsMap = rowsOrderDetail.toRowsMap("sa_orderitemsid");
  178. Rows rowsDispatchDetailGroup = dbConnect.runSqlQuery("select sum(t1.qty) qty,t1.sa_orderitemsid,t1.siteid from st_stockbill_items t1 where t1.sa_orderitemsid>0 and t1.st_stockbillid=" + st_stockbillid + " group by t1.sa_orderitemsid,t1.siteid");
  179. for (Row row : rowsDispatchDetailGroup) {
  180. sqlList.add("update sa_orderitems set undeliqty=" + rowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("undeliqty").add(row.getBigDecimal("qty")) + ",deliedqty=" + (rowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("deliedqty").subtract(row.getBigDecimal("qty"))) + " where sa_orderitemsid=" + row.getLong("sa_orderitemsid"));
  181. sqlList.add("update sa_orderitems set tobeoffqty=case when tobeoffqty-" + row.getDouble("qty") + ">0 then tobeoffqty-" + row.getDouble("qty")+" else 0 end where billingstatus='保内收费' and sa_orderitemsid=" + row.getLong("sa_orderitemsid"));
  182. }
  183. for (Row row : itemRows) {
  184. if (row.getBoolean("skucontrol")) {
  185. sqlList.add("update st_stockbill_items set wmsuploadflag2=0 where st_stockbill_itemsid=" + row.getLong("st_stockbill_itemsid"));
  186. }
  187. }
  188. }else{
  189. QuerySQL querySQL = SQLFactory.createQuerySQL(controller, "sa_tpartreimbursementdetail", "sa_tpartreimbursementdetailid","isverified","qty","sa_orderitemsid");
  190. querySQL.setTableAlias("t1");
  191. querySQL.addJoinTable(BaseClass.JOINTYPE.inner, "sa_tpartreimbursement", "t3", "t1.sa_tpartreimbursementid = t3.sa_tpartreimbursementid AND t1.siteid = t3.siteid");
  192. querySQL.setSiteid(siteid);
  193. querySQL.setWhere("t1.hongbillno='"+billno+"'");
  194. Rows rows = querySQL.query();
  195. QuerySQL querySQLgroup = SQLFactory.createQuerySQL(controller, "sa_tpartreimbursementdetail", "sa_orderitemsid");
  196. querySQLgroup.setTableAlias("t1");
  197. querySQLgroup.addJoinTable(BaseClass.JOINTYPE.left, "sa_orderitems", "t2", "t1.sa_orderitemsid = t2.sa_orderitemsid AND t1.siteid = t2.siteid");
  198. querySQLgroup.setSiteid(siteid);
  199. querySQLgroup.addQueryFields("sumqty", "sum(t1.checkqty)");
  200. querySQLgroup.setWhere("t1.hongbillno='"+ billno+"'");
  201. querySQLgroup.addGroupBy("sa_orderitemsid");
  202. Rows rowsgroup = querySQLgroup.query();
  203. for (Row row : rows) {
  204. sqlList.add("update sa_tpartreimbursementdetail set isverified=1 where sa_tpartreimbursementdetailid=" + row.getLong("sa_tpartreimbursementdetailid"));
  205. }
  206. for (Row row : rowsgroup) {
  207. sqlList.add("update sa_orderitems set verifiedqty=ifnull(verifiedqty,0)+"+row.getBigDecimal("sumqty")+" where sa_orderitemsid=" + row.getLong("sa_orderitemsid"));
  208. }
  209. }
  210. int orderautoclosepoint = Parameter.getInteger(siteid, "orderautoclosepoint");
  211. if(orderautoclosepoint==2){
  212. ArrayList<Long> sa_orderids = itemRows.toArrayList("sa_orderid",new ArrayList<>());
  213. for(Long sa_orderid : sa_orderids){
  214. sqlList.add("update sa_order set status='审核',closeby='',closedate=NULL where sa_orderid=" +sa_orderid);
  215. }
  216. }
  217. }
  218. } else {
  219. String order_paymentnode = Parameter.getString(siteid, "order_paymentnode");
  220. if (rb == 1) {
  221. if (order_paymentnode.equals("3")) {
  222. Rows cashbillRows =dbConnect.runSqlQuery("select amount,discountamount from sa_cashbill where ownerid="+st_stockbillid +" and ownertable='st_stockbill' and type=0 and class='货款'");
  223. CashbillEntity entity = getCashbillEntity(cashbillRows.sum("amount").negate(), cashbillRows.sum("discountamount").negate(), st_stockbillid, "销售出库单反审核", billno, "由销售出库单" + billno + "反审核时生成","货款");
  224. JSONObject createCashbillPay = Accountbalance.createCashbillPay(dbConnect, userInfo, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"), entity, true);
  225. if(!(cashbillRows.sum("amount").negate().compareTo(BigDecimal.ZERO)==0 && cashbillRows.sum("discountamount").negate().compareTo(BigDecimal.ZERO)==0)){
  226. sqlList.addAll(createCashbillPay.getJSONArray("sqlList").toJavaList(String.class));
  227. }
  228. }
  229. Rows rowsOrderDetail = dbConnect.runSqlQuery("select t1.undeliqty,t1.deliedqty,t1.qty,t1.sa_orderitemsid from sa_orderitems t1 where t1.sa_orderitemsid in (select sa_orderitemsid from st_stockbill_items where sa_orderitemsid>0 and st_stockbillid=" + st_stockbillid + ")");
  230. RowsMap rowsMap = rowsOrderDetail.toRowsMap("sa_orderitemsid");
  231. Rows rowsDispatchDetailGroup = dbConnect.runSqlQuery("select sum(t1.qty) qty,t1.sa_orderitemsid,t1.siteid from st_stockbill_items t1 where t1.sa_orderitemsid>0 and t1.st_stockbillid=" + st_stockbillid + " group by t1.sa_orderitemsid,t1.siteid");
  232. for (Row row : rowsDispatchDetailGroup) {
  233. sqlList.add("update sa_orderitems set undeliqty=" + rowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("undeliqty").add(row.getBigDecimal("qty")) + ",deliedqty=" + (rowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("deliedqty").subtract(row.getBigDecimal("qty"))) + " where sa_orderitemsid=" + row.getLong("sa_orderitemsid"));
  234. sqlList.add("update sa_orderitems set tobeoffqty=case when tobeoffqty-" + row.getDouble("qty") + ">0 then tobeoffqty-" + row.getDouble("qty")+" else 0 end where billingstatus='保内收费' and sa_orderitemsid=" + row.getLong("sa_orderitemsid"));
  235. }
  236. for (Row row : itemRows) {
  237. if (row.getBoolean("skucontrol")) {
  238. sqlList.add("update st_stockbill_items set wmsuploadflag2=0 where st_stockbill_itemsid=" + row.getLong("st_stockbill_itemsid"));
  239. }
  240. }
  241. //判断是否关闭订单
  242. int orderautoclosepoint = Parameter.getInteger(siteid, "orderautoclosepoint");
  243. if(orderautoclosepoint==2){
  244. ArrayList<Long> sa_orderids = itemRows.toArrayList("sa_orderid",new ArrayList<>());
  245. for(Long sa_orderid : sa_orderids){
  246. sqlList.add("update sa_order set status='审核',closeby='',closedate=NULL where sa_orderid=" +sa_orderid);
  247. }
  248. }
  249. sqlList.addAll(updateAccountbalance_freez(isInStock(ischeck)));
  250. } else {
  251. if (order_paymentnode.equals("3")) {
  252. Rows cashbillRows =dbConnect.runSqlQuery("select amount,discountamount from sa_cashbill where ownerid="+st_stockbillid +" and ownertable='st_stockbill' and type=0 and class='货款'");
  253. CashbillEntity entity = getCashbillEntity(cashbillRows.sum("amount").negate(), cashbillRows.sum("discountamount").negate(), st_stockbillid, "销售出库单反审核", billno, "由销售出库单" + billno + "反审核时生成","货款");
  254. JSONObject createCashbillPay = Accountbalance.createCashbillPay(dbConnect, userInfo, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"), entity, true);
  255. if(!(cashbillRows.sum("amount").negate().compareTo(BigDecimal.ZERO)==0 && cashbillRows.sum("discountamount").negate().compareTo(BigDecimal.ZERO)==0)){
  256. sqlList.addAll(createCashbillPay.getJSONArray("sqlList").toJavaList(String.class));
  257. }
  258. }
  259. if(!billRow.getString("sourceobject").equals("tpartreimbursement")){
  260. Rows rowsDispatchDetailGroup = dbConnect.runSqlQuery("select sum(t1.qty) qty,t1.sa_orderitemsid,t1.siteid from st_stockbill_items t1 where t1.sa_orderitemsid>0 and t1.st_stockbillid=" + st_stockbillid + " group by t1.sa_orderitemsid,t1.siteid");
  261. for (Row row : rowsDispatchDetailGroup) {
  262. sqlList.add("update sa_orderitems set undeliqty=undeliqty-" + row.getDouble("qty") + ",deliedqty=ifnull(deliedqty,0)+" + row.getDouble("qty") + ",offstatus=if(billingstatus='保内收费','待核销','不可核销'),offdate=CURRENT_TIME where sa_orderitemsid=" + row.getLong("sa_orderitemsid"));
  263. sqlList.add("update sa_orderitems set tobeoffqty=case when tobeoffqty+" + row.getDouble("qty") + ">canoffqty then canoffqty else tobeoffqty+" + row.getDouble("qty") + " end where billingstatus='保内收费' and sa_orderitemsid=" + row.getLong("sa_orderitemsid"));
  264. }
  265. for (Row row : itemRows) {
  266. if (row.getBoolean("skucontrol")) {
  267. sqlList.add("update st_stockbill_items set wmsuploadflag2=1 where st_stockbill_itemsid=" + row.getLong("st_stockbill_itemsid"));
  268. }
  269. }
  270. }else{
  271. QuerySQL querySQL = SQLFactory.createQuerySQL(controller, "sa_tpartreimbursementdetail", "sa_tpartreimbursementdetailid","isverified","qty","sa_orderitemsid");
  272. querySQL.setTableAlias("t1");
  273. querySQL.addJoinTable(BaseClass.JOINTYPE.inner, "sa_tpartreimbursement", "t3", "t1.sa_tpartreimbursementid = t3.sa_tpartreimbursementid AND t1.siteid = t3.siteid");
  274. querySQL.setSiteid(siteid);
  275. querySQL.setWhere("t1.hongbillno='"+billno+"'");
  276. Rows rows = querySQL.query();
  277. QuerySQL querySQLgroup = SQLFactory.createQuerySQL(controller, "sa_tpartreimbursementdetail", "sa_orderitemsid");
  278. querySQLgroup.setTableAlias("t1");
  279. querySQLgroup.addJoinTable(BaseClass.JOINTYPE.left, "sa_orderitems", "t2", "t1.sa_orderitemsid = t2.sa_orderitemsid AND t1.siteid = t2.siteid");
  280. querySQLgroup.setSiteid(siteid);
  281. querySQLgroup.addQueryFields("sumqty", "sum(t1.checkqty)");
  282. querySQLgroup.setWhere("t1.hongbillno='"+ billno+"'");
  283. querySQLgroup.addGroupBy("sa_orderitemsid");
  284. Rows rowsgroup = querySQLgroup.query();
  285. for (Row row : rows) {
  286. sqlList.add("update sa_tpartreimbursementdetail set isverified=0 where sa_tpartreimbursementdetailid=" + row.getLong("sa_tpartreimbursementdetailid"));
  287. }
  288. for (Row row : rowsgroup) {
  289. sqlList.add("update sa_orderitems set verifiedqty=ifnull(verifiedqty,0)-"+row.getBigDecimal("sumqty")+" where sa_orderitemsid=" + row.getLong("sa_orderitemsid"));
  290. }
  291. }
  292. //判断是否关闭订单
  293. int orderautoclosepoint = Parameter.getInteger(siteid, "orderautoclosepoint");
  294. if(orderautoclosepoint==2){
  295. ArrayList<Long> sa_orderids = itemRows.toArrayList("sa_orderid",new ArrayList<>());
  296. QuerySQL querySQL = SQLFactory.createQuerySQL(controller, "sa_order", "sa_orderid");
  297. querySQL.addJoinTable(BaseClass.JOINTYPE.inner, "sa_orderitems", "t2", "t2.sa_orderid = t1.sa_orderid and t2.siteid = t1.siteid",
  298. "undeliqty","sa_orderitemsid");
  299. querySQL.setTableAlias("t1");
  300. querySQL.setWhere("t1.siteid", siteid);
  301. querySQL.setWhere("t1.sa_orderid", sa_orderids);
  302. querySQL.setWhere("t1.status='审核' and t2.undeliqty!=0");
  303. Rows rows = querySQL.query();
  304. RowsMap rowsMap =rows.toRowsMap("sa_orderid");
  305. RowsMap itemRowsMap=itemRows.toRowsMap("sa_orderid");
  306. for(Long sa_orderid : sa_orderids){
  307. Rows stockbillitemrows = itemRowsMap.getOrDefault(String.valueOf(sa_orderid),new Rows());
  308. Rows orderrows = rowsMap.getOrDefault(String.valueOf(sa_orderid),new Rows());
  309. RowsMap stockbillitemrowsMap =stockbillitemrows.toRowsMap("sa_orderitemsid");
  310. int count=0;
  311. for(Row row : orderrows){
  312. if(stockbillitemrowsMap.containsKey(row.getString("sa_orderitemsid"))){
  313. if(stockbillitemrowsMap.getOrDefault(row.getString("sa_orderitemsid"),new Rows()).sum("qty").compareTo(row.getBigDecimal("undeliqty"))==0){
  314. count++;
  315. }
  316. }
  317. }
  318. if(orderrows.size()==count){
  319. sqlList.add("update sa_order set status='关闭',closeby='"+controller.username+"',closedate=CURRENT_TIME where sa_orderid=" +sa_orderid);
  320. sqlList.add("UPDATE sa_accountbalance t1 " +
  321. "INNER JOIN sa_accountbalance_freez t2 ON t1.sa_accountbalanceid = t2.sa_accountbalanceid " +
  322. "SET t1.freezamount = case when ifnull(t1.freezamount,0)>t2.amount then t1.freezamount-t2.amount else 0 end " +
  323. "WHERE t1.sa_accountbalanceid="+accountbalancerows.get(0).getLong("sa_accountbalanceid")+" and t2.sourcetable='sa_order' and t2.sourceid="+sa_orderid);
  324. sqlList.add("delete from sa_accountbalance_freez t1 WHERE t1.sourcetable='sa_order' and t1.sourceid="+sa_orderid);
  325. }
  326. }
  327. }
  328. }
  329. }
  330. return sqlList;
  331. }
  332. public ArrayList<String> getCheckSql_custamount(boolean ischeck) throws YosException {
  333. ArrayList<String> sqlList = super.getCheckSql_custamount(ischeck);
  334. if (ischeck) {
  335. 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=" + sys_enterpriseid);
  336. String order_paymentnode = Parameter.getString(siteid, "order_paymentnode");
  337. if (rb == 1) {
  338. if (order_paymentnode.equals("3")) {
  339. BigDecimal custamount=BigDecimal.ZERO;
  340. for(Row row :itemRows){
  341. custamount=custamount.add(row.getBigDecimal("custamount").multiply(row.getBigDecimal("qty")));
  342. }
  343. CashbillEntity entity_custamount = getCashbillEntity(custamount, BigDecimal.ZERO, st_stockbillid, "销售出库单审核", billno, "由销售出库单" + billno + "审核时生成","客户档案资料费");
  344. JSONObject createCashbillPay_custamount = Accountbalance.createCashbillPay(dbConnect, userInfo, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"), entity_custamount, true);
  345. if(custamount.compareTo(BigDecimal.ZERO)!=0){
  346. sqlList.addAll(createCashbillPay_custamount.getJSONArray("sqlList").toJavaList(String.class));
  347. }
  348. }
  349. } else {
  350. if (order_paymentnode.equals("3")) {
  351. BigDecimal custamount=BigDecimal.ZERO;
  352. for(Row row :itemRows){
  353. custamount=custamount.add(row.getBigDecimal("custamount").multiply(row.getBigDecimal("qty")));
  354. }
  355. CashbillEntity entity_custamount = getCashbillEntity(custamount.negate(), BigDecimal.ZERO, st_stockbillid, "销售出库单审核", billno, "由销售出库单" + billno + "审核时生成","客户档案资料费");
  356. JSONObject createCashbillPay_custamount = Accountbalance.createCashbillPay(dbConnect, userInfo, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"), entity_custamount, true);
  357. if(custamount.negate().compareTo(BigDecimal.ZERO)!=0){
  358. sqlList.addAll(createCashbillPay_custamount.getJSONArray("sqlList").toJavaList(String.class));
  359. }
  360. }
  361. }
  362. } else {
  363. 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=" + sys_enterpriseid);
  364. String order_paymentnode = Parameter.getString(siteid, "order_paymentnode");
  365. if (rb == 1) {
  366. if (order_paymentnode.equals("3")) {
  367. Rows cashbillRows_custamount =dbConnect.runSqlQuery("select amount,discountamount from sa_cashbill where ownerid="+st_stockbillid +" and ownertable='st_stockbill' and type=0 and class='客户档案资料费'");
  368. CashbillEntity entity_custamount = getCashbillEntity(cashbillRows_custamount.sum("amount").negate(), cashbillRows_custamount.sum("discountamount").negate(), st_stockbillid, "销售出库单反审核", billno, "由销售出库单" + billno + "反审核时生成","客户档案资料费");
  369. JSONObject createCashbillPay_custamount = Accountbalance.createCashbillPay(dbConnect, userInfo, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"), entity_custamount, true);
  370. if(cashbillRows_custamount.sum("amount").negate().compareTo(BigDecimal.ZERO)!=0){
  371. sqlList.addAll(createCashbillPay_custamount.getJSONArray("sqlList").toJavaList(String.class));
  372. }
  373. }
  374. } else {
  375. if (order_paymentnode.equals("3")) {
  376. Rows cashbillRows_custamount =dbConnect.runSqlQuery("select amount,discountamount from sa_cashbill where ownerid="+st_stockbillid +" and ownertable='st_stockbill' and type=0 and class='客户档案资料费'");
  377. CashbillEntity entity_custamount = getCashbillEntity(cashbillRows_custamount.sum("amount").negate(),cashbillRows_custamount.sum("discountamount").negate(), st_stockbillid, "销售出库单审核", billno, "由销售出库单" + billno + "审核时生成","客户档案资料费");
  378. JSONObject createCashbillPay_custamount = Accountbalance.createCashbillPay(dbConnect, userInfo, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"), entity_custamount, true);
  379. if(cashbillRows_custamount.sum("amount").negate().compareTo(BigDecimal.ZERO)!=0){
  380. sqlList.addAll(createCashbillPay_custamount.getJSONArray("sqlList").toJavaList(String.class));
  381. }
  382. }
  383. }
  384. }
  385. return sqlList;
  386. }
  387. /**
  388. * 账户余额冻结
  389. *
  390. * @param addorsub
  391. */
  392. public ArrayList<String> updateAccountbalance_freez(boolean addorsub) throws YosException {
  393. ArrayList<String> sqllist = new ArrayList<>();
  394. /******** 冻结数据 ********/
  395. Rows rows = dbConnect.runSqlQuery("select t4.sa_accountbalanceid,t3.sa_orderid,t3.sonum,t3.type,ROUND(sum(t1.qty*(t1.price+ifnull(t1.custamount,0))), 2) amount from st_stockbill_items t1 \n" +
  396. " inner join sa_orderitems t2 on t1.sa_orderitemsid=t2.sa_orderitemsid and t1.siteid=t2.siteid\n" +
  397. " inner join sa_order t3 on t2.sa_orderid=t3.sa_orderid and t2.siteid=t3.siteid\n" +
  398. "\t\t\t\t\t\t\t\t\tleft join sa_accountbalance t4 on t4.sa_accountclassid=t3.sa_accountclassid and t4.sys_enterpriseid=t3.sys_enterpriseid and t4.siteid=t3.siteid\n" +
  399. " where t1.st_stockbillid=" + st_stockbillid + " group by t4.sa_accountbalanceid,t3.sa_orderid,t3.sonum");
  400. if (addorsub) {
  401. for (Row row : rows) {
  402. String sonum = row.getString("sonum");
  403. long sa_orderid = row.getLong("sa_orderid");
  404. long sa_accountbalanceid = row.getLong("sa_accountbalanceid");
  405. BigDecimal amount = row.getBigDecimal("amount");
  406. Rows accountbalancefreezrows = dbConnect.runSqlQuery("select sa_accountbalance_freezid from sa_accountbalance_freez where sourceid=" + sa_orderid + " and sourcetable='sa_order' and siteid='" + siteid + "'");
  407. sqllist.add("update sa_accountbalance set freezamount=ifnull(freezamount,0)+" + amount + " where sa_accountbalanceid=" + sa_accountbalanceid + " and siteid='" + siteid + "'");
  408. if (accountbalancefreezrows.isNotEmpty()) {
  409. sqllist.add("update sa_accountbalance_freez set amount=amount+" + amount + " where sa_accountbalance_freezid=" + accountbalancefreezrows.get(0).getLong("sa_accountbalance_freezid"));
  410. } else {
  411. InsertSQL insertSQL = SQLFactory.createInsertSQL(dbConnect, "sa_accountbalance_freez");
  412. insertSQL.setSiteid(siteid);
  413. insertSQL.setValue("sa_accountbalanceid", sa_accountbalanceid);
  414. insertSQL.setValue("sourcetable", "sa_order");
  415. insertSQL.setValue("sourceid", sa_orderid);
  416. insertSQL.setValue("amount", amount);
  417. insertSQL.setValue("remarks", "由"+ (row.getString("type").equals("配件订单")?"配件":"销售")+"订单" + sonum + "审核时冻结");
  418. insertSQL.setValue("createby", userInfo.getUserName());
  419. insertSQL.setDateValue("createdate");
  420. sqllist.add(insertSQL.getSQL());
  421. }
  422. }
  423. } else {
  424. for (Row row : rows) {
  425. long sa_orderid = row.getLong("sa_orderid");
  426. long sa_accountbalanceid = row.getLong("sa_accountbalanceid");
  427. BigDecimal amount = row.getBigDecimal("amount");
  428. Rows accountbalancefreezrows = dbConnect.runSqlQuery("select sa_accountbalance_freezid,amount from sa_accountbalance_freez where sourceid=" + sa_orderid + " and sourcetable='sa_order' and siteid='" + siteid + "'");
  429. if (accountbalancefreezrows.size() > 0) {
  430. if(accountbalancefreezrows.get(0).getBigDecimal("amount").compareTo(amount)>0){
  431. sqllist.add("update sa_accountbalance set freezamount=ifnull(freezamount,0)-" + amount + " where sa_accountbalanceid=" + sa_accountbalanceid);
  432. sqllist.add("update sa_accountbalance_freez set amount=amount-" + amount + " where sa_accountbalance_freezid=" + accountbalancefreezrows.get(0).getLong("sa_accountbalance_freezid"));
  433. }else{
  434. sqllist.add("update sa_accountbalance set freezamount=ifnull(freezamount,0)-" + accountbalancefreezrows.get(0).getBigDecimal("amount") + " where sa_accountbalanceid=" + sa_accountbalanceid);
  435. sqllist.add("update sa_accountbalance_freez set amount=0 where sa_accountbalance_freezid=" + accountbalancefreezrows.get(0).getLong("sa_accountbalance_freezid"));
  436. }
  437. }
  438. }
  439. }
  440. return sqllist;
  441. }
  442. public static CashbillEntity getCashbillEntity(BigDecimal amount, BigDecimal discountamount, Long ownerid, String source, String sourcenotes, String remarks,String type) throws YosException {
  443. CashbillEntity entity = new CashbillEntity();
  444. entity.setAmount(amount);
  445. entity.setDiscountamountamount(discountamount);
  446. entity.setOwnerid(ownerid);
  447. entity.setOwnertable("st_stockbill");
  448. entity.setSource(source);
  449. entity.setRemarks(remarks);
  450. entity.setType(type);
  451. entity.setSourcenote(sourcenotes);
  452. return entity;
  453. }
  454. @Override
  455. public boolean isInStock(boolean fischeck) {
  456. if (fischeck && rb == 0 || !fischeck && rb == 1) {
  457. return true;
  458. }
  459. return false;
  460. }
  461. }