소스 검색

first commit

sbtjtserver/zhaoxh 2 달 전
커밋
90514b3d77

+ 657 - 0
bamp/basedata/webapi/CustomerAddnewWebApiPlugin.java

@@ -0,0 +1,657 @@
+package bamp.basedata.webapi;
+
+import kd.bos.algo.DataSet;
+import kd.bos.algo.Row;
+import kd.bos.bd.service.AssignService;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.db.DB;
+import kd.bos.db.DBRoute;
+import kd.bos.entity.AppInfo;
+import kd.bos.entity.AppMetadataCache;
+import kd.bos.entity.basedata.BaseDataResponse;
+import kd.bos.entity.operate.result.OperateErrorInfo;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.validate.ValidateResult;
+import kd.bos.entity.validate.ValidateResultCollection;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.openapi.common.custom.annotation.ApiController;
+import kd.bos.openapi.common.custom.annotation.ApiMapping;
+import kd.bos.openapi.common.custom.annotation.ApiParam;
+import kd.bos.openapi.common.custom.annotation.ApiPostMapping;
+import kd.bos.openapi.common.result.CustomApiResult;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+
+import java.io.Serializable;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/*
+ * 客户新增插件
+ * wangj 2025-01-15
+ * 主要功能:新增主数据客户并分配组织
+ */
+@SuppressWarnings("all")
+@ApiController(value = "open", desc = "客户新增接口插件")
+@ApiMapping(value = "/bd_customer")
+public class CustomerAddnewWebApiPlugin implements Serializable {
+    int successCount = 0;
+    int failCount = 0;
+    private static final Log log = LogFactory.getLog(CustomerAddnewWebApiPlugin.class);
+    @ApiPostMapping(value = "customer_addnew", desc = "同步接口")
+    public CustomApiResult<Map<String, Object>> customer_addnew(@ApiParam(value = "提交参数") List<Map<String, Object>> data ) {
+        CustomApiResult customApiResult = new CustomApiResult();
+        customApiResult.setStatus(true);
+        customApiResult.setErrorCode("0");
+        try {
+            Map resultDatasMap = new HashMap();
+            List<Map> resultDatas = new ArrayList<Map>();
+            for(Map param : data){
+                Map resultData = new HashMap();
+                try {
+                    doUpdateCustomer(param,resultData);
+                }catch (Exception e) {
+                    resultData.put("id","");
+                    resultData.put("errors",e.getMessage());
+                    resultData.put("billStatus",false);
+                    failCount ++;
+                }
+                resultDatas.add(resultData);
+            }
+            resultDatasMap.put("failCount",failCount);
+            if(failCount>0){
+                customApiResult.setStatus(false);
+                customApiResult.setErrorCode("603");
+            }
+            resultDatasMap.put("successCount",successCount);
+            resultDatasMap.put("result",resultDatas);
+            customApiResult.setData(resultDatasMap);
+        } catch (Exception e) {
+            customApiResult.setStatus(false);
+            customApiResult.setMessage(e.getMessage());
+            customApiResult.setErrorCode("400");
+        }
+
+        return customApiResult;
+    }
+
+    private void doUpdateCustomer(Map param, Map resultData) throws ParseException {
+        String errorMsg = "";
+        //创建新用户
+        DynamicObject customerObj = null;
+        if(param.get("number")!=null){
+            QFilter qFilter_number = new QFilter("number",QCP.equals,param.get("number"));
+            DynamicObject[] customer = BusinessDataServiceHelper.load("bd_customer","id",new QFilter[]{qFilter_number});
+            if(customer.length>0){//防止新增失败情况留存的历史数据
+                customerObj = BusinessDataServiceHelper.loadSingle(customer[0].getPkValue(),"bd_customer");
+                if(param.get("enable")!=null && !"".equals(param.get("enable")) && "0".equals(param.get("enable"))){//使用状态变为禁用
+                    //禁用人
+                    setDynamicField(true,"modifier_number","disabler","bos_user",param,resultData,customerObj);
+                    //禁用时间
+                    setDateField(true,"modifytime","disabledate",param,resultData,customerObj);
+                    //使用状态
+                    customerObj.set("enable","0");
+                }
+                //客户字码分录
+                if(param.get("pznm_zmentry")!=null){
+                    List<Map> mapEntrys = (List<Map>) param.get("pznm_zmentry");
+                    doSetEntry(mapEntrys,resultData,customerObj);
+                }
+            }else{
+                customerObj = BusinessDataServiceHelper.newDynamicObject("bd_customer");
+                //数据状态
+                customerObj.set("status","A");
+                //使用状态
+                customerObj.set("enable","1");
+            }
+            resultData.put("number",param.get("number"));
+        }
+
+        //客户编码
+        setTextField(true,"number","number",param,resultData,customerObj);
+        //客户名称
+        setTextField(true,"name","name",param,resultData,customerObj);
+        //创建人
+        setDynamicField(true,"creator_number","creator","bos_user",param,resultData,customerObj);
+        //创建时间
+        setDateField(true,"createtime","createtime",param,resultData,customerObj);
+        //修改人
+        setDynamicField(true,"modifier_number","pznm_modifier_xh","bos_user",param,resultData,customerObj);
+        //修改时间
+        setDateField(true,"modifytime","modifytime",param,resultData,customerObj);
+        //审核人
+        setDynamicField(true,"approverid_number","pznm_auditor_xh","bos_user",param,resultData,customerObj);
+        //审核日期
+        setDateField(true,"approvedate","approvedate",param,resultData,customerObj);
+        //创建组织
+        setDynamicField(true,"createorg_number","createorg","bos_org",param,resultData,customerObj);
+        //控制策略
+        customerObj.set("ctrlstrategy",1);
+        //详细地址
+        setTextField(false,"bizpartner_address","bizpartner_address",param,resultData,customerObj);
+        //统一社会信用代码
+        setTextField(false,"societycreditcode","societycreditcode",param,resultData,customerObj);
+        //是否关联单位
+        setTextField(false,"pznm_isrelateunit","pznm_isrelateunit",param,resultData,customerObj);
+        //内部业务单元
+        setDynamicField(false,"internal_company_number","internal_company","bos_org",param,resultData,customerObj);
+        //内部客户
+        setTextField(false,"chkisinternalcompany","chkisinternalcompany",param,resultData,customerObj);
+        //客户分类
+        if(param.get("entry_groupstandard")!=null){
+            List<Map> mapEntrys = (List<Map>) param.get("entry_groupstandard");
+            doSetGroupEntry(mapEntrys,resultData,customerObj);
+        }
+        //银行信息
+        if(param.get("entry_bank")!=null){
+            List<Map> mapEntrys = (List<Map>) param.get("entry_bank");
+            doSetBankEntry(mapEntrys,resultData,customerObj);
+        }
+        //委托人分录
+        if(param.get("pznm_wtrentry")!=null){
+            List<Map> mapEntrys = (List<Map>) param.get("pznm_wtrentry");
+            doSetWtrEntry(mapEntrys,resultData,customerObj);
+        }
+        //控制状态分录
+        if(param.get("pznm_kzztentry")!=null){
+            List<Map> mapEntrys = (List<Map>) param.get("pznm_kzztentry");
+            doSetKzztentry(mapEntrys,resultData,customerObj);
+        }
+        if(resultData.get("errors")!=null && !"".equals(resultData.get("errors"))){
+            List errors = new ArrayList();
+            errors.add(resultData.get("errors"));
+            resultData.put("id","");
+            resultData.put("errors",errors);
+            resultData.put("billStatus",false);
+        }else{
+            //保存客户对象
+            String status = customerObj.getString("status");
+            if("A".equals(status)){//暂存,走正常逻辑
+                doAddNew(resultData,customerObj,param);
+            }else if("B".equals(status)){//已提交,走update和审核
+                doUpdateAndFP(resultData,customerObj);
+            }else if("C".equals(status)){//已审核,走分配逻辑
+                String error = doFP(customerObj);
+                if("".equals(error)){//分配成功
+                    resultData.put("errors",new ArrayList());
+                    resultData.put("id",customerObj.getPkValue());
+                    resultData.put("billStatus", true);
+                    successCount++;
+                }else{//分配失败
+                    List errors = new ArrayList();
+                    errors.add(error);
+                    resultData.put("errors",errors);
+                    resultData.put("id",customerObj.getPkValue());
+                    resultData.put("billStatus", true);
+                    failCount ++;
+                }
+            }
+        }
+    }
+
+    private void doUpdateAndFP(Map resultData, DynamicObject customerObj) {
+        SaveServiceHelper.update(customerObj);
+        OperationResult result_audit = OperationServiceHelper.executeOperate("audit", "bd_customer",
+                new DynamicObject[]{customerObj}, OperateOption.create());
+        //执行客户对应组织分配
+        if(result_audit.isSuccess()){//保存客户成功
+            String error = doFP(customerObj);
+            if("".equals(error)){//分配成功
+                resultData.put("errors",new ArrayList());
+                resultData.put("id",result_audit.getSuccessPkIds().get(0));
+                resultData.put("billStatus", true);
+                successCount++;
+            }else{//分配失败
+                List errors = new ArrayList();
+                errors.add(error);
+                resultData.put("errors",errors);
+                resultData.put("id",result_audit.getSuccessPkIds().get(0));
+                resultData.put("billStatus", true);
+                failCount ++;
+            }
+        }else{//提交客户失败
+            List errors = new ArrayList();
+            ValidateResultCollection validateResults = result_audit.getValidateResult();
+            List<ValidateResult> validateResultList = validateResults.getValidateErrors();
+            for(ValidateResult validateResult : validateResultList){
+                List<OperateErrorInfo> allErrorInfos = validateResult.getAllErrorInfo();
+                for(OperateErrorInfo allErrorInfo : allErrorInfos){
+                    errors.add(allErrorInfo.getMessage());
+                }
+            }
+            resultData.put("errors",errors);
+            resultData.put("id","");
+            resultData.put("billStatus", false);
+            failCount ++;
+        }
+    }
+
+    private void doAddNew(Map resultData, DynamicObject customerObj, Map param) {
+        OperationResult result_submit = OperationServiceHelper.executeOperate("submit", "bd_customer",
+                new DynamicObject[]{customerObj}, OperateOption.create());
+        if(result_submit.isSuccess()){
+            OperationResult result_audit = OperationServiceHelper.executeOperate("audit", "bd_customer",
+                    new DynamicObject[]{customerObj}, OperateOption.create());
+            //执行客户对应组织分配
+            if(result_audit.isSuccess()){//保存客户成功
+                String error = doFP(customerObj);
+                if("".equals(error)){//分配成功
+                    //更新客户子码基础资料
+                    if(param.get("pznm_zmentry")!=null){
+                        List<Map> mapEntrys = (List<Map>) param.get("pznm_zmentry");
+                        doSetEntry(mapEntrys,resultData,customerObj);
+                    }
+
+                    if(resultData.get("errors")!=null && !"".equals(resultData.get("errors"))){
+                        List errors = new ArrayList();
+                        errors.add(resultData.get("errors"));
+                        resultData.put("errors",errors);
+                        resultData.put("id","");
+                        resultData.put("billStatus", false);
+                        failCount ++;
+                    }else{
+                        resultData.put("errors",new ArrayList());
+                        resultData.put("id",result_audit.getSuccessPkIds().get(0));
+                        resultData.put("billStatus", true);
+                        successCount++;
+                    }
+                }else{//分配失败
+                    List errors = new ArrayList();
+                    errors.add(error);
+                    resultData.put("errors",errors);
+                    resultData.put("id",result_audit.getSuccessPkIds().get(0));
+                    resultData.put("billStatus", true);
+                    failCount ++;
+                }
+            }else{//提交客户失败
+                List errors = new ArrayList();
+                ValidateResultCollection validateResults = result_audit.getValidateResult();
+                List<ValidateResult> validateResultList = validateResults.getValidateErrors();
+                for(ValidateResult validateResult : validateResultList){
+                    List<OperateErrorInfo> allErrorInfos = validateResult.getAllErrorInfo();
+                    for(OperateErrorInfo allErrorInfo : allErrorInfos){
+                        errors.add(allErrorInfo.getMessage());
+                    }
+                }
+                resultData.put("errors",errors);
+                resultData.put("id","");
+                resultData.put("billStatus", false);
+                failCount ++;
+            }
+        }else{
+            List errors = new ArrayList();
+            ValidateResultCollection validateResults = result_submit.getValidateResult();
+            List<ValidateResult> validateResultList = validateResults.getValidateErrors();
+            for(ValidateResult validateResult : validateResultList){
+                List<OperateErrorInfo> allErrorInfos = validateResult.getAllErrorInfo();
+                for(OperateErrorInfo allErrorInfo : allErrorInfos){
+                    errors.add(allErrorInfo.getMessage());
+                }
+            }
+            resultData.put("errors",errors);
+            resultData.put("id","");
+            resultData.put("billStatus", false);
+            failCount ++;
+        }
+    }
+
+    private void doSetGroupEntry(List<Map> mapEntrys, Map resultData, DynamicObject customerObj) {
+        DynamicObjectCollection entrys = customerObj.getDynamicObjectCollection("entry_groupstandard");
+        entrys.clear();
+        for(Map mapEntry : mapEntrys) {
+            DynamicObject newEntry = new DynamicObject(entrys.getDynamicObjectType());
+            //分类标准.编码
+            setDynamicField(true, "standardid_number", "standardid", "bd_customergroupstandard",
+                    mapEntry, resultData, newEntry);
+            //分类.编码
+            setDynamicField(false,"groupid_number","groupid","bd_customergroup",
+                    mapEntry,resultData,newEntry);
+            entrys.add(newEntry);
+        }
+    }
+
+    private void doSetBankEntry(List<Map> mapEntrys, Map resultData, DynamicObject customerObj) {
+        DynamicObjectCollection entrys = customerObj.getDynamicObjectCollection("entry_bank");
+        entrys.clear();
+        for(Map mapEntry : mapEntrys) {
+            DynamicObject newEntry = new DynamicObject(entrys.getDynamicObjectType());
+            //所属组织
+            setDynamicField(true, "pznm_bket_org_number", "pznm_bket_org", "bos_org",
+                    mapEntry, resultData, newEntry);
+            //银行账号
+            setTextField(true, "bankaccount", "bankaccount", mapEntry, resultData, newEntry);
+            //账户名称
+            setTextField(true, "accountname", "accountname", mapEntry, resultData, newEntry);
+            //开户银行
+            setDynamicField(true,"bank_number","bank","bd_bebank",
+                    mapEntry,resultData,newEntry);
+            //币别
+            setDynamicField(true,"currency_number","currency","bd_currency",
+                    mapEntry,resultData,newEntry);
+            //默认
+            setTextField(true, "isdefault_bank", "isdefault_bank", mapEntry, resultData, newEntry);
+            //账户性质
+            setTextField(false, "pznm_bket_account", "pznm_bket_account", mapEntry, resultData, newEntry);
+            entrys.add(newEntry);
+        }
+    }
+
+    private void doSetEntry(List<Map> mapEntrys, Map resultData, DynamicObject customerObj) {
+        //拼接组织+字码编码的过滤条件
+        List<String> zmnumbers = new ArrayList<String>();
+        List<String> orgnumbers = new ArrayList<String>();
+        for(Map mapEntry : mapEntrys){
+            zmnumbers.add(mapEntry.get("pznm_zmet_number").toString());
+            orgnumbers.add(mapEntry.get("pznm_zmet_org_number").toString());
+        }
+
+        //查询过滤条件,缓存存在的字码Map记录
+        Map isHaveOrgs_zmnumber = new HashMap();
+        QFilter qFilter_customer = new QFilter("pznm_customer",QCP.equals,customerObj.getPkValue());
+        QFilter qFilter_org = new QFilter("pznm_zmet_org.number",QCP.in,orgnumbers);
+        QFilter qFilter_ztnumber = new QFilter("number",QCP.in,zmnumbers);
+        DynamicObject[] isHaveObjs = BusinessDataServiceHelper.load("pznm_customerzm",
+                "id,pznm_zmet_org,pznm_zmet_org.number,pznm_zmet_number,pznm_zmet_name,pznm_zmet_oldnumber,pznm_zmet_wtr,pznm_zmet_wtrphone," +
+                        "pznm_zmet_lxr,pznm_zmet_lxrphone,pznm_shipaddress,pznm_shipperson,pznm_shipphone,pznm_zmet_setttype," +
+                        "pznm_zmet_zqnotes,pznm_zmet_settday,pznm_zmet_zqrtype,pznm_zmet_zqptype,pznm_zmet_paytype,pznm_zmet_invoicetype",
+                new QFilter[]{qFilter_customer,qFilter_org,qFilter_ztnumber});
+        for(DynamicObject obj : isHaveObjs){
+            DynamicObject org =  (DynamicObject) obj.getDynamicObject("pznm_zmet_org");
+            String org_zmnumber = org.getString("number")+"_"+obj.getString("number");
+            isHaveOrgs_zmnumber.put(org_zmnumber,obj);
+        }
+
+        //区分并拼接需更新和新增的记录
+        DynamicObjectCollection add_entrys = new DynamicObjectCollection();
+        DynamicObjectCollection update_entrys = new DynamicObjectCollection();
+        for(Map mapEntry : mapEntrys){
+            String org_zmnumber = mapEntry.get("pznm_zmet_org_number").toString()+"_"+mapEntry.get("pznm_zmet_number").toString();
+            if(isHaveOrgs_zmnumber.get(org_zmnumber)!=null && !"".equals(isHaveOrgs_zmnumber.get(org_zmnumber))){
+                //已存在,缓存修改对象
+                DynamicObject update_entry = (DynamicObject) isHaveOrgs_zmnumber.get(org_zmnumber);
+
+                setDynamicField(true,"pznm_zmet_org_number","pznm_zmet_org","bos_org",
+                        mapEntry,resultData,update_entry);
+                //客户子码.子码编码
+                setTextField(true,"pznm_zmet_number","number",mapEntry,resultData,update_entry);
+                //客户子码.子码名称
+                setTextField(true,"pznm_zmet_name","name",mapEntry,resultData,update_entry);
+                //客户子码.老系统编号
+                setTextField(false,"pznm_zmet_oldnumber","pznm_zmet_oldnumber",mapEntry,resultData,update_entry);
+                //委托人.编码
+                setDynamicField(false,"pznm_zmet_wtr_number","pznm_zmet_wtr","pznm_outcontacts",
+                        mapEntry,resultData,update_entry);
+                //委托人信息.委托人电话
+                setTextField(false,"pznm_zmet_wtrphone","pznm_zmet_wtrphone",mapEntry,resultData,update_entry);
+                //联系人.编码
+                setDynamicField(false,"pznm_zmet_lxr_number","pznm_zmet_lxr","pznm_outcontacts",
+                        mapEntry,resultData,update_entry);
+                //客户子码.联系人电话
+                setTextField(false,"pznm_zmet_lxrphone","pznm_zmet_lxrphone",mapEntry,resultData,update_entry);
+                //客户子码.收货地址
+                setTextField(false,"pznm_shipaddress","pznm_shipaddress",mapEntry,resultData,update_entry);
+                //客户子码.收货人
+                setTextField(false,"pznm_shipperson","pznm_shipperson",mapEntry,resultData,update_entry);
+                //客户子码.收货人电话
+                setTextField(false,"pznm_shipphone","pznm_shipphone",mapEntry,resultData,update_entry);
+                //结算类型.编码
+                setDynamicField(false,"pznm_zmet_setttype_number","pznm_zmet_setttype","pznm_settlementtype",
+                        mapEntry,resultData,update_entry);
+                //客户子码.账期摘要
+                setTextField(false,"pznm_zmet_zqnotes","pznm_zmet_zqnotes",mapEntry,resultData,update_entry);
+                //客户子码.实销实结结算日
+                setTextField(false,"pznm_zmet_settday","pznm_zmet_settday",mapEntry,resultData,update_entry);
+                //账期类型(收款).编码
+                setDynamicField(false,"pznm_zmet_zqrtype_number","pznm_zmet_zqrtype","bd_reccondition",
+                        mapEntry,resultData,update_entry);
+                //账期类型(付款).编码
+                setDynamicField(false,"pznm_zmet_zqptype_number","pznm_zmet_zqptype","bd_paycondition",
+                        mapEntry,resultData,update_entry);
+                //支付方式.编码
+                setDynamicField(false,"pznm_zmet_paytype_number","pznm_zmet_paytype","bd_settlementtype",
+                        mapEntry,resultData,update_entry);
+                //发票类型.编码
+                setDynamicField(false,"pznm_zmet_invoicetype_number","pznm_zmet_invoicetype","bd_invoicetype",
+                        mapEntry,resultData,update_entry);
+                update_entrys.add(update_entry);
+            }else{
+                //不存在,缓存新增对象
+                DynamicObject add_entry = BusinessDataServiceHelper.newDynamicObject("pznm_customerzm");
+
+                setDynamicField(true,"pznm_zmet_org_number","pznm_zmet_org","bos_org",
+                        mapEntry,resultData,add_entry);
+                //客户子码.子码编码
+                setTextField(true,"pznm_zmet_number","number",mapEntry,resultData,add_entry);
+                //客户子码.子码名称
+                setTextField(true,"pznm_zmet_name","name",mapEntry,resultData,add_entry);
+                //客户子码.老系统编号
+                setTextField(false,"pznm_zmet_oldnumber","pznm_zmet_oldnumber",mapEntry,resultData,add_entry);
+                //委托人.编码
+                setDynamicField(false,"pznm_zmet_wtr_number","pznm_zmet_wtr","pznm_outcontacts",
+                        mapEntry,resultData,add_entry);
+                //委托人信息.委托人电话
+                setTextField(false,"pznm_zmet_wtrphone","pznm_zmet_wtrphone",mapEntry,resultData,add_entry);
+                //联系人.编码
+                setDynamicField(false,"pznm_zmet_lxr_number","pznm_zmet_lxr","pznm_outcontacts",
+                        mapEntry,resultData,add_entry);
+                //客户子码.联系人电话
+                setTextField(false,"pznm_zmet_lxrphone","pznm_zmet_lxrphone",mapEntry,resultData,add_entry);
+                //客户子码.收货地址
+                setTextField(false,"pznm_shipaddress","pznm_shipaddress",mapEntry,resultData,add_entry);
+                //客户子码.收货人
+                setTextField(false,"pznm_shipperson","pznm_shipperson",mapEntry,resultData,add_entry);
+                //客户子码.收货人电话
+                setTextField(false,"pznm_shipphone","pznm_shipphone",mapEntry,resultData,add_entry);
+                //结算类型.编码
+                setDynamicField(false,"pznm_zmet_setttype_number","pznm_zmet_setttype","pznm_settlementtype",
+                        mapEntry,resultData,add_entry);
+                //客户子码.账期摘要
+                setTextField(false,"pznm_zmet_zqnotes","pznm_zmet_zqnotes",mapEntry,resultData,add_entry);
+                //客户子码.实销实结结算日
+                setTextField(false,"pznm_zmet_settday","pznm_zmet_settday",mapEntry,resultData,add_entry);
+                //账期类型(收款).编码
+                setDynamicField(false,"pznm_zmet_zqrtype_number","pznm_zmet_zqrtype","bd_reccondition",
+                        mapEntry,resultData,add_entry);
+                //账期类型(付款).编码
+                setDynamicField(false,"pznm_zmet_zqptype_number","pznm_zmet_zqptype","bd_paycondition",
+                        mapEntry,resultData,add_entry);
+                //支付方式.编码
+                setDynamicField(false,"pznm_zmet_paytype_number","pznm_zmet_paytype","bd_settlementtype",
+                        mapEntry,resultData,add_entry);
+                //发票类型.编码
+                setDynamicField(false,"pznm_zmet_invoicetype_number","pznm_zmet_invoicetype","bd_invoicetype",
+                        mapEntry,resultData,add_entry);
+                //客户
+                add_entry.set("pznm_customer",customerObj);
+                //数据状态
+                add_entry.set("status","A");
+                //使用状态
+                add_entry.set("enable","1");
+                add_entrys.add(add_entry);
+            }
+        }
+
+        DynamicObject[] real_update_entrys = new DynamicObject[update_entrys.size()];
+        for(int i=0;i< update_entrys.size();i++){
+            real_update_entrys[i] = update_entrys.get(i);
+        }
+
+        DynamicObject[] real_add_entrys = new DynamicObject[add_entrys.size()];
+        for(int i=0;i< add_entrys.size();i++){
+            real_add_entrys[i] = add_entrys.get(i);
+        }
+
+        if(resultData.get("errors")==null || "".equals(resultData.get("errors"))){
+            //执行更新
+            if (real_update_entrys.length > 0) {
+                SaveServiceHelper.update(real_update_entrys);
+            }
+            //执行新增
+            if (real_add_entrys.length > 0) {
+                OperationResult result_submit = OperationServiceHelper.executeOperate("submit", "pznm_customerzm",
+                        real_add_entrys, OperateOption.create());
+                if (result_submit.isSuccess() == true) {
+                    OperationResult result_audit = OperationServiceHelper.executeOperate("audit", "pznm_customerzm",
+                            real_add_entrys, OperateOption.create());
+                    if (result_audit.isSuccess() == false) {
+                        resultData.put("errors", "子码审核失败");
+                    }
+                } else {
+                    resultData.put("errors", "子码创建失败");
+                }
+            }
+        }
+    }
+
+    private void doSetWtrEntry(List<Map> mapEntrys, Map resultData, DynamicObject customerObj) {
+        DynamicObjectCollection entrys = customerObj.getDynamicObjectCollection("pznm_wtrentry");
+        entrys.clear();
+        for(Map mapEntry : mapEntrys){
+            DynamicObject newEntry = new DynamicObject(entrys.getDynamicObjectType());
+            //所属组织
+            setDynamicField(true,"pznm_wtret_org_number","pznm_wtret_org","bos_org",
+                    mapEntry,resultData,newEntry);
+            //委托人信息.委托人电话
+            setTextField(false,"pznm_wtret_userphone","pznm_wtret_userphone",mapEntry,resultData,newEntry);
+            //委托人.编码
+            setDynamicField(true,"pznm_wtret_user_number","pznm_wtret_user","pznm_outcontacts",
+                    mapEntry,resultData,newEntry);
+            entrys.add(newEntry);
+        }
+    }
+
+    private void doSetKzztentry(List<Map> mapEntrys, Map resultData, DynamicObject customerObj) {
+        DynamicObjectCollection entrys = customerObj.getDynamicObjectCollection("pznm_kzztentry");
+        entrys.clear();
+        for(Map mapEntry : mapEntrys){
+            DynamicObject newEntry = new DynamicObject(entrys.getDynamicObjectType());
+            //所属组织
+            setDynamicField(true,"pznm_kzztet_org_number","pznm_kzztet_org","bos_org",
+                    mapEntry,resultData,newEntry);
+            //公司级状态
+            setTextField(true,"pznm_companystatus","pznm_companystatus",mapEntry,resultData,newEntry);
+            //开票需求
+            setDynamicField(false,"pznm_invoicdemand_number","pznm_invoicdemand","pznm_invoicdemand",
+                    mapEntry,resultData,newEntry);
+            //月结开票日
+            setTextField(false,"pznm_invoicday","pznm_invoicday",mapEntry,resultData,newEntry);
+
+            entrys.add(newEntry);
+        }
+    }
+
+    /* 校验并设置F7字段
+     * @key 入参校验字段
+     * @fieldName 写入客户对象的字段名
+     * @entityNumber 字段对应基础资料实体名
+     * @param 接口入参对象
+     * @resultData 返回报文对象
+     * @customerObj 客户对象
+     */
+    private void setDynamicField(Boolean isMust,String key,String fieldName, String entityNumber, Map param, Map resultData, DynamicObject customerObj) {
+        if(param.get(key)==null || "".equals(param.get(key))){
+            if(isMust){
+                String errors = resultData.get("errors")!=null?resultData.get("errors").toString()+";":"";
+                resultData.put("errors",errors+"参数【" + key + "】必填");
+            }
+        }else{
+            QFilter qFilter_number = new QFilter("number",QCP.equals,param.get(key));
+            QFilter qFilter_enable = new QFilter("enable", QCP.equals,"1");
+            QFilter qFilter_status = new QFilter("status", QCP.equals, "C");
+            DynamicObject objCol = BusinessDataServiceHelper.loadSingleFromCache(entityNumber,"id,number,name",
+                    new QFilter[]{qFilter_number,qFilter_enable,qFilter_status});
+            if(objCol!=null){
+                customerObj.set(fieldName,objCol);
+            }else{
+                String errors = resultData.get("errors")!=null?resultData.get("errors").toString()+";":"";
+                resultData.put("errors",errors+"参数【" + key + "】值【"+param.get(key)+"】匹配不成功,可能的原因是:1、编码不正确 2、不符合基础资料字段查询条件");
+            }
+        }
+    }
+
+    /* 校验并设置文本字段
+    * @key 入参校验字段
+    * @fieldName 写入客户对象的字段名
+    * @param 接口入参对象
+    * @resultData 返回报文对象
+    * @customerObj 客户对象
+     */
+    private void setTextField(Boolean isMust,String key,String fieldName,Map param, Map resultData, DynamicObject customerObj) {
+        if(param.get(key)==null || "".equals(param.get(key))){
+            if(isMust){
+                String errors = resultData.get("errors")!=null?resultData.get("errors").toString()+";":"";
+                resultData.put("errors",errors+"参数【" + key + "】必填");
+            }
+        }else{
+            customerObj.set(fieldName,param.get(key));
+        }
+    }
+
+    /* 校验并设置日期字段
+     * @key 入参校验字段
+     * @fieldName 写入客户对象的字段名
+     * @param 接口入参对象
+     * @resultData 返回报文对象
+     * @customerObj 客户对象
+     */
+    private void setDateField(Boolean isMust,String key,String fieldName,Map param, Map resultData, DynamicObject customerObj) throws ParseException {
+        if(param.get(key)==null || "".equals(param.get(key))){
+            if(isMust){
+                String errors = resultData.get("errors")!=null?resultData.get("errors").toString()+";":"";
+                resultData.put("errors",errors+"参数【" + key + "】必填");
+            }
+        }else{
+            customerObj.set(fieldName,new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(param.get(key).toString()));
+        }
+    }
+
+    private String doFP(DynamicObject customerObj) {
+        SaveServiceHelper.update(customerObj);
+        String error = "";
+        Map isHaveOrgIds = getIsHaveOrgIds(customerObj.getPkValue());
+
+        DynamicObjectCollection kzztentrys = customerObj.getDynamicObjectCollection("pznm_kzztentry");
+        Set<Long> orgIds = new HashSet(kzztentrys.size());
+        List<Long> orgIds_list = new ArrayList<Long>();
+        for(DynamicObject kzztentry : kzztentrys){
+            DynamicObject org = kzztentry.getDynamicObject("pznm_kzztet_org");
+            if(isHaveOrgIds.get(org.getString("id"))==null || "".equals(isHaveOrgIds.get(org.getString("id")))){
+                orgIds_list.add(org.getLong("id"));
+            }
+        }
+        orgIds = new HashSet<>(orgIds_list);
+        if(orgIds.size()>0){
+            AppInfo appInfo = AppMetadataCache.getAppInfo("basedata");
+            String appId = appInfo.getAppId();
+            Set<Long> dataIds = new HashSet<Long>();
+            dataIds.add(customerObj.getLong("id"));
+            QFilter qFilter_number = new QFilter("number", QCP.equals,"1");
+            DynamicObject useOrg = BusinessDataServiceHelper.loadSingle("bos_adminorg","id",new QFilter[]{qFilter_number});
+            long useOrgId = useOrg.getLong("id");
+            BaseDataResponse response = (new AssignService("bd_customer").assign(useOrgId, appId, dataIds, orgIds, true));
+            if (!response.isSuccess()) {
+                error = response.getErrorMsg();
+            }
+        }
+
+        return error;
+    }
+
+    private Map getIsHaveOrgIds(Object pkValue) {
+        Map isHaveOrgIds = new HashMap();
+        String sql = "SELECT fuseorgid FROM T_BD_CUSTOMER_U WHERE FDATAID="+pkValue;
+        DataSet ds = DB.queryDataSet(this.getClass().getName(), DBRoute.of("sys"), sql);
+        for (Row row : ds) {
+            String orgId = row.getString("fuseorgid");
+            isHaveOrgIds.put(orgId,orgId);
+        }
+        return isHaveOrgIds;
+    }
+}

