1
0

2 Коміти fc540c30c6 ... 5973609f5a

Автор SHA1 Опис Дата
  Tyx 5973609f5a Merge remote-tracking branch 'master/master' 1 місяць тому
  Tyx 47cc63eeda 返利计算相关 1 місяць тому

+ 2 - 1
code/wnq/nckd-wnq01-wnq-scm/src/main/java/nckd/wnq01/wnq/scm/plugin/form/CommonHandleExpFormPlugin.java

@@ -229,7 +229,8 @@ public class CommonHandleExpFormPlugin extends AbstractFormPlugin implements Plu
     private void doClickCommitField(String key, String entryentity, String billFieldKey) {
         BillEntityType sourceMainType = this.getTargetMainType(entryentity,billFieldKey);
         int rowIndex = this.getModel().getEntryCurrentRowIndex(entryentity);
-        HashSet<String> selectEntitys = getSrcCommitEntity(this.getModel(), sourceMainType, true, rowIndex);
+        //HashSet<String> selectEntitys = getSrcCommitEntity(this.getModel(), sourceMainType, true, rowIndex);
+        HashSet<String> selectEntitys = new HashSet<String>();
         //if (WBRuleGetHelper.checkWritebackType(this.getView(), this.getModel())) {
         //Class<?> fldType = getCommitFieldType(this.getModel());
         Class<?> fldType = null;

+ 146 - 0
code/wnq/nckd-wnq01-wnq-scm/src/main/java/nckd/wnq01/wnq/scm/plugin/form/DiscountBillFormPlugin.java

@@ -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() {}
+
+
+
+}

+ 105 - 0
code/wnq/nckd-wnq01-wnq-scm/src/main/java/nckd/wnq01/wnq/scm/plugin/form/DiscountCalUtil.java

@@ -0,0 +1,105 @@
+package nckd.wnq01.wnq.scm.plugin.form;
+
+import com.grapecity.documents.excel.Q;
+import kd.bos.algo.DataSet;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+
+/**
+ * 2025-03-16 Tyx
+ * 返利计算工具雷
+ */
+public class DiscountCalUtil {
+
+    //客户上下级关系
+    public String customerRelation = "nckd_customerrelation";
+    //返利政策
+    public String policy = "nckd_rebatepolicy1";
+    //销售合同
+    public String saleContract = "conm_salcontract";
+    //销售订单
+    public String saleOrder = "sm_salorder";
+    //销售出库单
+    public String saleIssue = "im_saloutbill";
+
+    /**
+     * 获取所有返还类型=计量计返还的客户及二级客户
+     * @return
+     */
+    public DynamicObject[] getCustomer () {
+        QFilter filter = new QFilter("nckd_returntype", QCP.equals, "jljfh");
+        DynamicObject[] cols = BusinessDataServiceHelper.load(customerRelation, "nckd_customer,nckd_entryentity.nckd_ecustomer", new QFilter[]{filter});
+        return cols;
+    }
+
+    /**
+     * 按照销售部获取返利政策
+     * @return
+     */
+    public DynamicObject[] getPolicy() {
+        QFilter filter = new QFilter("nckd_rebatetype", QCP.equals, "1");
+        DynamicObject[] cols = BusinessDataServiceHelper.load(policy, "nckd_saledept,nckd_completerate,entryentity.nckd_qtymin,entryentity.nckd_qtymax", new QFilter[]{filter});
+        return cols;
+    }
+
+    /**
+     * 获取返利政策dataSet
+     * @return
+     */
+    public DataSet getPolicyDataSet() {
+        QFilter filter = new QFilter("nckd_rebatetype", QCP.equals, "1");
+        DataSet dataSet = QueryServiceHelper.queryDataSet("policy", policy, "nckd_saledept,nckd_completerate,entryentity.nckd_qtymin as qtymin,entryentity.nckd_qtymax as qtymax,entryentity.nckd_price as price", new QFilter[]{filter}, null);
+        return dataSet;
+    }
+
+    /**
+     * 获取销售合同,按客户和季度获取任务量
+     * @return
+     */
+    public DataSet getContract(int season) {
+        String selectFields = "";
+        switch(season) {
+            case 1 :
+                selectFields = "customer,nckd_qty1 + nckd_qty2 + nckd_qty3 as planQty";
+                break;
+            case 2 :
+                selectFields = "customer,nckd_qty4 + nckd_qty5 + nckd_qty6 as planQty";
+                break;
+            case 3 :
+                selectFields = "customer,nckd_qty7 + nckd_qty8 + nckd_qty9 as planQty";
+                break;
+            case 4 :
+                selectFields = "customer,nckd_qty10 + nckd_qty11 + nckd_qty12 as planQty";
+                break;
+        }
+        DataSet dataSet = QueryServiceHelper.queryDataSet("getContract", saleContract, selectFields, null, null);
+        return dataSet;
+    }
+
+    /**
+     * 获取销售订单销售数量,物料分类 like 袋装 45-03
+     * @return
+     */
+    public DataSet getOrderQtyByCustomer (QFilter[] filter) {
+        QFilter filter1 = new QFilter("billentry.material.masterid.group.longnumber", QCP.like, "45!45-03%");
+        DataSet dataSet = QueryServiceHelper.queryDataSet("order", saleOrder, "customer,nckd_basedatafield1 as thht,billentry.material.masterid as material,billentry.qty as qty", new QFilter[]{filter1}, null);
+        DataSet sumDataSet = dataSet.groupBy(new String[]{"customer","thht","material"}).sum("qty").finish();
+        return sumDataSet;
+    }
+
+    /**
+     * 获取销售出库数量,物料分类 like 散装 45-01
+     * @return
+     */
+    public DataSet getIssueQtyByCustomer (QFilter[] filter) {
+        QFilter filter1 = new QFilter("billentry.material.masterid.group.longnumber", QCP.like, "45!45-01%");
+        DataSet dataSet = QueryServiceHelper.queryDataSet("issue", saleIssue, "customer,nckd_basedatafield as thht,billentry.material.masterid as material,billentry.qty as qty", new QFilter[]{filter1}, null);
+        DataSet sumDataSet = dataSet.groupBy(new String[]{"customer","thht","material"}).sum("qty").finish();
+        return sumDataSet;
+    }
+
+}

+ 7 - 0
code/wnq/nckd-wnq01-wnq-scm/src/main/java/nckd/wnq01/wnq/scm/plugin/form/RebatePolicyFormPlugin.java

@@ -28,6 +28,13 @@ public class RebatePolicyFormPlugin extends AbstractFormPlugin implements Plugin
         for(String field : fields) {
             this.getView().setVisible(false, field);
         }
+        DynamicObject newValue = (DynamicObject) this.getModel().getValue("nckd_policytype");
+        if(newValue != null) {
+            newValue = BusinessDataServiceHelper.loadSingle(newValue.getPkValue(), "nckd_policytype");
+            DynamicObject judgment = newValue.getDynamicObject("nckd_judgmentcriteria");
+            String name = judgment.getString("name");
+            setFieldStatus(name);
+        }
     }
 
     @Override