package function; import beans.order.Order; import common.BaseClass; import common.Controller; import common.DataFunction; import common.YosException; import common.annotation.Param; import common.data.*; import org.apache.poi.hslf.dev.UserEditAndPersistListing; import java.math.BigDecimal; import java.util.ArrayList; /** * 订单费用计算方案1 */ public class OrderFeeCalculatePlan1 extends DataFunction { @Param(paramname = "站点ID", remarks = "站点ID") String siteid; @Param(paramname = "单位费用", remarks = "单位费用(具体一个方案生成的一个单位费用)",sequence = 4) String unitfee; @Param(paramname = "订单类型", remarks = "订单类型(可多个(英文逗号隔开),具体在哪些订单类型中适用)",sequence = 7) String ordertype; @Param(paramname = "是否订单内组合计算", remarks = "是否订单内组合计算(若组合计算则在订单中自动汇总同方案商品一起计算)",sequence = 5) String iscombination; @Param(paramname = "是否累加计算", remarks = "是否累加计算(若累加计算则订单内满足时则生成费用)",sequence = 2) String isaccumulation; @Param(paramname = "分摊方式", remarks = "分摊方式(订货数量/订货金额,在组合计算方式下,在订单中同费用方案商品明细行中按比例分摊)",sequence = 6) String apportiontype; @Param(paramname = "计算依据", remarks = "计算依据(订货数量、订货重量、订货金额)",sequence = 1) String itemfield; @Param(paramname = "满足条件", remarks = "满足条件(数值,大于等于某个值时产生费用)") String condition; @Param(paramname = "数值", remarks = "数值(数值,大于等于某个值时产生费用)",sequence = 3) String value; // @Param(paramname = "是否独立扣款", issystem = true, remarks = "是否独立扣款(独立扣款则在生成订单收支凭证时费用,若生成独立的支出凭证则需再选择支出分类)") // String ispay; // @Param(paramname = "是否可退款", issystem = true, remarks = "是否可退款") // String isreturn; @Param(paramname = "订单ID", issystem = true, remarks = "订单ID") Long sa_orderid; @Override public int action() throws YosException { //判断当前订单类型是否满足方案 Row orderRow = Order.getOrderRows(controller, sa_orderid).get(0); String type = orderRow.getString("type"); //清空费用表 DeleteSQL deleteSQL = SQLFactory.createDeleteSQL(controller, "sa_order_cost"); deleteSQL.setWhere("sa_orderid", sa_orderid); deleteSQL.delete(); RowsMap itemRowsMap = queryDataFunction(controller, sa_orderid, this.getClass().getSimpleName()).toRowsMap("sys_datafunctionid"); //查询订单商品和方案 Rows dfRows = dbConnect.runSqlQuery("select sys_datafunctionid from sys_datafunction WHERE classname='OrderFeeCalculatePlan1' and status='启用' "); for (Row dfRow : dfRows) { String sys_datafunctionid = dfRow.getString("sys_datafunctionid"); // System.err.println(sys_datafunctionid); Rows itemRows = itemRowsMap.getOrDefault(sys_datafunctionid, new Rows()); if (itemRows.isEmpty()) { continue; } Rows paramsRows = dbConnect.runSqlQuery("SELECT * from sys_datafunction_params WHERE sys_datafunctionid=" + sys_datafunctionid); if (paramsRows.isEmpty()) { continue; } RowsMap paramsRowsMap = paramsRows.toRowsMap("param"); String ordertype = paramsRowsMap.get("ordertype").get(0).getString("value"); BigDecimal unitfee = paramsRowsMap.get("unitfee").get(0).getBigDecimal("value"); BigDecimal value = paramsRowsMap.get("value").get(0).getBigDecimal("value"); String iscombination = paramsRowsMap.get("iscombination").get(0).getString("value"); String itemfield = paramsRowsMap.get("itemfield").get(0).getString("value"); String apportiontype = paramsRowsMap.get("apportiontype").get(0).getString("value"); String condition = paramsRowsMap.get("condition").get(0).getString("value"); String isaccumulation = paramsRowsMap.get("isaccumulation").get(0).getString("value"); if (!ordertype.contains(type)) { return super.action(); } BigDecimal bdUnitfee = unitfee; BigDecimal bdValue = value; ArrayList sqlList = new ArrayList<>(); //组合内计算(分摊) if (iscombination.equals("1")) { //分摊总金额 BigDecimal totalprice = new BigDecimal(0); //订货数量 BigDecimal qty = new BigDecimal(0); //订货重量 BigDecimal weight = new BigDecimal(0); //订货金额 BigDecimal amount = new BigDecimal(0); for (Row row : itemRows) { qty = qty.add(row.getBigDecimal("qty")); amount = amount.add(row.getBigDecimal("amount")); weight = weight.add(row.getBigDecimal("weight")); } if (itemfield.equals("1")) { totalprice = getTotalprice(bdValue, bdUnitfee, qty, condition, isaccumulation); } if (itemfield.equals("2")) { totalprice = getTotalprice(bdValue, bdUnitfee, weight, condition, isaccumulation); } if (itemfield.equals("3")) { totalprice = getTotalprice(bdValue, bdUnitfee, amount, condition, isaccumulation); } //分摊方式,订货数量 if (apportiontype.equals("1")) { for (Row row : itemRows) { BigDecimal itemqty = row.getBigDecimal("qty"); if (qty.compareTo(BigDecimal.ZERO) > 0) { BigDecimal price_apportion = totalprice.multiply(itemqty).divide(qty, 2, BigDecimal.ROUND_HALF_UP); sqlList.add(getInsertSQL(row, price_apportion).getSQL()); } else { sqlList.add(getInsertSQL(row, BigDecimal.ZERO).getSQL()); } } } //分摊方式,订货金额 if (apportiontype.equals("2")) { for (Row row : itemRows) { BigDecimal itemamount = row.getBigDecimal("amount"); if (amount.compareTo(BigDecimal.ZERO) > 0) { BigDecimal price_apportion = totalprice.multiply(itemamount).divide(amount, 2, BigDecimal.ROUND_HALF_UP); sqlList.add(getInsertSQL(row, price_apportion).getSQL()); } else { sqlList.add(getInsertSQL(row, BigDecimal.ZERO).getSQL()); } } } dbConnect.runSqlUpdate(sqlList); //调整最后一行数据 adjustLastData(itemRows, totalprice); } //不组合内计算(不分摊) if (iscombination.equals("0")) { for (Row row : itemRows) { //分摊总金额 BigDecimal totalprice = new BigDecimal(0); //订货数量 BigDecimal qty = row.getBigDecimal("qty"); //订货重量 BigDecimal weight = row.getBigDecimal("weight"); //订货金额 BigDecimal amount = row.getBigDecimal("amount"); if (itemfield.equals("1")) { totalprice = getTotalprice(bdValue, bdUnitfee, qty, condition, isaccumulation); } if (itemfield.equals("2")) { totalprice = getTotalprice(bdValue, bdUnitfee, weight, condition, isaccumulation); } if (itemfield.equals("3")) { totalprice = getTotalprice(bdValue, bdUnitfee, amount, condition, isaccumulation); } sqlList.add(getInsertSQL(row, totalprice).getSQL()); } dbConnect.runSqlUpdate(sqlList); } // System.err.println(sys_datafunctionid); System.err.println(sqlList); } return super.action(); } public BigDecimal getTotalprice(BigDecimal bdValue, BigDecimal bdUnitfee, BigDecimal itemFieldValue, String condition, String isaccumulation) { if (itemFieldValue.compareTo(bdValue) <= 0 && (condition.equals("1") || condition.equals("2"))) { return bdUnitfee; } if (itemFieldValue.compareTo(bdValue) >= 0 && (condition.equals("5") || condition.equals("4"))) { return bdUnitfee; } //数量,大于 if ( condition.equals("3") ) { //累加 BigDecimal scale = itemFieldValue.divide(bdValue, 0, BigDecimal.ROUND_HALF_UP); return bdUnitfee.multiply(scale); } return BigDecimal.valueOf(0); } //调整第一行数据 public void adjustLastData(Rows itemRows, BigDecimal totalprice) throws YosException { SQLFactory sqlFactory = new SQLFactory(this, "统计订单明细费用"); sqlFactory.addParameter_in("sa_orderitemsid", itemRows.toArray("sa_orderitemsid")); Rows costamountrows = dbConnect.runSqlQuery(sqlFactory); if (costamountrows.isNotEmpty()) { BigDecimal costamount = costamountrows.get(0).getBigDecimal("costamount"); Long sa_orderitemsid = itemRows.get(0).getLong("sa_orderitemsid"); if (costamount.compareTo(totalprice) > 0) { BigDecimal temp = costamount.subtract(totalprice); String sql = "UPDATE sa_order_cost SET costamount=costamount-" + temp + " WHERE sa_orderitemsid= " + sa_orderitemsid; dbConnect.runSqlUpdate(sql); } if (costamount.compareTo(totalprice) < 0) { BigDecimal temp = totalprice.subtract(costamount); String sql = "UPDATE sa_order_cost SET costamount=costamount+" + temp + " WHERE sa_orderitemsid= " + sa_orderitemsid; dbConnect.runSqlUpdate(sql); } } } public InsertSQL getInsertSQL(Row row, BigDecimal costamount) throws YosException { InsertSQL insertSQL = SQLFactory.createInsertSQL(controller, "sa_order_cost"); insertSQL.setUniqueid(controller.createTableID("sa_order_cost")); insertSQL.setValue("siteid", siteid); insertSQL.setValue("sa_orderid", sa_orderid); insertSQL.setValue("sa_orderitemsid", row.getLong("sa_orderitemsid")); insertSQL.setValue("itemid", row.getLong("itemid")); insertSQL.setValue("sys_datafunctionid", row.getLong("sys_datafunctionid")); insertSQL.setValue("functionname", functionname); insertSQL.setValue("costamount", costamount); return insertSQL; } public Rows queryDataFunction(Controller controller, Long sa_orderid, String classname) throws YosException { QuerySQL querySQL = SQLFactory.createQuerySQL(controller, "sa_orderitems", "sa_orderid", "sa_orderitemsid", "itemid", "qty", "amount"); querySQL.addJoinTable(BaseClass.JOINTYPE.inner, "sys_datafunction_bind", "t2", "t2.ownerid=t1.itemid and t2.ownertable='plm_item'", "sys_datafunctionid"); querySQL.addJoinTable(BaseClass.JOINTYPE.inner, "sys_datafunction", "t3", "sys_datafunctionid=t2.sys_datafunctionid", "functionname", "classname"); querySQL.addJoinTable(BaseClass.JOINTYPE.inner, "plm_item", "t4", "t4.itemid = t1.itemid", "grossweight", "weight"); querySQL.setWhere("t1.sa_orderid", sa_orderid); querySQL.setWhere("t3.classname", classname); querySQL.setWhere("t3.status", "启用"); querySQL.setTableAlias("t1"); return querySQL.query(); } }