1
0

3 Коміти a08379ec84 ... bd1eb7876b

Автор SHA1 Опис Дата
  lzh bd1eb7876b Merge remote-tracking branch 'origin/master' 4 днів тому
  lzh e3e19ba2ea 同步成本 4 днів тому
  lzh b06d1676eb 同步成本 4 днів тому

+ 60 - 0
code/jyyy/nckd-jimin-jyyy-bd/src/main/java/nckd/jimin/jyyy/bd/plugin/form/CusCostCenterListPlugin.java

@@ -0,0 +1,60 @@
+package nckd.jimin.jyyy.bd.plugin.form;
+
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.form.control.events.ItemClickEvent;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.sdk.plugin.Plugin;
+import nckd.jimin.jyyy.bd.task.SynSupplierFromSAPTask;
+import nckd.jimin.jyyy.bd.task.impl.SynSapServiceImpl;
+import nckd.jimin.jyyy.bd.webapi.BeiTransdetailConstantInfo;
+
+import java.util.EventObject;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 标准单据列表插件
+ */
+public class CusCostCenterListPlugin extends AbstractListPlugin implements Plugin {
+    private static final Log logger = LogFactory.getLog(SynSupplierFromSAPTask.class);
+    @Override
+    public void registerListener(EventObject e) {
+        super.registerListener(e);
+        this.addClickListeners("_toolbar_");
+    }
+    @Override
+    public void itemClick(ItemClickEvent evt) {
+        super.itemClick(evt);
+        if(evt.getItemKey().equalsIgnoreCase("nckd_sap")){
+            SynSapServiceImpl synSapService = new SynSapServiceImpl();
+            //使用状态=启用
+            QFilter qFilter = new QFilter("enable", QCP.equals, "1");
+            //数据状态=已审核
+            qFilter.and(new QFilter("status", QCP.equals, "C"));
+            //属性核算组织=是
+            QFilter and = new QFilter("fisaccounting", QCP.equals, "1");
+            //获取当前组织,将成本信息缓存到Map中
+            Long orgId = RequestContext.get().getOrgId();
+            qFilter.and(new QFilter("id", QCP.equals, orgId));
+            DynamicObject orgDy = BusinessDataServiceHelper.loadSingle("bos_org", "id, number", qFilter.toArray());
+            if(orgDy==null){
+                this.getView().showMessage("没有找到对应的组织");
+            }
+            logger.info("------同步成本 " + orgDy.getString("number") + "----------");
+            String orgNumber = orgDy.getString("number");
+            Map<String, String> result = new HashMap<>();
+            result=synSapService.synCostCenterForSap(orgNumber);
+            this.getView().showMessage(result.get("msg"));
+
+
+
+        }
+    }
+
+}

+ 9 - 0
code/jyyy/nckd-jimin-jyyy-bd/src/main/java/nckd/jimin/jyyy/bd/task/SynSapService.java

@@ -0,0 +1,9 @@
+package nckd.jimin.jyyy.bd.task;
+
+import java.util.Map;
+
+public interface SynSapService {
+    public abstract Map<String, String> synCostCenterForSap(String companyCode);
+    public abstract Map<String, String> synProjectForSap(String companyCode);
+    public abstract Map<String, String> synAccountViewForSap(String companyCode);
+}

+ 136 - 0
code/jyyy/nckd-jimin-jyyy-bd/src/main/java/nckd/jimin/jyyy/bd/task/SyncSapUtils.java

