tags/yfai-pcn-ext-v1.0
王杰 12 months ago
parent f346405d5d
commit c40ecb6c16

@ -0,0 +1,18 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.pojo.mes.model.MesEquipVariableRwModel;
import cn.estsh.i3plus.pojo.mes.model.MesEquipVariableRwResult;
import io.swagger.annotations.ApiOperation;
public interface IMesEquipVariableRwExtService {
@ApiOperation(value = "读写访问地址")
MesEquipVariableRwModel getRwRequestUrl(MesEquipVariableRwModel equipVariableRwModel);
@ApiOperation(value = "写值")
MesEquipVariableRwResult writeVariable(MesEquipVariableRwModel equipVariableRwModel);
@ApiOperation(value = "读取")
MesEquipVariableRwResult readVariable(MesEquipVariableRwModel equipVariableRwModel);
}

@ -1,33 +0,0 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.pojo.mes.model.MesOpcLinkModel;
import cn.estsh.i3plus.pojo.mes.model.MesOpcLinkReturnModel;
import cn.estsh.impp.framework.boot.util.ResultBean;
import io.swagger.annotations.ApiOperation;
import java.util.List;
import java.util.Map;
/**
* @Description :
* @Reference :
* @Author :
* @CreateDate : 2024-05-29 10:37
* @Modify:
**/
public interface IWriteOPCEquipmentService {
@ApiOperation(value = "查询工单")
ResultBean doOPCEquipment(List<Map<String, Object>> listData,String xmlString);
@ApiOperation(value = "writeVariableHttp")
String writeVariableHttp(String equipmentId,String channel,String clientHandle,String v, String wsUrl)throws Exception;
@ApiOperation(value = "写值")
MesOpcLinkReturnModel writeVariable(MesOpcLinkModel mesOpcLinkModel);
@ApiOperation(value = "读取")
MesOpcLinkReturnModel readVariable(MesOpcLinkModel mesOpcLinkModel);
}

