Przeglądaj źródła

1、新增插件,处理付款单的流水指定功能

wanghaiwu 3 dni temu
rodzic
commit
d0a2ab0803

+ 200 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/plugin/form/AssingDetailFormPlugin.java

@@ -0,0 +1,200 @@
+package nckd.jimin.jyyy.fi.plugin.form;
+
+import kd.bos.bill.AbstractBillPlugIn;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType;
+import kd.bos.dataentity.resource.ResManager;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.datamodel.IDataModel;
+import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.exception.KDBizException;
+import kd.bos.form.MessageBoxOptions;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.field.BasedataEdit;
+import kd.bos.form.field.events.BeforeF7SelectEvent;
+import kd.bos.form.field.events.BeforeF7SelectListener;
+import kd.bos.list.ListFilterParameter;
+import kd.bos.list.ListShowParameter;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.util.StringUtils;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * 交易明细指定
+ * @author wanghaiwu_kd
+ * @date 2026/01/05
+ */
+public class AssingDetailFormPlugin extends AbstractBillPlugIn implements BeforeF7SelectListener {
+    @Override
+    public void afterCreateNewData(EventObject e) {
+        super.afterCreateNewData(e);
+
+        Map<String, Object> customParams = this.getView().getFormShowParameter().getCustomParams();
+        Long companyId = (Long) customParams.get("companyId");
+
+        QFilter qFilter = new QFilter("id", QCP.equals, companyId);
+        DynamicObject company = BusinessDataServiceHelper.loadSingle("bos_org", qFilter.toArray());
+
+        this.getModel().setValue("nckd_org", company);
+
+        List<Long> billIds = (List<Long>) customParams.get("billIds");
+        String entityName = (String) customParams.get("entityName");
+
+        DynamicObjectType type = EntityMetadataCache.getDataEntityType(entityName);
+        //根据pkid找到完整的对象
+        DynamicObject[] billArray = BusinessDataServiceHelper.load(billIds.toArray(), type);
+        DynamicObject bill = billArray[0];
+
+        this.getModel().setValue("nckd_paybillno", bill.getString("billno"));
+        this.getModel().setValue("nckd_currency", bill.getDynamicObject("currency"));
+    }
+
+    @Override
+    public void registerListener(EventObject e) {
+        super.registerListener(e);
+
+        if(this.getModel().getProperty("nckd_detail") != null) {
+            BasedataEdit detailF7 = (BasedataEdit) this.getControl("nckd_detail");
+            detailF7.addBeforeF7SelectListener(this);
+        }
+    }
+
+    @Override
+    public void beforeF7Select(BeforeF7SelectEvent evt) {
+        String property = evt.getProperty().getName();
+
+        ListShowParameter showParameter = (ListShowParameter) evt.getFormShowParameter();
+        ListFilterParameter filterParam = showParameter.getListFilterParameter();
+        List<QFilter> qFilters = filterParam.getQFilters();
+
+        if("nckd_detail".equals(property)){
+            DynamicObject company = (DynamicObject)this.getModel().getValue("nckd_org");
+            if(company == null){
+                throw new KDBizException(ResManager.loadKDString("请先维护所属组织!", "VehicleEditPlugin_12", "em-formplugin", new Object[0]));
+            }
+            Map<String, Object> customParams = this.getView().getFormShowParameter().getCustomParams();
+            List<Long> billIds = (List<Long>) customParams.get("billIds");
+            String entityName = (String) customParams.get("entityName");
+
+            DynamicObjectType type = EntityMetadataCache.getDataEntityType(entityName);
+            //根据pkid找到完整的对象
+            DynamicObject[] billArray = BusinessDataServiceHelper.load(billIds.toArray(), type);
+            DynamicObject bill = billArray[0];
+
+            DynamicObject currency = bill.getDynamicObject("currency");
+
+            QFilter filter = new QFilter("nckd_company.id", QCP.not_in, company.getLong("id"));
+            if("CNY".equals(currency.getString("number"))){
+                BigDecimal actpayamt = bill.getBigDecimal("actpayamt");
+                filter.and((new QFilter("nckd_debitamount", QCP.equals, actpayamt)).or(new QFilter("nckd_creditamount", QCP.equals, actpayamt)));
+            }
+//            filter.and(new QFilter("status", QCP.equals, "D"));//已付款
+//            filter.and(new QFilter("bfj2_sourcebilltype", QCP.equals, " "));//手工单据
+
+            qFilters.add(filter);
+        }
+    }
+
+
+    @Override
+    public void propertyChanged(PropertyChangedArgs e) {
+        super.propertyChanged(e);
+
+        IDataModel model = this.getView().getModel();
+        String key = e.getProperty().getName();
+
+        switch (key) {
+            case "nckd_company":
+                //凭证类型
+//                model.setValue("bfj2_paybill", null);
+
+                break;
+        }
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs args) {
+        super.afterDoOperation(args);
+
+        String operateKey = args.getOperateKey();
+        if (args.getOperationResult() != null && args.getOperationResult().isSuccess() && "nckd_assigndetail".equals(operateKey)) {
+            //同步CBS交易明细 --------------------------
+            //message 返回的提示信息
+            String message = assignDetail();
+            if (StringUtils.isNotEmpty(message)) {
+                this.getView().showConfirm(message, MessageBoxOptions.OK);
+                return;
+            }
+
+            Map<String, String> returnData = new HashMap(4);
+            returnData.put("message", "success");
+            this.getView().returnDataToParent(returnData);
+            this.getView().close();
+        }
+    }
+
+    public Long getTransdetailID(String payBillId){
+        Long billId = Long.parseLong(payBillId);
+        QFilter qf = new QFilter("id", QCP.equals, billId);
+        DynamicObject billDyn = BusinessDataServiceHelper.loadSingle("cas_paybill", new QFilter[]{qf});
+        String transdetailId = billDyn.getString("detailseqid");
+        QFilter qf1 = new QFilter("billno", QCP.equals, transdetailId);
+        DynamicObject transdetailDyn = BusinessDataServiceHelper.loadSingle("bei_transdetail", new QFilter[]{qf1});
+        return transdetailDyn.getLong("id");
+    }
+
+    /**
+     * 流水指定
+     * @return
+     */
+    private String assignDetail(){
+        Map<String, Object> customParams = this.getView().getFormShowParameter().getCustomParams();
+
+        List<Long> billIds = (List<Long>) customParams.get("billIds");
+        String entityName = (String) customParams.get("entityName");
+
+        DynamicObjectType type = EntityMetadataCache.getDataEntityType(entityName);
+        //根据pkid找到完整的对象
+        DynamicObject[] billArray = BusinessDataServiceHelper.load(billIds.toArray(), type);
+        DynamicObject bill = billArray[0];
+
+        boolean isassigndetail = bill.getBoolean("nckd_isassigndetail");
+        if(isassigndetail){
+            return "已手工指定过交易流水,请先撤销指定后再重新指定";
+        }
+
+        String detailno = bill.getString("detailseqid");
+        if(StringUtils.isNotEmpty(detailno)){
+            return "已存在关联的交易流水(" + detailno + "),不允许手工指定";
+        }
+
+        if(this.getModel().getValue("nckd_detail") == null){
+            return "交易流水不能为空";
+        }
+
+        DynamicObject detail = (DynamicObject)this.getModel().getValue("nckd_detail");
+        String detailNO = detail.getString("number");
+
+        QFilter qFilter = new QFilter("detailseqid", QCP.equals, detailNO);
+        DynamicObject paybillInfo = BusinessDataServiceHelper.loadSingle("cas_paybill", new QFilter[]{qFilter});
+        if(paybillInfo != null){
+            return "交易流水(" + detailNO + ")与付款单(" + paybillInfo.getString("billno") + ")已匹配,不能指定";
+        }
+        //1、先校验付款单是否已存在下游凭证
+        qFilter = new QFilter("id", QCP.equals, bill.getPkValue());
+        bill = BusinessDataServiceHelper.loadSingle("cas_paybill", new QFilter[]{qFilter});
+
+        //更新付款单字段
+        bill.set("detailseqid", detailNO);
+        bill.set("nckd_isassigndetail", true);
+
+        SaveServiceHelper.update(new DynamicObject[]{bill});
+
+        return null;
+    }
+}

