Wind与S的集成-阿里云开发者社区

开发者社区> pandamonica> 正文

Wind与S的集成

简介: 物料同步,我们首先要搞清楚,同步发生在何时何地。打开组织的实用程序 打开工作流模板管理 找到图纸发布流程 下载到本地 点击运行,然后使用wcadmin账户登录系统 看到下面的流程图在靠后的某个OR节点,执行发送物料的表达式(即java代码的方法) 我们仔细看看这部分表达式 代码的具体内容如下: 错误信息=ext.
+关注继续查看

物料同步,我们首先要搞清楚,同步发生在何时何地。
打开组织的实用程序
image

打开工作流模板管理
image

找到图纸发布流程
image

下载到本地
image
image
image

点击运行,然后使用wcadmin账户登录系统
image

看到下面的流程图
在靠后的某个OR节点,执行发送物料的表达式(即java代码的方法)
image

我们仔细看看这部分表达式
image

代码的具体内容如下:

错误信息=ext.pwst.erp.ERPManager.sendMaterial((wt.fc.WTObject)primaryBusinessObject);
if(错误信息.equals("success")){
   result="通过";
}else{
   result="错误处理";
}

上述代码就是Windchill与SAP集成涉及到的核心方法的调用。
上述核心代码存放在Windchill服务器的什么位置呢?
我们使用xftp连接Windchill服务器进行查看,如下图所示
image
那么上述java文件的具体内容是怎样的呢?
我们进入自己的开发环境(Server2016)的eclipse中查看开发环境下,SAP集成代码的内容
image

package ext.pwst.erp;

import java.util.Vector;
import org.apache.log4j.Logger;
import com.ptc.core.meta.server.TypeIdentifierUtility;
import com.sap.mw.jco.JCO;
import ext.pwst.doc.util.IBAHelper;
import wt.change2.ChangeHelper2;
import wt.change2.WTChangeActivity2;
import wt.fc.QueryResult;
import wt.fc.WTObject;
import wt.maturity.MaturityHelper;
import wt.maturity.PromotionNotice;
import wt.method.RemoteAccess;
import wt.method.RemoteMethodServer;
import wt.part.WTPart;
import wt.util.WTException;
import wt.vc.VersionControlHelper;

public class ERPManager implements RemoteAccess {
    
    public static Logger log = Logger.getLogger(ERPManager.class);
    // 1. 
    public static String sendMaterial(WTObject obj){
        try{
            if(!RemoteMethodServer.ServerFlag){
                return (String)RemoteMethodServer.getDefault().invoke("sendMaterial", 
                        ERPManager.class.getName(), null, new Class[]{WTObject.class}, new Object[]{obj});
            }else{
                QueryResult qr = null;
                Vector<WTPart> vecPart = new Vector<WTPart>();
                if(obj instanceof PromotionNotice){
                    PromotionNotice pn = (PromotionNotice)obj;
                    qr = MaturityHelper.service.getPromotionTargets(pn);
                }else if(obj instanceof WTChangeActivity2){
                    WTChangeActivity2 eca = (WTChangeActivity2)obj;
                    qr = ChangeHelper2.service.getChangeablesAfter(eca);
                }
                if(qr != null){
                    while (qr.hasMoreElements()) {
                        WTObject o = (WTObject)qr.nextElement();
                        if(o instanceof WTPart){
                            WTPart part = (WTPart)o;
                            vecPart.add(part);
                        }
                    }
                }
                //调用2 sendMToSAP()
                String ret = sendMToSAP(vecPart);
                return ret;
            }
        }catch(Exception e){
            e.printStackTrace();
            return e.getMessage();
        }
    }
    
    
    /**
     * 2. 发送物料到ERP系统
     * @param part
     * @param mark
     * @return
     * @throws Exception
     */
    public static String sendMToSAP(Vector<WTPart> vecPart) throws Exception{
        boolean mark = false;
        StringBuffer buf = new StringBuffer();
        JCO.Client mConnection = SAPClientUtil.getConnectedClient();
        JCO.Function function = SAPClientUtil.createFunction("Z_PDM_MATERIAL", mConnection);//函数名
        JCO.Table input = function.getTableParameterList().getTable("IM_TAB");
        for(int i = 0; i < vecPart.size(); i++){
            WTPart part = vecPart.get(i);
            part = (WTPart)VersionControlHelper.service.getLatestIteration(part, false);
            input.appendRow();
            log.debug("[sendMToSAP]partnumber:" + part.getNumber());
            //调用3 setTableValue()
            setTableValue(input, part);
            mark = true;
        }
        if(mark){
            mConnection.execute(function);
            JCO.Table output = function.getTableParameterList().getTable("IT_RETURN");
            output.firstRow();
            do{
                String flag = (String)output.getValue("TYPE");
                String number = (String)output.getValue("MATNR");
                String message = (String)output.getValue("MESSAGE");
                log.debug("number:" + number + ";flag:" + flag + ";message:" + message);
                if(flag.equals("E")){
                    if(message.trim().length() > 0)
                        buf.append("物料编号为:" + number + " 的物料,传送erp失败。message:" + message + "\n");
                }
            }while(output.nextRow());
        }
        if(buf.toString().length() == 0){
            buf.append("success");
        }
        return buf.toString();
    }
    