+ 651 - 0
bamp/basedata/webapi/CustomerSaveWebApiPlugin.java

@@ -0,0 +1,651 @@
+package bamp.basedata.webapi;
+
+import kd.bos.algo.DataSet;
+import kd.bos.algo.Row;
+import kd.bos.bd.service.AssignService;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.db.DB;
+import kd.bos.db.DBRoute;
+import kd.bos.entity.AppInfo;
+import kd.bos.entity.AppMetadataCache;
+import kd.bos.entity.basedata.BaseDataResponse;
+import kd.bos.entity.operate.result.OperateErrorInfo;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.validate.ValidateResult;
+import kd.bos.entity.validate.ValidateResultCollection;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.openapi.common.custom.annotation.ApiController;
+import kd.bos.openapi.common.custom.annotation.ApiMapping;
+import kd.bos.openapi.common.custom.annotation.ApiParam;
+import kd.bos.openapi.common.custom.annotation.ApiPostMapping;
+import kd.bos.openapi.common.result.CustomApiResult;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+
+import java.io.Serializable;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/*
+ * 客户修改插件
+ * wangj 2025-01-15
+ * 主要功能:新增主数据客户并分配组织
+ */
+@SuppressWarnings("all")
+@ApiController(value = "open", desc = "客户修改接口插件")
+@ApiMapping(value = "/bd_customer")
+public class CustomerSaveWebApiPlugin implements Serializable {
+    int successCount = 0;
+    int failCount = 0;
+    private static final Log log = LogFactory.getLog(CustomerSaveWebApiPlugin.class);
+    @ApiPostMapping(value = "customer_save", desc = "同步接口")
+    public CustomApiResult<Map<String, Object>> customer_save(@ApiParam(value = "提交参数") List<Map<String, Object>> data ) {
+        CustomApiResult customApiResult = new CustomApiResult();
+        customApiResult.setStatus(true);
+        customApiResult.setErrorCode("0");
+        try {
+            Map resultDatasMap = new HashMap();
+            List<Map> resultDatas = new ArrayList<Map>();
+            for(Map param : data){
+                Map resultData = new HashMap();
+                try {
+                    doUpdateCustomer(param,resultData);
+                }catch (Exception e) {
+                    resultData.put("id","");
+                    resultData.put("errors",e.getMessage());
+                    resultData.put("billStatus",false);
+                    failCount ++;
+                }
+                resultDatas.add(resultData);
+            }
+            resultDatasMap.put("failCount",failCount);
+            if(failCount>0){
+                customApiResult.setStatus(false);
+                customApiResult.setErrorCode("603");
+            }
+            resultDatasMap.put("successCount",successCount);
+            resultDatasMap.put("result",resultDatas);
+            customApiResult.setData(resultDatasMap);
+        } catch (Exception e) {
+            customApiResult.setStatus(false);
+            customApiResult.setMessage(e.getMessage());
+            customApiResult.setErrorCode("400");
+        }
+
+        return customApiResult;
+    }
+
+    private void doUpdateCustomer(Map param, Map resultData) throws ParseException {
+        String errorMsg = "";
+        //创建新用户
+        DynamicObject customerObj = null;
+        if(param.get("number")!=null){
+            QFilter qFilter_number = new QFilter("number",QCP.equals,param.get("number"));
+            DynamicObject[] customer = BusinessDataServiceHelper.load("bd_customer","id",new QFilter[]{qFilter_number});
+            if(customer.length>0){//防止新增失败情况留存的历史数据
+                customerObj = BusinessDataServiceHelper.loadSingle(customer[0].getPkValue(),"bd_customer");
+                if(param.get("enable")!=null && !"".equals(param.get("enable")) && "0".equals(param.get("enable"))){//使用状态变为禁用
+                    //禁用人
+                    setDynamicField(true,"modifier_number","disabler","bos_user",param,resultData,customerObj);
+                    //禁用时间
+                    setDateField(true,"modifytime","disabledate",param,resultData,customerObj);
+                    //使用状态
+                    customerObj.set("enable","0");
+                }
+                //客户字码分录
+                if(param.get("pznm_zmentry")!=null){
+                    List<Map> mapEntrys = (List<Map>) param.get("pznm_zmentry");
+                    doSetEntry(mapEntrys,resultData,customerObj);
+                }
+            }else{
+                customerObj = BusinessDataServiceHelper.newDynamicObject("bd_customer");
+                //数据状态
+                customerObj.set("status","A");
+            }
+            resultData.put("number",param.get("number"));
+        }
+
+        //客户编码
+        setTextField(true,"number","number",param,resultData,customerObj);
+        //客户名称
+        setTextField(true,"name","name",param,resultData,customerObj);
+        //修改人
+        setDynamicField(true,"modifier_number","pznm_modifier_xh","bos_user",param,resultData,customerObj);
+        //修改时间
+        setDateField(true,"modifytime","modifytime",param,resultData,customerObj);
+        //审核人
+        setDynamicField(true,"approverid_number","pznm_auditor_xh","bos_user",param,resultData,customerObj);
+        //审核日期
+        setDateField(true,"approvedate","approvedate",param,resultData,customerObj);
+        //创建组织
+        setDynamicField(true,"createorg_number","createorg","bos_org",param,resultData,customerObj);
+        //控制策略
+        customerObj.set("ctrlstrategy",1);
+        //详细地址
+        setTextField(false,"bizpartner_address","bizpartner_address",param,resultData,customerObj);
+        //统一社会信用代码
+        setTextField(false,"societycreditcode","societycreditcode",param,resultData,customerObj);
+        //是否关联单位
+        setTextField(false,"pznm_isrelateunit","pznm_isrelateunit",param,resultData,customerObj);
+        //内部业务单元
+        setDynamicField(false,"internal_company_number","internal_company","bos_org",param,resultData,customerObj);
+        //内部客户
+        setTextField(false,"chkisinternalcompany","chkisinternalcompany",param,resultData,customerObj);
+        //客户分类
+        if(param.get("entry_groupstandard")!=null){
+            List<Map> mapEntrys = (List<Map>) param.get("entry_groupstandard");
+            doSetGroupEntry(mapEntrys,resultData,customerObj);
+        }
+        //银行信息
+        if(param.get("entry_bank")!=null){
+            List<Map> mapEntrys = (List<Map>) param.get("entry_bank");
+            doSetBankEntry(mapEntrys,resultData,customerObj);
+        }
+        //委托人分录
+        if(param.get("pznm_wtrentry")!=null){
+            List<Map> mapEntrys = (List<Map>) param.get("pznm_wtrentry");
+            doSetWtrEntry(mapEntrys,resultData,customerObj);
+        }
+        //控制状态分录
+        if(param.get("pznm_kzztentry")!=null){
+            List<Map> mapEntrys = (List<Map>) param.get("pznm_kzztentry");
+            doSetKzztentry(mapEntrys,resultData,customerObj);
+        }
+        if(resultData.get("errors")!=null && !"".equals(resultData.get("errors"))){
+            List errors = new ArrayList();
+            errors.add(resultData.get("errors"));
+            resultData.put("id","");
+            resultData.put("errors",errors);
+            resultData.put("billStatus",false);
+        }else{
+            //保存客户对象
+            String status = customerObj.getString("status");
+            if("A".equals(status)){//暂存,走正常逻辑
+                doAddNew(resultData,customerObj,param);
+            }else if("B".equals(status)){//已提交,走update和审核
+                doUpdateAndFP(resultData,customerObj);
+            }else if("C".equals(status)){//已审核,走分配逻辑
+                String error = doFP(customerObj);
+                if("".equals(error)){//分配成功
+                    resultData.put("errors",new ArrayList());
+                    resultData.put("id",customerObj.getPkValue());
+                    resultData.put("billStatus", true);
+                    successCount++;
+                }else{//分配失败
+                    List errors = new ArrayList();
+                    errors.add(error);
+                    resultData.put("errors",errors);
+                    resultData.put("id",customerObj.getPkValue());
+                    resultData.put("billStatus", true);
+                    failCount ++;
+                }
+            }
+        }
+    }
+
+    private void doUpdateAndFP(Map resultData, DynamicObject customerObj) {
+        SaveServiceHelper.update(customerObj);
+        OperationResult result_audit = OperationServiceHelper.executeOperate("audit", "bd_customer",
+                new DynamicObject[]{customerObj}, OperateOption.create());
+        //执行客户对应组织分配
+        if(result_audit.isSuccess()){//保存客户成功
+            String error = doFP(customerObj);
+            if("".equals(error)){//分配成功
+                resultData.put("errors",new ArrayList());
+                resultData.put("id",result_audit.getSuccessPkIds().get(0));
+                resultData.put("billStatus", true);
+                successCount++;
+            }else{//分配失败
+                List errors = new ArrayList();
+                errors.add(error);
+                resultData.put("errors",errors);
+                resultData.put("id",result_audit.getSuccessPkIds().get(0));
+                resultData.put("billStatus", true);
+                failCount ++;
+            }
+        }else{//提交客户失败
+            List errors = new ArrayList();
+            ValidateResultCollection validateResults = result_audit.getValidateResult();
+            List<ValidateResult> validateResultList = validateResults.getValidateErrors();
+            for(ValidateResult validateResult : validateResultList){
+                List<OperateErrorInfo> allErrorInfos = validateResult.getAllErrorInfo();
+                for(OperateErrorInfo allErrorInfo : allErrorInfos){
+                    errors.add(allErrorInfo.getMessage());
+                }
+            }
+            resultData.put("errors",errors);
+            resultData.put("id","");
+            resultData.put("billStatus", false);
+            failCount ++;
+        }
+    }
+
+    private void doAddNew(Map resultData, DynamicObject customerObj, Map param) {
+        OperationResult result_submit = OperationServiceHelper.executeOperate("submit", "bd_customer",
+                new DynamicObject[]{customerObj}, OperateOption.create());
+        if(result_submit.isSuccess()){
+            OperationResult result_audit = OperationServiceHelper.executeOperate("audit", "bd_customer",
+                    new DynamicObject[]{customerObj}, OperateOption.create());
+            //执行客户对应组织分配
+            if(result_audit.isSuccess()){//保存客户成功
+                String error = doFP(customerObj);
+                if("".equals(error)){//分配成功
+                    //更新客户子码基础资料
+                    if(param.get("pznm_zmentry")!=null){
+                        List<Map> mapEntrys = (List<Map>) param.get("pznm_zmentry");
+                        doSetEntry(mapEntrys,resultData,customerObj);
+                    }
+
+                    if(resultData.get("errors")!=null && !"".equals(resultData.get("errors"))){
+                        List errors = new ArrayList();
+                        errors.add(resultData.get("errors"));
+                        resultData.put("errors",errors);
+                        resultData.put("id","");
+                        resultData.put("billStatus", false);
+                        failCount ++;
+                    }else{
+                        resultData.put("errors",new ArrayList());
+                        resultData.put("id",result_audit.getSuccessPkIds().get(0));
+                        resultData.put("billStatus", true);
+                        successCount++;
+                    }
+                }else{//分配失败
+                    List errors = new ArrayList();
+                    errors.add(error);
+                    resultData.put("errors",errors);
+                    resultData.put("id",result_audit.getSuccessPkIds().get(0));
+                    resultData.put("billStatus", true);
+                    failCount ++;
+                }
+            }else{//提交客户失败
+                List errors = new ArrayList();
+                ValidateResultCollection validateResults = result_audit.getValidateResult();
+                List<ValidateResult> validateResultList = validateResults.getValidateErrors();
+                for(ValidateResult validateResult : validateResultList){
+                    List<OperateErrorInfo> allErrorInfos = validateResult.getAllErrorInfo();
+                    for(OperateErrorInfo allErrorInfo : allErrorInfos){
+                        errors.add(allErrorInfo.getMessage());
+                    }
+                }
+                resultData.put("errors",errors);
+                resultData.put("id","");
+                resultData.put("billStatus", false);
+                failCount ++;
+            }
+        }else{
+            List errors = new ArrayList();
+            ValidateResultCollection validateResults = result_submit.getValidateResult();
+            List<ValidateResult> validateResultList = validateResults.getValidateErrors();
+            for(ValidateResult validateResult : validateResultList){
+                List<OperateErrorInfo> allErrorInfos = validateResult.getAllErrorInfo();
+                for(OperateErrorInfo allErrorInfo : allErrorInfos){
+                    errors.add(allErrorInfo.getMessage());
+                }
+            }
+            resultData.put("errors",errors);
+            resultData.put("id","");
+            resultData.put("billStatus", false);
+            failCount ++;
+        }
+    }
+
+    private void doSetGroupEntry(List<Map> mapEntrys, Map resultData, DynamicObject customerObj) {
+        DynamicObjectCollection entrys = customerObj.getDynamicObjectCollection("entry_groupstandard");
+        entrys.clear();
+        for(Map mapEntry : mapEntrys) {
+            DynamicObject newEntry = new DynamicObject(entrys.getDynamicObjectType());
+            //分类标准.编码
+            setDynamicField(true, "standardid_number", "standardid", "bd_customergroupstandard",
+                    mapEntry, resultData, newEntry);
+            //分类.编码
+            setDynamicField(false,"groupid_number","groupid","bd_customergroup",
+                    mapEntry,resultData,newEntry);
+            entrys.add(newEntry);
+        }
+    }
+
+    private void doSetBankEntry(List<Map> mapEntrys, Map resultData, DynamicObject customerObj) {
+        DynamicObjectCollection entrys = customerObj.getDynamicObjectCollection("entry_bank");
+        entrys.clear();
+        for(Map mapEntry : mapEntrys) {
+            DynamicObject newEntry = new DynamicObject(entrys.getDynamicObjectType());
+            //所属组织
+            setDynamicField(true, "pznm_bket_org_number", "pznm_bket_org", "bos_org",
+                    mapEntry, resultData, newEntry);
+            //银行账号
+            setTextField(true, "bankaccount", "bankaccount", mapEntry, resultData, newEntry);
+            //账户名称
+            setTextField(true, "accountname", "accountname", mapEntry, resultData, newEntry);
+            //开户银行
+            setDynamicField(true,"bank_number","bank","bd_bebank",
+                    mapEntry,resultData,newEntry);
+            //币别
+            setDynamicField(true,"currency_number","currency","bd_currency",
+                    mapEntry,resultData,newEntry);
+            //默认
+            setTextField(true, "isdefault_bank", "isdefault_bank", mapEntry, resultData, newEntry);
+            //账户性质
+            setTextField(false, "pznm_bket_account", "pznm_bket_account", mapEntry, resultData, newEntry);
+            entrys.add(newEntry);
+        }
+    }
+
+    private void doSetEntry(List<Map> mapEntrys, Map resultData, DynamicObject customerObj) {
+        //拼接组织+字码编码的过滤条件
+        List<String> zmnumbers = new ArrayList<String>();
+        List<String> orgnumbers = new ArrayList<String>();
+        for(Map mapEntry : mapEntrys){
+            zmnumbers.add(mapEntry.get("pznm_zmet_number").toString());
+            orgnumbers.add(mapEntry.get("pznm_zmet_org_number").toString());
+        }
+
+        //查询过滤条件,缓存存在的字码Map记录
+        Map isHaveOrgs_zmnumber = new HashMap();
+        QFilter qFilter_customer = new QFilter("pznm_customer",QCP.equals,customerObj.getPkValue());
+        QFilter qFilter_org = new QFilter("pznm_zmet_org.number",QCP.in,orgnumbers);
+        QFilter qFilter_ztnumber = new QFilter("number",QCP.in,zmnumbers);
+        DynamicObject[] isHaveObjs = BusinessDataServiceHelper.load("pznm_customerzm",
+                "id,pznm_zmet_org,pznm_zmet_org.number,pznm_zmet_number,pznm_zmet_name,pznm_zmet_oldnumber,pznm_zmet_wtr,pznm_zmet_wtrphone," +
+                        "pznm_zmet_lxr,pznm_zmet_lxrphone,pznm_shipaddress,pznm_shipperson,pznm_shipphone,pznm_zmet_setttype," +
+                        "pznm_zmet_zqnotes,pznm_zmet_settday,pznm_zmet_zqrtype,pznm_zmet_zqptype,pznm_zmet_paytype,pznm_zmet_invoicetype",
+                new QFilter[]{qFilter_customer,qFilter_org,qFilter_ztnumber});
+        for(DynamicObject obj : isHaveObjs){
+            DynamicObject org =  (DynamicObject) obj.getDynamicObject("pznm_zmet_org");
+            String org_zmnumber = org.getString("number")+"_"+obj.getString("number");
+            isHaveOrgs_zmnumber.put(org_zmnumber,obj);
+        }
+
+        //区分并拼接需更新和新增的记录
+        DynamicObjectCollection add_entrys = new DynamicObjectCollection();
+        DynamicObjectCollection update_entrys = new DynamicObjectCollection();
+        for(Map mapEntry : mapEntrys){
+            String org_zmnumber = mapEntry.get("pznm_zmet_org_number").toString()+"_"+mapEntry.get("pznm_zmet_number").toString();
+            if(isHaveOrgs_zmnumber.get(org_zmnumber)!=null && !"".equals(isHaveOrgs_zmnumber.get(org_zmnumber))){
+                //已存在,缓存修改对象
+                DynamicObject update_entry = (DynamicObject) isHaveOrgs_zmnumber.get(org_zmnumber);
+
+                setDynamicField(true,"pznm_zmet_org_number","pznm_zmet_org","bos_org",
+                        mapEntry,resultData,update_entry);
+                //客户子码.子码编码
+                setTextField(true,"pznm_zmet_number","number",mapEntry,resultData,update_entry);
+                //客户子码.子码名称
+                setTextField(true,"pznm_zmet_name","name",mapEntry,resultData,update_entry);
+                //客户子码.老系统编号
+                setTextField(false,"pznm_zmet_oldnumber","pznm_zmet_oldnumber",mapEntry,resultData,update_entry);
+                //委托人.编码
+                setDynamicField(false,"pznm_zmet_wtr_number","pznm_zmet_wtr","pznm_outcontacts",
+                        mapEntry,resultData,update_entry);
+                //委托人信息.委托人电话
+                setTextField(false,"pznm_zmet_wtrphone","pznm_zmet_wtrphone",mapEntry,resultData,update_entry);
+                //联系人.编码
+                setDynamicField(false,"pznm_zmet_lxr_number","pznm_zmet_lxr","pznm_outcontacts",
+                        mapEntry,resultData,update_entry);
+                //客户子码.联系人电话
+                setTextField(false,"pznm_zmet_lxrphone","pznm_zmet_lxrphone",mapEntry,resultData,update_entry);
+                //客户子码.收货地址
+                setTextField(false,"pznm_shipaddress","pznm_shipaddress",mapEntry,resultData,update_entry);
+                //客户子码.收货人
+                setTextField(false,"pznm_shipperson","pznm_shipperson",mapEntry,resultData,update_entry);
+                //客户子码.收货人电话
+                setTextField(false,"pznm_shipphone","pznm_shipphone",mapEntry,resultData,update_entry);
+                //结算类型.编码
+                setDynamicField(false,"pznm_zmet_setttype_number","pznm_zmet_setttype","pznm_settlementtype",
+                        mapEntry,resultData,update_entry);
+                //客户子码.账期摘要
+                setTextField(false,"pznm_zmet_zqnotes","pznm_zmet_zqnotes",mapEntry,resultData,update_entry);
+                //客户子码.实销实结结算日
+                setTextField(false,"pznm_zmet_settday","pznm_zmet_settday",mapEntry,resultData,update_entry);
+                //账期类型(收款).编码
+                setDynamicField(false,"pznm_zmet_zqrtype_number","pznm_zmet_zqrtype","bd_reccondition",
+                        mapEntry,resultData,update_entry);
+                //账期类型(付款).编码
+                setDynamicField(false,"pznm_zmet_zqptype_number","pznm_zmet_zqptype","bd_paycondition",
+                        mapEntry,resultData,update_entry);
+                //支付方式.编码
+                setDynamicField(false,"pznm_zmet_paytype_number","pznm_zmet_paytype","bd_settlementtype",
+                        mapEntry,resultData,update_entry);
+                //发票类型.编码
+                setDynamicField(false,"pznm_zmet_invoicetype_number","pznm_zmet_invoicetype","bd_invoicetype",
+                        mapEntry,resultData,update_entry);
+                update_entrys.add(update_entry);
+            }else{
+                //不存在,缓存新增对象
+                DynamicObject add_entry = BusinessDataServiceHelper.newDynamicObject("pznm_customerzm");
+
+                setDynamicField(true,"pznm_zmet_org_number","pznm_zmet_org","bos_org",
+                        mapEntry,resultData,add_entry);
+                //客户子码.子码编码
+                setTextField(true,"pznm_zmet_number","number",mapEntry,resultData,add_entry);
+                //客户子码.子码名称
+                setTextField(true,"pznm_zmet_name","name",mapEntry,resultData,add_entry);
+                //客户子码.老系统编号
+                setTextField(false,"pznm_zmet_oldnumber","pznm_zmet_oldnumber",mapEntry,resultData,add_entry);
+                //委托人.编码
+                setDynamicField(false,"pznm_zmet_wtr_number","pznm_zmet_wtr","pznm_outcontacts",
+                        mapEntry,resultData,add_entry);
+                //委托人信息.委托人电话
+                setTextField(false,"pznm_zmet_wtrphone","pznm_zmet_wtrphone",mapEntry,resultData,add_entry);
+                //联系人.编码
+                setDynamicField(false,"pznm_zmet_lxr_number","pznm_zmet_lxr","pznm_outcontacts",
+                        mapEntry,resultData,add_entry);
+                //客户子码.联系人电话
+                setTextField(false,"pznm_zmet_lxrphone","pznm_zmet_lxrphone",mapEntry,resultData,add_entry);
+                //客户子码.收货地址
+                setTextField(false,"pznm_shipaddress","pznm_shipaddress",mapEntry,resultData,add_entry);
+                //客户子码.收货人
+                setTextField(false,"pznm_shipperson","pznm_shipperson",mapEntry,resultData,add_entry);
+                //客户子码.收货人电话
+                setTextField(false,"pznm_shipphone","pznm_shipphone",mapEntry,resultData,add_entry);
+                //结算类型.编码
+                setDynamicField(false,"pznm_zmet_setttype_number","pznm_zmet_setttype","pznm_settlementtype",
+                        mapEntry,resultData,add_entry);
+                //客户子码.账期摘要
+                setTextField(false,"pznm_zmet_zqnotes","pznm_zmet_zqnotes",mapEntry,resultData,add_entry);
+                //客户子码.实销实结结算日
+                setTextField(false,"pznm_zmet_settday","pznm_zmet_settday",mapEntry,resultData,add_entry);
+                //账期类型(收款).编码
+                setDynamicField(false,"pznm_zmet_zqrtype_number","pznm_zmet_zqrtype","bd_reccondition",
+                        mapEntry,resultData,add_entry);
+                //账期类型(付款).编码
+                setDynamicField(false,"pznm_zmet_zqptype_number","pznm_zmet_zqptype","bd_paycondition",
+                        mapEntry,resultData,add_entry);
+                //支付方式.编码
+                setDynamicField(false,"pznm_zmet_paytype_number","pznm_zmet_paytype","bd_settlementtype",
+                        mapEntry,resultData,add_entry);
+                //发票类型.编码
+                setDynamicField(false,"pznm_zmet_invoicetype_number","pznm_zmet_invoicetype","bd_invoicetype",
+                        mapEntry,resultData,add_entry);
+                //客户
+                add_entry.set("pznm_customer",customerObj);
+                //数据状态
+                add_entry.set("status","A");
+                //使用状态
+                add_entry.set("enable","1");
+                add_entrys.add(add_entry);
+            }
+        }
+
+        DynamicObject[] real_update_entrys = new DynamicObject[update_entrys.size()];
+        for(int i=0;i< update_entrys.size();i++){
+            real_update_entrys[i] = update_entrys.get(i);
+        }
+
+        DynamicObject[] real_add_entrys = new DynamicObject[add_entrys.size()];
+        for(int i=0;i< add_entrys.size();i++){
+            real_add_entrys[i] = add_entrys.get(i);
+        }
+
+        if(resultData.get("errors")==null || "".equals(resultData.get("errors"))){
+            //执行更新
+            if (real_update_entrys.length > 0) {
+                SaveServiceHelper.update(real_update_entrys);
+            }
+            //执行新增
+            if (real_add_entrys.length > 0) {
+                OperationResult result_submit = OperationServiceHelper.executeOperate("submit", "pznm_customerzm",
+                        real_add_entrys, OperateOption.create());
+                if (result_submit.isSuccess() == true) {
+                    OperationResult result_audit = OperationServiceHelper.executeOperate("audit", "pznm_customerzm",
+                            real_add_entrys, OperateOption.create());
+                    if (result_audit.isSuccess() == false) {
+                        resultData.put("errors", "子码审核失败");
+                    }
+                } else {
+                    resultData.put("errors", "子码创建失败");
+                }
+            }
+        }
+    }
+
+    private void doSetWtrEntry(List<Map> mapEntrys, Map resultData, DynamicObject customerObj) {
+        DynamicObjectCollection entrys = customerObj.getDynamicObjectCollection("pznm_wtrentry");
+        entrys.clear();
+        for(Map mapEntry : mapEntrys){
+            DynamicObject newEntry = new DynamicObject(entrys.getDynamicObjectType());
+            //所属组织
+            setDynamicField(true,"pznm_wtret_org_number","pznm_wtret_org","bos_org",
+                    mapEntry,resultData,newEntry);
+            //委托人信息.委托人电话
+            setTextField(false,"pznm_wtret_userphone","pznm_wtret_userphone",mapEntry,resultData,newEntry);
+            //委托人.编码
+            setDynamicField(true,"pznm_wtret_user_number","pznm_wtret_user","pznm_outcontacts",
+                    mapEntry,resultData,newEntry);
+            entrys.add(newEntry);
+        }
+    }
+
+    private void doSetKzztentry(List<Map> mapEntrys, Map resultData, DynamicObject customerObj) {
+        DynamicObjectCollection entrys = customerObj.getDynamicObjectCollection("pznm_kzztentry");
+        entrys.clear();
+        for(Map mapEntry : mapEntrys){
+            DynamicObject newEntry = new DynamicObject(entrys.getDynamicObjectType());
+            //所属组织
+            setDynamicField(true,"pznm_kzztet_org_number","pznm_kzztet_org","bos_org",
+                    mapEntry,resultData,newEntry);
+            //公司级状态
+            setTextField(true,"pznm_companystatus","pznm_companystatus",mapEntry,resultData,newEntry);
+            //开票需求
+            setDynamicField(false,"pznm_invoicdemand_number","pznm_invoicdemand","pznm_invoicdemand",
+                    mapEntry,resultData,newEntry);
+            //月结开票日
+            setTextField(false,"pznm_invoicday","pznm_invoicday",mapEntry,resultData,newEntry);
+
+            entrys.add(newEntry);
+        }
+    }
+
+    /* 校验并设置F7字段
+     * @key 入参校验字段
+     * @fieldName 写入客户对象的字段名
+     * @entityNumber 字段对应基础资料实体名
+     * @param 接口入参对象
+     * @resultData 返回报文对象
+     * @customerObj 客户对象
+     */
+    private void setDynamicField(Boolean isMust,String key,String fieldName, String entityNumber, Map param, Map resultData, DynamicObject customerObj) {
+        if(param.get(key)==null || "".equals(param.get(key))){
+            if(isMust){
+                String errors = resultData.get("errors")!=null?resultData.get("errors").toString()+";":"";
+                resultData.put("errors",errors+"参数【" + key + "】必填");
+            }
+        }else{
+            QFilter qFilter_number = new QFilter("number",QCP.equals,param.get(key));
+            QFilter qFilter_enable = new QFilter("enable", QCP.equals,"1");
+            QFilter qFilter_status = new QFilter("status", QCP.equals, "C");
+            DynamicObject objCol = BusinessDataServiceHelper.loadSingleFromCache(entityNumber,"id,number,name",
+                    new QFilter[]{qFilter_number,qFilter_enable,qFilter_status});
+            if(objCol!=null){
+                customerObj.set(fieldName,objCol);
+            }else{
+                String errors = resultData.get("errors")!=null?resultData.get("errors").toString()+";":"";
+                resultData.put("errors",errors+"参数【" + key + "】值【"+param.get(key)+"】匹配不成功,可能的原因是:1、编码不正确 2、不符合基础资料字段查询条件");
+            }
+        }
+    }
+
+    /* 校验并设置文本字段
+     * @key 入参校验字段
+     * @fieldName 写入客户对象的字段名
+     * @param 接口入参对象
+     * @resultData 返回报文对象
+     * @customerObj 客户对象
+     */
+    private void setTextField(Boolean isMust,String key,String fieldName,Map param, Map resultData, DynamicObject customerObj) {
+        if(param.get(key)==null || "".equals(param.get(key))){
+            if(isMust){
+                String errors = resultData.get("errors")!=null?resultData.get("errors").toString()+";":"";
+                resultData.put("errors",errors+"参数【" + key + "】必填");
+            }
+        }else{
+            customerObj.set(fieldName,param.get(key));
+        }
+    }
+
+    /* 校验并设置日期字段
+     * @key 入参校验字段
+     * @fieldName 写入客户对象的字段名
+     * @param 接口入参对象
+     * @resultData 返回报文对象
+     * @customerObj 客户对象
+     */
+    private void setDateField(Boolean isMust,String key,String fieldName,Map param, Map resultData, DynamicObject customerObj) throws ParseException {
+        if(param.get(key)==null || "".equals(param.get(key))){
+            if(isMust){
+                String errors = resultData.get("errors")!=null?resultData.get("errors").toString()+";":"";
+                resultData.put("errors",errors+"参数【" + key + "】必填");
+            }
+        }else{
+            customerObj.set(fieldName,new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(param.get(key).toString()));
+        }
+    }
+
+    private String doFP(DynamicObject customerObj) {
+        SaveServiceHelper.update(customerObj);
+        String error = "";
+        Map isHaveOrgIds = getIsHaveOrgIds(customerObj.getPkValue());
+
+        DynamicObjectCollection kzztentrys = customerObj.getDynamicObjectCollection("pznm_kzztentry");
+        Set<Long> orgIds = new HashSet(kzztentrys.size());
+        List<Long> orgIds_list = new ArrayList<Long>();
+        for(DynamicObject kzztentry : kzztentrys){
+            DynamicObject org = kzztentry.getDynamicObject("pznm_kzztet_org");
+            if(isHaveOrgIds.get(org.getString("id"))==null || "".equals(isHaveOrgIds.get(org.getString("id")))){
+                orgIds_list.add(org.getLong("id"));
+            }
+        }
+        orgIds = new HashSet<>(orgIds_list);
+        if(orgIds.size()>0){
+            AppInfo appInfo = AppMetadataCache.getAppInfo("basedata");
+            String appId = appInfo.getAppId();
+            Set<Long> dataIds = new HashSet<Long>();
+            dataIds.add(customerObj.getLong("id"));
+            QFilter qFilter_number = new QFilter("number", QCP.equals,"1");
+            DynamicObject useOrg = BusinessDataServiceHelper.loadSingle("bos_adminorg","id",new QFilter[]{qFilter_number});
+            long useOrgId = useOrg.getLong("id");
+            BaseDataResponse response = (new AssignService("bd_customer").assign(useOrgId, appId, dataIds, orgIds, true));
+            if (!response.isSuccess()) {
+                error = response.getErrorMsg();
+            }
+        }
+
+        return error;
+    }
+
+    private Map getIsHaveOrgIds(Object pkValue) {
+        Map isHaveOrgIds = new HashMap();
+        String sql = "SELECT fuseorgid FROM T_BD_CUSTOMER_U WHERE FDATAID="+pkValue;
+        DataSet ds = DB.queryDataSet(this.getClass().getName(), DBRoute.of("sys"), sql);
+        for (Row row : ds) {
+            String orgId = row.getString("fuseorgid");
+            isHaveOrgIds.put(orgId,orgId);
+        }
+        return isHaveOrgIds;
+    }
+}

