1
0

2 Incheckningar 2be4c2a26b ... 3f5c8a11e6

Upphovsman SHA1 Meddelande Datum
  Tyx 3f5c8a11e6 Merge remote-tracking branch 'master/master' 1 månad sedan
  Tyx a47b46ac9c 返利计算相关 1 månad sedan

+ 11 - 14
code/wnq/nckd-wnq01-wnq-scm/src/main/java/nckd/wnq01/wnq/scm/plugin/form/DiscountBillFormPlugin.java

@@ -49,34 +49,30 @@ public class DiscountBillFormPlugin extends AbstractFormPlugin implements Plugin
     public void calculate() {
         IDataModel model = this.getModel();
         IFormView view = this.getView();
+        //清空单据体
+        model.deleteEntryData("entryentity");
         //获取年度
-        //int year = Integer.valueOf(model.getValue("nckd_year").toString());
+        int year = Integer.valueOf(model.getValue("nckd_year").toString());
         //获取季度
-        //int season = Integer.valueOf(model.getValue("nckd_season").toString());
-        int year = 2025;
-        int season = 4;
+        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 planDataSet = util.getContract(year, season);
         //完成量dataSet 客户+提货户头+物料+完成量
-        DataSet comDataSet_sz = util.getIssueQtyByCustomer(null);
-        DataSet comDataSet_dz = util.getOrderQtyByCustomer(null);
-
-
+        DataSet comDataSet_sz = util.getIssueQtyByCustomer(year, season);
+        DataSet comDataSet_dz = util.getOrderQtyByCustomer(year, season);
         //完成量合并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();
@@ -87,7 +83,8 @@ public class DiscountBillFormPlugin extends AbstractFormPlugin implements Plugin
         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)");
-
+        //不满足数量阶梯的数据也需要显示,单价显示为0,上面filterDataSet会过滤掉不满足数量阶梯条件的客户,这里再跟qtyDataSet2 join后再union一下
+        //上面这行通过在返利政策里面再配置一行0-3000的数据解决
         //合并订单+出库单数据,包含字段:客户,提货户头,物料,数量
         DataSet baseDataSet = comDataSet_sz.union(comDataSet_dz);
         //排序前dataSet

+ 60 - 5
code/wnq/nckd-wnq01-wnq-scm/src/main/java/nckd/wnq01/wnq/scm/plugin/form/DiscountCalUtil.java

@@ -9,6 +9,11 @@ import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
 import kd.bos.servicehelper.QueryServiceHelper;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
 /**
  * 2025-03-16 Tyx
  * 返利计算工具雷
@@ -60,7 +65,7 @@ public class DiscountCalUtil {
      * 获取销售合同,按客户和季度获取任务量
      * @return
      */
-    public DataSet getContract(int season) {
+    public DataSet getContract(int year, int season) {
         String selectFields = "";
         switch(season) {
             case 1 :
@@ -76,6 +81,16 @@ public class DiscountCalUtil {
                 selectFields = "customer,nckd_qty10 + nckd_qty11 + nckd_qty12 as planQty";
                 break;
         }
+        Calendar calendar = Calendar.getInstance();
+        calendar.clear();
+        calendar.set(Calendar.YEAR, year);
+        Date endDate = calendar.getTime();
+        calendar.roll(Calendar.DAY_OF_YEAR, -1);
+        Date startDate = calendar.getTime();
+
+        QFilter filter = new QFilter("biztime", QCP.large_equals, startDate);
+        filter.and("biztime", QCP.less_equals, endDate);
+
         DataSet dataSet = QueryServiceHelper.queryDataSet("getContract", saleContract, selectFields, null, null);
         return dataSet;
     }
@@ -84,8 +99,9 @@ public class DiscountCalUtil {
      * 获取销售订单销售数量,物料分类 like 袋装 45-03
      * @return
      */
-    public DataSet getOrderQtyByCustomer (QFilter[] filter) {
-        QFilter filter1 = new QFilter("billentry.material.masterid.group.longnumber", QCP.like, "45!45-03%");
+    public DataSet getOrderQtyByCustomer (int year, int season) {
+        QFilter filter1 = getFilterByYearAndSeason(year, season, saleOrder);
+        filter1.and("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;
@@ -95,11 +111,50 @@ public class DiscountCalUtil {
      * 获取销售出库数量,物料分类 like 散装 45-01
      * @return
      */
-    public DataSet getIssueQtyByCustomer (QFilter[] filter) {
-        QFilter filter1 = new QFilter("billentry.material.masterid.group.longnumber", QCP.like, "45!45-01%");
+    public DataSet getIssueQtyByCustomer (int year, int season) {
+        QFilter filter1 = getFilterByYearAndSeason(year, season, saleIssue);
+        filter1.and("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;
     }
 
+    public QFilter getFilterByYearAndSeason(int year, int season, String entityKey) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        Date startDate = null;
+        Date endDate = null;
+        try {
+            if(season == 1) {
+                startDate = sdf.parse(year +"-01-01");
+                endDate = sdf.parse(year +"-03-31");
+            }
+            else if (season == 2) {
+                startDate = sdf.parse(year +"-04-01");
+                endDate = sdf.parse(year +"-06-30");
+            }
+            else if (season == 3) {
+                startDate = sdf.parse(year +"-07-01");
+                endDate = sdf.parse(year +"-09-30");
+            }
+            else if (season == 4) {
+                startDate = sdf.parse(year +"-10-01");
+                endDate = sdf.parse(year +"-12-31");
+            }
+            String bizdateKey = "";
+            if(entityKey.equals(saleOrder)) {
+                bizdateKey = "bizdate";
+            }
+            else {
+                bizdateKey = "biztime";
+            }
+
+            QFilter filter = new QFilter(bizdateKey, QCP.less_equals, endDate);
+            filter.and(bizdateKey, QCP.large_equals, startDate);
+            return filter;
+
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
 }