Преглед на файлове

发货计划及订单批处理

hu преди 7 месеца
родител
ревизия
15e8192e62

+ 45 - 0
src/custom/restcontroller/R.java

@@ -5717,6 +5717,51 @@ public class R {
         public static class v1 {
         }
     }
+
+    public static class ID2025032708594903 {
+        public static class v1 {
+        }
+    }
+
+    public static class ID2025032709024503 {
+        public static class v1 {
+        }
+    }
+
+    public static class ID2025032709040403 {
+        public static class v1 {
+        }
+    }
+
+    public static class ID2025032709331803 {
+        public static class v1 {
+        }
+    }
+
+    public static class ID2025032709342503 {
+        public static class v1 {
+        }
+    }
+
+    public static class ID2025032709355603 {
+        public static class v1 {
+        }
+    }
+
+    public static class ID2025032709370703 {
+        public static class v1 {
+        }
+    }
+
+    public static class ID2025032709373303 {
+        public static class v1 {
+        }
+    }
+
+    public static class ID2025032809311903 {
+        public static class v1 {
+        }
+    }
 }
 
 

+ 215 - 1
src/custom/restcontroller/webmanage/sale/order/Order.java

@@ -855,6 +855,200 @@ public class Order extends Controller {
             } else {
                 row.put("invoicestatus", "部分开票");
             }