    // 3. 
    public static void setTableValue(JCO.Table input, WTPart part) throws WTException{
        String factory = "";
        String pinpai = "";
        double penqimianji = 0;
        double zhongliang = 0;
        String bianma = "";
        String miaoshu = "";
        String zhongyaodu = "";
        String chanpinxinghao = "";
        String type = TypeIdentifierUtility.getTypeIdentifier(part).getTypename();
        if(type.contains("PWSTXTB.xtbparts")){
            factory = "2000";
            miaoshu = part.getName();
            bianma = part.getNumber();
            penqimianji = IBAHelper.getIBAFloatValue(part, "com.tsmi.pengqimianji");
            zhongliang = IBAHelper.getIBAFloatValue(part, "com.tsmi.zhongliang");
            pinpai = IBAHelper.getIBAStringValue(part, "com.tsmi.pinpai"); 
            pinpai = pinpai == null ? "":pinpai;
            String xinghao = IBAHelper.getIBAStringValue(part, "com.tsmi.xinghao");
            //如果物料型号属性存在且型号编码不超过18位,则型号作为物料号传给erp,否则传编号
            if(xinghao != null && xinghao.length() > 0){
                if(xinghao.length() > 18){
                    bianma = part.getNumber();
                    miaoshu = part.getName() + " " + xinghao;
                }else{
                    bianma = xinghao;
                    miaoshu = part.getName() + " " + part.getNumber();
                }
            }
        }else{
            //技术部部件  重要度,产品型号
            factory = "1000";
            //重要度    01 安全 ;02 重要;03一般
        }
        String unit = part.getDefaultUnit().toString().toUpperCase();
        //调用4 toERPUnit()
        unit = toERPUnit(unit);
        log.debug("[setTableValue]bianma:" + bianma + " miaoshu:" + miaoshu + " unit:" + unit 
                 + " zhongliang:" + zhongliang + " penqimianji:" + penqimianji
                + " zhongyaodu:" + zhongyaodu + " chanpinxinghao:" + chanpinxinghao + " factory:" + factory + " pinpai:" + pinpai);
        input.setValue(bianma, "MATNR");   //物料编码
        input.setValue(miaoshu, "MAKTX");     //物料描述
        input.setValue(unit, "MEINS");         //单位
        input.setValue("Z001", "MTART");     //物料类型
        input.setValue(zhongliang, "NTGEW");     //重量
        input.setValue(penqimianji, "VOLUM");     //涂装面积
        input.setValue(zhongyaodu, "TEMPB");     //重要度
        input.setValue(chanpinxinghao, "WRKST");     //产品型号
        input.setValue("1000", "PRCTR");     //利润中心
        input.setValue(pinpai, "ZEINR");     //品牌
        input.setValue("X", "XMCNG");        //是否允许负库存
        input.setValue(factory, "WERKS");     //工厂
    }
    