+ 121 - 0
bamp/basedata/webapi/MaterialSFHZQueryWebApiPlugin.java

@@ -0,0 +1,121 @@
+package bamp.basedata.webapi;
+
+import kd.bos.algo.DataSet;
+import kd.bos.algo.Row;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.openapi.common.custom.annotation.ApiController;
+import kd.bos.openapi.common.custom.annotation.ApiMapping;
+import kd.bos.openapi.common.custom.annotation.ApiParam;
+import kd.bos.openapi.common.custom.annotation.ApiPostMapping;
+import kd.bos.openapi.common.result.CustomApiResult;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.scmc.im.report.algox.util.ImReportQueryHelper;
+import kd.scmc.im.report.algox.util.ReqParam;
+
+import java.io.Serializable;
+import java.util.*;
+
+/*
+ * 客户新增插件
+ * wangj 2025-01-15
+ * 主要功能:新增主数据客户并分配组织
+ */
+@SuppressWarnings("all")
+@ApiController(value = "open", desc = "报表查询接口插件")
+@ApiMapping(value = "/report")
+public class MaterialSFHZQueryWebApiPlugin implements Serializable {
+    private static final Log log = LogFactory.getLog(MaterialSFHZQueryWebApiPlugin.class);
+    int successCount = 0;
+    int failCount = 0;
+    @ApiPostMapping(value = "materialInvInfo_query", desc = "同步接口")
+    public CustomApiResult<Map<String, Object>> materialInvInfo_query(@ApiParam(value = "提交参数") List<Map<String, Object>> data ) {
+        CustomApiResult customApiResult = new CustomApiResult();
+        customApiResult.setStatus(true);
+        customApiResult.setErrorCode("0");
+        try {
+            Map resultDatasMap = new HashMap();
+            List<Map> resultDatas = new ArrayList<Map>();
+            for(Map param : data){
+                Map resultData = new HashMap();
+                try {
+                    doQuery(param,resultData);
+                }catch (Exception e) {
+                    resultData.put("id","");
+                    resultData.put("errors",e.getMessage());
+                    resultData.put("billStatus","false");
+                    failCount ++;
+                }
+                resultDatas.add(resultData);
+            }
+            resultDatasMap.put("failCount",failCount);
+            resultDatasMap.put("successCount",successCount);
+            resultDatasMap.put("result",resultDatas);
+            customApiResult.setData(resultDatasMap);
+        } catch (Exception e) {
+            customApiResult.setStatus(false);
+            customApiResult.setMessage(e.getMessage());
+            customApiResult.setErrorCode("400");
+        }
+
+        return customApiResult;
+    }
+
+    private void doQuery(Map param, Map resultData) {
+
+        String errorInfo = "";
+        ReqParam params = new ReqParam();
+        List<Long> orgIds = new ArrayList();
+        if(param.get("invorg")!=null && !"".equals(param.get("invorg"))){
+            List<String> orgNumbers = new ArrayList();
+            String[] invorg = param.get("invorg").toString().split(",");
+            for(String orgNumber : invorg){
+                orgNumbers.add(orgNumber);
+            }
+            QFilter qFilter_number = new QFilter("number", QCP.in, orgNumbers);
+            DynamicObject[] orgCol = BusinessDataServiceHelper.load("bos_org", "id", new QFilter[]{qFilter_number});
+            for(DynamicObject org : orgCol){
+                orgIds.add(org.getLong("id"));
+            }
+
+            if(orgIds.size()>0){
+                params.setOrgIds(orgIds);
+            }
+        }else{
+            errorInfo = "组织不能为空;";
+        }
+
+        String beginDate = "";
+        if(param.get("beginDate")!=null){
+            beginDate = param.get("beginDate").toString();
+            params.setBeginDate(param.get("beginDate").toString());
+        }else{
+            errorInfo = errorInfo + "查询起始日期不能为空;";
+        }
+
+        String endDate = "";
+        if(param.get("endDate")!=null){
+            endDate = param.get("endDate").toString();
+            params.setEndDate(param.get("endDate").toString());
+        }else{
+            errorInfo = errorInfo + "查询结束日期不能为空;";
+        }
+
+//        if(param.get("groupstandard")!=null){
+//
+//        }else{
+//            errorInfo = errorInfo + "物料分类标准不能为空;";
+//        }
+
+//        params.setqFilter();
+
+        DataSet dataSet = ImReportQueryHelper.query(params);
+        while (dataSet.hasNext()) {
+            Row row = dataSet.next();
+            log.info(row.toString());
+        }
+    }
+}