+            //收货信息
+            row.put("contacts", beans.order.Order.getContactsRow(this, row.getLong("rec_contactsid")));
+        }
+
+
+        return getSucReturnObject().setData(rows).toString();
+    }
+
+    @API(title = "订单批处理", apiversion = R.ID2025032809311903.v1.class)
+    @CACHEING
+    public String query_Order() throws YosException {
+        StringBuffer where = new StringBuffer(" 1=1 ");
+        if (content.containsKey("where")) {
+            JSONObject whereObject = content.getJSONObject("where");
+            if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
+                where.append(" and(");
+                where.append("t1.sonum like'%").append(whereObject.getString("condition")).append("%' ");
+                where.append("or t2.enterprisename like'%").append(whereObject.getString("condition")).append("%' ");
+                where.append("or t2.abbreviation like'%").append(whereObject.getString("condition")).append("%' ");
+//                where.append("or t5.erpbillno like'%").append(whereObject.getString("condition")).append("%' ");
+                where.append("or t1.remarks like'%").append(whereObject.getString("condition")).append("%' ");
+                where.append(")");
+            }
+            //状态
+            if (whereObject.containsKey("status") && !"".equals(whereObject.getString("status"))) {
+                where.append(" and(");
+                where.append("t1.status ='").append(whereObject.getString("status")).append("' ");
+                where.append(")");
+            }
+            if (whereObject.containsKey("type") && !"".equals(whereObject.getString("type"))) {
+                where.append(" and(");
+                where.append("t1.type like'%").append(whereObject.getString("type")).append("%' ");
+                where.append(")");
+            }
+            //品牌
+            if (whereObject.containsKey("brandname") && !"".equals(whereObject.getString("brandname"))) {
+                where.append(" and(");
+                where.append("t3.brandname like'%").append(whereObject.getString("brandname")).append("%' ");
+                where.append(")");
+            }
+            //领域
+            if (whereObject.containsKey("tradefield") && !"".equals(whereObject.getString("tradefield"))) {
+                where.append(" and(");
+                where.append("t1.tradefield like'%").append(whereObject.getString("tradefield")).append("%' ");
+                where.append(")");
+            }
+            if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
+                where.append(" and DATE_FORMAT(t1.billdate, '%Y-%m-%d') >='").append(whereObject.getString("begindate")).append("' ");
+            }
+            if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
+                where.append(" and DATE_FORMAT(t1.billdate, '%Y-%m-%d') <='").append(whereObject.getString("enddate")).append("' ");
+            }
+            if (whereObject.containsKey("begindate1") && !"".equals(whereObject.getString("begindate1"))) {
+                where.append(" and DATE_FORMAT(t1.submitdate, '%Y-%m-%d') >='").append(whereObject.getString("begindate1")).append("' ");
+            }
+            if (whereObject.containsKey("enddate1") && !"".equals(whereObject.getString("enddate1"))) {
+                where.append(" and DATE_FORMAT(t1.submitdate, '%Y-%m-%d') <='").append(whereObject.getString("enddate1")).append("' ");
+            }
+            if (whereObject.containsKey("begindate2") && !"".equals(whereObject.getString("begindate2"))) {
+                where.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') >='").append(whereObject.getString("begindate2")).append("' ");
+            }
+            if (whereObject.containsKey("enddate2") && !"".equals(whereObject.getString("enddate2"))) {
+                where.append(" and DATE_FORMAT(t1.checkdate, '%Y-%m-%d') <='").append(whereObject.getString("enddate2")).append("' ");
+            }
+            if (whereObject.containsKey("remarks") && !"".equals(whereObject.getString("remarks"))) {
+                where.append("and t1.remarks like'%").append(whereObject.getString("remarks")).append("%' ");
+            }
+            if (whereObject.containsKey("createby") && !"".equals(whereObject.getString("createby"))) {
+                where.append("and t1.createby like'%").append(whereObject.getString("createby")).append("%' ");
+            }
+            if (whereObject.containsKey("checkby") && !"".equals(whereObject.getString("checkby"))) {
+                where.append("and t1.checkby like'%").append(whereObject.getString("checkby")).append("%' ");
+            }
+            if (whereObject.containsKey("agentinfo") && !"".equals(whereObject.getString("agentinfo"))) {
+                where.append(" and(");
+                where.append(" t2.enterprisename like'%").append(whereObject.getString("agentinfo")).append("%' ");
+                where.append("or t7.agentnum like'%").append(whereObject.getString("agentinfo")).append("%' ");
+                where.append(")");
+            }
+
+//            if (whereObject.containsKey("writeoffstatus") && !"".equals(whereObject.getString("writeoffstatus"))) {
+//                String writeoffstatus = whereObject.getStringValue("writeoffstatus");
+//                if (writeoffstatus.equals("未核销")) {
+//                    where.append(" and t7.writeoffamount = 0");
+//                } else if (writeoffstatus.equals("已核销")) {
+//                    where.append(" and t7.writeoffamount = t7.amount and t7.amount > 0");
+//                } else {
+//                    where.append(" and t7.writeoffamount < t7.amount and t7.writeoffamount > 0");
+//                }
+//
+//            }
+//            if (whereObject.containsKey("invoicestatus") && !"".equals(whereObject.getString("invoicestatus"))) {
+//                String invoicestatus = whereObject.getStringValue("invoicestatus");
+//                if (invoicestatus.equals("未开票")) {
+//                    where.append(" and t7.invoiceamount = 0");
+//                } else if (invoicestatus.equals("已开票")) {
+//                    where.append(" and t7.invoiceamount = t7.amount and t7.amount > 0");
+//                } else {
+//                    where.append(" and t7.invoiceamount < t7.amount and t7.invoiceamount > 0");
+//                }
+//
+//            }
+            if (whereObject.containsKey("isreturn") && !"".equals(whereObject.getString("isreturn"))) {
+                String isreturn = whereObject.getStringValue("isreturn");
+                if (isreturn.equals("1")) {
+                    where.append(" and exists (select 1 from sa_orderitems where sa_orderid=t1.sa_orderid and siteid=t1.siteid and ifnull(returnqty,0)>0) ");
+                } else {
+                    where.append(" and not exists (select 1 from sa_orderitems where sa_orderid=t1.sa_orderid and siteid=t1.siteid and ifnull(returnqty,0)=0) ");
+                }
+            }
+            if (whereObject.containsKey("ischange") && !"".equals(whereObject.getString("ischange"))) {
+                String ischange = whereObject.getStringValue("ischange");
+                if (ischange.equals("0")) {
+                    where.append(" and not exists(SELECT * from sa_orderitems_change WHERE sa_orderid = t1.sa_orderid and siteid = t1.siteid)");
+                } else {
+                    where.append(" and exists(SELECT * from sa_orderitems_change WHERE sa_orderid = t1.sa_orderid and siteid = t1.siteid)");
+                }
+            }
+            if (whereObject.containsKey("tobeclosebyhand") && !"".equals(whereObject.getString("tobeclosebyhand"))) {
+                String tobeclosebyhand = whereObject.getStringValue("tobeclosebyhand");
+                if (tobeclosebyhand.equals("1")) {
+                    where.append(" and  t1.status !='手工关闭' and sa_orderid in (select sa_orderid from sa_orderitems t1 left 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)  and t1.isfreeze=1) and sa_orderid in(select t1.sa_orderid from (select sa_orderid,t1.siteid,count(1) count 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.isfreeze=0 and  t1.qty=t2.sumoutwarehouseqty group by sa_orderid,t1.siteid) t1 inner join (select sa_orderid,t1.siteid,count(1) count from sa_orderitems t1 where t1.isfreeze=0 group by sa_orderid,t1.siteid) t2 on t1.siteid=t2.siteid and t1.sa_orderid=t2.sa_orderid where t1.count=t2.count)");
+                } else {
+                    where.append(" and 1=1");
+                }
+            }
+        }
+//        SQLFactory sqlFactory = new SQLFactory(this, "订单(管理端)_列表", pageSize, pageNumber, pageSorting);
+//        if (isExport) {
+//            sqlFactory = new SQLFactory(this, "订单(管理端)_列表");
+//        }
+//        sqlFactory.addParameter("siteid", siteid);
+//        sqlFactory.addParameter("hrid", hrid);
+//        sqlFactory.addParameter("userid", userid);
+//        sqlFactory.addParameter_SQL("where", where);
+//        String sql = sqlFactory.getSQL();
+        QuerySQL querySQL = queryListManage1(where.toString());
+        querySQL.setOrderBy(pageSorting);
+        Rows rows;
+        querySQL.setPage(pageSize, pageNumber);
+        rows = querySQL.query();
+
+        ArrayList<Long> ids = rows.toArrayList("sa_orderid", new ArrayList<>());
+        //查询数量金额
+        RowsMap OrderAmountRowsMap = beans.order.Order.getSumOrderAmount(this, ids);
+
+//        SQLFactory ischangeSQl = new SQLFactory("sql:SELECT distinct sa_orderid from sa_orderitems_change WHERE siteid='" + siteid + "' and sa_orderid in $sa_orderids$ ");
+//        ischangeSQl.addParameter_in("sa_orderids", rows.toArrayList("sa_orderid"));
+        ArrayList<Long> ischangesa_orderidList = dbConnect.runSqlQuery("SELECT distinct sa_orderid from sa_orderitems_change WHERE siteid='" + siteid + "' and sa_orderid in"+rows.toArrayList("sa_orderid").toString().replace("[", "(").replace("]", ")")).toArrayList("sa_orderid", new ArrayList<>());
+
+        for (Row row : rows) {
+            Long id = row.getLong("sa_orderid");
+            if (OrderAmountRowsMap.get(id.toString()).isNotEmpty()) {
+                row.put("amount", OrderAmountRowsMap.get(id.toString()).get(0).getBigDecimal("amount"));
+                row.put("defaultamount", OrderAmountRowsMap.get(id.toString()).get(0).getBigDecimal("defaultamount"));
+                row.put("qty", OrderAmountRowsMap.get(id.toString()).get(0).getBigDecimal("qty"));
+                row.put("writeoffamount", OrderAmountRowsMap.get(id.toString()).get(0).getBigDecimal("writeoffamount"));
+                row.put("invoiceamount", OrderAmountRowsMap.get(id.toString()).get(0).getBigDecimal("invoiceamount"));
+                if (OrderAmountRowsMap.get(id.toString()).get(0).getBigDecimal("returnqty").compareTo(BigDecimal.ZERO) > 0) {
+                    row.put("isreturn", "1");
+                } else {
+                    row.put("isreturn", "0");
+                }
+            } else {
+                row.put("amount", 0);
+                row.put("defaultamount", 0);
+                row.put("sumamount", 0);
+                row.put("qty", 0);
+                row.put("writeoffamount", 0);
+                row.put("invoiceamount", 0);
+                row.put("isreturn", "0");
+            }
+            BigDecimal writeoffamount = row.getBigDecimal("writeoffamount");
+            BigDecimal invoiceamount = row.getBigDecimal("invoiceamount");
+            BigDecimal amount = row.getBigDecimal("amount");
+            row.put("ischange", ischangesa_orderidList.contains(row.getLong("sa_orderid")) ? "1" : "0");
+
+            if (writeoffamount.compareTo(BigDecimal.ZERO) == 0) {
+                row.put("writeoffstatus", "未核销");
+            } else if (writeoffamount.compareTo(amount) == 0) {
+                row.put("writeoffstatus", "已核销");
+            } else {
+                row.put("writeoffstatus", "部分核销");
+            }
+            if (invoiceamount.compareTo(BigDecimal.ZERO) == 0) {
+                row.put("invoicestatus", "未开票");
+            } else if (invoiceamount.compareTo(amount) == 0) {
+                row.put("invoicestatus", "已开票");
+            } else {
+                row.put("invoicestatus", "部分开票");
+            }
+
+            //收货信息
+            row.put("contacts", beans.order.Order.getContactsRow(this, row.getLong("rec_contactsid")));
 
         }
 