@ -1,8 +1,8 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.opc;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IWriteOPCEquipmentService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipVariableRwExtService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.pojo.mes.model.MesOpcLinkModel;
import cn.estsh.i3plus.pojo.mes.model.MesEquipVariableRwModel;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import cn.estsh.impp.framework.boot.util.ResultBean;
@ -14,27 +14,20 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description :opc
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/6/3 10:24
* @Modify:
**/
@RestController
@Api(tags = "opc")
@Api(tags = "设备数据变量读写API")
@RequestMapping(MesCommonConstant.MES_YANFEN + "/opc")
@Slf4j
public class MesOpcLinkController {
public class MesEquipVariableRwExtController {
@Autowired
private IWriteOPCEquipmentService iWriteOPCEquipmentService;
private IMesEquipVariableRwExtService equipVariableRwExtService;
@PostMapping("/write-variable")
@ApiOperation(value = "写值")
public ResultBean writeVariable(MesOpcLinkModel mesOpcLinkModel) {
public ResultBean writeVariable(MesEquipVariableRwModel mesOpcLinkModel) {
try {
return ResultBean.success("执行成功").setResultObject(iWriteOPCEquipmentService.writeVariable(mesOpcLinkModel));
return ResultBean.success("操作成功").setResultObject(equipVariableRwExtService.writeVariable(mesOpcLinkModel));
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
@ -44,9 +37,9 @@ public class MesOpcLinkController {
@PostMapping("/read-variable")
@ApiOperation(value = "读值")
public ResultBean readVariable(MesOpcLinkModel mesOpcLinkModel) {
public ResultBean readVariable(MesEquipVariableRwModel mesOpcLinkModel) {
try {
return ResultBean.success("执行成功").setResultObject(iWriteOPCEquipmentService.readVariable(mesOpcLinkModel));
return ResultBean.success("读取成功").setResultObject(equipVariableRwExtService.readVariable(mesOpcLinkModel));
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {

@ -0,0 +1,118 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.equiplog;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipVariableRwExtService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.api.iservice.base.IConfigService;
import cn.estsh.i3plus.platform.common.tool.HttpClientTool;
import cn.estsh.i3plus.platform.common.tool.JsonUtilTool;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesConfig;
import cn.estsh.i3plus.pojo.mes.model.MesEquipVariableRwModel;
import cn.estsh.i3plus.pojo.mes.model.MesEquipVariableRwResult;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
@Service
public class MesEquipmentRwExtServiceImpl implements IMesEquipVariableRwExtService {
@Autowired
private IConfigService configService;
@Override
public MesEquipVariableRwModel getRwRequestUrl(MesEquipVariableRwModel equipVariableRwModel) {
if (StringUtils.isEmpty(equipVariableRwModel.getOrganizeCode())) return equipVariableRwModel;
//根据cfgCode查询缓存的配置数据
List<MesConfig> configList = configService.doCachedConfigList(MesPcnExtConstWords.EQUIP_VARIABLE_RW_CFG, equipVariableRwModel.getOrganizeCode());
//根据设备标识分组
Map<String, List<MesConfig>> requestUrlMap = getConfigMap(configList, MesPcnExtConstWords.KEPWARE_FLAG_CFG);
//根据读写标志分组
Map<String, List<MesConfig>> rwApiMap = getConfigMap(configList, MesPcnExtConstWords.RW_API_CFG);
if (CollectionUtils.isEmpty(requestUrlMap) || CollectionUtils.isEmpty(rwApiMap)) return equipVariableRwModel;
if (!rwApiMap.containsKey(MesExtEnumUtil.READ_WRITE_FLAG.READ.getValueStr()) || !rwApiMap.containsKey(MesExtEnumUtil.READ_WRITE_FLAG.WRITE.getValueStr())) return equipVariableRwModel;
List<MesConfig> requestUrlList = (StringUtils.isEmpty(equipVariableRwModel.getKepwareFlag()) || !requestUrlMap.containsKey(equipVariableRwModel.getKepwareFlag())) ? requestUrlMap.get(MesPcnExtConstWords.DEFAULT_URL) : requestUrlMap.get(equipVariableRwModel.getKepwareFlag());
if (CollectionUtils.isEmpty(requestUrlList)) return equipVariableRwModel;
//赋值读/写访问地址
return equipVariableRwModel.readRequestUrl(requestUrlList.get(0).getCfgValue() + rwApiMap.get(MesExtEnumUtil.READ_WRITE_FLAG.READ.getValueStr()).get(0).getCfgValue()).
writeRequestUrl(requestUrlList.get(0).getCfgValue() + rwApiMap.get(MesExtEnumUtil.READ_WRITE_FLAG.WRITE.getValueStr()).get(0).getCfgValue());
}
private Map<String, List<MesConfig>> getConfigMap(List<MesConfig> configList, String cfgType) {
List<MesConfig> filterList = CollectionUtils.isEmpty(configList) ? null :
configList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getCfgType()) && !StringUtils.isEmpty(o.getCfgKey()) && o.getCfgType().equals(MesPcnExtConstWords.RW_API_CFG))).collect(Collectors.toList());
return CollectionUtils.isEmpty(filterList) ? null : filterList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesConfig::getCfgKey));
}
@Override
public MesEquipVariableRwResult writeVariable(MesEquipVariableRwModel equipVariableRwModel) {
MesEquipVariableRwResult result = checkBefore(equipVariableRwModel);
if (!result.getIsSuccessed()) return result;
if (StringUtils.isEmpty(equipVariableRwModel.getValue())) return new MesEquipVariableRwResult(false).message("入参缺失必要参数[value]!");
Map<String, String> params = new HashMap<>();
params.put(MesPcnExtConstWords.VALUE, equipVariableRwModel.getValue());
params.put(MesPcnExtConstWords.CLIENT_HANDLE, equipVariableRwModel.getClientHandle());
params.put(MesPcnExtConstWords.CHANNEL, equipVariableRwModel.getChannel());
params.put(MesPcnExtConstWords.EQUIPMENT_ID, equipVariableRwModel.getEquipId());
String data = HttpClientTool.doHttpUrl(CommonEnumUtil.HTTP_METHOD_TYPE.POST, false, equipVariableRwModel.getWriteRequestUrl(), params, null, null);
if (!StringUtils.isEmpty(data)) return JsonUtilTool.decode(data, MesEquipVariableRwResult.class);
else return result.isSuccessed(false).message(String.format("设备数据变量写值失败! 数据信息:[%s]", JSONObject.toJSONString(equipVariableRwModel)));
}
private MesEquipVariableRwResult checkBefore(MesEquipVariableRwModel equipVariableRwModel) {
if (null == equipVariableRwModel) return new MesEquipVariableRwResult(false).message("入参为空!");
if (StringUtils.isEmpty(equipVariableRwModel.getOrganizeCode()) || StringUtils.isEmpty(equipVariableRwModel.getChannel()) || StringUtils.isEmpty(equipVariableRwModel.getEquipId()) || StringUtils.isEmpty(equipVariableRwModel.getClientHandle()))
return new MesEquipVariableRwResult(false).message("入参缺失必要参数,请检查参数[organizeCode][channel][equipId][clientHandle]是否缺失!");
if (StringUtils.isEmpty(equipVariableRwModel.getWriteRequestUrl()) || StringUtils.isEmpty(equipVariableRwModel.getReadRequestUrl())) getRwRequestUrl(equipVariableRwModel);
if (StringUtils.isEmpty(equipVariableRwModel.getWriteRequestUrl()) || StringUtils.isEmpty(equipVariableRwModel.getReadRequestUrl()))
return new MesEquipVariableRwResult(false).message(String.format("工厂[%s]缺失系统配置信息[%s]!", equipVariableRwModel.getOrganizeCode(), MesPcnExtConstWords.EQUIP_VARIABLE_RW_CFG));
return new MesEquipVariableRwResult(true);
}
@Override
public MesEquipVariableRwResult readVariable(MesEquipVariableRwModel equipVariableRwModel) {
MesEquipVariableRwResult result = checkBefore(equipVariableRwModel);
if (!result.getIsSuccessed()) return result;
Map<String, String> params = new HashMap<>();
params.put(MesPcnExtConstWords.CLIENT_HANDLE, equipVariableRwModel.getClientHandle());
params.put(MesPcnExtConstWords.CHANNEL, equipVariableRwModel.getChannel());
params.put(MesPcnExtConstWords.EQUIPMENT_ID, equipVariableRwModel.getEquipId());
String data = HttpClientTool.doHttpUrl(CommonEnumUtil.HTTP_METHOD_TYPE.POST, false, equipVariableRwModel.getReadRequestUrl(), params, null, null);
if (!StringUtils.isEmpty(data)) return JsonUtilTool.decode(data, MesEquipVariableRwResult.class);
else return result.isSuccessed(false).message(String.format("设备数据变量读值失败! 数据信息:[%s]", JSONObject.toJSONString(equipVariableRwModel)));
}
}

@ -1,240 +0,0 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.equiplog;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IWriteOPCEquipmentService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.api.iservice.base.IConfigService;
import cn.estsh.i3plus.mes.pcn.util.datatable.DataColumnCollection;
import cn.estsh.i3plus.platform.common.tool.HttpClientTool;
import cn.estsh.i3plus.platform.common.tool.JsonUtilTool;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.WmsEnumUtil;
import cn.estsh.i3plus.pojo.base.util.StringUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesConfig;
import cn.estsh.i3plus.pojo.mes.model.MesOpcLinkModel;
import cn.estsh.i3plus.pojo.mes.model.MesOpcLinkReturnModel;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.util.ResultBean;
import cn.hutool.json.XML;
import com.alibaba.excel.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* @Description : WriteOPCEquipmentServiceImpl
* @Author :gsz
* @Date 2024/5/29 10:48
* @Modify
**/
@Slf4j
@Service("WriteOPCEquipmentServiceImpl")
public class WriteOPCEquipmentServiceImpl implements IWriteOPCEquipmentService {
@Autowired
private IConfigService configService;
@Override
public ResultBean doOPCEquipment(List<Map<String, Object>> listData,String xmlString) {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
// headers.setContentType(MediaType.APPLICATION_JSON_UTF8); //application/soap+xml;charset=UTF-8
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
cn.hutool.json.JSONObject jsonObjectParam = XML.toJSONObject(xmlString);
String content = jsonObjectParam.toString();
HttpEntity<String> request = new HttpEntity<>(content, headers);
String url = String.format("http://172.28.16.50:8111/WriteOPCEquipmentService" );
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);
if (response.getStatusCode().is2xxSuccessful()) {
String bodyJson = response.getBody();
JSONObject jsonObject = JSON.parseObject(bodyJson);
if ("0" == jsonObject.getString("code")) {
return new ResultBean(WmsEnumUtil.RC_RESPONSE_TIPS.OK.getCodeStatus(),
"OK");
} else {
throw new ImppBusiException(String.format("Error message【%s】", jsonObject.getString("message")));
}
} else {
throw new ImppBusiException(String.format("Error Code %s", response.getStatusCode().toString()));
}
}
@Override
public String writeVariableHttp(String equipmentId,String channel,String clientHandle,String v, String wsUrl)throws Exception{
//服务的地址 http://172.28.16.50:8111
wsUrl="http://172.28.16.50:8111";
URL url = new URL(wsUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8");
//请求体---使用soapui获取
StringBuffer sb = new StringBuffer();
sb.append("<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:tem=\"http://tempuri.org/\">");
sb.append("<soap:Header>");
sb.append("<a:To s:mustUnderstand=\"1\" xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:a=\"http://www.w3.org/2005/08/addressing\">http://172.28.16.50:8111/WriteOPCEquipmentService</a:To>\n");
sb.append("</soap:Header>");
sb.append("<soap:Body>");
sb.append("<tem:WriteVariable>");
sb.append("<tem:equipmentId>"+equipmentId+"</tem:equipmentId>");
sb.append("<tem:channel>"+channel+"</tem:channel>");
sb.append("<tem:clientHandle>"+clientHandle+ "</tem:clientHandle>");
sb.append("<tem:v>"+v+"</tem:v>");
sb.append("</tem:WriteVariable>");
sb.append("</soap:Body>");
sb.append("</soap:Envelope>");
String soap = sb.toString();
conn.connect();
OutputStream os = conn.getOutputStream();
os.write(soap.getBytes("UTF-8"));
InputStream is = conn.getInputStream();
byte[] b = new byte[1024];
int len = 0;
String s = "";
while ((len = is.read(b)) != -1) {
String ss = new String(b, 0, len, "UTF-8");
s += ss;
}
is.close();
os.close();
conn.disconnect();
return s;
}
@Override
public MesOpcLinkReturnModel writeVariable(MesOpcLinkModel mesOpcLinkModel) {
MesConfig mesConfigByCfgCode = configService.getMesConfigByCfgCode(MesPcnExtConstWords.OPC_LINK_URL);
if (Objects.isNull(mesConfigByCfgCode) || StringUtil.isEmpty(mesConfigByCfgCode.getCfgValue())) {
MesPcnException.throwFlowException("系统参数【%s】未维护",MesPcnExtConstWords.OPC_LINK_URL);
}
String requestUrl = mesConfigByCfgCode.getCfgValue() + MesPcnExtConstWords.OPC_WRITE_VARIABLE;
Map<String, String> params = new HashMap<>();
params.put(MesPcnExtConstWords.VALUE, mesOpcLinkModel.getValue());
params.put(MesPcnExtConstWords.CLIENT_HANDLE, mesOpcLinkModel.getClientHandle());
params.put(MesPcnExtConstWords.CHANNEL, mesOpcLinkModel.getChannel());
params.put(MesPcnExtConstWords.EQUIPMENT_ID, mesOpcLinkModel.getEquipmentId());
String data = HttpClientTool.doHttpUrl(CommonEnumUtil.HTTP_METHOD_TYPE.POST, false, requestUrl, params, null, null);
MesOpcLinkReturnModel returnModel = null;
if (!StringUtils.isEmpty(data)) {
returnModel = JsonUtilTool.decode(data, MesOpcLinkReturnModel.class);
} else {
log.error("HTTP[{}]调用opcLink写值接口失败", requestUrl);
}
return returnModel;
}
@Override
public MesOpcLinkReturnModel readVariable(MesOpcLinkModel mesOpcLinkModel) {
MesConfig mesConfigByCfgCode = configService.getMesConfigByCfgCode(MesPcnExtConstWords.OPC_LINK_URL);
if (Objects.isNull(mesConfigByCfgCode) || StringUtil.isEmpty(mesConfigByCfgCode.getCfgValue())) {
MesPcnException.throwFlowException("系统参数【%s】未维护",MesPcnExtConstWords.OPC_LINK_URL);
}
String requestUrl = mesConfigByCfgCode.getCfgValue() + MesPcnExtConstWords.OPC_READ_VARIABLE;
Map<String, String> params = new HashMap<>();
params.put(MesPcnExtConstWords.VALUE, mesOpcLinkModel.getValue());
params.put(MesPcnExtConstWords.CLIENT_HANDLE, mesOpcLinkModel.getClientHandle());
params.put(MesPcnExtConstWords.CHANNEL, mesOpcLinkModel.getChannel());
params.put(MesPcnExtConstWords.EQUIPMENT_ID, mesOpcLinkModel.getEquipmentId());
String data = HttpClientTool.doHttpUrl(CommonEnumUtil.HTTP_METHOD_TYPE.POST, false, requestUrl, params, null, null);
MesOpcLinkReturnModel returnModel = null;
if (!StringUtils.isEmpty(data)) {
returnModel = JsonUtilTool.decode(data, MesOpcLinkReturnModel.class);
} else {
log.error("HTTP[{}]调用opcLink读取接口失败", requestUrl);
}
return returnModel;
}
private String convertListToXml(DataColumnCollection newTable, List<Map<String, Object>> listData, String rootNodeName, String nodeName,
String rootClassName, String nodeClassName) {
if (listData == null || listData.size() == 0) {
throw new RuntimeException("listData is null ! ");
}
StringBuilder sb = new StringBuilder();
if (rootNodeName != null && !rootNodeName.isEmpty() && rootClassName != null && !rootClassName.isEmpty()) {
sb.append(String.format("<%s class=\"%s\">\n", rootNodeName, rootClassName));
}
for (Map<String, Object> row : listData) {
// 子节点的类名可能为空,这种情况下不需要填充类名
if (StringUtils.isEmpty(nodeClassName)) {
sb.append(String.format("<%s>\n", nodeName));
} else {
sb.append(String.format("<%s class=\"%s\">\n", nodeName, nodeClassName));
}
newTable.forEach( s ->
sb.append(String.format("<%s>%s</%s>\n", s, row.get(s.getColumnName()), s))
);
sb.append(String.format("</%s>\n", nodeName));
}
if (rootNodeName != null && !rootNodeName.isEmpty()) {
sb.append(String.format("</%s>\n", rootNodeName));
}
return sb.toString();
}
// private HashMap<String,String> getData(String serviceCode, String xmlPara){
// HashMap<String,String> res = new HashMap<>();
// String endpoint = "http://124.205.248.2:8080/eSales/esales.asmx?WSDL";
// PostMethod postMethod = new PostMethod(endpoint);
// byte[] b;
// try {
// b = xmlPara.getBytes("utf-8");
// InputStream is = new ByteArrayInputStream(b,0,b.length);
// RequestEntity re = new InputStreamRequestEntity(is,b.length,"application/soap+xml; charset=utf-8");
// //把Soap请求数据添加到PostMethod中
// postMethod.setRequestEntity(re);
//
// //生成一个HttpClient对象并发出postMethod请求
// HttpClient httpClient = new HttpClient();
// int statusCode = httpClient.executeMethod(postMethod);
// if(200==statusCode){
// String getServerData = postMethod.getResponseBodyAsString();
// //System.out.println("----->"+getServerData);
// //获取返回值状态标识标识为0成功非0失败
// res.put("status", "0");
// res.put("msg", msg);
// }
// } catch (Exception e) {
// res.put("status", "1");
// res.put("msg", e.toString());
// e.printStackTrace();
// }
// return res;
// }
}

@ -108,6 +108,14 @@ public class MesPcnExtConstWords {
public static final String CUST_SN = "custSn";
//设备数据变量读写访问配置
public static final String EQUIP_VARIABLE_RW_CFG = "EQUIP_VARIABLE_RW_CFG";
//kepware标识
public static final String KEPWARE_FLAG_CFG = "KEPWARE_FLAG_CFG";
//默认URL
public static final String DEFAULT_URL = "DEFAULT_URL";
//读写API
public static final String RW_API_CFG = "RW_API_CFG";
// 空腔码
public static final String CAVITY_FINISH_CODE = "CAVITY_FINISH_CODE";

Loading…
Cancel
Save