+ 572 - 0
bamp/basedata/webapi/SupplierAddnewWebApiPlugin.java

@@ -0,0 +1,572 @@
+package bamp.basedata.webapi;
+
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.operate.result.OperateErrorInfo;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.validate.ValidateResult;
+import kd.bos.entity.validate.ValidateResultCollection;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.openapi.common.custom.annotation.ApiController;
+import kd.bos.openapi.common.custom.annotation.ApiMapping;
+import kd.bos.openapi.common.custom.annotation.ApiParam;
+import kd.bos.openapi.common.custom.annotation.ApiPostMapping;
+import kd.bos.openapi.common.result.CustomApiResult;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+
+import java.io.Serializable;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/*
+ * 供应商新增插件
+ * wangj 2025-02-05
+ * 主要功能:新增主数据供应商
+ */
+@SuppressWarnings("all")
+@ApiController(value = "open", desc = "供应商新增接口插件")
+@ApiMapping(value = "/bd_supplier")
+public class SupplierAddnewWebApiPlugin implements Serializable {
+    int successCount = 0;
+    int failCount = 0;
+    private static final Log log = LogFactory.getLog(SupplierAddnewWebApiPlugin.class);
+    @ApiPostMapping(value = "supplier_addnew", desc = "同步接口")
+    public CustomApiResult<Map<String, Object>> supplier_addnew(@ApiParam(value = "提交参数") List<Map<String, Object>> data ) {
+        CustomApiResult customApiResult = new CustomApiResult();
+        customApiResult.setStatus(true);
+        customApiResult.setErrorCode("0");
+        try {
+            Map resultDatasMap = new HashMap();
+            List<Map> resultDatas = new ArrayList<Map>();
+            for(Map param : data){
+                Map resultData = new HashMap();
+                try {
+                    doUpdateSupplier(param,resultData);
+                }catch (Exception e) {
+                    resultData.put("id","");
+                    resultData.put("errors",e.getMessage());
+                    resultData.put("billStatus",false);
+                    failCount ++;
+                }
+                resultDatas.add(resultData);
+            }
+            resultDatasMap.put("failCount",failCount);
+            if(failCount>0){
+                customApiResult.setStatus(false);
+                customApiResult.setErrorCode("603");
+            }
+            resultDatasMap.put("successCount",successCount);
+            resultDatasMap.put("result",resultDatas);
+            customApiResult.setData(resultDatasMap);
+        } catch (Exception e) {
+            customApiResult.setStatus(false);
+            customApiResult.setMessage(e.getMessage());
+            customApiResult.setErrorCode("400");
+        }
+
+        return customApiResult;
+    }
+
+    private void doUpdateSupplier(Map param, Map resultData) throws ParseException {
+        String errorMsg = "";
+        //创建新用户
+        DynamicObject supplierObj = null;
+        if(param.get("number")!=null){
+            QFilter qFilter_number = new QFilter("number", QCP.equals,param.get("number"));
+            DynamicObject[] customer = BusinessDataServiceHelper.load("bd_supplier","id",new QFilter[]{qFilter_number});
+            if(customer.length>0){//防止新增失败情况留存的历史数据
+                supplierObj = BusinessDataServiceHelper.loadSingle(customer[0].getPkValue(),"bd_supplier");
+                if(param.get("enable")!=null && !"".equals(param.get("enable")) && "0".equals(param.get("enable"))){//使用状态变为禁用
+                    //禁用人
+                    setDynamicField(true,"modifier_number","disabler","bos_user",param,resultData,supplierObj);
+                    //禁用时间
+                    setDateField(true,"modifytime","disabledate",param,resultData,supplierObj);
+                    //使用状态
+                    supplierObj.set("enable","0");
+                }
+                //更新供应商子码基础资料
+                if(param.get("pznm_zmentry")!=null){
+                    List<Map> mapEntrys = (List<Map>) param.get("pznm_zmentry");
+                    doSetEntry(mapEntrys,resultData,supplierObj);
+                }
+            }else{
+                supplierObj = BusinessDataServiceHelper.newDynamicObject("bd_supplier");
+                //数据状态
+                supplierObj.set("status","A");
+                //使用状态
+                supplierObj.set("enable","1");
+            }
+            resultData.put("number",param.get("number"));
+        }
+
+        //供应商编码
+        setTextField(true,"number","number",param,resultData,supplierObj);
+        //供应商名称
+        setTextField(true,"name","name",param,resultData,supplierObj);
+        //创建人
+        setDynamicField(true,"creator_number","creator","bos_user",param,resultData,supplierObj);
+        //创建时间
+        setDateField(true,"createtime","createtime",param,resultData,supplierObj);
+        //修改人
+        setDynamicField(true,"modifier_number","pznm_modifier_xh","bos_user",param,resultData,supplierObj);
+        //修改时间
+        setDateField(true,"modifytime","modifytime",param,resultData,supplierObj);
+        //审核人
+        setDynamicField(true,"approverid_number","pznm_auditor_xh","bos_user",param,resultData,supplierObj);
+        //审核日期
+        setDateField(true,"approvedate","approvedate",param,resultData,supplierObj);
+        //创建组织
+        setDynamicField(true,"createorg_number","createorg","bos_org",param,resultData,supplierObj);
+        //控制策略
+        setTextField(true,"ctrlstrategy","ctrlstrategy",param,resultData,supplierObj);
+        //详细地址
+        setTextField(false,"bizpartner_address","bizpartner_address",param,resultData,supplierObj);
+        //统一社会信用代码
+        setTextField(false,"societycreditcode","societycreditcode",param,resultData,supplierObj);
+        //是否关联单位
+        setTextField(false,"pznm_isrelateunit","pznm_isrelateunit",param,resultData,supplierObj);
+        //内部业务单元
+        setDynamicField(false,"internal_company_number","internal_company","bos_org",param,resultData,supplierObj);
+        //是否内部单位
+        setTextField(false,"chkisinternalcompany","chkisinternalcompany",param,resultData,supplierObj);
+        //供应商分类
+        if(param.get("entry_groupstandard")!=null){
+            List<Map> mapEntrys = (List<Map>) param.get("entry_groupstandard");
+            doSetGroupEntry(mapEntrys,resultData,supplierObj);
+        }
+        //银行信息
+        if(param.get("entry_bank")!=null){
+            List<Map> mapEntrys = (List<Map>) param.get("entry_bank");
+            doSetBankEntry(mapEntrys,resultData,supplierObj);
+        }
+        //委托人分录
+        if(param.get("pznm_wtrentry")!=null){
+            List<Map> mapEntrys = (List<Map>) param.get("pznm_wtrentry");
+            doSetWtrEntry(mapEntrys,resultData,supplierObj);
+        }
+        //控制状态分录
+        if(param.get("pznm_kzztentry")!=null){
+            List<Map> mapEntrys = (List<Map>) param.get("pznm_kzztentry");
+            doSetKzztentry(mapEntrys,resultData,supplierObj);
+        }
+
+        if(resultData.get("errors")!=null && !"".equals(resultData.get("errors"))){
+            List errors = new ArrayList();
+            errors.add(resultData.get("errors"));
+            resultData.put("id","");
+            resultData.put("errors",errors);
+            resultData.put("billStatus",false);
+        }else{
+            //保存供应商对象
+            String status = supplierObj.getString("status");
+            if("A".equals(status)){//暂存,走正常逻辑
+                doAddNew(resultData,supplierObj,param);
+            }else if("B".equals(status)){//已提交,走update和审核
+                doUpdateAndAudit(resultData,supplierObj);
+            }else if("C".equals(status)){//已审核,走修改逻辑
+                doUpdate(resultData,supplierObj);
+            }
+        }
+    }
+
+    private void doUpdate(Map resultData, DynamicObject supplierObj) {
+        SaveServiceHelper.update(supplierObj);
+        resultData.put("errors",new ArrayList());
+        resultData.put("id",supplierObj.getPkValue());
+        resultData.put("billStatus", true);
+        successCount++;
+    }
+
+    private void doUpdateAndAudit(Map resultData, DynamicObject supplierObj) {
+        SaveServiceHelper.update(supplierObj);
+        OperationResult result_audit = OperationServiceHelper.executeOperate("audit", "bd_supplier",
+                new DynamicObject[]{supplierObj}, OperateOption.create());
+        //执行供应商对应组织分配
+        if(result_audit.isSuccess()){//保存供应商成功
+            resultData.put("errors",new ArrayList());
+            resultData.put("id",result_audit.getSuccessPkIds().get(0));
+            resultData.put("billStatus", true);
+            successCount++;
+        }else{//提交供应商失败
+            List errors = new ArrayList();
+            ValidateResultCollection validateResults = result_audit.getValidateResult();
+            List<ValidateResult> validateResultList = validateResults.getValidateErrors();
+            for(ValidateResult validateResult : validateResultList){
+                List<OperateErrorInfo> allErrorInfos = validateResult.getAllErrorInfo();
+                for(OperateErrorInfo allErrorInfo : allErrorInfos){
+                    errors.add(allErrorInfo.getMessage());
+                }
+            }
+            resultData.put("errors",errors);
+            resultData.put("id","");
+            resultData.put("billStatus", false);
+            failCount ++;
+        }
+    }
+
+    private void doAddNew(Map resultData, DynamicObject supplierObj, Map param) {
+        OperationResult result_submit = OperationServiceHelper.executeOperate("submit", "bd_supplier",
+                new DynamicObject[]{supplierObj}, OperateOption.create());
+        if(result_submit.isSuccess()){
+            OperationResult result_audit = OperationServiceHelper.executeOperate("audit", "bd_supplier",
+                    new DynamicObject[]{supplierObj}, OperateOption.create());
+            //执行供应商对应组织分配
+            if(result_audit.isSuccess()){//保存供应商成功
+                //更新供应商子码基础资料
+                if(param.get("pznm_zmentry")!=null){
+                    List<Map> mapEntrys = (List<Map>) param.get("pznm_zmentry");
+                    doSetEntry(mapEntrys,resultData,supplierObj);
+                }
+
+                if(resultData.get("errors")!=null && !"".equals(resultData.get("errors"))){
+                    List errors = new ArrayList();
+                    errors.add(resultData.get("errors"));
+                    resultData.put("errors",errors);
+                    resultData.put("id","");
+                    resultData.put("billStatus", false);
+                    failCount ++;
+                }else{
+                    resultData.put("errors",new ArrayList());
+                    resultData.put("id",result_audit.getSuccessPkIds().get(0));
+                    resultData.put("billStatus", true);
+                    successCount++;
+                }
+            }else{//提交供应商失败
+                List errors = new ArrayList();
+                ValidateResultCollection validateResults = result_audit.getValidateResult();
+                List<ValidateResult> validateResultList = validateResults.getValidateErrors();
+                for(ValidateResult validateResult : validateResultList){
+                    List<OperateErrorInfo> allErrorInfos = validateResult.getAllErrorInfo();
+                    for(OperateErrorInfo allErrorInfo : allErrorInfos){
+                        errors.add(allErrorInfo.getMessage());
+                    }
+                }
+                resultData.put("errors",errors);
+                resultData.put("id","");
+                resultData.put("billStatus", false);
+                failCount ++;
+            }
+        }else{
+            List errors = new ArrayList();
+            ValidateResultCollection validateResults = result_submit.getValidateResult();
+            List<ValidateResult> validateResultList = validateResults.getValidateErrors();
+            for(ValidateResult validateResult : validateResultList){
+                List<OperateErrorInfo> allErrorInfos = validateResult.getAllErrorInfo();
+                for(OperateErrorInfo allErrorInfo : allErrorInfos){
+                    errors.add(allErrorInfo.getMessage());
+                }
+            }
+            resultData.put("errors",errors);
+            resultData.put("id","");
+            resultData.put("billStatus", false);
+            failCount ++;
+        }
+    }
+
+    private void doSetGroupEntry(List<Map> mapEntrys, Map resultData, DynamicObject supplierObj) {
+        DynamicObjectCollection entrys = supplierObj.getDynamicObjectCollection("entry_groupstandard");
+        entrys.clear();
+        for(Map mapEntry : mapEntrys) {
+            DynamicObject newEntry = new DynamicObject(entrys.getDynamicObjectType());
+            //分类标准.编码
+            setDynamicField(true, "standardid_number", "standardid", "bd_suppliergroupstandard",
+                    mapEntry, resultData, newEntry);
+            //分类.编码
+            setDynamicField(false,"groupid_number","groupid","bd_suppliergroup",
+                    mapEntry,resultData,newEntry);
+            entrys.add(newEntry);
+        }
+    }
+
+    private void doSetBankEntry(List<Map> mapEntrys, Map resultData, DynamicObject supplierObj) {
+        DynamicObjectCollection entrys = supplierObj.getDynamicObjectCollection("entry_bank");
+        entrys.clear();
+        for(Map mapEntry : mapEntrys) {
+            DynamicObject newEntry = new DynamicObject(entrys.getDynamicObjectType());
+            //所属组织
+            setDynamicField(true, "pznm_bket_org_number", "pznm_bket_org", "bos_org",
+                    mapEntry, resultData, newEntry);
+            //银行账号
+            setTextField(true, "bankaccount", "bankaccount", mapEntry, resultData, newEntry);
+            //账户名称
+            setTextField(true, "accountname", "accountname", mapEntry, resultData, newEntry);
+            //开户银行
+            setDynamicField(true,"bank_number","bank","bd_bebank",
+                    mapEntry,resultData,newEntry);
+            //币别
+            setDynamicField(true,"currency_number","currency","bd_currency",
+                    mapEntry,resultData,newEntry);
+            //默认
+            setTextField(true, "isdefault_bank", "isdefault_bank", mapEntry, resultData, newEntry);
+            //账户性质
+            setTextField(false, "pznm_bket_account", "pznm_bket_account", mapEntry, resultData, newEntry);
+            entrys.add(newEntry);
+        }
+    }
+
+    private void doSetEntry(List<Map> mapEntrys, Map resultData, DynamicObject supplierObj) {
+        //拼接组织+字码编码的过滤条件
+        List<String> zmnumbers = new ArrayList<String>();
+        List<String> orgnumbers = new ArrayList<String>();
+        for(Map mapEntry : mapEntrys){
+            zmnumbers.add(mapEntry.get("pznm_zmet_number").toString());
+            orgnumbers.add(mapEntry.get("pznm_zmet_org_number").toString());
+        }
+
+        //查询过滤条件,缓存存在的字码Map记录
+        Map isHaveOrgs_zmnumber = new HashMap();
+        QFilter qFilter_customer = new QFilter("pznm_supplier",QCP.equals,supplierObj.getPkValue());
+        QFilter qFilter_org = new QFilter("pznm_zmet_org.number",QCP.in,orgnumbers);
+        QFilter qFilter_ztnumber = new QFilter("number",QCP.in,zmnumbers);
+        DynamicObject[] isHaveObjs = BusinessDataServiceHelper.load("pznm_supplierzm",
+                "id,pznm_zmet_org,pznm_zmet_org.number,pznm_zmet_number,pznm_zmet_name,pznm_zmet_oldnumber,pznm_zmet_wtr,pznm_zmet_wtrphone," +
+                        "pznm_zmet_lxr,pznm_zmet_lxrphone,pznm_zmet_cgper,pznm_zmet_setttype," +
+                        "pznm_zmet_zqnotes,pznm_zmet_settday,pznm_zmet_zqrtype,pznm_zmet_zqptype,pznm_zmet_paytype,pznm_zmet_invoicetype",
+                new QFilter[]{qFilter_customer,qFilter_org,qFilter_ztnumber});
+        for(DynamicObject obj : isHaveObjs){
+            DynamicObject org =  (DynamicObject) obj.getDynamicObject("pznm_zmet_org");
+            String org_zmnumber = org.getString("number")+"_"+obj.getString("number");
+            isHaveOrgs_zmnumber.put(org_zmnumber,obj);
+        }
+
+        //区分并拼接需更新和新增的记录
+        DynamicObjectCollection add_entrys = new DynamicObjectCollection();
+        DynamicObjectCollection update_entrys = new DynamicObjectCollection();
+        for(Map mapEntry : mapEntrys){
+            String org_zmnumber = mapEntry.get("pznm_zmet_org_number").toString()+"_"+mapEntry.get("pznm_zmet_number").toString();
+            if(isHaveOrgs_zmnumber.get(org_zmnumber)!=null && !"".equals(isHaveOrgs_zmnumber.get(org_zmnumber))){
+                //已存在,缓存修改对象
+                DynamicObject update_entry = (DynamicObject) isHaveOrgs_zmnumber.get(org_zmnumber);
+
+                setDynamicField(true,"pznm_zmet_org_number","pznm_zmet_org","bos_org",
+                        mapEntry,resultData,update_entry);
+                //供应商子码.子码编码
+                setTextField(true,"pznm_zmet_number","number",mapEntry,resultData,update_entry);
+                //供应商子码.子码名称
+                setTextField(true,"pznm_zmet_name","name",mapEntry,resultData,update_entry);
+                //供应商子码.老系统编号
+                setTextField(false,"pznm_zmet_oldnumber","pznm_zmet_oldnumber",mapEntry,resultData,update_entry);
+                //委托人.编码
+                setDynamicField(false,"pznm_zmet_wtr_number","pznm_zmet_wtr","pznm_outcontacts",
+                        mapEntry,resultData,update_entry);
+                //委托人信息.委托人电话
+                setTextField(false,"pznm_zmet_wtrphone","pznm_zmet_wtrphone",mapEntry,resultData,update_entry);
+                //联系人.编码
+                setDynamicField(false,"pznm_zmet_lxr_number","pznm_zmet_lxr","pznm_outcontacts",
+                        mapEntry,resultData,update_entry);
+                //供应商子码.联系人电话
+                setTextField(false,"pznm_zmet_lxrphone","pznm_zmet_lxrphone",mapEntry,resultData,update_entry);
+                //供应商子码.采购负责人.工号
+                setDynamicField(false,"pznm_zmet_cgper_number","pznm_zmet_cgper","bos_user",
+                        mapEntry,resultData,update_entry);
+                //结算类型.编码
+                setDynamicField(false,"pznm_zmet_setttype_number","pznm_zmet_setttype","pznm_settlementtype",
+                        mapEntry,resultData,update_entry);
+                //供应商子码.账期摘要
+                setTextField(false,"pznm_zmet_zqnotes","pznm_zmet_zqnotes",mapEntry,resultData,update_entry);
+                //供应商子码.实销实结结算日
+                setTextField(false,"pznm_zmet_settday","pznm_zmet_settday",mapEntry,resultData,update_entry);
+                //账期类型(收款).编码
+                setDynamicField(false,"pznm_zmet_zqrtype_number","pznm_zmet_zqrtype","bd_reccondition",
+                        mapEntry,resultData,update_entry);
+                //账期类型(付款).编码
+                setDynamicField(false,"pznm_zmet_zqptype_number","pznm_zmet_zqptype","bd_paycondition",
+                        mapEntry,resultData,update_entry);
+                //支付方式.编码
+                setDynamicField(false,"pznm_zmet_paytype_number","pznm_zmet_paytype","bd_settlementtype",
+                        mapEntry,resultData,update_entry);
+                //发票类型.编码
+                setDynamicField(false,"pznm_zmet_invoicetype_number","pznm_zmet_invoicetype","bd_invoicetype",
+                        mapEntry,resultData,update_entry);
+                update_entrys.add(update_entry);
+            }else{
+                //不存在,缓存新增对象
+                DynamicObject add_entry = BusinessDataServiceHelper.newDynamicObject("pznm_supplierzm");
+
+                setDynamicField(true,"pznm_zmet_org_number","pznm_zmet_org","bos_org",
+                        mapEntry,resultData,add_entry);
+                //供应商子码.子码编码
+                setTextField(true,"pznm_zmet_number","number",mapEntry,resultData,add_entry);
+                //供应商子码.子码名称
+                setTextField(true,"pznm_zmet_name","name",mapEntry,resultData,add_entry);
+                //供应商子码.老系统编号
+                setTextField(false,"pznm_zmet_oldnumber","pznm_zmet_oldnumber",mapEntry,resultData,add_entry);
+                //委托人.编码
+                setDynamicField(false,"pznm_zmet_wtr_number","pznm_zmet_wtr","pznm_outcontacts",
+                        mapEntry,resultData,add_entry);
+                //委托人信息.委托人电话
+                setTextField(false,"pznm_zmet_wtrphone","pznm_zmet_wtrphone",mapEntry,resultData,add_entry);
+                //联系人.编码
+                setDynamicField(false,"pznm_zmet_lxr_number","pznm_zmet_lxr","pznm_outcontacts",
+                        mapEntry,resultData,add_entry);
+                //供应商子码.联系人电话
+                setTextField(false,"pznm_zmet_lxrphone","pznm_zmet_lxrphone",mapEntry,resultData,add_entry);
+                //供应商子码.采购负责人.工号
+                setDynamicField(false,"pznm_zmet_cgper_number","pznm_zmet_cgper","bos_user",
+                        mapEntry,resultData,add_entry);
+                //结算类型.编码
+                setDynamicField(false,"pznm_zmet_setttype_number","pznm_zmet_setttype","pznm_settlementtype",
+                        mapEntry,resultData,add_entry);
+                //客户子码.账期摘要
+                setTextField(false,"pznm_zmet_zqnotes","pznm_zmet_zqnotes",mapEntry,resultData,add_entry);
+                //客户子码.实销实结结算日
+                setTextField(false,"pznm_zmet_settday","pznm_zmet_settday",mapEntry,resultData,add_entry);
+                //账期类型(收款).编码
+                setDynamicField(false,"pznm_zmet_zqrtype_number","pznm_zmet_zqrtype","bd_reccondition",
+                        mapEntry,resultData,add_entry);
+                //账期类型(付款).编码
+                setDynamicField(false,"pznm_zmet_zqptype_number","pznm_zmet_zqptype","bd_paycondition",
+                        mapEntry,resultData,add_entry);
+                //支付方式.编码
+                setDynamicField(false,"pznm_zmet_paytype_number","pznm_zmet_paytype","bd_settlementtype",
+                        mapEntry,resultData,add_entry);
+                //发票类型.编码
+                setDynamicField(false,"pznm_zmet_invoicetype_number","pznm_zmet_invoicetype","bd_invoicetype",
+                        mapEntry,resultData,add_entry);
+                //供应商
+                add_entry.set("pznm_supplier",supplierObj);
+                //数据状态
+                add_entry.set("status","A");
+                //使用状态
+                add_entry.set("enable","1");
+                add_entrys.add(add_entry);
+            }
+        }
+
+        DynamicObject[] real_update_entrys = new DynamicObject[update_entrys.size()];
+        for(int i=0;i< update_entrys.size();i++){
+            real_update_entrys[i] = update_entrys.get(i);
+        }
+
+        DynamicObject[] real_add_entrys = new DynamicObject[add_entrys.size()];
+        for(int i=0;i< add_entrys.size();i++){
+            real_add_entrys[i] = add_entrys.get(i);
+        }
+
+        if(resultData.get("errors")==null || "".equals(resultData.get("errors"))) {
+            //执行更新
+            if (real_update_entrys.length > 0) {
+                SaveServiceHelper.update(real_update_entrys);
+            }
+            //执行新增
+            if (real_add_entrys.length > 0) {
+                OperationResult result_submit = OperationServiceHelper.executeOperate("submit", "pznm_supplierzm",
+                        real_add_entrys, OperateOption.create());
+                if (result_submit.isSuccess() == true) {
+                    OperationResult result_audit = OperationServiceHelper.executeOperate("audit", "pznm_supplierzm",
+                            real_add_entrys, OperateOption.create());
+                    if (result_audit.isSuccess() == false) {
+                        resultData.put("errors", "子码审核失败");
+                    }
+                } else {
+                    resultData.put("errors", "子码创建失败");
+                }
+            }
+        }
+    }
+
+    private void doSetWtrEntry(List<Map> mapEntrys, Map resultData, DynamicObject supplierObj) {
+        DynamicObjectCollection entrys = supplierObj.getDynamicObjectCollection("pznm_wtrentry");
+        entrys.clear();
+        for(Map mapEntry : mapEntrys){
+            DynamicObject newEntry = new DynamicObject(entrys.getDynamicObjectType());
+            //所属组织
+            setDynamicField(true,"pznm_wtret_org_number","pznm_wtret_org","bos_org",
+                    mapEntry,resultData,newEntry);
+            //委托人信息.委托人电话
+            setTextField(false,"pznm_wtret_userphone","pznm_wtret_userphone",mapEntry,resultData,newEntry);
+            //委托人.编码
+            setDynamicField(true,"pznm_wtret_user_number","pznm_wtret_user","pznm_outcontacts",
+                    mapEntry,resultData,newEntry);
+            entrys.add(newEntry);
+        }
+    }
+
+    private void doSetKzztentry(List<Map> mapEntrys, Map resultData, DynamicObject supplierObj) {
+        DynamicObjectCollection entrys = supplierObj.getDynamicObjectCollection("pznm_kzztentry");
+        entrys.clear();
+        for(Map mapEntry : mapEntrys){
+            DynamicObject newEntry = new DynamicObject(entrys.getDynamicObjectType());
+            //所属组织
+            setDynamicField(true,"pznm_kzztet_org_number","pznm_kzztet_org","bos_org",
+                    mapEntry,resultData,newEntry);
+            //公司级状态
+            setTextField(true,"pznm_companystatus","pznm_companystatus",mapEntry,resultData,newEntry);
+
+            entrys.add(newEntry);
+        }
+    }
+
+    /* 校验并设置F7字段
+     * @key 入参校验字段
+     * @fieldName 写入供应商对象的字段名
+     * @entityNumber 字段对应基础资料实体名
+     * @param 接口入参对象
+     * @resultData 返回报文对象
+     * @supplierObj 供应商对象
+     */
+    private void setDynamicField(Boolean isMust,String key,String fieldName, String entityNumber, Map param, Map resultData, DynamicObject supplierObj) {
+        if(param.get(key)==null || "".equals(param.get(key))){
+            if(isMust){
+                String errors = resultData.get("errors")!=null?resultData.get("errors").toString()+";":"";
+                resultData.put("errors",errors+"参数【" + key + "】必填");
+            }
+        }else{
+            QFilter qFilter_number = new QFilter("number",QCP.equals,param.get(key));
+            QFilter qFilter_enable = new QFilter("enable", QCP.equals,"1");
+            QFilter qFilter_status = new QFilter("status", QCP.equals, "C");
+            DynamicObject objCol = BusinessDataServiceHelper.loadSingleFromCache(entityNumber,"id,number,name",
+                    new QFilter[]{qFilter_number,qFilter_enable,qFilter_status});
+            if(objCol!=null){
+                supplierObj.set(fieldName,objCol);
+            }else{
+                String errors = resultData.get("errors")!=null?resultData.get("errors").toString()+";":"";
+                resultData.put("errors",errors+"参数【" + key + "】值【"+param.get(key)+"】匹配不成功,可能的原因是:1、编码不正确 2、不符合基础资料字段查询条件");
+            }
+        }
+    }
+
+    /* 校验并设置文本字段
+     * @key 入参校验字段
+     * @fieldName 写入供应商对象的字段名
+     * @param 接口入参对象
+     * @resultData 返回报文对象
+     * @supplierObj 供应商对象
+     */
+    private void setTextField(Boolean isMust,String key,String fieldName,Map param, Map resultData, DynamicObject supplierObj) {
+        if(param.get(key)==null || "".equals(param.get(key))){
+            if(isMust){
+                String errors = resultData.get("errors")!=null?resultData.get("errors").toString()+";":"";
+                resultData.put("errors",errors+"参数【" + key + "】必填");
+            }
+        }else{
+            supplierObj.set(fieldName,param.get(key));
+        }
+    }
+
+    /* 校验并设置日期字段
+     * @key 入参校验字段
+     * @fieldName 写入供应商对象的字段名
+     * @param 接口入参对象
+     * @resultData 返回报文对象
+     * @supplierObj 供应商对象
+     */
+    private void setDateField(Boolean isMust,String key,String fieldName,Map param, Map resultData, DynamicObject supplierObj) throws ParseException {
+        if(param.get(key)==null || "".equals(param.get(key))){
+            if(isMust){
+                String errors = resultData.get("errors")!=null?resultData.get("errors").toString()+";":"";
+                resultData.put("errors",errors+"参数【" + key + "】必填");
+            }
+        }else{
+            supplierObj.set(fieldName,new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(param.get(key).toString()));
+        }
+    }
+
+}