+ 184 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/plugin/form/PaymentAssignDetailListPlugin.java

@@ -0,0 +1,184 @@
+package nckd.jimin.jyyy.fi.plugin.form;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType;
+import kd.bos.dataentity.resource.ResManager;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.datamodel.ListSelectedRow;
+import kd.bos.entity.datamodel.ListSelectedRowCollection;
+import kd.bos.entity.operate.result.IOperateInfo;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.form.CloseCallBack;
+import kd.bos.form.FormShowParameter;
+import kd.bos.form.ShowType;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.events.ClosedCallBackEvent;
+import kd.bos.form.operate.AbstractOperate;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * 付款处理,指定交易明细
+ * @author wanghaiwu_kd
+ * @date 2026/01/05
+ */
+public class PaymentAssignDetailListPlugin extends AbstractListPlugin {
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        super.beforeDoOperation(args);
+
+        Object source = args.getSource();
+
+        String opKey = ((AbstractOperate)source).getOperateKey();
+        Set<Long> selectedDatas = (Set)args.getListSelectedData().stream().map((data) -> {
+            return (Long)data.getPrimaryKeyValue();
+        }).collect(Collectors.toSet());
+
+        switch (opKey) {
+            case "nckd_assigndetail":
+                if (selectedDatas.size() == 0) {
+                    this.getView().showTipNotification(ResManager.loadKDString("请选择要指定交易明细的单据。", "PaymentAssignDetailListPlugin_7", "fi-cas-formplugin", new Object[0]));
+                    args.setCancel(true);
+                    return;
+                } else if (selectedDatas.size() > 1) {
+                    this.getView().showTipNotification(ResManager.loadKDString("只能选择一张单据指定交易明细。", "PaymentAssignDetailListPlugin_7", "fi-cas-formplugin", new Object[0]));
+                    args.setCancel(true);
+                    return;
+                } else {
+                    QFilter qFilter = new QFilter("id", QCP.in, selectedDatas);
+                    qFilter.and(new QFilter("billstatus", QCP.not_equals2, getAssginBillStatus()));
+
+                    boolean exists = QueryServiceHelper.exists(getEntityName(), qFilter.toArray());
+                    if (exists) {
+                        this.getView().showTipNotification(ResManager.loadKDString("选择的单据中存在不是" + getAssginBillStatusName() + "状态的单据,不允许指定交易明细。", "PaymentAssignDetailListPlugin_7", "fi-cas-formplugin", new Object[0]));
+                        args.setCancel(true);
+                        return;
+                    }
+
+                    DynamicObjectType type = EntityMetadataCache.getDataEntityType(getEntityName());
+                    //根据pkid找到完整的对象
+                    DynamicObject[] billArray = BusinessDataServiceHelper.load(selectedDatas.toArray(), type);
+                    DynamicObject bill = billArray[0];
+
+                    boolean isassigndetail = bill.getBoolean("nckd_isassigndetail");
+                    if(isassigndetail){
+                        this.getView().showTipNotification(ResManager.loadKDString("已手工指定过交易流水,请先撤销指定后再重新指定", "PaymentAssignDetailListPlugin_7", "fi-cas-formplugin", new Object[0]));
+                        args.setCancel(true);
+                        return;
+                    }
+
+                    String detailno = bill.getString("detailseqid");
+                    if(StringUtils.isNotEmpty(detailno)){
+                        this.getView().showTipNotification(ResManager.loadKDString("已存在关联的交易流水(" + detailno + "),不允许手工指定", "PaymentAssignDetailListPlugin_7", "fi-cas-formplugin", new Object[0]));
+                        args.setCancel(true);
+                        return;
+                    }
+                }
+                break;
+            case "nckd_unassigndetail":
+
+                break;
+        }
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs args) {
+        super.afterDoOperation(args);
+
+        String opKey = args.getOperateKey();
+
+        if("nckd_assigndetail".equalsIgnoreCase(opKey)) {
+            ListSelectedRowCollection selectedRows = this.getSelectedRows();
+            List<Long> idList = new ArrayList<>();
+            for(ListSelectedRow row : selectedRows){
+                idList.add((Long)row.getPrimaryKeyValue());
+            }
+            QFilter qFilter = new QFilter("id", QCP.in, idList);
+
+            DynamicObject[] billInfos = BusinessDataServiceHelper.load(getEntityName(), "id, org", qFilter.toArray());
+
+            List<Long> companyIds = new ArrayList<>();
+            for(DynamicObject bill : billInfos){
+                if(!companyIds.contains(bill.getDynamicObject("org").getLong("id"))){
+                    companyIds.add(bill.getDynamicObject("org").getLong("id"));
+                }
+            }
+
+            if(companyIds.size() > 1){
+                this.getView().showTipNotification(ResManager.loadKDString("选择的单据中存在多个资金组织,不允许指定。", "PaymentAssignDetailListPlugin_7", "fi-cas-formplugin", new Object[0]));
+            } else {
+
+                OperationResult operationResult = args.getOperationResult();
+                if (operationResult.isSuccess()) {
+                    FormShowParameter showForm = new FormShowParameter();
+                    showForm.setFormId("nckd_assigndetail");
+                    showForm.getOpenStyle().setShowType(ShowType.Modal);
+
+                    showForm.setCustomParam("entityName", getEntityName());
+                    showForm.setCustomParam("companyId", billInfos[0].getDynamicObject("org").getLong("id"));
+                    showForm.setCustomParam("billIds", idList);
+
+                    showForm.setCloseCallBack(new CloseCallBack(this, "nckd_assigndetail"));
+                    this.getView().showForm(showForm);
+                }
+            }
+        } else if("nckd_unassigndetail".equalsIgnoreCase(opKey)) {
+            OperationResult operationResult = args.getOperationResult();
+            operationResult.setShowMessage(false);
+            String message = operationResult.getMessage();
+
+            List<IOperateInfo> errorInfos = operationResult.getAllErrorOrValidateInfo();
+            boolean isSuccess = operationResult.isSuccess();
+            if(errorInfos.size()> 0){
+                operationResult.setSuccess(false);
+                StringBuffer msg = new StringBuffer();
+                for (IOperateInfo errInfo: errorInfos) {
+                    msg.append(errInfo.getMessage()).append("\r\n");
+                }
+                message = message + "\r\n" + msg.toString();
+            }
+
+            if(StringUtils.isEmpty(message)){
+                this.getView().showSuccessNotification("取消成功!");
+            } else {
+                this.getView().showErrorNotification(message);
+            }
+
+            this.getView().invokeOperation("refresh");
+        }
+    }
+
+    public void closedCallBack(ClosedCallBackEvent event) {
+        super.closedCallBack(event);
+        Map returnData;
+        if ("nckd_assigndetail".equals(event.getActionId())) {
+            returnData = (Map) event.getReturnData();
+            if (returnData != null && returnData.get("message") != null) {
+                this.getView().showSuccessNotification(ResManager.loadKDString("交易流水指定成功。", "PaymentAssignDetailListPlugin_7", "fi-cas-formplugin", new Object[0]));
+                this.getView().invokeOperation("refresh");
+            }
+        }
+    }
+
+    public String getEntityName(){
+        return "cas_paybill";
+    }
+
+    public String getAssginBillStatus(){
+        return "D";
+    }
+
+    public String getAssginBillStatusName(){
+        return "已付款";
+    }
+}

