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