+ 567 - 0
bamp/basedata/webapi/SupplierSaveWebApiPlugin.java

@@ -0,0 +1,567 @@
+package bamp.basedata.webapi;
+
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.operate.result.OperateErrorInfo;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.validate.ValidateResult;
+import kd.bos.entity.validate.ValidateResultCollection;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.openapi.common.custom.annotation.ApiController;
+import kd.bos.openapi.common.custom.annotation.ApiMapping;
+import kd.bos.openapi.common.custom.annotation.ApiParam;
+import kd.bos.openapi.common.custom.annotation.ApiPostMapping;
+import kd.bos.openapi.common.result.CustomApiResult;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+
+import java.io.Serializable;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/*
+ * 供应商修改插件
+ * wangj 2025-02-05
+ * 主要功能:修改主数据供应商
+ */
+@SuppressWarnings("all")
+@ApiController(value = "open", desc = "供应商修改接口插件")
+@ApiMapping(value = "/bd_supplier")
+public class SupplierSaveWebApiPlugin implements Serializable {
+    int successCount = 0;
+    int failCount = 0;
+    private static final Log log = LogFactory.getLog(SupplierAddnewWebApiPlugin.class);
+    @ApiPostMapping(value = "supplier_save", desc = "同步接口")
+    public CustomApiResult<Map<String, Object>> supplier_save(@ApiParam(value = "提交参数") List<Map<String, Object>> data ) {
+        CustomApiResult customApiResult = new CustomApiResult();
+        customApiResult.setStatus(true);
+        customApiResult.setErrorCode("0");
+        try {
+            Map resultDatasMap = new HashMap();
+            List<Map> resultDatas = new ArrayList<Map>();
+            for(Map param : data){
+                Map resultData = new HashMap();
+                try {
+                    doUpdateSupplier(param,resultData);
+                }catch (Exception e) {
+                    resultData.put("id","");
+                    resultData.put("errors",e.getMessage());
+                    resultData.put("billStatus",false);
+                    failCount ++;
+                }
+                resultDatas.add(resultData);
+            }
+            resultDatasMap.put("failCount",failCount);
+            resultDatasMap.put("successCount",successCount);
+            if(failCount>0){
+                customApiResult.setStatus(false);
+                customApiResult.setErrorCode("603");
+            }
+            resultDatasMap.put("result",resultDatas);
+            customApiResult.setData(resultDatasMap);
+        } catch (Exception e) {
+            customApiResult.setStatus(false);
+            customApiResult.setMessage(e.getMessage());
+            customApiResult.setErrorCode("400");
+        }
+
+        return customApiResult;
+    }
+
+    private void doUpdateSupplier(Map param, Map resultData) throws ParseException {
+        String errorMsg = "";
+        //创建新用户
+        DynamicObject supplierObj = null;
+        if(param.get("number")!=null){
+            QFilter qFilter_number = new QFilter("number", QCP.equals,param.get("number"));
+            DynamicObject[] customer = BusinessDataServiceHelper.load("bd_supplier","id",new QFilter[]{qFilter_number});
+            if(customer.length>0){//防止新增失败情况留存的历史数据
+                supplierObj = BusinessDataServiceHelper.loadSingle(customer[0].getPkValue(),"bd_supplier");
+                if(param.get("enable")!=null && !"".equals(param.get("enable")) && "0".equals(param.get("enable"))){//使用状态变为禁用
+                    //禁用人
+                    setDynamicField(true,"modifier_number","disabler","bos_user",param,resultData,supplierObj);
+                    //禁用时间
+                    setDateField(true,"modifytime","disabledate",param,resultData,supplierObj);
+                    //使用状态
+                    supplierObj.set("enable","0");
+                }
+                //更新供应商子码基础资料
+                if(param.get("pznm_zmentry")!=null){
+                    List<Map> mapEntrys = (List<Map>) param.get("pznm_zmentry");
+                    doSetEntry(mapEntrys,resultData,supplierObj);
+                }
+            }else{
+                supplierObj = BusinessDataServiceHelper.newDynamicObject("bd_supplier");
+                //数据状态
+                supplierObj.set("status","A");
+            }
+            resultData.put("number",param.get("number"));
+        }
+
+        //供应商编码
+        setTextField(true,"number","number",param,resultData,supplierObj);
+        //供应商名称
+        setTextField(true,"name","name",param,resultData,supplierObj);
+        //修改人
+        setDynamicField(true,"modifier_number","pznm_modifier_xh","bos_user",param,resultData,supplierObj);
+        //修改时间
+        setDateField(true,"modifytime","modifytime",param,resultData,supplierObj);
+        //审核人
+        setDynamicField(true,"approverid_number","pznm_auditor_xh","bos_user",param,resultData,supplierObj);
+        //审核日期
+        setDateField(true,"approvedate","approvedate",param,resultData,supplierObj);
+        //创建组织
+        setDynamicField(true,"createorg_number","createorg","bos_org",param,resultData,supplierObj);
+        //控制策略
+        setTextField(true,"ctrlstrategy","ctrlstrategy",param,resultData,supplierObj);
+        //详细地址
+        setTextField(false,"bizpartner_address","bizpartner_address",param,resultData,supplierObj);
+        //统一社会信用代码
+        setTextField(false,"societycreditcode","societycreditcode",param,resultData,supplierObj);
+        //是否关联单位
+        setTextField(false,"pznm_isrelateunit","pznm_isrelateunit",param,resultData,supplierObj);
+        //内部业务单元
+        setDynamicField(false,"internal_company_number","internal_company","bos_org",param,resultData,supplierObj);
+        //是否内部单位
+        setTextField(false,"chkisinternalcompany","chkisinternalcompany",param,resultData,supplierObj);
+        //供应商分类
+        if(param.get("entry_groupstandard")!=null){
+            List<Map> mapEntrys = (List<Map>) param.get("entry_groupstandard");
+            doSetGroupEntry(mapEntrys,resultData,supplierObj);
+        }
+        //银行信息
+        if(param.get("entry_bank")!=null){
+            List<Map> mapEntrys = (List<Map>) param.get("entry_bank");
+            doSetBankEntry(mapEntrys,resultData,supplierObj);
+        }
+        //委托人分录
+        if(param.get("pznm_wtrentry")!=null){
+            List<Map> mapEntrys = (List<Map>) param.get("pznm_wtrentry");
+            doSetWtrEntry(mapEntrys,resultData,supplierObj);
+        }
+        //控制状态分录
+        if(param.get("pznm_kzztentry")!=null){
+            List<Map> mapEntrys = (List<Map>) param.get("pznm_kzztentry");
+            doSetKzztentry(mapEntrys,resultData,supplierObj);
+        }
+        if(resultData.get("errors")!=null && !"".equals(resultData.get("errors"))){
+            List errors = new ArrayList();
+            errors.add(resultData.get("errors"));
+            resultData.put("id","");
+            resultData.put("errors",errors);
+            resultData.put("billStatus",false);
+        }else{
+            //保存供应商对象
+            String status = supplierObj.getString("status");
+            if("A".equals(status)){//暂存,走正常逻辑
+                doAddNew(resultData,supplierObj,param);
+            }else if("B".equals(status)){//已提交,走update和审核
+                doUpdateAndAudit(resultData,supplierObj);
+            }else if("C".equals(status)){//已审核,走修改逻辑
+                doUpdate(resultData,supplierObj);
+            }
+        }
+    }
+
+    private void doUpdate(Map resultData, DynamicObject supplierObj) {
+        SaveServiceHelper.update(supplierObj);
+        resultData.put("errors",new ArrayList());
+        resultData.put("id",supplierObj.getPkValue());
+        resultData.put("billStatus", true);
+        successCount++;
+    }
+
+    private void doUpdateAndAudit(Map resultData, DynamicObject supplierObj) {
+        SaveServiceHelper.update(supplierObj);
+        OperationResult result_audit = OperationServiceHelper.executeOperate("audit", "bd_supplier",
+                new DynamicObject[]{supplierObj}, OperateOption.create());
+        //执行供应商对应组织分配
+        if(result_audit.isSuccess()){//保存供应商成功
+            resultData.put("errors",new ArrayList());
+            resultData.put("id",result_audit.getSuccessPkIds().get(0));
+            resultData.put("billStatus", true);
+            successCount++;
+        }else{//提交供应商失败
+            List errors = new ArrayList();
+            ValidateResultCollection validateResults = result_audit.getValidateResult();
+            List<ValidateResult> validateResultList = validateResults.getValidateErrors();
+            for(ValidateResult validateResult : validateResultList){
+                List<OperateErrorInfo> allErrorInfos = validateResult.getAllErrorInfo();
+                for(OperateErrorInfo allErrorInfo : allErrorInfos){
+                    errors.add(allErrorInfo.getMessage());
+                }
+            }
+            resultData.put("errors",errors);
+            resultData.put("id","");
+            resultData.put("billStatus", false);
+            failCount ++;
+        }
+    }
+
+    private void doAddNew(Map resultData, DynamicObject supplierObj, Map param) {
+        OperationResult result_submit = OperationServiceHelper.executeOperate("submit", "bd_supplier",
+                new DynamicObject[]{supplierObj}, OperateOption.create());
+        if(result_submit.isSuccess()){
+            OperationResult result_audit = OperationServiceHelper.executeOperate("audit", "bd_supplier",
+                    new DynamicObject[]{supplierObj}, OperateOption.create());
+            //执行供应商对应组织分配
+            if(result_audit.isSuccess()){//保存供应商成功
+                //更新供应商子码基础资料
+                if(param.get("pznm_zmentry")!=null){
+                    List<Map> mapEntrys = (List<Map>) param.get("pznm_zmentry");
+                    doSetEntry(mapEntrys,resultData,supplierObj);
+                }
+
+                if(resultData.get("errors")!=null && !"".equals(resultData.get("errors"))){
+                    List errors = new ArrayList();
+                    errors.add(resultData.get("errors"));
+                    resultData.put("errors",errors);
+                    resultData.put("id","");
+                    resultData.put("billStatus", false);
+                    failCount ++;
+                }else{
+                    resultData.put("errors",new ArrayList());
+                    resultData.put("id",result_audit.getSuccessPkIds().get(0));
+                    resultData.put("billStatus", true);
+                    successCount++;
+                }
+            }else{//提交供应商失败
+                List errors = new ArrayList();
+                ValidateResultCollection validateResults = result_audit.getValidateResult();
+                List<ValidateResult> validateResultList = validateResults.getValidateErrors();
+                for(ValidateResult validateResult : validateResultList){
+                    List<OperateErrorInfo> allErrorInfos = validateResult.getAllErrorInfo();
+                    for(OperateErrorInfo allErrorInfo : allErrorInfos){
+                        errors.add(allErrorInfo.getMessage());
+                    }
+                }
+                resultData.put("errors",errors);
+                resultData.put("id","");
+                resultData.put("billStatus", false);
+                failCount ++;
+            }
+        }else{
+            List errors = new ArrayList();
+            ValidateResultCollection validateResults = result_submit.getValidateResult();
+            List<ValidateResult> validateResultList = validateResults.getValidateErrors();
+            for(ValidateResult validateResult : validateResultList){
+                List<OperateErrorInfo> allErrorInfos = validateResult.getAllErrorInfo();
+                for(OperateErrorInfo allErrorInfo : allErrorInfos){
+                    errors.add(allErrorInfo.getMessage());
+                }
+            }
+            resultData.put("errors",errors);
+            resultData.put("id","");
+            resultData.put("billStatus", false);
+            failCount ++;
+        }
+    }
+
+    private void doSetGroupEntry(List<Map> mapEntrys, Map resultData, DynamicObject supplierObj) {
+        DynamicObjectCollection entrys = supplierObj.getDynamicObjectCollection("entry_groupstandard");
+        entrys.clear();
+        for(Map mapEntry : mapEntrys) {
+            DynamicObject newEntry = new DynamicObject(entrys.getDynamicObjectType());
+            //分类标准.编码
+            setDynamicField(true, "standardid_number", "standardid", "bd_suppliergroupstandard",
+                    mapEntry, resultData, newEntry);
+            //分类.编码
+            setDynamicField(false,"groupid_number","groupid","bd_suppliergroup",
+                    mapEntry,resultData,newEntry);
+            entrys.add(newEntry);
+        }
+    }
+
+    private void doSetBankEntry(List<Map> mapEntrys, Map resultData, DynamicObject supplierObj) {
+        DynamicObjectCollection entrys = supplierObj.getDynamicObjectCollection("entry_bank");
+        entrys.clear();
+        for(Map mapEntry : mapEntrys) {
+            DynamicObject newEntry = new DynamicObject(entrys.getDynamicObjectType());
+            //所属组织
+            setDynamicField(true, "pznm_bket_org_number", "pznm_bket_org", "bos_org",
+                    mapEntry, resultData, newEntry);
+            //银行账号
+            setTextField(true, "bankaccount", "bankaccount", mapEntry, resultData, newEntry);
+            //账户名称
+            setTextField(true, "accountname", "accountname", mapEntry, resultData, newEntry);
+            //开户银行
+            setDynamicField(true,"bank_number","bank","bd_bebank",
+                    mapEntry,resultData,newEntry);
+            //币别
+            setDynamicField(true,"currency_number","currency","bd_currency",
+                    mapEntry,resultData,newEntry);
+            //默认
+            setTextField(true, "isdefault_bank", "isdefault_bank", mapEntry, resultData, newEntry);
+            //账户性质
+            setTextField(false, "pznm_bket_account", "pznm_bket_account", mapEntry, resultData, newEntry);
+            entrys.add(newEntry);
+        }
+    }
+
+    private void doSetEntry(List<Map> mapEntrys, Map resultData, DynamicObject supplierObj) {
+        //拼接组织+字码编码的过滤条件
+        List<String> zmnumbers = new ArrayList<String>();
+        List<String> orgnumbers = new ArrayList<String>();
+        for(Map mapEntry : mapEntrys){
+            zmnumbers.add(mapEntry.get("pznm_zmet_number").toString());
+            orgnumbers.add(mapEntry.get("pznm_zmet_org_number").toString());
+        }
+
+        //查询过滤条件,缓存存在的字码Map记录
+        Map isHaveOrgs_zmnumber = new HashMap();
+        QFilter qFilter_customer = new QFilter("pznm_supplier",QCP.equals,supplierObj.getPkValue());
+        QFilter qFilter_org = new QFilter("pznm_zmet_org.number",QCP.in,orgnumbers);
+        QFilter qFilter_ztnumber = new QFilter("number",QCP.in,zmnumbers);
+        DynamicObject[] isHaveObjs = BusinessDataServiceHelper.load("pznm_supplierzm",
+                "id,pznm_zmet_org,pznm_zmet_org.number,pznm_zmet_number,pznm_zmet_name,pznm_zmet_oldnumber,pznm_zmet_wtr,pznm_zmet_wtrphone," +
+                        "pznm_zmet_lxr,pznm_zmet_lxrphone,pznm_zmet_cgper,pznm_zmet_setttype," +
+                        "pznm_zmet_zqnotes,pznm_zmet_settday,pznm_zmet_zqrtype,pznm_zmet_zqptype,pznm_zmet_paytype,pznm_zmet_invoicetype",
+                new QFilter[]{qFilter_customer,qFilter_org,qFilter_ztnumber});
+        for(DynamicObject obj : isHaveObjs){
+            DynamicObject org =  (DynamicObject) obj.getDynamicObject("pznm_zmet_org");
+            String org_zmnumber = org.getString("number")+"_"+obj.getString("number");
+            isHaveOrgs_zmnumber.put(org_zmnumber,obj);
+        }
+
+        //区分并拼接需更新和新增的记录
+        DynamicObjectCollection add_entrys = new DynamicObjectCollection();
+        DynamicObjectCollection update_entrys = new DynamicObjectCollection();
+        for(Map mapEntry : mapEntrys){
+            String org_zmnumber = mapEntry.get("pznm_zmet_org_number").toString()+"_"+mapEntry.get("pznm_zmet_number").toString();
+            if(isHaveOrgs_zmnumber.get(org_zmnumber)!=null && !"".equals(isHaveOrgs_zmnumber.get(org_zmnumber))){
+                //已存在,缓存修改对象
+                DynamicObject update_entry = (DynamicObject) isHaveOrgs_zmnumber.get(org_zmnumber);
+
+                setDynamicField(true,"pznm_zmet_org_number","pznm_zmet_org","bos_org",
+                        mapEntry,resultData,update_entry);
+                //供应商子码.子码编码
+                setTextField(true,"pznm_zmet_number","number",mapEntry,resultData,update_entry);
+                //供应商子码.子码名称
+                setTextField(true,"pznm_zmet_name","name",mapEntry,resultData,update_entry);
+                //供应商子码.老系统编号
+                setTextField(false,"pznm_zmet_oldnumber","pznm_zmet_oldnumber",mapEntry,resultData,update_entry);
+                //委托人.编码
+                setDynamicField(false,"pznm_zmet_wtr_number","pznm_zmet_wtr","pznm_outcontacts",
+                        mapEntry,resultData,update_entry);
+                //委托人信息.委托人电话
+                setTextField(false,"pznm_zmet_wtrphone","pznm_zmet_wtrphone",mapEntry,resultData,update_entry);
+                //联系人.编码
+                setDynamicField(false,"pznm_zmet_lxr_number","pznm_zmet_lxr","pznm_outcontacts",
+                        mapEntry,resultData,update_entry);
+                //供应商子码.联系人电话
+                setTextField(false,"pznm_zmet_lxrphone","pznm_zmet_lxrphone",mapEntry,resultData,update_entry);
+                //供应商子码.采购负责人.工号
+                setDynamicField(false,"pznm_zmet_cgper_number","pznm_zmet_cgper","bos_user",
+                        mapEntry,resultData,update_entry);
+                //结算类型.编码
+                setDynamicField(false,"pznm_zmet_setttype_number","pznm_zmet_setttype","pznm_settlementtype",
+                        mapEntry,resultData,update_entry);
+                //供应商子码.账期摘要
+                setTextField(false,"pznm_zmet_zqnotes","pznm_zmet_zqnotes",mapEntry,resultData,update_entry);
+                //供应商子码.实销实结结算日
+                setTextField(false,"pznm_zmet_settday","pznm_zmet_settday",mapEntry,resultData,update_entry);
+                //账期类型(收款).编码
+                setDynamicField(false,"pznm_zmet_zqrtype_number","pznm_zmet_zqrtype","bd_reccondition",
+                        mapEntry,resultData,update_entry);
+                //账期类型(付款).编码
+                setDynamicField(false,"pznm_zmet_zqptype_number","pznm_zmet_zqptype","bd_paycondition",
+                        mapEntry,resultData,update_entry);
+                //支付方式.编码
+                setDynamicField(false,"pznm_zmet_paytype_number","pznm_zmet_paytype","bd_settlementtype",
+                        mapEntry,resultData,update_entry);
+                //发票类型.编码
+                setDynamicField(false,"pznm_zmet_invoicetype_number","pznm_zmet_invoicetype","bd_invoicetype",
+                        mapEntry,resultData,update_entry);
+                update_entrys.add(update_entry);
+            }else{
+                //不存在,缓存新增对象
+                DynamicObject add_entry = BusinessDataServiceHelper.newDynamicObject("pznm_supplierzm");
+
+                setDynamicField(true,"pznm_zmet_org_number","pznm_zmet_org","bos_org",
+                        mapEntry,resultData,add_entry);
+                //供应商子码.子码编码
+                setTextField(true,"pznm_zmet_number","number",mapEntry,resultData,add_entry);
+                //供应商子码.子码名称
+                setTextField(true,"pznm_zmet_name","name",mapEntry,resultData,add_entry);
+                //供应商子码.老系统编号
+                setTextField(false,"pznm_zmet_oldnumber","pznm_zmet_oldnumber",mapEntry,resultData,add_entry);
+                //委托人.编码
+                setDynamicField(false,"pznm_zmet_wtr_number","pznm_zmet_wtr","pznm_outcontacts",
+                        mapEntry,resultData,add_entry);
+                //委托人信息.委托人电话
+                setTextField(false,"pznm_zmet_wtrphone","pznm_zmet_wtrphone",mapEntry,resultData,add_entry);
+                //联系人.编码
+                setDynamicField(false,"pznm_zmet_lxr_number","pznm_zmet_lxr","pznm_outcontacts",
+                        mapEntry,resultData,add_entry);
+                //供应商子码.联系人电话
+                setTextField(false,"pznm_zmet_lxrphone","pznm_zmet_lxrphone",mapEntry,resultData,add_entry);
+                //供应商子码.采购负责人.工号
+                setDynamicField(false,"pznm_zmet_cgper_number","pznm_zmet_cgper","bos_user",
+                        mapEntry,resultData,add_entry);
+                //结算类型.编码
+                setDynamicField(false,"pznm_zmet_setttype_number","pznm_zmet_setttype","pznm_settlementtype",
+                        mapEntry,resultData,add_entry);
+                //客户子码.账期摘要
+                setTextField(false,"pznm_zmet_zqnotes","pznm_zmet_zqnotes",mapEntry,resultData,add_entry);
+                //客户子码.实销实结结算日
+                setTextField(false,"pznm_zmet_settday","pznm_zmet_settday",mapEntry,resultData,add_entry);
+                //账期类型(收款).编码
+                setDynamicField(false,"pznm_zmet_zqrtype_number","pznm_zmet_zqrtype","bd_reccondition",
+                        mapEntry,resultData,add_entry);
+                //账期类型(付款).编码
+                setDynamicField(false,"pznm_zmet_zqptype_number","pznm_zmet_zqptype","bd_paycondition",
+                        mapEntry,resultData,add_entry);
+                //支付方式.编码
+                setDynamicField(false,"pznm_zmet_paytype_number","pznm_zmet_paytype","bd_settlementtype",
+                        mapEntry,resultData,add_entry);
+                //发票类型.编码
+                setDynamicField(false,"pznm_zmet_invoicetype_number","pznm_zmet_invoicetype","bd_invoicetype",
+                        mapEntry,resultData,add_entry);
+                //供应商
+                add_entry.set("pznm_supplier",supplierObj);
+                //数据状态
+                add_entry.set("status","A");
+                //使用状态
+                add_entry.set("enable","1");
+                add_entrys.add(add_entry);
+            }
+        }
+
+        DynamicObject[] real_update_entrys = new DynamicObject[update_entrys.size()];
+        for(int i=0;i< update_entrys.size();i++){
+            real_update_entrys[i] = update_entrys.get(i);
+        }
+
+        DynamicObject[] real_add_entrys = new DynamicObject[add_entrys.size()];
+        for(int i=0;i< add_entrys.size();i++){
+            real_add_entrys[i] = add_entrys.get(i);
+        }
+
+        if(resultData.get("errors")==null || "".equals(resultData.get("errors"))) {
+            //执行更新
+            if (real_update_entrys.length > 0) {
+                SaveServiceHelper.update(real_update_entrys);
+            }
+            //执行新增
+            if (real_add_entrys.length > 0) {
+                OperationResult result_submit = OperationServiceHelper.executeOperate("submit", "pznm_supplierzm",
+                        real_add_entrys, OperateOption.create());
+                if (result_submit.isSuccess() == true) {
+                    OperationResult result_audit = OperationServiceHelper.executeOperate("audit", "pznm_supplierzm",
+                            real_add_entrys, OperateOption.create());
+                    if (result_audit.isSuccess() == false) {
+                        resultData.put("errors", "子码审核失败");
+                    }
+                } else {
+                    resultData.put("errors", "子码创建失败");
+                }
+            }
+        }
+    }
+
+    private void doSetWtrEntry(List<Map> mapEntrys, Map resultData, DynamicObject supplierObj) {
+        DynamicObjectCollection entrys = supplierObj.getDynamicObjectCollection("pznm_wtrentry");
+        entrys.clear();
+        for(Map mapEntry : mapEntrys){
+            DynamicObject newEntry = new DynamicObject(entrys.getDynamicObjectType());
+            //所属组织
+            setDynamicField(true,"pznm_wtret_org_number","pznm_wtret_org","bos_org",
+                    mapEntry,resultData,newEntry);
+            //委托人信息.委托人电话
+            setTextField(false,"pznm_wtret_userphone","pznm_wtret_userphone",mapEntry,resultData,newEntry);
+            //委托人.编码
+            setDynamicField(true,"pznm_wtret_user_number","pznm_wtret_user","pznm_outcontacts",
+                    mapEntry,resultData,newEntry);
+            entrys.add(newEntry);
+        }
+    }
+
+    private void doSetKzztentry(List<Map> mapEntrys, Map resultData, DynamicObject supplierObj) {
+        DynamicObjectCollection entrys = supplierObj.getDynamicObjectCollection("pznm_kzztentry");
+        entrys.clear();
+        for(Map mapEntry : mapEntrys){
+            DynamicObject newEntry = new DynamicObject(entrys.getDynamicObjectType());
+            //所属组织
+            setDynamicField(true,"pznm_kzztet_org_number","pznm_kzztet_org","bos_org",
+                    mapEntry,resultData,newEntry);
+            //公司级状态
+            setTextField(true,"pznm_companystatus","pznm_companystatus",mapEntry,resultData,newEntry);
+
+            entrys.add(newEntry);
+        }
+    }
+
+    /* 校验并设置F7字段
+     * @key 入参校验字段
+     * @fieldName 写入供应商对象的字段名
+     * @entityNumber 字段对应基础资料实体名
+     * @param 接口入参对象
+     * @resultData 返回报文对象
+     * @supplierObj 供应商对象
+     */
+    private void setDynamicField(Boolean isMust,String key,String fieldName, String entityNumber, Map param, Map resultData, DynamicObject supplierObj) {
+        if(param.get(key)==null || "".equals(param.get(key))){
+            if(isMust){
+                String errors = resultData.get("errors")!=null?resultData.get("errors").toString()+";":"";
+                resultData.put("errors",errors+"参数【" + key + "】必填");
+            }
+        }else{
+            QFilter qFilter_number = new QFilter("number",QCP.equals,param.get(key));
+            QFilter qFilter_enable = new QFilter("enable", QCP.equals,"1");
+            QFilter qFilter_status = new QFilter("status", QCP.equals, "C");
+            DynamicObject objCol = BusinessDataServiceHelper.loadSingleFromCache(entityNumber,"id,number,name",
+                    new QFilter[]{qFilter_number,qFilter_enable,qFilter_status});
+            if(objCol!=null){
+                supplierObj.set(fieldName,objCol);
+            }else{
+                String errors = resultData.get("errors")!=null?resultData.get("errors").toString()+";":"";
+                resultData.put("errors",errors+"参数【" + key + "】值【"+param.get(key)+"】匹配不成功,可能的原因是:1、编码不正确 2、不符合基础资料字段查询条件");
+            }
+        }
+    }
+
+    /* 校验并设置文本字段
+     * @key 入参校验字段
+     * @fieldName 写入供应商对象的字段名
+     * @param 接口入参对象
+     * @resultData 返回报文对象
+     * @supplierObj 供应商对象
+     */
+    private void setTextField(Boolean isMust,String key,String fieldName,Map param, Map resultData, DynamicObject supplierObj) {
+        if(param.get(key)==null || "".equals(param.get(key))){
+            if(isMust){
+                String errors = resultData.get("errors")!=null?resultData.get("errors").toString()+";":"";
+                resultData.put("errors",errors+"参数【" + key + "】必填");
+            }
+        }else{
+            supplierObj.set(fieldName,param.get(key));
+        }
+    }
+
+    /* 校验并设置日期字段
+     * @key 入参校验字段
+     * @fieldName 写入供应商对象的字段名
+     * @param 接口入参对象
+     * @resultData 返回报文对象
+     * @supplierObj 供应商对象
+     */
+    private void setDateField(Boolean isMust,String key,String fieldName,Map param, Map resultData, DynamicObject supplierObj) throws ParseException {
+        if(param.get(key)==null || "".equals(param.get(key))){
+            if(isMust){
+                String errors = resultData.get("errors")!=null?resultData.get("errors").toString()+";":"";
+                resultData.put("errors",errors+"参数【" + key + "】必填");
+            }
+        }else{
+            supplierObj.set(fieldName,new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(param.get(key).toString()));
+        }
+    }
+}