@@ -0,0 +1,136 @@
+package nckd.jimin.jyyy.bd.task;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import kd.bos.exception.KDBizException;
+import kd.bos.ext.fi.plugin.ArApConvert.util.EmptyUtils;
+import kd.bos.logging.LogFactory;
+import kd.bos.sdk.util.KHttpClientUtils;
+import kd.bos.util.StringUtils;
+import nckd.jimin.jyyy.bd.common.CommonHelperUtils;
+import kd.bos.logging.Log;
+import nckd.jimin.jyyy.bd.task.impl.SynSapServiceImpl;
+
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class SyncSapUtils {
+    private static final Log logger = LogFactory.getLog(SynSapServiceImpl.class);
+    /**
+     * 向SAP系统发送POST请求并返回结果
+     * 该方法主要用于与SAP系统进行数据交互,通过POST请求发送JSON数据,并接收SAP系统的响应
+     *
+     * @param url 请求的URL类型,决定目标URL
+     * @param jsonData 要发送的JSON数据
+     * @return SAP系统的响应结果,以字符串形式返回
+     * @throws KDBizException 如果请求失败,抛出业务异常
+     */
+    public static String postDataToSAP(String url, String jsonData)
+    {
+        try {
+            Map<String, String> mapentity = CommonHelperUtils.getCommonParams("SAP");
+           if(mapentity == null){
+               return null;
+            }
+            String param_cost_url = mapentity.get("cost_url");
+            String param_account_url = mapentity.get("account_url");
+            String param_porject_url = mapentity.get("project_url");
+            String param_username = mapentity.get("username");
+            String param_password = mapentity.get("password");
+
+        if( StringUtils.isEmpty(param_username) || StringUtils.isEmpty(param_password)
+                || StringUtils.isEmpty(param_cost_url) || StringUtils.isEmpty(param_account_url)
+                ||  StringUtils.isEmpty(param_porject_url)){
+            return null;
+        }
+
+            String encoded = Base64.getEncoder().encodeToString((param_username + ":" + param_password).getBytes());
+            Map<String, String> header = new HashMap<>();
+            header.put("Content-Type", "application/json; charset=UTF-8");
+            header.put("Authorization", "Basic " + encoded);
+            String post_url = null;
+            switch (url) {
+                case "account":
+                    post_url = param_account_url;break;
+                case "costcenter":
+                    post_url = param_cost_url;break;
+                case "project":
+                    post_url = param_porject_url;break;
+                default:
+                    break;
+            }
+            String result = KHttpClientUtils.postjson(post_url, header, jsonData);
+            return result;
+        } catch (Exception e) {
+            throw new KDBizException("请求SAP接口失败:" + e.getMessage());
+        }
+    }
+
+    public static String getAccountViewData(String companyCode)
+    {
+        JSONObject json = new JSONObject();
+        json.put("BUKRS", EmptyUtils.isNotEmpty(companyCode) ? companyCode : "");
+        json.put("SAKNR", "");
+        json.put("TXT50", "");
+        JSONObject itemMap = new JSONObject();
+        itemMap.put("BUKRS", "");
+        itemMap.put("SAKNR", "");
+        itemMap.put("TXT50", "");
+        JSONObject etMap = new JSONObject();
+        etMap.put("item", itemMap);
+        json.put("ET_ITEM", etMap);
+        return json.toString();
+    }
+
+    public static String getCostCenterData(String companyCode)
+    {
+        JSONObject json = new JSONObject();
+        json.put("BUKRS", EmptyUtils.isNotEmpty(companyCode) ? companyCode : "");
+        json.put("KOSTL", "");
+        json.put("KTEXT", "");
+        json.put("ERSDA", "");
+        JSONObject itemMap = new JSONObject();
+        itemMap.put("BUKRS", "");
+        itemMap.put("KOSTL", "");
+        itemMap.put("KTEXT", "");
+        itemMap.put("ERSDA", "");
+        JSONObject etMap = new JSONObject();
+        etMap.put("item", itemMap);
+        json.put("ET_ITEM", etMap);
+        return json.toString();
+    }
+
+    public static String getProjectData(String companyCode)
+    {
+        JSONObject json = new JSONObject();
+        json.put("I_PBUKR", EmptyUtils.isNotEmpty(companyCode) ? companyCode : "");
+        json.put("I_AEDAT", "");
+        json.put("I_ERDAT", "");
+        JSONObject itemMap = new JSONObject();
+        itemMap.put("I_PBUKR", "");
+        itemMap.put("I_AEDAT", "");
+        itemMap.put("I_ERDAT", "");
+        JSONObject etMap = new JSONObject();
+        etMap.put("item", itemMap);
+        json.put("ET_ITEM", etMap);
+        return json.toString();
+    }
+
+    /**
+     * 获取字符串中最后一个 '.' 之前的部分
+     *
+     * @param str 输入字符串
+     * @return 第一个 '.' 之前的部分,如果没有 '.' 则返回NULL
+     */
+    public static String getProjectNumberForParent(String str) {
+        int firstDotIndex = str.indexOf('.');
+        if (firstDotIndex == -1) {
+            return null; // 没有找到 '.',返回NULL
+        }
+        return str.substring(0, firstDotIndex);
+    }
+
+}

