package com.java110.common.smartMeter.factory.tqdianbiao; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.java110.common.smartMeter.ISmartMeterCoreRead; import com.java110.common.smartMeter.ISmartMeterFactoryAdapt; import com.java110.core.factory.GenerateCodeFactory; import com.java110.dto.meter.MeterMachineDto; import com.java110.dto.meter.MeterMachineDetailDto; import com.java110.dto.meter.MeterMachineSpecDto; import com.java110.intf.common.IMeterMachineDetailV1InnerServiceSMO; import com.java110.intf.common.IMeterMachineSpecV1InnerServiceSMO; import com.java110.intf.common.IMeterMachineV1InnerServiceSMO; import com.java110.intf.user.IUserInnerServiceSMO; import com.java110.po.meter.MeterMachineDetailPo; import com.java110.utils.cache.UrlCache; import com.java110.vo.ResultVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; /* 拓强智能电表 处理类 -- 5.1 单项单费率抄表 http://doc-api.tqdianbiao.com/#/api2/6/2/1 */ @Service("tqDianBiaoDanxiangDanFeiLvFactoryAdaptImpl") public class TqDianBiaoDanxiangDanFeiLvFactoryAdaptImpl implements ISmartMeterFactoryAdapt { private static final String READ_URL = "http://api2.tqdianbiao.com/Api_v2/ele_read"; private static final String NOTIFY_URL = "/app/smartMeter/notify/a"; @Autowired private IMeterMachineSpecV1InnerServiceSMO meterMachineSpecV1InnerServiceSMOImpl; @Autowired private IMeterMachineV1InnerServiceSMO meterMachineV1InnerServiceSMOImpl; @Autowired private IMeterMachineDetailV1InnerServiceSMO meterMachineDetailV1InnerServiceSMOImpl; @Autowired private IUserInnerServiceSMO userInnerServiceSMOImpl; @Autowired private ISmartMeterCoreRead smartMeterCoreReadImpl; @Override public ResultVo requestRecharge(MeterMachineDto meterMachineDto, double degree,double money) { return new ResultVo(ResultVo.CODE_ERROR, "单项单费率 不支持充值"); } @Override public ResultVo requestRead(MeterMachineDto meterMachineDto) { List> req = new ArrayList<>(); MeterMachineSpecDto meterMachineSpecDto = new MeterMachineSpecDto(); meterMachineSpecDto.setMachineId(meterMachineDto.getMachineId()); meterMachineSpecDto.setCommunityId(meterMachineDto.getCommunityId()); meterMachineSpecDto.setSpecId("120102"); List meterMachineSpecDtos = meterMachineSpecV1InnerServiceSMOImpl.queryMeterMachineSpecs(meterMachineSpecDto); if (meterMachineSpecDtos == null || meterMachineSpecDtos.size() < 1) { return new ResultVo(ResultVo.CODE_ERROR, "未配置采集器ID"); } String detailId = GenerateCodeFactory.getGeneratorId("11"); Map item = new HashMap<>(); item.put("opr_id", detailId); item.put("time_out", 0); item.put("must_online", true); item.put("retry_times", 1); item.put("cid", meterMachineSpecDtos.get(0).getSpecValue()); item.put("address", meterMachineDto.getAddress()); item.put("type", 3); req.add(item); List meterMachineDetailPos = new ArrayList<>(); MeterMachineDetailPo meterMachineDetailPo = new MeterMachineDetailPo(); meterMachineDetailPo.setCommunityId(meterMachineDto.getCommunityId()); meterMachineDetailPo.setDetailId(detailId); meterMachineDetailPo.setMachineId(meterMachineDto.getMachineId()); meterMachineDetailPo.setDetailType(meterMachineDto.getMachineModel()); // 抄表 meterMachineDetailPo.setCurDegrees(meterMachineDto.getCurDegrees()); meterMachineDetailPo.setCurReadingTime(meterMachineDto.getCurReadingTime()); meterMachineDetailPo.setPrestoreDegrees(meterMachineDto.getPrestoreDegrees()); meterMachineDetailPo.setState(MeterMachineDetailDto.STATE_W); meterMachineDetailPos.add(meterMachineDetailPo); String request_content = JSON.toJSONString(req); String resStr = TdDianBiaoUtil.requestAsync(READ_URL, request_content, UrlCache.getOwnerUrl() + NOTIFY_URL); JSONObject paramOut = JSONObject.parseObject(resStr); if (!"SUCCESS".equals(paramOut.getString("status"))) { return new ResultVo(ResultVo.CODE_ERROR, paramOut.getString("error_msg")); } JSONArray responseContent = paramOut.getJSONArray("response_content"); for (int resIndex = 0; resIndex < responseContent.size(); resIndex++) { String status = responseContent.getJSONObject(resIndex).getString("status"); if (!"SUCCESS".equals(status)) { return new ResultVo(ResultVo.CODE_ERROR, responseContent.getJSONObject(resIndex).getString("error_msg")); } } if (meterMachineDetailPos.size() > 0) { meterMachineDetailV1InnerServiceSMOImpl.saveMeterMachineDetails(meterMachineDetailPos); } return new ResultVo(ResultVo.CODE_OK, "请求已发送,等待电表反馈数据"); } @Override public ResultVo requestReads(List meterMachineDtos) { List> req = new ArrayList<>(); List meterMachineDetailPos = new ArrayList<>(); String detailId = ""; for (MeterMachineDto meterMachineDto : meterMachineDtos) { MeterMachineSpecDto meterMachineSpecDto = new MeterMachineSpecDto(); meterMachineSpecDto.setMachineId(meterMachineDto.getMachineId()); meterMachineSpecDto.setCommunityId(meterMachineDto.getCommunityId()); meterMachineSpecDto.setSpecId("120102"); List meterMachineSpecDtos = meterMachineSpecV1InnerServiceSMOImpl.queryMeterMachineSpecs(meterMachineSpecDto); if (meterMachineSpecDtos == null || meterMachineSpecDtos.size() < 1) { continue; } detailId = GenerateCodeFactory.getGeneratorId("11"); Map item = new HashMap<>(); item.put("opr_id", detailId); item.put("time_out", 0); item.put("must_online", true); item.put("retry_times", 1); item.put("cid", meterMachineSpecDtos.get(0).getSpecValue()); item.put("address", meterMachineDto.getAddress()); item.put("type", 3); req.add(item); MeterMachineDetailPo meterMachineDetailPo = new MeterMachineDetailPo(); meterMachineDetailPo.setCommunityId(meterMachineDto.getCommunityId()); meterMachineDetailPo.setDetailId(detailId); meterMachineDetailPo.setMachineId(meterMachineDto.getMachineId()); meterMachineDetailPo.setDetailType(meterMachineDto.getMachineModel()); // 抄表 meterMachineDetailPo.setCurDegrees(meterMachineDto.getCurDegrees()); meterMachineDetailPo.setCurReadingTime(meterMachineDto.getCurReadingTime()); meterMachineDetailPo.setPrestoreDegrees(meterMachineDto.getPrestoreDegrees()); meterMachineDetailPo.setState(MeterMachineDetailDto.STATE_W); meterMachineDetailPos.add(meterMachineDetailPo); } String request_content = JSON.toJSONString(req); String resStr = TdDianBiaoUtil.requestAsync(READ_URL, request_content, UrlCache.getOwnerUrl() + NOTIFY_URL); JSONObject paramOut = JSONObject.parseObject(resStr); if (!"SUCCESS".equals(paramOut.getString("status"))) { return new ResultVo(ResultVo.CODE_ERROR, paramOut.getString("error_msg")); } JSONArray responseContent = JSONArray.parseArray(paramOut.getString("response_content")); for (int resIndex = 0; resIndex < responseContent.size(); resIndex++) { String status = responseContent.getJSONObject(resIndex).getString("status"); if (!"SUCCESS".equals(status)) { return new ResultVo(ResultVo.CODE_ERROR, responseContent.getJSONObject(resIndex).getString("error_msg")); } } if (meterMachineDetailPos.size() > 0) { meterMachineDetailV1InnerServiceSMOImpl.saveMeterMachineDetails(meterMachineDetailPos); } return new ResultVo(ResultVo.CODE_OK, "请求已发送,等待电表反馈数据"); } /** * 抄表异步通知 * * @param readData * @return */ @Override public ResultVo notifyReadData(String readData) { JSONObject data = JSONObject.parseObject(readData); String response_content = data.getString("response_content"); String timestamp = data.getString("timestamp"); String sign = data.getString("sign"); // 验签 if (!TdDianBiaoUtil.checkSign(response_content, timestamp, sign)) { System.out.println("sign check failed"); return new ResultVo(ResultVo.CODE_ERROR, "鉴权失败"); } JSONArray contentArray = JSON.parseArray(response_content); if (contentArray == null || contentArray.size() < 1) { return new ResultVo(ResultVo.CODE_ERROR, "没有数据"); } MeterMachineDetailDto meterMachineDetailDto = new MeterMachineDetailDto(); meterMachineDetailDto.setDetailId(contentArray.getJSONObject(0).getString("opr_id")); meterMachineDetailDto.setState(MeterMachineDetailDto.STATE_W); List meterMachineDetailDtos = meterMachineDetailV1InnerServiceSMOImpl.queryMeterMachineDetails(meterMachineDetailDto); if (meterMachineDetailDtos == null || meterMachineDetailDtos.size() < 1) { return new ResultVo(ResultVo.CODE_ERROR, "没有数据"); } String batchId = smartMeterCoreReadImpl.generatorBatch(meterMachineDetailDtos.get(0).getCommunityId()); for (int i = 0; i < contentArray.size(); ++i) { try { JSONObject contentObject = contentArray.getJSONObject(i); doBusiness(contentObject, batchId); } catch (Exception e) { e.printStackTrace(); } } return new ResultVo(ResultVo.CODE_OK, "成功"); } private void doBusiness(JSONObject contentObject, String batchId) { MeterMachineDetailDto meterMachineDetailDto; meterMachineDetailDto = new MeterMachineDetailDto(); meterMachineDetailDto.setDetailId(contentObject.getString("opr_id")); meterMachineDetailDto.setState(MeterMachineDetailDto.STATE_W); List meterMachineDetailDtos = meterMachineDetailV1InnerServiceSMOImpl.queryMeterMachineDetails(meterMachineDetailDto); if (meterMachineDetailDtos == null || meterMachineDetailDtos.size() < 1) { return; } if (!"SUCCESS".equals(contentObject.getString("status"))) { return; } double degree = contentObject.getJSONArray("data").getJSONObject(0).getJSONArray("value").getDouble(0); smartMeterCoreReadImpl.saveMeterAndCreateFee(meterMachineDetailDtos.get(0), degree + "", batchId); } }