+ 59 - 0
bamp/basedata/webapi/TransformApiData.java

@@ -0,0 +1,59 @@
+package bamp.basedata.webapi;
+
+import kd.bos.bd.service.AssignService;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.basedata.BaseDataResponse;
+import kd.bos.openapi.api.plugin.ApiSavePlugin;
+
+import java.util.*;
+
+/*
+* 通用接口扩展插件
+* wangj 2025-01-08
+* 主要功能:根据禁用状态设置禁用人
+ */
+public class TransformApiData implements ApiSavePlugin {
+    @Override
+    public List<Map<String, Object>> preHandleRequestData(List<Map<String, Object>> reqData) {
+//        Set<Long> orgIds = new HashSet(selectedRows.size());
+//        selectedRows.forEach((r) -> {
+//            orgIds.add(Long.valueOf(r.getPrimaryKeyValue().toString()));
+//        });
+//        BaseDataResponse response = (new AssignService(this.entityId)).assign(this.useOrg, this.appId, this.dataIds, orgIds, true);
+//        if(response.isSuccess()==true){
+
+//        }else{
+//            response.getErrorMsg();
+//        }
+        for (Map<String, Object> map : reqData) {
+            if(map.get("enable")!=null && !"".equals(map.get("enable")) && "0".equals(map.get("enable"))){
+                Map<String, Object> modifierMap = (Map<String, Object>) map.get("modifier");
+                Map<String, Object> disablerMap = new HashMap<>();
+                disablerMap.put("number",modifierMap.get("number"));
+                map.put("disabler",disablerMap);
+                map.put("disabledate",map.get("modifytime"));
+            }else{
+                Map<String, Object> disablerMap = new HashMap<>();
+                disablerMap.put("number","");
+                map.put("disabler",disablerMap);
+                map.put("disabledate",null);
+            }
+
+            if(map.get("modifier")!=null && !"".equals(map.get("modifier"))){
+                Map<String, Object> modifierMap = (Map<String, Object>) map.get("modifier");
+                Map<String, Object> disablerMap = new HashMap<>();
+                disablerMap.put("number",modifierMap.get("number"));
+                map.put("pznm_modifier_xh",disablerMap);
+            }
+
+            if(map.get("auditor")!=null && !"".equals(map.get("auditor"))){
+                Map<String, Object> modifierMap = (Map<String, Object>) map.get("auditor");
+                Map<String, Object> disablerMap = new HashMap<>();
+                disablerMap.put("number",modifierMap.get("number"));
+                map.put("pznm_auditor_xh",disablerMap);
+            }
+        }
+        return reqData;
+    }
+}