+ 132 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/plugin/operate/PaymentUnAssignDetailOpPlugin.java

@@ -0,0 +1,132 @@
+package nckd.jimin.jyyy.fi.plugin.operate;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.ExtendedDataEntity;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.AddValidatorsEventArgs;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.AfterOperationArgs;
+import kd.bos.entity.plugin.args.BeforeOperationArgs;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.entity.plugin.args.EndOperationTransactionArgs;
+import kd.bos.entity.validate.AbstractValidator;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 付款单取消流水指定
+ * @author wanghaiwu_kd
+ * @date 2026/01/07
+ */
+public class PaymentUnAssignDetailOpPlugin extends AbstractOperationServicePlugIn {
+    private static final Log logger = LogFactory.getLog(PaymentUnAssignDetailOpPlugin.class);
+
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+
+        List<String> fieldKeys = e.getFieldKeys();
+
+        fieldKeys.add("billno");
+        fieldKeys.add("billstatus");
+        fieldKeys.add("nckd_isassigndetail");
+    }
+
+    @Override
+    public void onAddValidators(AddValidatorsEventArgs e) {
+        super.onAddValidators(e);
+        e.addValidator(new AbstractValidator() {
+            @Override
+            public void validate() {
+                ExtendedDataEntity[] dataEntitys = this.getDataEntities();
+                for (ExtendedDataEntity dataEntity : dataEntitys) {
+                    if(dataEntity == null){
+                        continue;
+                    }
+
+                    DynamicObject data = dataEntity.getDataEntity();
+                    String msg = "";
+
+                    if(!data.getBoolean("nckd_isassigndetail")) {
+                        msg = "未指定流水";
+                    }
+
+                    if(!"".equals(msg)){
+                        msg = "付款处理单(" + data.getString("billno") + ")" + msg + ",不允许取消指定";
+
+                        this.addErrorMessage(dataEntity, msg);
+                    }
+                }
+            }
+        });
+    }
+
+    @Override
+    public void beforeExecuteOperationTransaction(BeforeOperationArgs e) {
+        super.beforeExecuteOperationTransaction(e);
+
+        DynamicObject[] dataEntitys = e.getDataEntities();
+        List<Long> ids = (List) Arrays.stream(dataEntitys).map((o) -> {
+            return o.getLong("id");
+        }).collect(Collectors.toList());
+
+        DynamicObjectType type = EntityMetadataCache.getDataEntityType("cas_paybill");
+        DynamicObject[] billArray = BusinessDataServiceHelper.load(ids.toArray(), type);
+
+        //2、更新指定标记
+        List<DynamicObject> listBill = new ArrayList<>();
+        for (DynamicObject bill : billArray) {
+            bill.set("nckd_isassigndetail", false);
+            bill.set("detailseqid", null);
+
+            listBill.add(bill);
+        }
+
+        if(listBill.size() > 0){
+            SaveServiceHelper.update(listBill.toArray(new DynamicObject[]{}));
+        }
+    }
+
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        super.beginOperationTransaction(e);
+    }
+
+    @Override
+    public void endOperationTransaction(EndOperationTransactionArgs e) {
+        super.endOperationTransaction(e);
+    }
+
+    @Override
+    public void afterExecuteOperationTransaction(AfterOperationArgs e) {
+        super.afterExecuteOperationTransaction(e);
+
+//        DynamicObject[] dataEntitys = e.getDataEntities();
+//        List<Long> ids = (List) Arrays.stream(dataEntitys).map((o) -> {
+//            return o.getLong("id");
+//        }).collect(Collectors.toList());
+//
+//        DynamicObjectType type = EntityMetadataCache.getDataEntityType("cas_paybill");
+//        DynamicObject[] billArray = BusinessDataServiceHelper.load(ids.toArray(), type);
+//
+//        //2、更新指定标记
+//        List<DynamicObject> listBill = new ArrayList<>();
+//        for (DynamicObject bill : billArray) {
+//            bill.set("nckd_isassigndetail", false);
+//            bill.set("detailseqid", null);
+//
+//            listBill.add(bill);
+//        }
+//
+//        if(listBill.size() > 0){
+//            SaveServiceHelper.update(listBill.toArray(new DynamicObject[]{}));
+//        }
+    }
+}