@@ -862,6 +1056,7 @@ public class Order extends Controller {
         return getSucReturnObject().setData(rows).toString();
     }
 
+
     @API(title = "查询订单列表(区域经理)", apiversion = R.ID20231025160203.v1.class)
     @CACHEING
     public String selectListManage_regionalManager() throws YosException, IOException {
@@ -1030,7 +1225,7 @@ public class Order extends Controller {
     //查询订单列表(管理端)
     public QuerySQL queryListManage(String where) throws YosException {
         QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sa_order",
-                "sa_orderid", "sonum", "type", "status", "submitdate", "checkdate", "remarks", "createby", "checkby", "billdate", "tradefield");
+                "sa_orderid", "sonum", "type", "status", "submitdate", "checkdate", "remarks", "createby", "checkby", "billdate", "tradefield","rec_contactsid");
 
         querySQL.setTableAlias("t1");
         querySQL.addJoinTable(JOINTYPE.left, "sys_enterprise", "t2", "t2.sys_enterpriseid = t1.sys_enterpriseid and t2.siteid = t1.siteid",
@@ -1049,6 +1244,25 @@ public class Order extends Controller {
         return querySQL;
     }
 
+    public QuerySQL queryListManage1(String where) throws YosException {
+        QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sa_order",
+                "sa_orderid", "sonum", "type", "status", "submitdate", "checkdate", "remarks", "createby", "checkby", "billdate", "tradefield","rec_contactsid");
+
+        querySQL.setTableAlias("t1");
+        querySQL.addJoinTable(JOINTYPE.left, "sys_enterprise", "t2", "t2.sys_enterpriseid = t1.sys_enterpriseid and t2.siteid = t1.siteid",
+                "enterprisename");
+        querySQL.addJoinTable(JOINTYPE.left, "sa_agents", "t6", "t6.sys_enterpriseid=t1.sys_enterpriseid and t6.siteid = t1.siteid",
+                "agentnum");
+        querySQL.addJoinTable(JOINTYPE.left, "sa_promotion", "t7", "t7.sa_promotionid=t1.sa_promotionid and t7.siteid = t1.siteid",
+                "promnum", "promname");
+        querySQL.addQueryFields("amount", "CAST(0 AS CHAR(20))");
+        querySQL.addQueryFields("qty", "CAST(0 AS CHAR(20))");
+        querySQL.setWhere("t1.siteid", siteid);
+        querySQL.setWhere(where);
+        querySQL.setWhere("t1.deleted=0 and t1.status in('新建','提交') and t1.createflag=0");
+        return querySQL;
+    }
+
     @API(title = "查询订单列表(业务员)", apiversion = R.ID20221111145202.v1.class)
     public String selectList() throws YosException, IOException {
         StringBuffer where = new StringBuffer(" 1=1 ");

+ 11 - 0
src/custom/restcontroller/webmanage/sale/sendplan/SQL/发货计划订单未发货量(简略).sql

@@ -0,0 +1,11 @@
+select t.sa_orderitemsid,sum(t.undeliqty)undeliqty,sum(t.willoutqty)willoutqty from
+    (select sa_orderitemsid,undeliqty,0 willoutqty  from sa_orderitems t1
+                                                             inner join sa_order t2 on t2.sa_orderid=t1.sa_orderid and t1.siteid=t2.siteid
+     where t1.isclose=0 and t1.undeliqty>0 and
+         t2.status='审核' and t1.siteid=$siteid$
+     union all
+     select t2.sa_orderitemsid,0,sum(qty) willoutfqty from st_stockbill t1
+                                                               inner join st_stockbill_items t2 on t1.st_stockbillid=t2.st_stockbillid and t1.siteid=t2.siteid
+     where t1.status='新建'and t1.type='销售出库'and ifnull(t2.sa_orderitemsid,0)!=0 and t1.siteid=$siteid$
+     group by t2.sa_orderitemsid) t
+group by t.sa_orderitemsid

+ 19 - 0
src/custom/restcontroller/webmanage/sale/sendplan/SQL/发货计划订单未发货量.sql

@@ -0,0 +1,19 @@
+select t1.sa_orderitemsid,t2.sa_orderid,t6.sa_agentsid,t5.enterprisename,t3.type,t3.billdate,t3.checkdate,t3.submitdate,t6.agentnum,t7.abbreviation,t4.marketingcategory,
+       t3.sonum,t4.itemno,t4.itemname,t4.model,t4.spec,t1.undeliqty,t1.willoutqty,(t1.undeliqty-t1.willoutqty) sendqty,t4.outplace  from
+    (select t.sa_orderitemsid,sum(t.undeliqty)undeliqty,sum(t.willoutqty)willoutqty from
+        (select sa_orderitemsid,undeliqty,0 willoutqty  from sa_orderitems t1
+                                                                 inner join sa_order t2 on t2.sa_orderid=t1.sa_orderid and t1.siteid=t2.siteid
+         where t1.isclose=0 and t1.undeliqty>0 and
+             t2.status='审核' and t1.siteid=$siteid$
+         union all
+         select t2.sa_orderitemsid,0,sum(qty) willoutfqty from st_stockbill t1
+                                                                   inner join st_stockbill_items t2 on t1.st_stockbillid=t2.st_stockbillid and t1.siteid=t2.siteid
+         where t1.status='新建'and t1.type='销售出库'and ifnull(t2.sa_orderitemsid,0)!=0 and t1.siteid=$siteid$
+         group by t2.sa_orderitemsid) t
+     group by t.sa_orderitemsid) t1
+        inner join sa_orderitems t2 on t1.sa_orderitemsid=t2.sa_orderitemsid
+        inner join sa_order t3 on t2.sa_orderid=t3.sa_orderid
+        inner join plm_item t4 on t2.itemid=t4.itemid
+        left join sys_enterprise_finance t5 on t3.sys_enterprise_financeid=t5.sys_enterprise_financeid and t3.siteid=t5.siteid
+        left join sa_agents t6 on t3.sys_enterpriseid=t6.sys_enterpriseid and t3.siteid=t6.siteid
+        left join sys_enterprise t7 on t3.sys_enterpriseid=t7.sys_enterpriseid and t3.siteid=t7.siteid where $where$;

+ 2 - 0
src/custom/restcontroller/webmanage/sale/sendplan/SQL/销售出库单新增.sql

@@ -0,0 +1,2 @@
+insert into st_stockbill (siteid, st_stockbillid,createby, createdate, billno,billdate,changeby, changedate,checkby,checkdate,sys_enterpriseid, rb,type,remarks,status)
+values ($siteid$, $st_stockbillid$,$createby$, $createdate$, $billno$,$billdate$, $changeby$, $changedate$,$checkby$,$checkdate$,$sys_enterpriseid$,$rb$,$type$,$remarks$,'新建');

+ 13 - 0
src/custom/restcontroller/webmanage/sale/sendplan/SQL/销售出库单明细新增.sql

@@ -0,0 +1,13 @@
+insert into st_stockbill_items (siteid, st_stockbill_itemsid,st_stockbillid, sa_dispatch_itemsid, rowno, itemid, qty,amount,remarks,price,sa_orderitemsid,sa_orderid)
+select $siteid$,
+       $st_stockbill_itemsid$,
+       $st_stockbillid$,
+       $sa_dispatch_itemsid$,
+       $rowno$,
+       $itemid$,
+       $qty$,
+       $amount$,
+       $remarks$,
+       $price$,
+       $sa_orderitemsid$,
+       $sa_orderid$

+ 120 - 0
src/custom/restcontroller/webmanage/sale/sendplan/sendplan.java

@@ -0,0 +1,120 @@
+package restcontroller.webmanage.sale.sendplan;
+
+import beans.datacontrllog.DataContrlLog;
+import com.alibaba.fastjson.JSONObject;
+import common.Controller;
+import common.YosException;
+import common.annotation.API;
+import common.annotation.CACHEING;
+import common.annotation.CACHEING_CLEAN;
+import common.data.*;
+import restcontroller.R;
+import restcontroller.webmanage.sale.item.quarterpricenum;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+
+@API(title = "发货计划")
+public class sendplan extends Controller {
+    public sendplan(JSONObject content) throws YosException {
+        super(content);
+    }
+
+    @API(title = "发货计划新增更新", apiversion = R.ID2025032708594903.v1.class)
+    @CACHEING_CLEAN(apiClass = {sendplan.class})
+    public String insertormodify_sendplan() throws YosException {
+
+        ArrayList<String> sqlList = new ArrayList<>();
+        String tableName = "sa_sendplan";
+
+        Long sa_sendplanid = 0l;
+        String begindate = content.getStringValue("begindate",false,"null");
+        String enddate = content.getStringValue("enddate",false,"null");
+        Long departmentid = content.getLongValue("departmentid");
+        String senddate = content.getStringValue("senddate",false,"null");
+        String type = content.getStringValue("type");
+        if (dbConnect.runSqlQuery("select * from sa_sendplan where siteid='"+siteid+"'").isEmpty()) {
+            sa_sendplanid = createTableID(tableName);
+            InsertSQL insertSQL = SQLFactory.createInsertSQL(this, tableName);
+            insertSQL.setUniqueid(sa_sendplanid).setSiteid(siteid);
+            insertSQL.setValue("begindate", begindate);
+            insertSQL.setValue("enddate", enddate);
+            insertSQL.setValue("departmentid", departmentid);
+            insertSQL.setValue("senddate", senddate);
+            insertSQL.setValue("type", type);
+            insertSQL.setDateValue("createdate");
+            insertSQL.setDateValue("changedate");
+            insertSQL.setValue("createby", username);
+            insertSQL.setValue("changeby", username);
+            sqlList.add(insertSQL.getSQL());
+            sqlList.add(DataContrlLog.createLog(this, tableName, sa_sendplanid, "新增", "发货计划新增成功").getSQL());
+        } else{
+            Rows rows = dbConnect.runSqlQuery("select * from sa_sendplan where siteid='"+siteid+"'");
+            sa_sendplanid =rows.get(0).getLong("sa_sendplanid");
+            UpdateSQL updateSQL = SQLFactory.createUpdateSQL(this, tableName);
+            updateSQL.setUniqueid(rows.get(0).getLong("sa_sendplanid")).setSiteid(siteid);
+            updateSQL.setValue("begindate", begindate);
+            updateSQL.setValue("enddate", enddate);
+            updateSQL.setValue("departmentid", departmentid);
+            updateSQL.setValue("senddate", senddate);
+            updateSQL.setValue("type", type);
+            updateSQL.setDateValue("changedate");
+            updateSQL.setValue("changeby", username);
+            sqlList.add(updateSQL.getSQL());
+            sqlList.add(DataContrlLog.createLog(this, tableName, sa_sendplanid, "编辑", "发货计划编辑成功").getSQL());
+
+        }
+
+        dbConnect.runSqlUpdate(sqlList);
+
+        content.put("sa_sendplanid", sa_sendplanid);
+
+        return querysendplanMain();
+    }
+    @API(title = "发货计划列表", apiversion = R.ID2025032709040403.v1.class)
+    @CACHEING
+    public String querysendplanList() throws YosException {
+        /*
+          过滤条件设置
+         */
+        StringBuffer where = new StringBuffer(" 1=1 ");
+//        if (content.containsKey("where")) {
+//            JSONObject whereObject = content.getJSONObject("where");
+//            if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
+//                where.append(" and(");
+//                where.append("t1.year like'%").append(whereObject.getString("condition")).append("%' ");
+//                where.append("or t1.quarter like'%").append(whereObject.getString("condition")).append("%' ");
+//                where.append("or t2.agentnum like'%").append(whereObject.getString("condition")).append("%' ");
+//                where.append("or t3.enterprisename like'%").append(whereObject.getString("condition")).append("%' ");
+//                where.append(")");
+//            }
+//            if (whereObject.containsKey("status") && !"".equals(whereObject.getString("status"))) {
+//                where.append(" and t1.status='").append(whereObject.getString("status")).append("' ");
+//            }
+//        }
+//        SQLFactory sqlFactory = new SQLFactory(this, "经销商列表查询", pageSize, pageNumber, pageSorting);
+//        sqlFactory.addParameter_SQL("where", where);
+//        sqlFactory.addParameter("siteid", siteid);
+//        Rows rows = dbConnect.runSqlQuery(sqlFactory.getSQL());
+        QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sa_sendplan");
+        querySQL.setTableAlias("t1");
+        querySQL.setSiteid(siteid);
+        querySQL.setWhere(where.toString());
+        querySQL.setPage(pageSize, pageNumber);
+        querySQL.setOrderBy(pageSorting);
+        Rows rows = querySQL.query();
+        return getSucReturnObject().setData(rows).toString();
+    }
+
+    @API(title = "发货计划明细", apiversion = R.ID2025032709024503.v1.class)
+    @CACHEING
+    public String querysendplanMain() throws YosException {
+        QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sa_sendplan");
+        querySQL.setTableAlias("t1");
+        querySQL.setSiteid(siteid);
+        querySQL.setWhere("sa_sendplanid",content.getLongValue("sa_sendplanid"));
+        Rows rows = querySQL.query();
+        return getSucReturnObject().setData(rows).toString();
+    }
+
+}

+ 294 - 0
src/custom/restcontroller/webmanage/sale/sendplan/sendplandetail.java

@@ -0,0 +1,294 @@
+package restcontroller.webmanage.sale.sendplan;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import common.Controller;
+import common.YosException;
+import common.annotation.API;
+import common.annotation.CACHEING;
+import common.annotation.CACHEING_CLEAN;
+import common.data.*;
+import restcontroller.R;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+@API(title = "发货计划明细")
+public class sendplandetail extends Controller {
+    public sendplandetail(JSONObject content) throws YosException {
+        super(content);
+    }
+
+    @API(title = "订单信息刷新", apiversion = R.ID2025032709331803.v1.class)
+    @CACHEING_CLEAN(apiClass = {sendplandetail.class})
+    public String orderRefresh() throws YosException {
+        long sa_sendplanid =content.getLongValue("sa_sendplanid");
+        Rows sendplanRows = dbConnect.runSqlQuery("select * from sa_sendplan where sa_sendplanid='"+sa_sendplanid+"' and siteid='"+siteid+"'");
+        if(sendplanRows.isEmpty()){
+            return getErrReturnObject().setErrMsg("发货计划不存在,无法进行订单信息刷新").toString();
+        }
+        dbConnect.runSqlUpdate("delete from sa_sendplandetail where sa_sendplanid='"+sa_sendplanid+"' and siteid='"+siteid+"'");
+        /*
+          过滤条件设置
+         */
+        StringBuffer where = new StringBuffer(" 1=1 and t1.undeliqty>0 and t3.type='"+sendplanRows.get(0).getString("type")
+                +"' and  DATE_FORMAT(t3.checkdate, '%Y-%m-%d') >='"+sendplanRows.get(0).getString("begindate")
+                +"' and  DATE_FORMAT(t3.checkdate, '%Y-%m-%d') <='"+sendplanRows.get(0).getString("enddate")
+                +"' and ( \n" +
+                "\t\t(t3.type in('标准订单','网销订单')) or\n" +
+                "\t\t(\n" +
+                "\t\t\tt3.type='配件订单'\n" +
+                "\t\t\tand t3.sys_enterpriseid in (\n" +
+                "\t\t\tselect distinct sys_enterpriseid from st_stockbill \n" +
+                "\t\t\twhere type='销售出库'  and status='审核' and \n" +
+                "\t\t\tDATE_FORMAT(billdate, '%Y-%m-%d') = '"+sendplanRows.get(0).getString("senddate")+"'\n" +
+                "\t\t\t)\n" +
+                "\t\t))");
+
+        SQLFactory sqlFactory = new SQLFactory(this, "发货计划订单未发货量");
+        sqlFactory.addParameter_SQL("where", where);
+        sqlFactory.addParameter("siteid", siteid);
+        Rows rows = dbConnect.runSqlQuery(sqlFactory.getSQL());
+        ArrayList<String> list = new ArrayList<>();
+        //计划发货插入明细
+        for(Row row :rows){
+            InsertSQL insertSQL = SQLFactory.createInsertSQL(this,"sa_sendplandetail");
+            insertSQL.setUniqueid(createTableID("sa_sendplandetail"));
+            insertSQL.setSiteid(siteid);
+            insertSQL.setValue("sa_sendplanid", sa_sendplanid);
+            insertSQL.setValue("sendqty", row.getBigDecimal("sendqty"));
+            insertSQL.setValue("sa_orderid", row.getLong("sa_orderid"));
+            insertSQL.setValue("sa_orderitemsid", row.getLong("sa_orderitemsid"));
+            insertSQL.setValue("outplace", row.getString("outplace"));
+            insertSQL.setValue("sa_agentsid", row.getString("sa_agentsid"));
+            insertSQL.setValue("canuseqty", 0);
+
+            list.add(insertSQL.getSQL());
+        }
+        dbConnect.runSqlUpdate(list);
+
+        //计划发货明细计算
+        list=new ArrayList<>();
+        Rows stockbillrows =dbConnect.runSqlQuery("\t\tselect itemid,sum(t2.qty) qty from st_stockbill t1\n" +
+                "\t\t\tinner join st_stockbill_items t2 on t1.st_stockbillid=t2.st_stockbillid\n" +
+                "\t\t\twhere t1.type='销售出库'and t1.status='新建' and t1.siteid='"+siteid+"'\n" +
+                "\t\t\tand DATE_FORMAT(billdate, '%Y-%m-%d')<='"+sendplanRows.get(0).getString("senddate")+"'\n" +
+                "\t\t\tgroup by itemid");
+        Rows invbalrows =dbConnect.runSqlQuery("select itemid,sum(qty) qty from st_invbal t1 group by itemid");
+        Rows sendplandetails = dbConnect.runSqlQuery("select * from sa_sendplandetail where sa_sendplanid="+sa_sendplanid+" and siteid='"+siteid+"'");
+        RowsMap stockbillrowsMap =stockbillrows.toRowsMap("itemid");
+        RowsMap invbalrowsMap =invbalrows.toRowsMap("itemid");
+        for(Row row:sendplandetails){
+            BigDecimal canuseqty=BigDecimal.ZERO;
+            BigDecimal willoutqty=BigDecimal.ZERO;
+            BigDecimal invbalqty=BigDecimal.ZERO;
+            UpdateSQL updateSQL = SQLFactory.createUpdateSQL(this, "sa_sendplandetail");
+            updateSQL.setUniqueid(row.getLong("sa_sendplandetailid")).setSiteid(siteid);
+            if(stockbillrowsMap.containsKey(row.getString("itemid"))){
+                willoutqty=stockbillrowsMap.get(row.getString("itemid")).get(0).getBigDecimal("qty");
+            }
+            if(invbalrowsMap.containsKey(row.getString("itemid"))){
+                invbalqty=stockbillrowsMap.get(row.getString("itemid")).get(0).getBigDecimal("qty");
+            }
+            canuseqty=invbalqty.subtract(willoutqty);
+            updateSQL.setValue("willoutqty",willoutqty);
+            updateSQL.setValue("willinqty",0);
+            updateSQL.setValue("canuseqty",canuseqty);
+            if(canuseqty.compareTo(BigDecimal.ZERO)<=0){
+                updateSQL.setValue("sendqty",0);
+                updateSQL.setValue("colorflag",0);
+            }else {
+                if(canuseqty.compareTo(row.getBigDecimal("sendqty"))>=0){
+                    updateSQL.setValue("colorflag",2);
+                }else{
+                    updateSQL.setValue("colorflag",3);
+                }
+            }
+            list.add(updateSQL.getSQL());
+        }
+        dbConnect.runSqlUpdate(list);
+        list= new ArrayList<>();
+        Rows rows1 =dbConnect.runSqlQuery("select t1.sa_orderid from (select sa_orderid,count(0)count from sa_sendplandetail where sa_sendplanid="+sa_sendplanid+" group by sa_orderid) t1 inner join (select sa_orderid,count(0)count from sa_sendplandetail where colorflag='2' and  sa_sendplanid="+sa_sendplanid+"  group by sa_orderid) t2 on  t1.sa_orderid=t2.sa_orderid and t1.count=t2.count");
+        for(Row row :rows1){
+            list.add("update sa_sendplandetail set colorflag=1 where sa_sendplanid="+sa_sendplanid+" and sa_orderid ="+row.getLong("sa_orderid"));
+        }
+        dbConnect.runSqlUpdate(list);
+        return getSucReturnObject().toString();
+    }
+
+    @API(title = "计划清空", apiversion = R.ID2025032709342503.v1.class)
+    @CACHEING_CLEAN(apiClass = {sendplandetail.class})
+    public String clearPlan() throws YosException {
+        Long sa_sendplanid = content.getLongValue("sa_sendplanid");
+        dbConnect.runSqlUpdate("delete from sa_sendplandetail where sa_sendplanid='"+sa_sendplanid+"' and siteid='"+siteid+"'");
+        return getSucReturnObject().toString();
+    }
+
+    @API(title = "生成销售出库单", apiversion = R.ID2025032709355603.v1.class)
+    @CACHEING_CLEAN(apiClass = {sendplandetail.class})
+    public String createIcstockBill() throws YosException {
+        JSONArray detailarray = content.getJSONArray("details");
+        ArrayList<String> sqlList = new ArrayList<>();
+        HashMap<String, HashMap<String, List<JSONObject>>> agentmap = new HashMap<String, HashMap<String, List<JSONObject>>>();
+        for(Object object :detailarray){
+            JSONObject jsonObject =(JSONObject) object;
+            if (jsonObject.getDouble("sendqty") <= 0) {
+                continue;
+            }
+            String key="";
+            String sys_enterpriseid = jsonObject.getString("sys_enterpriseid");
+            String outplace = jsonObject.getString("outplace");
+            key=sys_enterpriseid+outplace;
+            HashMap<String, List<JSONObject>> agent = null;
+            List<JSONObject> paolist = null;
+            if (agentmap.containsKey(sys_enterpriseid)) {
+                agent = agentmap.get(sys_enterpriseid);
+                if (agent.containsKey(key)) {
+                    paolist = agent.get(key);
+                } else {
+                    paolist = new ArrayList<JSONObject>();
+                }
+            } else {
+                agent = new HashMap<String, List<JSONObject>>();
+                paolist = new ArrayList<JSONObject>();
+            }
+            paolist.add(jsonObject);
+            agent.put(key, paolist);
+            agentmap.put(sys_enterpriseid, agent);
+        }
+        Iterator<Map.Entry<String, HashMap<String, List<JSONObject>>>> iter = agentmap
+                .entrySet().iterator();
+
+
+        while (iter.hasNext()) {
+            Map.Entry entry = (Map.Entry) iter.next();
+            String sys_enterpriseid = (String) entry.getKey();
+
+            HashMap<String, List<JSONObject>> keymap = (HashMap<String, List<JSONObject>>) entry
+                    .getValue();
+            Iterator<Map.Entry<String, List<JSONObject>>> iter2 = keymap
+                    .entrySet().iterator();
+            while (iter2.hasNext()) {
+                Map.Entry entry2 = (Map.Entry) iter2.next();
+                String key = (String) entry2.getKey();
+                List<JSONObject> paolist = (List<JSONObject>) entry2
+                        .getValue();
+
+                SQLFactory sqlFactory = new SQLFactory(this, "销售出库单新增");
+                long st_stockbillid = createTableID("st_stockbill");
+                sqlFactory.addParameter("siteid", siteid);
+                sqlFactory.addParameter("st_stockbillid", st_stockbillid);
+                sqlFactory.addParameter("sys_enterpriseid", sys_enterpriseid);
+                sqlFactory.addParameter("billno", createBillCode("stockbill"));
+                sqlFactory.addParameter("type", "销售出库");
+                sqlFactory.addParameter("rb", 1);
+                sqlFactory.addParameter("billdate", getDateTime_Str());
+                sqlFactory.addParameter("createby", username);
+                sqlFactory.addParameter("createdate", getDateTime_Str());
+                sqlFactory.addParameter("changeby", username);
+                sqlFactory.addParameter("changedate", getDateTime_Str());
+                sqlFactory.addParameter("checkby", username);
+                sqlFactory.addParameter("checkdate", getDateTime_Str());
+                sqlFactory.addParameter("remarks", "由发货计划自动生成"+key);
+                sqlList.add(sqlFactory.getSQL());
+
+                Iterator<JSONObject> senddetailpaoit = paolist.iterator();
+                int rowno=1;
+                while (senddetailpaoit.hasNext()) {
+                    JSONObject jsonObject = senddetailpaoit.next();
+                    BigDecimal qty = new BigDecimal(jsonObject.getString("sendqty"));
+                    qty = qty.compareTo(BigDecimal.ZERO) < 0 ? qty.negate() : qty;
+                    //String fdetailstockno = jsonObject.getString("fstockno");
+                    //String fbatchno = jsonObject.getString("fbatchno");
+                    SQLFactory sqlFactorydetail = new SQLFactory(this, "销售出库单明细新增");
+                    sqlFactorydetail.addParameter("siteid", siteid);
+                    sqlFactorydetail.addParameter("st_stockbill_itemsid", createTableID("st_stockbill_items"));
+                    sqlFactorydetail.addParameter("st_stockbillid", st_stockbillid);
+
+                    Rows orderdetails = dbConnect.runSqlQuery("select * from sa_orderitems where sa_orderitemsid="+jsonObject.getLongValue("sa_orderitemsid"));
+                    if(orderdetails.isNotEmpty()){
+                        sqlFactorydetail.addParameter("remarks", orderdetails.get(0).getString("remarks"));
+                        sqlFactorydetail.addParameter("price", orderdetails.get(0).getBigDecimal("price"));
+                        sqlFactorydetail.addParameter("amount", orderdetails.get(0).getBigDecimal("price").multiply(qty));
+                    }else{
+                        sqlFactorydetail.addParameter("remarks", "");
+                        sqlFactorydetail.addParameter("price", 0);
+                        sqlFactorydetail.addParameter("amount", 0);
+                    }
+                    sqlFactorydetail.addParameter("itemid", jsonObject.getLongValue("itemid"));
+                    sqlFactorydetail.addParameter("qty", qty);
+                    sqlFactorydetail.addParameter("sa_dispatch_itemsid", 0);
+                    sqlFactorydetail.addParameter("rowno", rowno);
+
+                    sqlFactorydetail.addParameter("sa_orderitemsid", jsonObject.getLongValue("sa_orderitemsid"));
+                    sqlFactorydetail.addParameter("sa_orderid", jsonObject.getLongValue("sa_orderid"));
+                    sqlList.add(sqlFactorydetail.getSQL());
+                    rowno++;
+                }
+
+            }
+        }
+        dbConnect.runSqlUpdate(sqlList);
+        return getSucReturnObject().toString();
+    }
+
+    @API(title = "发货计划明细列表", apiversion = R.ID2025032709373303.v1.class)
+    @CACHEING
+    public String queryList_sendplan() throws YosException {
+        Long sa_sendplanid = content.getLongValue("sa_sendplanid");
+        /*
+          过滤条件设置
+         */
+        StringBuffer where = new StringBuffer(" 1=1 ");
+        if (content.containsKey("where")) {
+            JSONObject whereObject = content.getJSONObject("where");
+            if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
+                where.append(" and(");
+                where.append("t1.outplace like'%").append(whereObject.getString("condition")).append("%' ");
+                where.append("or t2.sonum like'%").append(whereObject.getString("condition")).append("%' ");
+                where.append("or t4.agentnum like'%").append(whereObject.getString("condition")).append("%' ");
+                where.append("or t5.enterprisename like'%").append(whereObject.getString("condition")).append("%' ");
+                where.append(")");
+            }
+        }
+        SQLFactory sqlFactory = new SQLFactory(this, "发货计划订单未发货量(简略)");
+        sqlFactory.addParameter_SQL("where", "1=1");
+        sqlFactory.addParameter("siteid", siteid);
+
+        QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sa_sendplandetail","sa_sendplandetailid","colorflag","topclassnum","outplace","sendqty","willoutqty","willinqty","canuseqty");
+        querySQL.setTableAlias("t1");
+        querySQL.addJoinTable(JOINTYPE.left, "sa_order", "t2", "t1.siteid = t2.siteid and t1.sa_orderid = t2.sa_orderid","sonum","checkdate","sys_enterpriseid","sa_orderid");
+        querySQL.addJoinTable(JOINTYPE.left, "sa_orderitems", "t3", "t3.siteid = t1.siteid and t3.sa_orderitemsid = t1.sa_orderitemsid","rowno","remarks","sa_orderitemsid");
+        querySQL.addJoinTable(JOINTYPE.left, "sa_agents", "t4", "t4.siteid = t1.siteid and t4.sa_agentsid = t1.sa_agentsid","agentnum");
+        querySQL.addJoinTable(JOINTYPE.left, "sys_enterprise", "t5", "t5.siteid = t4.siteid and t5.sys_enterpriseid = t4.sys_enterpriseid","abbreviation");
+        querySQL.addJoinTable(JOINTYPE.left, "plm_item", "t6", "t6.siteid = t3.siteid and t6.itemid = t3.itemid","itemno","itemname","model","itemid");
+        querySQL.addJoinTable(JOINTYPE.left, sqlFactory , "t7", "t7.sa_orderitemsid = t3.sa_orderitemsid","undeliqty");
+        querySQL.addJoinTable(JOINTYPE.left, "st_invbal" , "t8", "t8.itemid = t3.itemid and stockid='101'");
+        querySQL.addJoinTable(JOINTYPE.left, "st_invbal" , "t9", "t9.itemid = t3.itemid and stockid='103'");
+        querySQL.addJoinTable(JOINTYPE.left, "st_invbal" , "t10", "t10.itemid = t3.itemid and stockid='109'");
+        querySQL.setSiteid(siteid);
+        querySQL.setWhere(where.toString());
+        querySQL.addQueryFields("willoutqty_jh", "t7.willoutqty");
+        querySQL.addQueryFields("qty_xs", "t8.qty");
+        querySQL.addQueryFields("qty_tq", "t9.qty");
+        querySQL.addQueryFields("qty_mq", "t10.qty");
+        querySQL.setPage(pageSize, pageNumber);
+        querySQL.setOrderBy(pageSorting);
+        Rows rows = querySQL.query();
+        return getSucReturnObject().setData(rows).toString();
+    }
+
+
+    @API(title = "删除明细", apiversion = R.ID2025032709370703.v1.class)
+    @CACHEING_CLEAN(apiClass = {sendplandetail.class})
+    public String deletemx() throws YosException {
+        long sa_sendplandetailid = content.getLongValue("sa_sendplandetailid");
+        ArrayList<String> list = new ArrayList<>();
+        list.add("delete from sa_sendplandetail where siteid='" + siteid
+                + "' and sa_sendplandetailid=" + sa_sendplandetailid);
+        dbConnect.runSqlUpdate(list);
+        return getSucReturnObject().toString();
+    }
+
+
+}