|
@@ -0,0 +1,146 @@
|
|
|
+package nckd.wnq01.wnq.scm.plugin.form;
|
|
|
+
|
|
|
+import kd.bos.algo.DataSet;
|
|
|
+import kd.bos.algo.JoinDataSet;
|
|
|
+import kd.bos.algo.JoinType;
|
|
|
+import kd.bos.algo.Row;
|
|
|
+import kd.bos.dataentity.entity.DynamicObject;
|
|
|
+import kd.bos.entity.datamodel.IDataModel;
|
|
|
+import kd.bos.form.IFormView;
|
|
|
+import kd.bos.form.control.events.ItemClickEvent;
|
|
|
+import kd.bos.form.plugin.AbstractFormPlugin;
|
|
|
+import kd.sdk.plugin.Plugin;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
+import java.util.EventObject;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 2025-03-16 Tyx
|
|
|
+ * 返利结算单表单插件
|
|
|
+ */
|
|
|
+public class DiscountBillFormPlugin extends AbstractFormPlugin implements Plugin {
|
|
|
+
|
|
|
+ private static DiscountCalUtil util = new DiscountCalUtil();
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void registerListener(EventObject e) {
|
|
|
+ super.registerListener(e);
|
|
|
+ this.addItemClickListeners("tbmain");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void itemClick(ItemClickEvent evt) {
|
|
|
+ super.itemClick(evt);
|
|
|
+ //计算返利结果
|
|
|
+ if("nckd_baritemap".equals(evt.getItemKey())) {
|
|
|
+ calculate();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void click(EventObject evt) {
|
|
|
+ super.click(evt);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算返利结果
|
|
|
+ */
|
|
|
+ public void calculate() {
|
|
|
+ IDataModel model = this.getModel();
|
|
|
+ IFormView view = this.getView();
|
|
|
+ //获取年度
|
|
|
+ //int year = Integer.valueOf(model.getValue("nckd_year").toString());
|
|
|
+ //获取季度
|
|
|
+ //int season = Integer.valueOf(model.getValue("nckd_season").toString());
|
|
|
+ int year = 2025;
|
|
|
+ int season = 4;
|
|
|
+ //先查询所有需要计算的客户,查这些客户的任务量及完成量,如果完成量/任务量 < 返利政策上的最低完成率 则该客户不计算
|
|
|
+ DynamicObject[] policy = util.getPolicy();
|
|
|
+ //完成率 / 100
|
|
|
+ BigDecimal completeRate = policy[0].getBigDecimal("nckd_completerate").divide(new BigDecimal("100"),2, RoundingMode.HALF_UP);
|
|
|
+
|
|
|
+ //任务量dataSet
|
|
|
+ DataSet planDataSet = util.getContract(season);
|
|
|
+ //完成量dataSet 客户+提货户头+物料+完成量
|
|
|
+ DataSet comDataSet_sz = util.getIssueQtyByCustomer(null);
|
|
|
+ DataSet comDataSet_dz = util.getOrderQtyByCustomer(null);
|
|
|
+
|
|
|
+
|
|
|
+ //完成量合并dataSet,按照客户分组sum
|
|
|
+ DataSet comDataSet = comDataSet_sz.union(comDataSet_dz).groupBy(new String[]{"customer"}).sum("qty").finish();
|
|
|
+
|
|
|
+ //任务量 join 完成量
|
|
|
+ JoinDataSet joinDataSet = planDataSet.join(comDataSet, JoinType.INNER).on("customer", "customer").select(new String[]{"customer", "planQty"}, new String[]{"qty"});
|
|
|
+ DataSet qtyDataSet = joinDataSet.finish();
|
|
|
+
|
|
|
+ //客户,实际销量,任务量,完成率
|
|
|
+ DataSet qtyDataSet1 = qtyDataSet.select("customer,qty as actualqty,planqty,case when round(qty / planqty, 2) >= "+completeRate+" then round(qty / planqty, 2) else 0 end as completerate");
|
|
|
+
|
|
|
+ //取销售单价,返利政策
|
|
|
+ //返利政策dataSet
|
|
|
+ DataSet policyDataSet = util.getPolicyDataSet();
|
|
|
+ //添加临时匹配字段 tempKey
|
|
|
+ DataSet qtyDataSet2 = qtyDataSet1.addFields(new String[] {"1"}, new String[]{"tempkey"});
|
|
|
+ DataSet policyDataSet1 = policyDataSet.addFields(new String[] {"1"}, new String[]{"tempkey"});
|
|
|
+ //fulljoin一下,跟返利政策的数量最大值最小值拼一块再过滤
|
|
|
+ DataSet fullJoinDataSet = qtyDataSet2.fullJoin(policyDataSet1).on("tempkey", "tempkey").select(new String[]{"customer", "actualqty", "planqty", "completerate"}, new String[]{"qtymin", "qtymax", "price"}).finish();
|
|
|
+ //过滤后的dataSet 包含字段:客户,实际销量,任务量,完成率,优惠单价
|
|
|
+ DataSet filterDataSet = fullJoinDataSet.executeSql("select customer,actualqty,planqty,completerate,price where (actualqty >= qtymin and actualqty <= qtymax) or (actualqty >= qtymin and qtymax = 0)");
|
|
|
+
|
|
|
+ //合并订单+出库单数据,包含字段:客户,提货户头,物料,数量
|
|
|
+ DataSet baseDataSet = comDataSet_sz.union(comDataSet_dz);
|
|
|
+ //排序前dataSet
|
|
|
+ DataSet beforeOrderDataSet = filterDataSet.join(baseDataSet).on("customer", "customer")
|
|
|
+ .select(new String[]{"customer","actualqty","planqty","completerate","price"}, new String[]{"thht", "material", "qty"}).finish();
|
|
|
+
|
|
|
+ DataSet finalDataSet = beforeOrderDataSet.orderBy(new String[]{"customer", "thht", "material"});
|
|
|
+ setField(finalDataSet);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 赋值给单据体
|
|
|
+ * @param finalDataSet
|
|
|
+ */
|
|
|
+ public void setField(DataSet finalDataSet) {
|
|
|
+ IDataModel model = this.getModel();
|
|
|
+ IFormView view = this.getView();
|
|
|
+ while(finalDataSet.hasNext()) {
|
|
|
+ Row data = finalDataSet.next();
|
|
|
+ int rowIndex = model.createNewEntryRow("entryentity");
|
|
|
+ model.setValue("nckd_customer",data.getLong("customer"), rowIndex);
|
|
|
+ model.setValue("nckd_thht",data.getLong("thht"), rowIndex);
|
|
|
+ model.setValue("nckd_materiel",data.getLong("material"), rowIndex);
|
|
|
+ model.setValue("nckd_completeqty",data.getBigDecimal("actualqty"), rowIndex);
|
|
|
+ model.setValue("nckd_planqty",data.getBigDecimal("planqty"), rowIndex);
|
|
|
+
|
|
|
+ BigDecimal hundred = new BigDecimal("100");
|
|
|
+ BigDecimal completeRate = data.getBigDecimal("completerate").multiply(hundred);
|
|
|
+ if(completeRate.compareTo(hundred) > 0) {
|
|
|
+ model.setValue("nckd_taskcomplete", hundred, rowIndex);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ model.setValue("nckd_taskcomplete", completeRate, rowIndex);
|
|
|
+ }
|
|
|
+ model.setValue("nckd_completerate",completeRate, rowIndex);
|
|
|
+ model.setValue("nckd_discountprice",data.getBigDecimal("price"), rowIndex);
|
|
|
+ model.setValue("nckd_discountqty",data.getBigDecimal("qty"), rowIndex);
|
|
|
+
|
|
|
+ BigDecimal amount = data.getBigDecimal("price").multiply(data.getBigDecimal("qty"));
|
|
|
+
|
|
|
+ model.setValue("nckd_discountamount",amount, rowIndex);
|
|
|
+ }
|
|
|
+ view.updateView("entryentity");
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算服务费
|
|
|
+ */
|
|
|
+ public void calculateFWF() {}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+}
|