java110-bean/src/main/java/com/java110/dto/community/CommunityAttrDto.java
@@ -15,6 +15,9 @@ **/ public class CommunityAttrDto extends PageDto implements Serializable { public static final String SPEC_CD_GOV = "9329000004"; public static final String SPEC_CD_GOV_SECURE = "8329000004"; private String attrId; private String communityId; private String specCd; java110-bean/src/main/java/com/java110/dto/reportData/ReportDataDto.java
New file @@ -0,0 +1,28 @@ package com.java110.dto.reportData; import com.alibaba.fastjson.JSONObject; import java.io.Serializable; public class ReportDataDto implements Serializable { private ReportDataHeaderDto reportDataHeaderDto; private JSONObject reportDataBodyDto; public ReportDataHeaderDto getReportDataHeaderDto() { return reportDataHeaderDto; } public void setReportDataHeaderDto(ReportDataHeaderDto reportDataHeaderDto) { this.reportDataHeaderDto = reportDataHeaderDto; } public JSONObject getReportDataBodyDto() { return reportDataBodyDto; } public void setReportDataBodyDto(JSONObject reportDataBodyDto) { this.reportDataBodyDto = reportDataBodyDto; } } java110-bean/src/main/java/com/java110/dto/reportData/ReportDataHeaderDto.java
New file @@ -0,0 +1,95 @@ package com.java110.dto.reportData; import java.io.Serializable; public class ReportDataHeaderDto implements Serializable { public static final int CODE_SUCCESS = 0; public static final int CODE_ERROR = -1; public static final String MSG_SUCCESS= "成功"; public static final String MSG_ERROR= "系统错误"; public static final String RETUR_CODE= "1001"; //已发送 public static final String RETUR_SUCCESS_CODE= "2002"; //处理成功 public static final String RETUR_ERROR_CODE= "3003";//处理失败 public static final String RETUR_AGAIN_CODE= "4004";//重新发送 public static final String SYSTEM_COMMUNITY_TYPE= "777777"; public static final String SYSTEM_GOV_TYPE= "999999"; //暂时写死建筑物类型 一个ID 为612021083132790001 住宅 public static final String SYSTEM_FLOOR_TYPE= "612021083132790001"; private String serviceCode; private String tranId; private String reqTime; private String sign; private String resTime; private int code; private String msg; private String extCommunityId; public String getServiceCode() { return serviceCode; } public void setServiceCode(String serviceCode) { this.serviceCode = serviceCode; } public String getTranId() { return tranId; } public void setTranId(String tranId) { this.tranId = tranId; } public String getReqTime() { return reqTime; } public void setReqTime(String reqTime) { this.reqTime = reqTime; } public String getSign() { return sign; } public void setSign(String sign) { this.sign = sign; } public String getResTime() { return resTime; } public void setResTime(String resTime) { this.resTime = resTime; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public String getExtCommunityId() { return extCommunityId; } public void setExtCommunityId(String extCommunityId) { this.extCommunityId = extCommunityId; } } java110-core/src/main/java/com/java110/core/factory/AuthenticationFactory.java
@@ -11,6 +11,8 @@ import com.auth0.jwt.interfaces.DecodedJWT; import com.java110.core.context.ApiDataFlow; import com.java110.core.context.DataFlow; import com.java110.dto.reportData.ReportDataDto; import com.java110.dto.reportData.ReportDataHeaderDto; import com.java110.utils.cache.JWTCache; import com.java110.utils.cache.MappingCache; import com.java110.utils.constant.CommonConstant; @@ -380,6 +382,31 @@ } /** * md5签名 * * @param reportDataDto * @return */ public static void authReportDataSign(ReportDataDto reportDataDto, String code) throws NoAuthorityException { ReportDataHeaderDto reportDataHeaderDto = reportDataDto.getReportDataHeaderDto(); if (reportDataHeaderDto == null) { throw new IllegalArgumentException("参数错误"); } String newSign = md5(reportDataHeaderDto.getTranId() + reportDataHeaderDto.getReqTime() + reportDataDto.getReportDataBodyDto().toJSONString() + code).toLowerCase(); if (!newSign.equals(reportDataHeaderDto.getSign())) { throw new IllegalArgumentException("签名失败"); } } public static void generatorReportDataSign(ReportDataDto reportDataDto, String code) { ReportDataHeaderDto reportDataHeaderDto = reportDataDto.getReportDataHeaderDto(); if (reportDataHeaderDto == null) { throw new IllegalArgumentException("参数错误"); } String newSign = md5(reportDataHeaderDto.getTranId() + reportDataHeaderDto.getReqTime() + reportDataDto.getReportDataBodyDto().toJSONString() + code).toLowerCase(); reportDataHeaderDto.setSign(newSign); } /** * 加载公钥 * * @param publicPemData java110-db/src/main/resources/mapper/community/CommunityServiceDaoImplMapper.xml
@@ -143,6 +143,12 @@ <if test="communityId != null and communityId !=''"> and sa.community_id = #{communityId} </if> <if test="specCd != null and specCd !=''"> and sa.spec_cd = #{specCd} </if> <if test="value != null and value !=''"> and sa.value = #{value} </if> <if test="communityIds != null "> and sa.community_id in <foreach collection="communityIds" item="item" index="index" open="(" close=")" separator=","> java110-interface/src/main/java/com/java110/intf/community/IFloorAttrInnerServiceSMO.java
@@ -50,4 +50,12 @@ */ @RequestMapping(value = "/saveFloorAttr", method = RequestMethod.POST) int saveFloorAttr(@RequestBody FloorAttrPo floorAttrPo); /** * 保存 楼栋属性 * * @param floorAttrPo 数据对象分享 * @return 小区下的小区楼记录数 */ @RequestMapping(value = "/updateFloorAttrInfoInstance", method = RequestMethod.POST) int updateFloorAttrInfoInstance(@RequestBody FloorAttrPo floorAttrPo); } service-community/src/main/java/com/java110/community/dao/IFloorAttrServiceDao.java
@@ -67,7 +67,7 @@ * @param info 修改信息 * @throws DAOException DAO异常 */ void updateFloorAttrInfoInstance(Map info) throws DAOException; int updateFloorAttrInfoInstance(Map info) throws DAOException; /** service-community/src/main/java/com/java110/community/dao/impl/FloorAttrServiceDaoImpl.java
@@ -102,7 +102,7 @@ * @throws DAOException DAO异常 */ @Override public void updateFloorAttrInfoInstance(Map info) throws DAOException { public int updateFloorAttrInfoInstance(Map info) throws DAOException { logger.debug("修改考勤班组属性信息Instance 入参 info : {}", info); int saveFlag = sqlSessionTemplate.update("floorAttrServiceDaoImpl.updateFloorAttrInfoInstance", info); @@ -110,6 +110,7 @@ if (saveFlag < 1) { throw new DAOException(ResponseConstant.RESULT_PARAM_ERROR, "修改考勤班组属性信息Instance数据失败:" + JSONObject.toJSONString(info)); } return saveFlag; } /** service-community/src/main/java/com/java110/community/smo/impl/FloorAttrInnerServiceSMOImpl.java
@@ -56,6 +56,11 @@ return floorAttrServiceDaoImpl.saveFloorAttr(BeanConvertUtil.beanCovertMap(floorAttrPo)); } @Override public int updateFloorAttrInfoInstance(@RequestBody FloorAttrPo floorAttrPo) { return floorAttrServiceDaoImpl.updateFloorAttrInfoInstance(BeanConvertUtil.beanCovertMap(floorAttrPo)); } public IFloorAttrServiceDao getFloorAttrServiceDaoImpl() { return floorAttrServiceDaoImpl; } service-job/src/main/java/com/java110/job/adapt/hcGov/IReportReturnDataAdapt.java
New file @@ -0,0 +1,7 @@ package com.java110.job.adapt.hcGov; import com.java110.dto.reportData.ReportDataDto; public interface IReportReturnDataAdapt { void reportReturn(ReportDataDto reportDataDto, String extCommunityId); } service-job/src/main/java/com/java110/job/adapt/hcGov/asyn/BaseHcGovSendAsyn.java
@@ -6,6 +6,9 @@ public JSONObject createHeadersOrBody(JSONObject body,String extCommunityId,String serviceCode,String secure); public void saveHcGovLog(JSONObject paramIn,String communityId,String topic,String objId,String secure); public void updateHcGovLog(JSONObject paramIn); public void sendKafka(String topic,JSONObject massage,String communityId,String objId,String secure); } service-job/src/main/java/com/java110/job/adapt/hcGov/asyn/impl/BaseHcGovSendAsynImpl.java
@@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONObject; import com.java110.core.factory.GenerateCodeFactory; import com.java110.dto.reportData.ReportDataHeaderDto; import com.java110.intf.common.IHcGovTranslateDetailInnerServiceSMO; import com.java110.intf.common.IHcGovTranslateInnerServiceSMO; import com.java110.job.adapt.hcGov.HcGovConstant; @@ -38,7 +39,7 @@ } protected void saveHcGovLog(JSONObject paramIn,String communityId,String topic,String objId,String secure) { public void saveHcGovLog(JSONObject paramIn,String communityId,String topic,String objId,String secure) { Assert.hasKeyAndValue(paramIn, "header", "请求报文中未包含header"); Assert.hasKeyAndValue(paramIn, "body", "请求报文中未包含body"); JSONObject heard = paramIn.getJSONObject("header"); @@ -56,7 +57,7 @@ hcGovTranslatePo.setReqTime(heard.getString("reqTime")); hcGovTranslatePo.setServiceCode(heard.getString("serviceCode")); hcGovTranslatePo.setSign(heard.getString("sign")); hcGovTranslatePo.setState("1001"); hcGovTranslatePo.setState(ReportDataHeaderDto.RETUR_CODE); hcGovTranslatePo.setUpdateTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); hcGovTranslatePo.setRemark("物业系统自动推送楼栋信息到政务系统"); int flag = hcGovTranslateInnerServiceSMOImpl.saveHcGovTranslate(hcGovTranslatePo); @@ -74,6 +75,33 @@ } } public void updateHcGovLog(JSONObject paramIn) { Assert.hasKeyAndValue(paramIn, "header", "请求报文中未包含header"); Assert.hasKeyAndValue(paramIn, "body", "请求报文中未包含body"); JSONObject heard = paramIn.getJSONObject("header"); JSONObject body = paramIn.getJSONObject("body"); HcGovTranslatePo hcGovTranslatePo = new HcGovTranslatePo(); hcGovTranslatePo.setTranId(heard.getString("tranId")); hcGovTranslatePo.setState(ReportDataHeaderDto.RETUR_SUCCESS_CODE); if(!Integer.toString(ReportDataHeaderDto.CODE_SUCCESS).equals(heard.getString("code"))){ hcGovTranslatePo.setState(ReportDataHeaderDto.RETUR_ERROR_CODE); } hcGovTranslatePo.setUpdateTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); int flag = hcGovTranslateInnerServiceSMOImpl.updateHcGovTranslate(hcGovTranslatePo); if(flag < 1){ throw new IllegalArgumentException("更新物业系统保存楼栋日志失败"); } HcGovTranslateDetailPo hcGovTranslateDetailPo = new HcGovTranslateDetailPo(); hcGovTranslateDetailPo.setTranId(hcGovTranslatePo.getTranId()); hcGovTranslateDetailPo.setResBody(paramIn.toJSONString()); flag = hcGovTranslateDetailInnerServiceSMOImpl.updateHcGovTranslateDetail(hcGovTranslateDetailPo); if(flag < 1){ throw new IllegalArgumentException("物业系统保存楼栋推送报文明细日志失败"); } } public void sendKafka(String topic,JSONObject massage,String communityId,String objId,String secure) { try { KafkaFactory.sendKafkaMessage(topic,massage.toJSONString()); service-job/src/main/java/com/java110/job/adapt/hcGov/floor/AddFloorToHcGovAdapt.java
@@ -125,7 +125,7 @@ body.put("layerCount", layerCount); body.put("unitCount", floorUse); body.put("floorUse", tmpCommunityDto.getName() + "_住宅"); body.put("personName", "HC小区管理系统"); body.put("personName", "小区管理系统"); body.put("personLink", "18909711234"); JSONObject kafkaData = baseHcGovSendAsynImpl.createHeadersOrBody(body, extCommunityId, HcGovConstant.ADD_FLOOR_ACTION, HcGovConstant.COMMUNITY_SECURE); service-job/src/main/java/com/java110/job/adapt/hcGov/floor/AddFloorToHcGovReturnAdapt.java
New file @@ -0,0 +1,87 @@ /* * Copyright 2017-2020 吴学文 and java110 team. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.java110.job.adapt.hcGov.floor; import com.java110.core.factory.GenerateCodeFactory; import com.java110.dto.community.CommunityAttrDto; import com.java110.dto.floorAttr.FloorAttrDto; import com.java110.dto.hcGovTranslate.HcGovTranslateDto; import com.java110.dto.reportData.ReportDataDto; import com.java110.intf.common.IHcGovTranslateInnerServiceSMO; import com.java110.intf.community.ICommunityInnerServiceSMO; import com.java110.intf.community.IFloorAttrInnerServiceSMO; import com.java110.job.adapt.hcGov.IReportReturnDataAdapt; import com.java110.po.floorAttr.FloorAttrPo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; /** * 新增楼栋同步HC政务接口 返回 * <p> * 接口协议地址: https://gitee.com/java110/microCommunityInformation/tree/master/info-doc#1%E6%A5%BC%E6%A0%8B%E4%B8%8A%E4%BC%A0 * * @desc add by 吴学文 16:20 */ @Component(value = "ADD_FLOOR_RETURN") public class AddFloorToHcGovReturnAdapt implements IReportReturnDataAdapt { @Autowired private IFloorAttrInnerServiceSMO floorAttrInnerServiceSMOImpl; @Autowired private IHcGovTranslateInnerServiceSMO hcGovTranslateInnerServiceSMOImpl; @Override public void reportReturn(ReportDataDto reportDataDto, String extCommunityId) { HcGovTranslateDto hcGovTranslateDto = new HcGovTranslateDto(); hcGovTranslateDto.setTranId(reportDataDto.getReportDataHeaderDto().getTranId()); hcGovTranslateDto.setServiceCode(reportDataDto.getReportDataHeaderDto().getServiceCode()); List<HcGovTranslateDto> hcGovTranslateDtos = hcGovTranslateInnerServiceSMOImpl.queryHcGovTranslates(hcGovTranslateDto); if (hcGovTranslateDtos == null || hcGovTranslateDtos.size() < 1) { throw new IllegalArgumentException("查询推送报文失败。不是同一订单信息"); } FloorAttrDto floorAttrDto = new FloorAttrDto(); floorAttrDto.setFloorId(hcGovTranslateDtos.get(0).getObjId()); floorAttrDto.setCommunityId(hcGovTranslateDtos.get(0).getCommunityId()); floorAttrDto.setSpecCd(CommunityAttrDto.SPEC_CD_GOV); List<FloorAttrDto> floorAttrDtos = floorAttrInnerServiceSMOImpl.queryFloorAttrs(floorAttrDto); FloorAttrPo floorAttrPo = new FloorAttrPo(); floorAttrPo.setAttrId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_floorId)); floorAttrPo.setFloorId(floorAttrDto.getFloorId()); floorAttrPo.setCommunityId(floorAttrDto.getCommunityId()); floorAttrPo.setSpecCd(floorAttrDto.getSpecCd()); floorAttrPo.setValue(reportDataDto.getReportDataBodyDto().getString("extFloorId")); if (floorAttrDtos == null || floorAttrDtos.size() < 1) { int flag = floorAttrInnerServiceSMOImpl.saveFloorAttr(floorAttrPo); if (flag < 1) { throw new IllegalArgumentException("保存楼栋属性失败"); } } else { floorAttrPo.setAttrId(floorAttrDtos.get(0).getAttrId()); int flag = floorAttrInnerServiceSMOImpl.updateFloorAttrInfoInstance(floorAttrPo); if (flag < 1) { throw new IllegalArgumentException("修改楼栋属性失败"); } } } } service-job/src/main/java/com/java110/job/kafka/JobServiceKafka.java
@@ -3,15 +3,26 @@ import com.alibaba.fastjson.JSONObject; import com.java110.core.base.controller.BaseController; import com.java110.core.context.BusinessServiceDataFlow; import com.java110.core.factory.AuthenticationFactory; import com.java110.core.factory.DataTransactionFactory; import com.java110.dto.community.CommunityAttrDto; import com.java110.dto.community.CommunityDto; import com.java110.dto.reportData.ReportDataDto; import com.java110.dto.reportData.ReportDataHeaderDto; import com.java110.intf.community.ICommunityInnerServiceSMO; import com.java110.job.adapt.hcGov.HcGovConstant; import com.java110.job.adapt.hcGov.IReportReturnDataAdapt; import com.java110.job.adapt.hcGov.asyn.BaseHcGovSendAsyn; import com.java110.job.smo.IJobServiceSMO; import com.java110.utils.constant.KafkaConstant; import com.java110.utils.constant.ResponseConstant; import com.java110.utils.constant.StatusConstant; import com.java110.utils.exception.InitConfigDataException; import com.java110.utils.exception.InitDataFlowContextException; import com.java110.utils.factory.ApplicationContextFactory; import com.java110.utils.kafka.KafkaFactory; import com.java110.utils.util.Assert; import com.java110.utils.util.BeanConvertUtil; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -19,6 +30,7 @@ import org.springframework.kafka.annotation.KafkaListener; import java.util.HashMap; import java.util.List; import java.util.Map; /** @@ -29,8 +41,14 @@ private final static Logger logger = LoggerFactory.getLogger(JobServiceKafka.class); public static final String KAFKA_RETURN = "_RETURN"; @Autowired private IJobServiceSMO jobServiceSMOImpl; @Autowired private ICommunityInnerServiceSMO communityInnerServiceSMOImpl; @Autowired private BaseHcGovSendAsyn baseHcGovSendAsynImpl; @KafkaListener(topics = {"jobServiceTopic"}) public void listen(ConsumerRecord<?, ?> record) { @@ -73,20 +91,88 @@ @KafkaListener(topics = {"${kafka.hcGovTopic}"}) public void hcGovListen(ConsumerRecord<?, ?> record) { logger.info("kafka的key: " + record.key()); logger.info("kafka的value: " + record.value().toString()); String orderInfo = record.value().toString(); logger.debug("hcGovkafka 接收到数据", orderInfo); doListen(orderInfo); try { logger.debug("hcGovkafka 接收到数据", orderInfo); //responseJson = jobServiceSMOImpl.service(businessServiceDataFlow); } catch (Exception e) { logger.error("请求订单异常", e); } finally { } } private void doListen(String orderInfo) { JSONObject reqJson = JSONObject.parseObject(orderInfo); ReportDataDto reportDataDto = null; JSONObject header = reqJson.getJSONObject("header"); String extCommunityId = header.getString("extCommunityId"); //签名校验 CommunityDto community = null; try { //获得小区对象 String secure = getExtCommunityCode(extCommunityId); //报文合规性校验 preValiateOrderInfo(orderInfo); //构建对象 reportDataDto = freshReportDataDto(orderInfo); //签名认证 AuthenticationFactory.authReportDataSign(reportDataDto, secure); //适配器 IReportReturnDataAdapt reportDataAdapt = ApplicationContextFactory.getBean(reportDataDto.getReportDataHeaderDto().getServiceCode() + KAFKA_RETURN, IReportReturnDataAdapt.class); if (reportDataAdapt == null) { throw new IllegalArgumentException("serviceCode 错误 请检查"); } //业务处理 reportDataAdapt.reportReturn(reportDataDto, extCommunityId); } catch (Exception e) { logger.error("政务回写失败", e); }finally { //回写日志表 baseHcGovSendAsynImpl.updateHcGovLog(reqJson); } } /** * 获取小区密钥 * * @param extCommunityId * @return */ private String getExtCommunityCode(String extCommunityId) { CommunityAttrDto communityAttrDto = new CommunityAttrDto(); communityAttrDto.setSpecCd(CommunityAttrDto.SPEC_CD_GOV); communityAttrDto.setValue(extCommunityId); List<CommunityAttrDto> tmpCommunityAttrDtos = communityInnerServiceSMOImpl.getCommunityAttrs(communityAttrDto); if (tmpCommunityAttrDtos == null || tmpCommunityAttrDtos.size() < 1) { return HcGovConstant.COMMUNITY_SECURE; } communityAttrDto = new CommunityAttrDto(); communityAttrDto.setSpecCd(CommunityAttrDto.SPEC_CD_GOV_SECURE); communityAttrDto.setCommunityId(tmpCommunityAttrDtos.get(0).getCommunityId()); tmpCommunityAttrDtos = communityInnerServiceSMOImpl.getCommunityAttrs(communityAttrDto); if (tmpCommunityAttrDtos == null || tmpCommunityAttrDtos.size() < 1) { return HcGovConstant.COMMUNITY_SECURE; } return tmpCommunityAttrDtos.get(0).getValue(); } /** * 构建对象 * * @param orderInfo * @return */ private ReportDataDto freshReportDataDto(String orderInfo) { ReportDataDto reportDataDto = new ReportDataDto(); JSONObject reqJson = JSONObject.parseObject(orderInfo); ReportDataHeaderDto reportDataHeaderDto = BeanConvertUtil.covertBean(reqJson.getJSONObject("header"), ReportDataHeaderDto.class); reportDataDto.setReportDataHeaderDto(reportDataHeaderDto); reportDataDto.setReportDataBodyDto(reqJson.getJSONObject("body")); return reportDataDto; } /** * 这里预校验,请求报文中不能有 dataFlowId