    //4.
    public static String toERPUnit(String unit){
        if(unit.equals("EA")){
            return "EA";
        }else if(unit.equals("KG")){
            return "KG";
        }else if(unit.equals("M")){
            return "M";
        }else if(unit.equals("L")){
            return "L";
        }else if(unit.equals("SQ_M")){
            return "M2";
        }else if(unit.equals("MIN")){
            return "MIN";
        }else if(unit.equals("CU_M")){
            return "M3";
        }else if(unit.equals("KM")){
            return "KM";
        }else if(unit.equals("MM")){
            return "MM";
        }else if(unit.equals("CAN")){
            return "CAN";
        }else if(unit.equals("DEG")){
            return "DEG";
        }else if(unit.equals("BLANK")){
            return "EA";
        }else if(unit.equals("PC")){
            return "PC";
        }else{
            return "";
        }
    }
}
package ext.pwst.erp;

import java.util.HashMap;
import java.util.Map;

import com.sap.mw.jco.IFunctionTemplate;
import com.sap.mw.jco.JCO;

import ext.pwst.conf.ConfigUtil;

public class SAPClientUtil {
    public static JCO.Client getConnectedClient(){
        
        String clientV = ConfigUtil.getProperty("SAP_CLIENT");
        String user = ConfigUtil.getProperty("SAP_USRE");
        String pwd = ConfigUtil.getProperty("SAP_PASSWORD");
        String lang = ConfigUtil.getProperty("SAP_LANG");
        String ipAddress = ConfigUtil.getProperty("SAP_IPADDRESS");
        String sync = ConfigUtil.getProperty("SAP_SYSNR");
        
        JCO.Client client = JCO.createClient(clientV, user, pwd, lang, ipAddress, sync);
        client.connect();
        
        return client;
    }

    public static JCO.Function createFunction(String name, JCO.Client client) throws Exception {
        JCO.Repository repository = new JCO.Repository("ARAsoft", client);
        try {
            IFunctionTemplate ft = repository.getFunctionTemplate(name.toUpperCase());
            if (ft == null)
                return null;
            return ft.getFunction();
        } catch (Exception ex) {
            throw new Exception("Problem retrieving JCO.Function object.");
        }
    }
    
    public static JCO.Table callRFC(String funcName, String paramName, String paramValue, String returnTab) throws Exception{
        Map<String, String> params = new HashMap<String, String>();
        params.put(paramName, paramValue);
        
        return callRFC(funcName, params, returnTab);
    }
    
    public static JCO.Table callRFC(String funcName, String paramName, String paramValue, String returnTab, JCO.Client client) throws Exception{
        Map<String, String> params = new HashMap<String, String>();
        params.put(paramName, paramValue);
        
        return callRFC(funcName, params, returnTab, client);
    }
    
    public static JCO.Table callRFC(String funcName, Map<String, String> params, String returnTab) throws Exception{
        return callRFC(funcName, params).getTableParameterList().getTable(returnTab);
    }
    
    public static JCO.Table callRFC(String funcName, Map<String, String> params, String returnTab, JCO.Client client) throws Exception{
        return callRFC(funcName, params, client).getTableParameterList().getTable(returnTab);
    }
    
    public static JCO.Function callRFC(String funcName, Map<String, String> params) throws Exception{
        JCO.Client client = null;
        try{
            client = SAPClientUtil.getConnectedClient();
            return callRFC(funcName, params, client);
        }catch(Exception e){
            throw e;
        }finally{
            if(client != null){
                client.disconnect();
                client = null;
            }
        }
    }
    
    public static JCO.Function callRFC(String funcName, Map<String, String> params, JCO.Client client) throws Exception{
        client = SAPClientUtil.getConnectedClient();
        JCO.Function function = createFunction(funcName, client);
        JCO.ParameterList input = function.getImportParameterList();
        if(params != null){
            for(String key : params.keySet())
                input.setValue(params.get(key), key);
        }
        
        client.execute(function);
        return function;
    }
}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10099 0
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
11643 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13896 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
9161 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
4511 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
22414 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
7366 0
+关注
159
文章
3
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载