| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- 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<String> 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();
- }
- }
|