Browse Source

订单下单时判断支出的账户

hu 2 years ago
parent
commit
536155d904

+ 83 - 18
src/custom/restcontroller/webmanage/sale/order/Order.java

@@ -1002,6 +1002,9 @@ public class Order extends Controller {
             return getErrReturnObject().setErrMsg("订单不存在").toString();
         }
         Row row = rows.get(0);
+        //付款账户信息
+        JSONArray accountclassinfos = row.getJSONArray("sa_accountclassinfos");
+
         Long sa_accountclassid = row.getLong("sa_accountclassid");
         if (sa_accountclassid <= 0) {
             return getErrReturnObject().setErrMsg("请选择支付账号").toString();
@@ -1123,17 +1126,42 @@ public class Order extends Controller {
                 sqlList.addAll(useRateBill(row, "订单提交"));
 
             } else {
-                if (Accountbalance.judgeBalance(this, pay_enterpriseid, sa_accountclassid, amount)) {
-                    CashbillEntity entity = getCashbillEntity(amount, sa_orderid, "订单提交", "由" + sonum + "订单提交时自动产生");
-                    sqlList.addAll(Accountbalance.createCashbillPay(this, pay_enterpriseid, sa_accountclassid, entity, true));
-                } else {
-                    return getErrReturnObject().setErrMsg("账户余额不足,还差"+Accountbalance.InsufficientBalance(this, pay_enterpriseid, sa_accountclassid, amount)+"元!").toString();
+
+                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="+pay_enterpriseid+" where isused=1 and t1.siteid='"+siteid+"'");
+                RowsMap accountclassrowsMap = accountclassrows.toRowsMap("sa_accountclassid");
+                if(!accountclassinfos.isEmpty()){
+                    for (Object object:accountclassinfos) {
+                        JSONObject jsonObject = (JSONObject) object;
+                        if (Accountbalance.judgeBalance(this, pay_enterpriseid, jsonObject.getLong("sa_accountclassid"), jsonObject.getBigDecimal("amount"))) {
+                            CashbillEntity entity = getCashbillEntity(jsonObject.getBigDecimal("amount"), sa_orderid, "订单提交", "由" + sonum + "订单提交时,"+jsonObject.getString("accountname")+"账户自动支出产生");
+                            //
+                            if(accountclassrowsMap.containsKey(jsonObject.getString("sa_accountclassid")) && accountclassrowsMap.get(jsonObject.getString("sa_accountclassid")).isNotEmpty()){
+                                jsonObject.put("balance",accountclassrowsMap.get(jsonObject.getString("sa_accountclassid")).get(0).getBigDecimal("balance").subtract(jsonObject.getBigDecimal("amount")));
+                            }else {
+                                jsonObject.put("balance",jsonObject.getBigDecimalValue("balance").subtract(jsonObject.getBigDecimal("amount")));
+                            }
+
+                            sqlList.addAll(Accountbalance.createCashbillPay(this, pay_enterpriseid, jsonObject.getLong("sa_accountclassid"), entity, true));
+                        } else {
+                            return getErrReturnObject().setErrMsg("账户余额不足,还差"+Accountbalance.InsufficientBalance(this, pay_enterpriseid, jsonObject.getLong("sa_accountclassid"), jsonObject.getBigDecimal("amount"))+"元!").toString();
+                        }
+                    }
+                }else{
+                    if (Accountbalance.judgeBalance(this, pay_enterpriseid, sa_accountclassid, amount)) {
+                        CashbillEntity entity = getCashbillEntity(amount, sa_orderid, "订单提交", "由" + sonum + "订单提交时自动产生");
+                        sqlList.addAll(Accountbalance.createCashbillPay(this, pay_enterpriseid, sa_accountclassid, entity, true));
+                    } else {
+                        return getErrReturnObject().setErrMsg("账户余额不足,还差"+Accountbalance.InsufficientBalance(this, pay_enterpriseid, sa_accountclassid, amount)+"元!").toString();
+                    }
                 }
+
+
             }
         }
 
         String message = "您的订单【" + sonum + "】 金额为【" + amount + "】 已提交!";
 
+        sqlList.add("update sa_order set sa_accountclassinfos='"+accountclassinfos+"' where sa_orderid="+sa_orderid+" and siteid='"+siteid+"'");
         sqlList.add(getOrderSubmitSql(sa_orderid, status, freightstatus));
         sqlList.add(DataContrlLog.createLog(this, "sa_order", sa_orderid, "订单提交", "订单提交成功,金额:" + amount).getSQL());
         dbConnect.runSqlUpdate(sqlList);
@@ -1233,6 +1261,7 @@ public class Order extends Controller {
             return getErrReturnObject().setErrMsg("订单不存在").toString();
         }
         Row row = rows.get(0);
+        JSONArray accountclassinfos = row.getJSONArray("accountclassinfos");
         Long sys_enterpriseid = row.getLong("sys_enterpriseid");
         Long sa_accountclassid = row.getLong("sa_accountclassid");
         if (sa_accountclassid <= 0) {
@@ -1285,11 +1314,24 @@ public class Order extends Controller {
                 sqlList.addAll(useRateBill(row, "订单审核"));
 
             } else {
-                if (Accountbalance.judgeBalance(this, pay_enterpriseid, sa_accountclassid, amount)) {
-                    CashbillEntity entity = getCashbillEntity(amount, sa_orderid, "订单审核", "由" + sonum + "订单审核时自动产生");
-                    sqlList.addAll(Accountbalance.createCashbillPay(this, pay_enterpriseid, sa_accountclassid, entity, true));
-                } else {
-                    return getErrReturnObject().setErrMsg("账户余额不足").toString();
+                if(!accountclassinfos.isEmpty()){
+                    for (Object object:accountclassinfos) {
+                        JSONObject jsonObject = (JSONObject) object;
+                        if (Accountbalance.judgeBalance(this, pay_enterpriseid, jsonObject.getLong("sa_accountclassid"), jsonObject.getBigDecimal("amount"))) {
+                            CashbillEntity entity = getCashbillEntity(jsonObject.getBigDecimal("amount"), sa_orderid, "订单审核", "由" + sonum + "订单审核时,"+jsonObject.getString("accountname")+"账户自动支出产生");
+                            jsonObject.put("balance",jsonObject.getBigDecimalValue("balance").subtract(jsonObject.getBigDecimal("amount")));
+                            sqlList.addAll(Accountbalance.createCashbillPay(this, pay_enterpriseid, jsonObject.getLong("sa_accountclassid"), entity, true));
+                        } else {
+                            return getErrReturnObject().setErrMsg("账户余额不足,还差"+Accountbalance.InsufficientBalance(this, pay_enterpriseid, jsonObject.getLong("sa_accountclassid"), jsonObject.getBigDecimal("amount"))+"元!").toString();
+                        }
+                    }
+                }else{
+                    if (Accountbalance.judgeBalance(this, pay_enterpriseid, sa_accountclassid, amount)) {
+                        CashbillEntity entity = getCashbillEntity(amount, sa_orderid, "订单审核", "由" + sonum + "订单审核时自动产生");
+                        sqlList.addAll(Accountbalance.createCashbillPay(this, pay_enterpriseid, sa_accountclassid, entity, true));
+                    } else {
+                        return getErrReturnObject().setErrMsg("账户余额不足,还差"+Accountbalance.InsufficientBalance(this, pay_enterpriseid, sa_accountclassid, amount)+"元!").toString();
+                    }
                 }
             }
         }
@@ -1739,7 +1781,8 @@ public class Order extends Controller {
 
     public ArrayList<String> returnPayBill(Row orderrow, String source, String remarks) throws YosException {
         Long sa_orderid = orderrow.getLong("sa_orderid");
-        Long sa_accountclassid = orderrow.getLong("sa_accountclassid");
+        JSONArray sa_accountclassinfos =orderrow.getJSONArray("sa_accountclassinfos");
+        //Long sa_accountclassid = orderrow.getLong("sa_accountclassid");
         //验证结算企业
         Long pay_enterpriseid = orderrow.getLong("pay_enterpriseid");
         ArrayList<String> sqlList = new ArrayList<>();
@@ -1759,15 +1802,31 @@ public class Order extends Controller {
 
         }
         //金额
-        Rows amountRows = getCashbillRows(sa_orderid);
+        Rows amountRows = getMultipleAccountsCashbillRows(sa_orderid);
         if (amountRows.isNotEmpty()) {
-            amount = amountRows.get(0).getBigDecimal("amount");
-            if (amount.compareTo(BigDecimal.ZERO) > 0) {
-                CashbillEntity entity = getCashbillEntity(amount.negate(), sa_orderid, source, remarks);
-                sqlList.addAll(Accountbalance.createCashbillPay(this, pay_enterpriseid, sa_accountclassid, entity, true));
+            for (Row row:amountRows) {
+                amount=row.getBigDecimal("amount");
+                if(!sa_accountclassinfos.isEmpty()){
+                    for (Object object:sa_accountclassinfos) {
+                        JSONObject jsonObject = (JSONObject)object;
+                        if(jsonObject.getLong("sa_accountclassid")==row.getLong("sa_accountclassid")){
+                            System.out.println(jsonObject.getBigDecimal("balance"));
+                            System.out.println(amount);
+                             System.out.println(jsonObject.getBigDecimal("balance").add(amount));
+                            jsonObject.put("balance",jsonObject.getBigDecimal("balance").add(amount));
+                            break;
+                        }
+                    }
+                }
+                if (amount.compareTo(BigDecimal.ZERO) > 0) {
+                    CashbillEntity entity = getCashbillEntity(amount.negate(), sa_orderid, source, remarks);
+                    sqlList.addAll(Accountbalance.createCashbillPay(this, pay_enterpriseid, row.getLong("sa_accountclassid"), entity, true));
+                }
             }
-        }
 
+
+        }
+        sqlList.add("update sa_order set sa_accountclassinfos='"+sa_accountclassinfos+"' where sa_orderid="+sa_orderid+" and siteid='"+siteid+"'");
         return sqlList;
     }
 
@@ -2472,7 +2531,13 @@ public class Order extends Controller {
 
     public Rows getCashbillRows(Long sa_orderid) throws YosException {
 
-        return dbConnect.runSqlQuery("SELECT sum(amount) amount from sa_cashbill WHERE  ownerid ='" + sa_orderid + "' and ownertable='sa_order' and type = 0 and sa_cashbillid_rebate is null and siteid = '" + siteid + "'");
+        return dbConnect.runSqlQuery("SELECT sum(amount) amount from sa_cashbill WHERE  ownerid ='" + sa_orderid + "' and ownertable='sa_order' and type = 0 and sa_cashbillid_rebate is null and siteid = '" + siteid + "' ");
+
+    }
+
+    public Rows getMultipleAccountsCashbillRows(Long sa_orderid) throws YosException {
+
+        return dbConnect.runSqlQuery("SELECT sa_accountclassid,sum(amount) amount from sa_cashbill WHERE  ownerid ='" + sa_orderid + "' and ownertable='sa_order' and type = 0 and sa_cashbillid_rebate is null and siteid = '" + siteid + "' group by sa_accountclassid");
 
     }
 

+ 90 - 7
src/custom/restcontroller/webmanage/sale/order/OrderItems.java

@@ -299,9 +299,6 @@ public class OrderItems extends Controller {
             }
         }
         dbConnect.runSqlUpdate(sqlList);
-        for (String str:sqlList) {
-             System.out.println(str);
-        }
         //重新排序
         updateRowNo(sa_orderid);
         //居间费设置
@@ -312,13 +309,99 @@ public class OrderItems extends Controller {
             setRebateAmount(this, sa_orderid, getMaxUsedRebateAmount(this, sa_orderid));
             adjustLastRebateAmount(this, sa_orderid);
         }
-//        else {
-//            dbConnect.runSqlUpdate("UPDATE sa_orderitems SET amount=amount-rebateamount,price=amount/qty WHERE sa_orderid='" + sa_orderid + "' and siteid='" + siteid + "' and qty!=0");
-//            dbConnect.runSqlUpdate("UPDATE sa_orderitems SET amount=0 WHERE sa_orderid='" + sa_orderid + "' and siteid='" + siteid + "' and qty=0");
-//        }
+
+        //更新订单扣款信息
+        updateAccountclassinfos(sa_orderid);
+
+
         return getSucReturnObject().toString();
     }
 
+
+    /**
+     * 更新订单扣款信息
+     */
+    public void updateAccountclassinfos(Long sa_orderid) throws YosException {
+
+        Rows orderRows = getOrderRows(this, sa_orderid);
+
+
+        if (orderRows.isEmpty()) {
+            return;
+        }
+        JSONArray jsonArray =new JSONArray();
+        BigDecimal orderSumamount = BigDecimal.ZERO;
+        Rows classamountrows =dbConnect.runSqlQuery("select t3.topitemclassid,t1.siteid,sum(ifnull(t1.amount,0)) sumamount  from sa_orderitems t1 inner join sa_itemsaleclass t2 on t1.itemid=t2.itemid and t1.siteid=t2.siteid inner join (select itemclassid,find_top(itemclassid) topitemclassid,siteid  from plm_itemclass where siteid!='ZZYOS') t3 on t2.itemclassid=t3.itemclassid and t2.siteid=t3.siteid  where t1.sa_orderid="+sa_orderid+" group by t3.topitemclassid,t1.siteid");
+        for (Row classamountrow:classamountrows) {
+            orderSumamount=orderSumamount.add(classamountrow.getBigDecimal("sumamount"));
+        }
+        if(orderSumamount.compareTo(getAmount(this,sa_orderid))!=0){
+            return;
+        }
+
+        RowsMap classamountrowsMap =classamountrows.toRowsMap("topitemclassid");
+        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+"'");
+        BigDecimal firstpayamount = BigDecimal.ZERO;
+
+
+        if(!accountclassrows.isEmpty()){
+            for (Row row:accountclassrows) {
+                BigDecimal sumamount =BigDecimal.ZERO;
+                JSONObject jsonObject =new JSONObject();
+                if(row.getJSONArray("bindingcategories")!=null && !row.getJSONArray("bindingcategories").isEmpty()){
+                    for (Object object:row.getJSONArray("bindingcategories")) {
+                        Long topitemclassid = Long.valueOf(object.toString());
+                        if(classamountrowsMap.containsKey(object.toString())){
+                            if(classamountrowsMap.get(object.toString()).isNotEmpty()){
+                                sumamount=sumamount.add(classamountrowsMap.get(object.toString()).get(0).getBigDecimal("sumamount").multiply(row.getBigDecimal("maximumdiscount")).setScale(2, BigDecimal.ROUND_HALF_UP));
+                            }
+                        }
+                    }
+                }
+                if(sumamount.compareTo(BigDecimal.ZERO)>0){
+                    if((row.getBigDecimal("balance").add(row.getBigDecimal("creditquota"))).compareTo(BigDecimal.ZERO)<=0){
+                        continue;
+                    }else if((row.getBigDecimal("balance").add(row.getBigDecimal("creditquota"))).compareTo(sumamount)<0){
+                        //部分优先账户扣款,部分现金扣款
+                        jsonObject.put("amount",row.getBigDecimal("balance").add(row.getBigDecimal("creditquota")));
+                        jsonObject.put("sa_accountclassid",row.getLong("sa_accountclassid"));
+                        jsonObject.put("accountname",row.getString("accountname"));
+                        jsonObject.put("balance",row.getBigDecimal("balance"));
+                        jsonObject.put("creditquota",row.getBigDecimal("creditquota"));
+                        jsonArray.add(jsonObject);
+                        firstpayamount=firstpayamount.add(row.getBigDecimal("balance").add(row.getBigDecimal("creditquota")));
+
+                    }else if((row.getBigDecimal("balance").add(row.getBigDecimal("creditquota"))).compareTo(sumamount)>=0){
+                        //全部优先账户扣款
+                        jsonObject.put("amount",sumamount);
+                        jsonObject.put("sa_accountclassid",row.getLong("sa_accountclassid"));
+                        jsonObject.put("accountname",row.getString("accountname"));
+                        jsonObject.put("balance",row.getBigDecimal("balance"));
+                        jsonObject.put("creditquota",row.getBigDecimal("creditquota"));
+                        jsonArray.add(jsonObject);
+                        firstpayamount=firstpayamount.add(sumamount);
+                    }
+                }
+            }
+        }
+
+        if(orderSumamount.compareTo(firstpayamount)>0){
+
+            Rows xianjinaccountclassrows =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 isorder=1 and isused=1 and t1.accountname='现金账户' and t1.siteid='"+siteid+"'");
+            if(xianjinaccountclassrows.isNotEmpty()){
+                JSONObject jsonObject =new JSONObject();
+                jsonObject.put("amount", orderSumamount.subtract(firstpayamount));
+                jsonObject.put("sa_accountclassid",xianjinaccountclassrows.get(0).getLong("sa_accountclassid"));
+                jsonObject.put("accountname",xianjinaccountclassrows.get(0).getString("accountname"));
+                jsonObject.put("balance",xianjinaccountclassrows.get(0).getBigDecimal("balance"));
+                jsonObject.put("creditquota",xianjinaccountclassrows.get(0).getBigDecimal("creditquota"));
+                jsonArray.add(jsonObject);
+            }
+        }
+
+        dbConnect.runSqlUpdate("update sa_order set sa_accountclassinfos='"+jsonArray+"' where sa_orderid="+sa_orderid+" and siteid='"+siteid+"'");
+    }
+
     /**
      * 更新居间费信息
      */