+ 427 - 0
code/jyyy/nckd-jimin-jyyy-bd/src/main/java/nckd/jimin/jyyy/bd/task/impl/SynSapServiceImpl.java

@@ -0,0 +1,427 @@
+package nckd.jimin.jyyy.bd.task.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import kd.bos.basedata.service.BaseDataServiceImpl;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.db.DB;
+import kd.bos.ext.fi.plugin.ArApConvert.util.EmptyUtils;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.util.StringUtils;
+import nckd.jimin.jyyy.bd.task.SynSapService;
+import nckd.jimin.jyyy.bd.task.SyncSapUtils;
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class SynSapServiceImpl implements SynSapService {
+
+    protected static final Long DEFAULT_ORG_ID = 100000L;
+    private static final Log logger = LogFactory.getLog(SynSapServiceImpl.class);
+
+    /**
+     *同步成本中心
+     * @param companyCode
+     * @return
+     */
+    @Override
+    public Map<String, String> synCostCenterForSap(String companyCode) {
+        Map<String, String> result = new HashMap<>();
+        logger.info("同步SAP主数据_成本");
+        String data = SyncSapUtils.getCostCenterData(companyCode);
+        String url = "costcenter";
+        logger.info("同步SAP主数据_成本,参数:" + data);
+        String response = SyncSapUtils.postDataToSAP(url, data);
+        if(StringUtils.isEmpty(response)){
+            result.put("code", "300");
+            result.put("msg", "同步SAP主数据_成本,同步失败");
+            return result;
+        }
+        JSONObject rData = JSONObject.parseObject(response);
+        String etype = rData.getString("E_TYPE");
+
+        if(!"S".equals(etype)){
+            result.put("code", "301");
+            result.put("msg", "同步SAP主数据_成本,E_TYPE:"+etype+",错误信息:"+rData.getString("E_MESSGE"));
+            return result;
+        }
+
+        JSONObject rEtItem = rData.getJSONObject("ET_ITEM");
+        if(rEtItem == null){
+            result.put("code", "302");
+            result.put("msg", "同步SAP主数据_成本,ET_ITEM参数为空");
+            return result;
+        }
+
+        JSONArray rItemArray = rEtItem.getJSONArray("item");
+        if(rItemArray == null){
+            result.put("code", "303");
+            result.put("msg", "同步SAP主数据_成本,item参数为空");
+            return result;
+        }
+
+        List<String> costNumList = new ArrayList<String>();
+        for(int i = 0; i < rItemArray.size(); ++i) {
+            JSONObject item = rItemArray.getJSONObject(i);
+            String number = item.getString("KOSTL");
+            costNumList.add(number);
+        }
+        //取组织对象
+        QFilter qf = new QFilter("number", QCP.equals, companyCode);
+        DynamicObject companyDyn = BusinessDataServiceHelper.loadSingle("bos_org",  new QFilter[]{qf});
+
+        QFilter qFilter = new QFilter("number", QCP.in, costNumList);
+       // QFilter qFilter1 = new QFilter("accountorg.number", QCP.equals, companyCode);
+        DynamicObject[] costDyns  = BusinessDataServiceHelper.load("bos_costcenter", "id,masterid,number,name,accountorg,orgduty,status,enable", new QFilter[]{qFilter});
+        Map<String, DynamicObject> costMap =
+                Arrays.stream(costDyns)
+                        .collect(Collectors.toMap(
+                                detail -> detail.getString("number"),
+                                detail -> detail, // 整个 DynamicObject 作为 value
+                                (existing, replacement) -> existing // 保留前面的值
+                        ));
+        ArrayList<DynamicObject> costList = new ArrayList<>();
+        StringBuilder err = new StringBuilder();
+
+        for(int i = 0; i < rItemArray.size(); ++i) {
+            JSONObject item = rItemArray.getJSONObject(i);
+            String number = item.getString("KOSTL");
+
+            String name = item.getString("KTEXT");
+            if(StringUtils.isEmpty(number) || StringUtils.isEmpty(name)){
+                err.append("/n 存在项目编号或名称为空, " + number + name);
+                continue;
+            }
+
+            if(EmptyUtils.isNotEmpty(number)){
+                DynamicObject dyn = costMap.get(number);
+                if(dyn == null){
+                    dyn = BusinessDataServiceHelper.newDynamicObject("bos_costcenter");
+                    long Id = DB.genLongId("t_bos_costcenter");
+                    dyn.set("id", Id);
+                    dyn.set("number", number); // 编号
+                    dyn.set("accountorg", companyDyn);//核算组织
+                    String orgduty=item.getString("KTEXT");
+                    if(EmptyUtils.isNotEmpty(orgduty)){
+
+                        String orgdutyValue=orgduty.substring(orgduty.length()-1);
+
+                        switch (orgdutyValue){
+                            case "V"://销售
+                                dyn.set("orgduty", "3");
+                                break;
+                            case "L"://管理
+                                dyn.set("orgduty", "1");
+                                break;
+                            case "F"://制造
+                                dyn.set("orgduty", "4");
+                                break;
+                            case "E"://研发
+                                dyn.set("orgduty", "2");
+                                break;
+                            default://其他
+                                dyn.set("orgduty", "5");
+                                break;
+                        }
+
+                    }
+                }
+                dyn.set("name", item.getString("KTEXT"));////项目名称
+                dyn.set("status", "C");   ///单据状态
+                dyn.set("enable", "1");  //使用状态
+                logger.info("同步SAP主数据_成本,id:"+dyn.getLong("id")+"  -->"+Long.valueOf(dyn.getString("id")));
+                dyn.set("masterid",Long.valueOf(dyn.getString("id")));
+                costList.add(dyn);
+            }
+        }
+
+        if(costList.size()>0) {
+            Object[] save = SaveServiceHelper.save(costList.toArray(new DynamicObject[0]));
+            int length = save.length;
+            logger.info("同步[成本]完成,本次新增数量:{},"+err, length);
+            result.put("code", "200");
+            result.put("msg", "同步SAP主数据_成本,执行成功,本次同步数量"+length+err);
+        }else{
+            result.put("code", "304");
+            result.put("msg", "同步SAP主数据_"+err);
+        }
+
+
+        return result;
+    }
+
+    /**
+     * 同步SAP主数据中的项目信息
+     *
+     * 本方法负责从SAP系统同步项目相关的主数据,处理并保存到当前系统中
+     * 它首先从SAP获取项目数据,然后解析这些数据,并与系统中已存在的项目信息进行对比和更新
+     * 如果项目在系统中不存在,则会创建新的项目记录;如果存在,则更新项目信息
+     *
+     * 1、根据 SAP 项目编码判断层级
+     * 编码中的2010、2060 代表公司  1级项目(编码无点)按全局共享,2级项目阶段,按02、.03判断私分配隔(私有)
+     * 需要代码自动判断创建1级项目
+     * 注意需要单独处理项目t_bd_project_u表数据,否则不能在界面查询出来
+     *
+     * @param companyCode 公司代码,用于过滤特定公司的项目信息
+     * @return 返回一个包含同步结果的Map,包括状态码(code)和消息(msg)
+     */
+    @Override
+    public Map<String, String> synProjectForSap(String companyCode) {
+        BaseDataServiceImpl baseDataService = new BaseDataServiceImpl();
+        Map<String, String> result = new HashMap<>();
+        logger.info("同步SAP主数据_项目");
+        String data = SyncSapUtils.getProjectData(companyCode);
+        String url = "project";
+        logger.info("同步SAP主数据_项目,参数:" + data);
+        String response = SyncSapUtils.postDataToSAP(url, data);
+
+        if(StringUtils.isEmpty(response)){
+            result.put("code", "300");
+            result.put("msg", "同步SAP主数据_项目,同步失败");
+            return result;
+        }
+        JSONObject rData = JSONObject.parseObject(response);
+
+        String etype = rData.getString("E_TYPE");
+
+        if(!"S".equals(etype)){
+            result.put("code", "301");
+            result.put("msg", "同步SAP主数据_项目,E_TYPE:"+etype+",错误信息:"+rData.getString("E_MESSGE"));
+            return result;
+        }
+
+        JSONObject rEtItem = rData.getJSONObject("ET_ITEM");
+        if(rEtItem == null){
+            result.put("code", "302");
+            result.put("msg", "同步SAP主数据_项目,ET_ITEM参数为空");
+            return result;
+        }
+
+        JSONArray rItemArray = rEtItem.getJSONArray("item");
+        if(rItemArray == null){
+            result.put("code", "303");
+            result.put("msg", "同步SAP主数据_项目,item参数为空");
+            return result;
+        }
+
+        List<String> projectNumList = new ArrayList<String>();
+        for(int i = 0; i < rItemArray.size(); ++i) {
+            JSONObject item = rItemArray.getJSONObject(i);
+            String number = item.getString("POSID");
+            projectNumList.add(number);
+        }
+        //取组织对象
+        QFilter qf = new QFilter("number", QCP.equals, companyCode);
+        DynamicObject companyDyn = BusinessDataServiceHelper.loadSingle("bos_org",  new QFilter[]{qf});
+
+        QFilter qFilter = new QFilter("number", QCP.in, projectNumList);
+        QFilter qFilter1 = new QFilter("org.number", QCP.equals, companyCode);
+        DynamicObject[] dyns  = BusinessDataServiceHelper.load("bd_project", "id,number,name,fullname,parent,masterid,proleader,org,useorg,createorg,group,status,ctrlstrategy,level,isleaf,department,prostatus,enable", new QFilter[]{qFilter,qFilter1});
+
+        Map<String, DynamicObject> projectMap =
+                Arrays.stream(dyns)
+                        .collect(Collectors.toMap(
+                                detail -> detail.getString("number"),
+                                detail -> detail, // 整个 DynamicObject 作为 value
+                                (existing, replacement) -> existing // 保留前面的值
+                        ));
+
+        ArrayList<DynamicObject> projectList = new ArrayList<>();
+        List<Object[]> useorgList = new ArrayList<>();
+        StringBuilder err = new StringBuilder();
+
+        for(int i = 0; i < rItemArray.size(); ++i) {
+            JSONObject item = rItemArray.getJSONObject(i);
+            String number = item.getString("POSID");
+            String name = item.getString("POST1");
+            if(StringUtils.isEmpty(number) || StringUtils.isEmpty(name)){
+                err.append("  \n存在项目编号或名称为空, " + number + name);
+                continue;
+            }
+
+            if(!"CD20210404.2010.22".equals(number)) continue;
+
+            String proleader = item.getString("USR03");
+            String department =  item.getString("DEPARTMENT");
+            String type = item.getString("ZBY2");
+            String billstatus = item.getString("STATUS");
+            DynamicObject proleaderDyn = null;
+            DynamicObject departmentDyn = null;
+            DynamicObject typeDyn = null;
+            DynamicObject projectStatusDyn = null;
+            if(StringUtils.isNotEmpty(proleader)){
+                QFilter qf1 = new QFilter("number", QCP.equals, proleader);
+                proleaderDyn = BusinessDataServiceHelper.loadSingle("bos_user",  new QFilter[]{qf1});
+            }
+            if(StringUtils.isNotEmpty(department)){
+                QFilter qf1 = new QFilter("number", QCP.equals, department);
+                departmentDyn = BusinessDataServiceHelper.loadSingle("bos_org",  new QFilter[]{qf1});
+            }
+            if(StringUtils.isNotEmpty(type)){
+                QFilter qf1 = new QFilter("number", QCP.equals, type);
+                typeDyn = BusinessDataServiceHelper.loadSingle("bd_projectkind",  new QFilter[]{qf1});
+            }
+            if(StringUtils.isNotEmpty(billstatus)){
+                QFilter qf1 = new QFilter("nckd_sapprojstatus", QCP.equals, billstatus);
+                projectStatusDyn = BusinessDataServiceHelper.loadSingle("bd_projectstatus",  new QFilter[]{qf1});
+            }
+            QFilter qf2 = new QFilter("number", QCP.equals, "SAP");
+            DynamicObject srcSysDyn = BusinessDataServiceHelper.loadSingle("bos_devportal_bizcloud",new QFilter[]{qf2});
+
+            DynamicObject dyn = projectMap.get(number);
+            if(dyn == null){
+                /*
+                 * 处理一级项目,来自于项目编码前段编码  BD20200303.2010.07 ,BD20200303为一级项目编码
+                 * */
+                DynamicObject parentDyn = null;
+                String parent = SyncSapUtils.getProjectNumberForParent(number);
+                if(StringUtils.isNotEmpty(parent)) {
+
+                    parentDyn = BusinessDataServiceHelper.newDynamicObject("bd_project");
+                    long Id = DB.genLongId("t_bd_project");
+                    parentDyn.set("id", Id);
+                    parentDyn.set("masterid",Id);
+                    parentDyn.set("number", parent); // 编号
+                    parentDyn.set("org", DEFAULT_ORG_ID);  //一级项目放在顶层组织下
+                    parentDyn.set("createorg", DEFAULT_ORG_ID);  //一级项目放在顶层组织下
+                    if(EmptyUtils.isNotEmpty(typeDyn)) {
+                        parentDyn.set("group", typeDyn);  ///项目分类
+                    }
+                    parentDyn.set("level", 1);
+                    parentDyn.set("isleaf", 0);
+                    parentDyn.set("status", "C");        ///单据状态
+                    parentDyn.set("ctrlstrategy", "5");  //控制策略  自由分配 2 全局共享 5  私有 7
+                    parentDyn.set("enable", "1");        //使用状态
+                    // parentDyn.set("prostatus", "PASS_S"); //项目状态 PASS通过
+                    parentDyn.set("name", parent);
+                    parentDyn.set("fullname", parent);
+                    if(EmptyUtils.isNotEmpty(proleaderDyn)) {
+                        parentDyn.set("proleader", proleaderDyn);
+                    }
+                    if(EmptyUtils.isNotEmpty(departmentDyn)) {
+                        parentDyn.set("department", departmentDyn);
+                    }
+                    if(EmptyUtils.isNotEmpty(projectStatusDyn)) {
+                        parentDyn.set("prostatus", projectStatusDyn);
+                    }
+                    if(EmptyUtils.isNotEmpty(srcSysDyn)) {
+                        parentDyn.set("systemtypebase", srcSysDyn);
+                    }
+                    projectList.add(parentDyn);
+
+                }
+                /***
+                 * 处理二级项目,如果项目编码中包含点,则需要处理上级项目
+                 */
+                dyn = BusinessDataServiceHelper.newDynamicObject("bd_project");
+                long Id = DB.genLongId("t_bd_project");
+                dyn.set("id", Id);
+                dyn.set("masterid",Id);
+                if(EmptyUtils.isNotEmpty(parentDyn)){
+                    dyn.set("parent", parentDyn);
+                }
+                dyn.set("number", number); // 编号
+                dyn.set("org", companyDyn.getPkValue());
+                dyn.set("level", 2);
+                dyn.set("isleaf", 1);
+                dyn.set("createorg", companyDyn.getPkValue());
+                dyn.set("useorg", companyDyn.getPkValue());
+                if(EmptyUtils.isNotEmpty(typeDyn)) {
+                    dyn.set("group", typeDyn);  ///项目分类
+                }
+                dyn.set("status", "C");        ///单据状态
+                dyn.set("ctrlstrategy", "7");  //控制策略  自由分配 2 全局共享 5  私有 7
+                dyn.set("enable", "1");        //使用状态
+                //dyn.set("prostatus", "PASS_S"); //项目状态 PASS通过
+
+                /***
+                 * 当控制策略为自由分配和私有时,需要单独处理项目t_bd_project_u表数据,否则不能在界面查询出来
+                 */
+                Object[] odjs = new Object[]{
+                        dyn.get("id"),
+                        dyn.get("useorg")
+                };
+                useorgList.add(odjs);
+            }
+            dyn.set("name", item.getString("POST1"));
+            dyn.set("fullname", item.getString("POST1"));
+            if(EmptyUtils.isNotEmpty(proleaderDyn)) {
+                dyn.set("proleader", proleaderDyn);
+            }
+            if(EmptyUtils.isNotEmpty(departmentDyn)) {
+                dyn.set("department", departmentDyn);
+            }
+            if(EmptyUtils.isNotEmpty(projectStatusDyn)) {
+                dyn.set("prostatus", projectStatusDyn);
+            }
+            if(EmptyUtils.isNotEmpty(srcSysDyn)) {
+                dyn.set("systemtypebase", srcSysDyn);
+            }
+            projectList.add(dyn);
+        }
+
+        if(projectList.size()>0) {
+            Object[] save = SaveServiceHelper.save(projectList.toArray(new DynamicObject[0]));
+            int length = save.length;
+            logger.info("同步[项目]完成,本次新增数量:{},"+err, length);
+            result.put("code", "200");
+            result.put("msg", "同步SAP主数据_项目,执行成功,本次同步数量"+length+err);
+        }else{
+            result.put("code", "304");
+            result.put("msg", "同步SAP主数据_错误,"+err);
+        }
+        /***
+         * 需要单独处理项目t_bd_project_u表数据,否则不能在界面查询出来
+         */
+        if (useorgList.size()>0) {
+            baseDataService.savePrivateBaseDataUseRange("bd_project", useorgList);
+            logger.info("同步[项目]完成,t_bd_project_u表");
+        }
+        return result;
+    }
+
+    @Override
+    public Map<String, String> synAccountViewForSap(String companyCode) {
+        Map<String, String> result = new HashMap<>();
+
+        String data = SyncSapUtils.getAccountViewData(companyCode);
+        String url = "account";
+        String response = SyncSapUtils.postDataToSAP(url, data);
+
+        if(StringUtils.isEmpty(response)){
+            result.put("code", "300");
+            result.put("msg", "同步失败");
+            return result;
+        }
+        JSONObject rData = JSONObject.parseObject(response);
+
+        String etype = rData.getString("E_TYPE");
+
+        if(!"S".equals(etype)){
+            result.put("code", "301");
+            result.put("msg", "E_TYPE:"+etype+",错误信息:"+rData.getString("E_MESSGE"));
+            return result;
+        }
+
+        JSONObject rEtItem = rData.getJSONObject("ET_ITEM");
+        if(rEtItem == null){
+            result.put("code", "302");
+            result.put("msg", "ET_ITEM参数为空");
+            return result;
+        }
+
+        JSONArray rItemArray = rEtItem.getJSONArray("item");
+        if(rItemArray == null){
+            result.put("code", "303");
+            result.put("msg", "item参数为空");
+            return result;
+        }
+
+
+        return result;
+    }
+}