OrderFeeCalculatePlan1.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. package function;
  2. import beans.order.Order;
  3. import common.BaseClass;
  4. import common.Controller;
  5. import common.DataFunction;
  6. import common.YosException;
  7. import common.annotation.Param;
  8. import common.data.*;
  9. import org.apache.poi.hslf.dev.UserEditAndPersistListing;
  10. import java.math.BigDecimal;
  11. import java.util.ArrayList;
  12. /**
  13. * 订单费用计算方案1
  14. */
  15. public class OrderFeeCalculatePlan1 extends DataFunction {
  16. @Param(paramname = "站点ID", remarks = "站点ID")
  17. String siteid;
  18. @Param(paramname = "单位费用", remarks = "单位费用(具体一个方案生成的一个单位费用)",sequence = 4)
  19. String unitfee;
  20. @Param(paramname = "订单类型", remarks = "订单类型(可多个(英文逗号隔开),具体在哪些订单类型中适用)",sequence = 7)
  21. String ordertype;
  22. @Param(paramname = "是否订单内组合计算", remarks = "是否订单内组合计算(若组合计算则在订单中自动汇总同方案商品一起计算)",sequence = 5)
  23. String iscombination;
  24. @Param(paramname = "是否累加计算", remarks = "是否累加计算(若累加计算则订单内满足时则生成费用)",sequence = 2)
  25. String isaccumulation;
  26. @Param(paramname = "分摊方式", remarks = "分摊方式(订货数量/订货金额,在组合计算方式下,在订单中同费用方案商品明细行中按比例分摊)",sequence = 6)
  27. String apportiontype;
  28. @Param(paramname = "计算依据", remarks = "计算依据(订货数量、订货重量、订货金额)",sequence = 1)
  29. String itemfield;
  30. @Param(paramname = "满足条件", remarks = "满足条件(数值,大于等于某个值时产生费用)")
  31. String condition;
  32. @Param(paramname = "数值", remarks = "数值(数值,大于等于某个值时产生费用)",sequence = 3)
  33. String value;
  34. // @Param(paramname = "是否独立扣款", issystem = true, remarks = "是否独立扣款(独立扣款则在生成订单收支凭证时费用,若生成独立的支出凭证则需再选择支出分类)")
  35. // String ispay;
  36. // @Param(paramname = "是否可退款", issystem = true, remarks = "是否可退款")
  37. // String isreturn;
  38. @Param(paramname = "订单ID", issystem = true, remarks = "订单ID")
  39. Long sa_orderid;
  40. @Override
  41. public int action() throws YosException {
  42. //判断当前订单类型是否满足方案
  43. Row orderRow = Order.getOrderRows(controller, sa_orderid).get(0);
  44. String type = orderRow.getString("type");
  45. //清空费用表
  46. DeleteSQL deleteSQL = SQLFactory.createDeleteSQL(controller, "sa_order_cost");
  47. deleteSQL.setWhere("sa_orderid", sa_orderid);
  48. deleteSQL.delete();
  49. RowsMap itemRowsMap = queryDataFunction(controller, sa_orderid, this.getClass().getSimpleName()).toRowsMap("sys_datafunctionid");
  50. //查询订单商品和方案
  51. Rows dfRows = dbConnect.runSqlQuery("select sys_datafunctionid from sys_datafunction WHERE classname='OrderFeeCalculatePlan1' and status='启用' ");
  52. for (Row dfRow : dfRows) {
  53. String sys_datafunctionid = dfRow.getString("sys_datafunctionid");
  54. // System.err.println(sys_datafunctionid);
  55. Rows itemRows = itemRowsMap.getOrDefault(sys_datafunctionid, new Rows());
  56. if (itemRows.isEmpty()) {
  57. continue;
  58. }
  59. Rows paramsRows = dbConnect.runSqlQuery("SELECT * from sys_datafunction_params WHERE sys_datafunctionid=" + sys_datafunctionid);
  60. if (paramsRows.isEmpty()) {
  61. continue;
  62. }
  63. RowsMap paramsRowsMap = paramsRows.toRowsMap("param");
  64. String ordertype = paramsRowsMap.get("ordertype").get(0).getString("value");
  65. BigDecimal unitfee = paramsRowsMap.get("unitfee").get(0).getBigDecimal("value");
  66. BigDecimal value = paramsRowsMap.get("value").get(0).getBigDecimal("value");
  67. String iscombination = paramsRowsMap.get("iscombination").get(0).getString("value");
  68. String itemfield = paramsRowsMap.get("itemfield").get(0).getString("value");
  69. String apportiontype = paramsRowsMap.get("apportiontype").get(0).getString("value");
  70. String condition = paramsRowsMap.get("condition").get(0).getString("value");
  71. String isaccumulation = paramsRowsMap.get("isaccumulation").get(0).getString("value");
  72. if (!ordertype.contains(type)) {
  73. return super.action();
  74. }
  75. BigDecimal bdUnitfee = unitfee;
  76. BigDecimal bdValue = value;
  77. ArrayList<String> sqlList = new ArrayList<>();
  78. //组合内计算(分摊)
  79. if (iscombination.equals("1")) {
  80. //分摊总金额
  81. BigDecimal totalprice = new BigDecimal(0);
  82. //订货数量
  83. BigDecimal qty = new BigDecimal(0);
  84. //订货重量
  85. BigDecimal weight = new BigDecimal(0);
  86. //订货金额
  87. BigDecimal amount = new BigDecimal(0);
  88. for (Row row : itemRows) {
  89. qty = qty.add(row.getBigDecimal("qty"));
  90. amount = amount.add(row.getBigDecimal("amount"));
  91. weight = weight.add(row.getBigDecimal("weight"));
  92. }
  93. if (itemfield.equals("1")) {
  94. totalprice = getTotalprice(bdValue, bdUnitfee, qty, condition, isaccumulation);
  95. }
  96. if (itemfield.equals("2")) {
  97. totalprice = getTotalprice(bdValue, bdUnitfee, weight, condition, isaccumulation);
  98. }
  99. if (itemfield.equals("3")) {
  100. totalprice = getTotalprice(bdValue, bdUnitfee, amount, condition, isaccumulation);
  101. }
  102. //分摊方式,订货数量
  103. if (apportiontype.equals("1")) {
  104. for (Row row : itemRows) {
  105. BigDecimal itemqty = row.getBigDecimal("qty");
  106. if (qty.compareTo(BigDecimal.ZERO) > 0) {
  107. BigDecimal price_apportion = totalprice.multiply(itemqty).divide(qty, 2, BigDecimal.ROUND_HALF_UP);
  108. sqlList.add(getInsertSQL(row, price_apportion).getSQL());
  109. } else {
  110. sqlList.add(getInsertSQL(row, BigDecimal.ZERO).getSQL());
  111. }
  112. }
  113. }
  114. //分摊方式,订货金额
  115. if (apportiontype.equals("2")) {
  116. for (Row row : itemRows) {
  117. BigDecimal itemamount = row.getBigDecimal("amount");
  118. if (amount.compareTo(BigDecimal.ZERO) > 0) {
  119. BigDecimal price_apportion = totalprice.multiply(itemamount).divide(amount, 2, BigDecimal.ROUND_HALF_UP);
  120. sqlList.add(getInsertSQL(row, price_apportion).getSQL());
  121. } else {
  122. sqlList.add(getInsertSQL(row, BigDecimal.ZERO).getSQL());
  123. }
  124. }
  125. }
  126. dbConnect.runSqlUpdate(sqlList);
  127. //调整最后一行数据
  128. adjustLastData(itemRows, totalprice);
  129. }
  130. //不组合内计算(不分摊)
  131. if (iscombination.equals("0")) {
  132. for (Row row : itemRows) {
  133. //分摊总金额
  134. BigDecimal totalprice = new BigDecimal(0);
  135. //订货数量
  136. BigDecimal qty = row.getBigDecimal("qty");
  137. //订货重量
  138. BigDecimal weight = row.getBigDecimal("weight");
  139. //订货金额
  140. BigDecimal amount = row.getBigDecimal("amount");
  141. if (itemfield.equals("1")) {
  142. totalprice = getTotalprice(bdValue, bdUnitfee, qty, condition, isaccumulation);
  143. }
  144. if (itemfield.equals("2")) {
  145. totalprice = getTotalprice(bdValue, bdUnitfee, weight, condition, isaccumulation);
  146. }
  147. if (itemfield.equals("3")) {
  148. totalprice = getTotalprice(bdValue, bdUnitfee, amount, condition, isaccumulation);
  149. }
  150. sqlList.add(getInsertSQL(row, totalprice).getSQL());
  151. }
  152. dbConnect.runSqlUpdate(sqlList);
  153. }
  154. // System.err.println(sys_datafunctionid);
  155. System.err.println(sqlList);
  156. }
  157. return super.action();
  158. }
  159. public BigDecimal getTotalprice(BigDecimal bdValue, BigDecimal bdUnitfee, BigDecimal itemFieldValue, String condition, String isaccumulation) {
  160. if (itemFieldValue.compareTo(bdValue) <= 0
  161. && (condition.equals("1") || condition.equals("2"))) {
  162. return bdUnitfee;
  163. }
  164. if (itemFieldValue.compareTo(bdValue) >= 0
  165. && (condition.equals("5") || condition.equals("4"))) {
  166. return bdUnitfee;
  167. }
  168. //数量,大于
  169. if ( condition.equals("3") ) {
  170. //累加
  171. BigDecimal scale = itemFieldValue.divide(bdValue, 0, BigDecimal.ROUND_HALF_UP);
  172. return bdUnitfee.multiply(scale);
  173. }
  174. return BigDecimal.valueOf(0);
  175. }
  176. //调整第一行数据
  177. public void adjustLastData(Rows itemRows, BigDecimal totalprice) throws YosException {
  178. SQLFactory sqlFactory = new SQLFactory(this, "统计订单明细费用");
  179. sqlFactory.addParameter_in("sa_orderitemsid", itemRows.toArray("sa_orderitemsid"));
  180. Rows costamountrows = dbConnect.runSqlQuery(sqlFactory);
  181. if (costamountrows.isNotEmpty()) {
  182. BigDecimal costamount = costamountrows.get(0).getBigDecimal("costamount");
  183. Long sa_orderitemsid = itemRows.get(0).getLong("sa_orderitemsid");
  184. if (costamount.compareTo(totalprice) > 0) {
  185. BigDecimal temp = costamount.subtract(totalprice);
  186. String sql = "UPDATE sa_order_cost SET costamount=costamount-" + temp + " WHERE sa_orderitemsid= " + sa_orderitemsid;
  187. dbConnect.runSqlUpdate(sql);
  188. }
  189. if (costamount.compareTo(totalprice) < 0) {
  190. BigDecimal temp = totalprice.subtract(costamount);
  191. String sql = "UPDATE sa_order_cost SET costamount=costamount+" + temp + " WHERE sa_orderitemsid= " + sa_orderitemsid;
  192. dbConnect.runSqlUpdate(sql);
  193. }
  194. }
  195. }
  196. public InsertSQL getInsertSQL(Row row, BigDecimal costamount) throws YosException {
  197. InsertSQL insertSQL = SQLFactory.createInsertSQL(controller, "sa_order_cost");
  198. insertSQL.setUniqueid(controller.createTableID("sa_order_cost"));
  199. insertSQL.setValue("siteid", siteid);
  200. insertSQL.setValue("sa_orderid", sa_orderid);
  201. insertSQL.setValue("sa_orderitemsid", row.getLong("sa_orderitemsid"));
  202. insertSQL.setValue("itemid", row.getLong("itemid"));
  203. insertSQL.setValue("sys_datafunctionid", row.getLong("sys_datafunctionid"));
  204. insertSQL.setValue("functionname", functionname);
  205. insertSQL.setValue("costamount", costamount);
  206. return insertSQL;
  207. }
  208. public Rows queryDataFunction(Controller controller, Long sa_orderid, String classname) throws YosException {
  209. QuerySQL querySQL = SQLFactory.createQuerySQL(controller, "sa_orderitems",
  210. "sa_orderid", "sa_orderitemsid", "itemid", "qty", "amount");
  211. querySQL.addJoinTable(BaseClass.JOINTYPE.inner, "sys_datafunction_bind", "t2", "t2.ownerid=t1.itemid and t2.ownertable='plm_item'",
  212. "sys_datafunctionid");
  213. querySQL.addJoinTable(BaseClass.JOINTYPE.inner, "sys_datafunction", "t3", "sys_datafunctionid=t2.sys_datafunctionid",
  214. "functionname", "classname");
  215. querySQL.addJoinTable(BaseClass.JOINTYPE.inner, "plm_item", "t4", "t4.itemid = t1.itemid",
  216. "grossweight", "weight");
  217. querySQL.setWhere("t1.sa_orderid", sa_orderid);
  218. querySQL.setWhere("t3.classname", classname);
  219. querySQL.setWhere("t3.status", "启用");
  220. querySQL.setTableAlias("t1");
  221. return querySQL.query();
  222. }
  223. }