|  | @ -0,0 +1,210 @@
 | 
	
		
			
				|  |  | package com.yihu.jw.care.service.hz;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import com.alibaba.fastjson.JSONArray;
 | 
	
		
			
				|  |  | import com.alibaba.fastjson.JSONObject;
 | 
	
		
			
				|  |  | import com.yihu.jw.care.dao.device.BaseDeviceElectricRecordDao;
 | 
	
		
			
				|  |  | import com.yihu.jw.care.dao.device.BaseHzInterfaceDictDao;
 | 
	
		
			
				|  |  | import com.yihu.jw.care.dao.device.PatientDeviceDao;
 | 
	
		
			
				|  |  | import com.yihu.jw.care.util.DSLUtils;
 | 
	
		
			
				|  |  | import com.yihu.jw.care.util.HttpToolUtil;
 | 
	
		
			
				|  |  | import com.yihu.jw.care.util.MD5Utils;
 | 
	
		
			
				|  |  | import com.yihu.jw.entity.care.device.BaseDeviceElectricRecordDO;
 | 
	
		
			
				|  |  | import com.yihu.jw.entity.care.device.DevicePatientDevice;
 | 
	
		
			
				|  |  | import com.yihu.jw.entity.util.BaseHzInterfaceDictEntity;
 | 
	
		
			
				|  |  | import com.yihu.jw.util.date.DateUtil;
 | 
	
		
			
				|  |  | import com.yihu.jw.util.http.HttpClientUtil;
 | 
	
		
			
				|  |  | import org.apache.commons.lang3.StringUtils;
 | 
	
		
			
				|  |  | import org.slf4j.Logger;
 | 
	
		
			
				|  |  | import org.slf4j.LoggerFactory;
 | 
	
		
			
				|  |  | import org.springframework.beans.factory.annotation.Autowired;
 | 
	
		
			
				|  |  | import org.springframework.data.redis.core.StringRedisTemplate;
 | 
	
		
			
				|  |  | import org.springframework.http.HttpMethod;
 | 
	
		
			
				|  |  | import org.springframework.jdbc.core.JdbcTemplate;
 | 
	
		
			
				|  |  | import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  | import org.springframework.transaction.annotation.Transactional;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import java.util.*;
 | 
	
		
			
				|  |  | import java.util.concurrent.TimeUnit;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | /**
 | 
	
		
			
				|  |  |  * Created by wsl on 2022/6/29
 | 
	
		
			
				|  |  |  */
 | 
	
		
			
				|  |  | @Service
 | 
	
		
			
				|  |  | public class HzInterfaceService {
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     Logger logger = LoggerFactory.getLogger(HzInterfaceService.class);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private StringRedisTemplate redisTemplate;
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private BaseHzInterfaceDictDao baseHzInterfaceDictDao;
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private JdbcTemplate jdbcTemplate;
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private HttpClientUtil httpClientUtil;
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private PatientDeviceDao patientDeviceDao;
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private BaseDeviceElectricRecordDao baseDeviceElectricRecordDao;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 同步居民电表数据
 | 
	
		
			
				|  |  |      * @param queryDate
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public void electricityTable(String queryDate){
 | 
	
		
			
				|  |  |         try {
 | 
	
		
			
				|  |  |             List<BaseDeviceElectricRecordDO> list = new ArrayList<>();
 | 
	
		
			
				|  |  |             if(StringUtils.isBlank(queryDate)){
 | 
	
		
			
				|  |  |                 queryDate = DateUtil.getStringDateShort();
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             list = baseDeviceElectricRecordDao.findByStatDate(queryDate);
 | 
	
		
			
				|  |  |             if(list.size()>0){
 | 
	
		
			
				|  |  |                 logger.info("当天数据已同步,请勿重复操作:"+queryDate);
 | 
	
		
			
				|  |  |                 return;
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             Map<String,Integer> map = new HashMap<>();
 | 
	
		
			
				|  |  |             JSONArray jsonArray = getAreaApi(queryDate);
 | 
	
		
			
				|  |  |             for (int i=0;i<jsonArray.size();i++){
 | 
	
		
			
				|  |  |                 JSONObject json = jsonArray.getJSONObject(i);
 | 
	
		
			
				|  |  |                 String consNo = json.getString("consNo");
 | 
	
		
			
				|  |  |                 if(!map.containsKey(consNo)){
 | 
	
		
			
				|  |  |                     map.put(consNo,0);
 | 
	
		
			
				|  |  |                     BaseDeviceElectricRecordDO recordDO = new BaseDeviceElectricRecordDO();
 | 
	
		
			
				|  |  |                     recordDO.setAddress(json.getString("address"));
 | 
	
		
			
				|  |  |                     recordDO.setConsNo(json.getString("consNo"));
 | 
	
		
			
				|  |  |                     recordDO.setHome(json.getString("home"));
 | 
	
		
			
				|  |  |                     recordDO.setLowerLimit(json.getString("lowerLimit"));
 | 
	
		
			
				|  |  |                     recordDO.setStatDate(json.getString("statDate"));
 | 
	
		
			
				|  |  |                     recordDO.setUpperLimit(json.getString("upperLimit"));
 | 
	
		
			
				|  |  |                     recordDO.setName(json.getString("name"));
 | 
	
		
			
				|  |  |                     DevicePatientDevice patientDevice = patientDeviceDao.findByDeviceSnAndCategoryCodeAndUserType(consNo,"20","-1");
 | 
	
		
			
				|  |  |                     if(patientDevice!=null){
 | 
	
		
			
				|  |  |                         recordDO.setPatient(patientDevice.getUser());
 | 
	
		
			
				|  |  |                     }
 | 
	
		
			
				|  |  |                     list.add(recordDO);
 | 
	
		
			
				|  |  |                 }
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             if(list.size()>0){
 | 
	
		
			
				|  |  |                 baseDeviceElectricRecordDao.save(list);
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         }catch (Exception e){
 | 
	
		
			
				|  |  |             e.printStackTrace();
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     private long expire(String key) {
 | 
	
		
			
				|  |  |         return redisTemplate.opsForValue().getOperations().getExpire(key);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     public JSONArray getAreaApi(String date){
 | 
	
		
			
				|  |  |         try {
 | 
	
		
			
				|  |  |             BaseHzInterfaceDictEntity dbkey = requestDBKEY();
 | 
	
		
			
				|  |  |             //判断是否过期 或者 是否不存在
 | 
	
		
			
				|  |  |             if(expire(dbkey.getCode()) > 0?false:true||redisTemplate.hasKey(dbkey.getCode())){
 | 
	
		
			
				|  |  |                 PopBasicInfo();
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             String requestSecret = redisTemplate.opsForValue().get(dbkey.getCode());
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             //请求接口地址(政务网环境根据接口文档地址改动)
 | 
	
		
			
				|  |  |             String electricityTableSql = "SELECT url FROM base_hz_interface_dict WHERE `status` = 1 AND `code` = 'zfjddjlrdbjk'";
 | 
	
		
			
				|  |  |             String url = jdbcTemplate.queryForObject(electricityTableSql, String.class);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             String requestTime = DSLUtils.dateToLong(new Date()) + "";//时间戳
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             String sign = MD5Utils.encoderByMd5(dbkey.getAppKey()+ requestSecret + requestTime);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             JSONObject json = new JSONObject();
 | 
	
		
			
				|  |  |             json.put("queryDate",date);
 | 
	
		
			
				|  |  |             url +="?appKey="+dbkey.getAppKey()+"&sign="+sign+"&requestTime="+requestTime;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             org.springframework.http.HttpEntity<JSONObject> response = httpClientUtil.assesTokenPostHttp(url, json, HttpMethod.POST);
 | 
	
		
			
				|  |  |             logger.info("电表接口调用结果----> "+response);
 | 
	
		
			
				|  |  |             JSONObject responseBody = response.getBody();
 | 
	
		
			
				|  |  |             if("0".equals(responseBody.getString("code"))){
 | 
	
		
			
				|  |  |                 return responseBody.getJSONArray("data");
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         }catch (Exception e){
 | 
	
		
			
				|  |  |             e.printStackTrace();
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         return new JSONArray();
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     // 刷新密钥还存在时可以调用这个方法
 | 
	
		
			
				|  |  |     private String refreshKey(BaseHzInterfaceDictEntity refreshdbkey, BaseHzInterfaceDictEntity requestdbkey){
 | 
	
		
			
				|  |  |         Map<String, String> params = new HashMap<String, String>();
 | 
	
		
			
				|  |  |         String appkey = refreshdbkey.getAppKey();   //appKey
 | 
	
		
			
				|  |  |         String requstSecret = refreshdbkey.getRefreshSecret();//刷新密钥
 | 
	
		
			
				|  |  |         String requestTime = DSLUtils.dateToLong(new Date()) + "";//时间戳
 | 
	
		
			
				|  |  |         String url = refreshdbkey.getUrl();  //请求url
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         String sign = MD5Utils.encoderByMd5(appkey + requstSecret + requestTime);
 | 
	
		
			
				|  |  |         params.put("appKey", appkey);
 | 
	
		
			
				|  |  |         params.put("sign", sign);
 | 
	
		
			
				|  |  |         params.put("requestTime", requestTime);
 | 
	
		
			
				|  |  |         JSONObject resultObj = HttpToolUtil.httpURLConnection_sendPost(url, params);
 | 
	
		
			
				|  |  |         logger.info("接口返回值:"+resultObj.toString());
 | 
	
		
			
				|  |  |         System.out.println("接口返回值:"+resultObj.toString());
 | 
	
		
			
				|  |  |         JSONObject datasObj = JSONObject.parseObject(resultObj.get("datas").toString());
 | 
	
		
			
				|  |  |         requestdbkey.setRequestSecret(datasObj.get("requestSecret").toString());
 | 
	
		
			
				|  |  |         requestdbkey.setRequestSecretEndTime(DateUtil.strToDateLong(datasObj.get("requestSecretEndTime").toString()));
 | 
	
		
			
				|  |  |         baseHzInterfaceDictDao.save(requestdbkey);
 | 
	
		
			
				|  |  |         redisTemplate.opsForValue().set(requestdbkey.getCode(),resultObj.get("requestSecret").toString(),14, TimeUnit.MINUTES);
 | 
	
		
			
				|  |  |         return datasObj.toString();
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  |     public String PopBasicInfo() {
 | 
	
		
			
				|  |  |         Map<String, String> params = new HashMap<String, String>();
 | 
	
		
			
				|  |  |         BaseHzInterfaceDictEntity requestdbkey = requestDBKEY();
 | 
	
		
			
				|  |  |         BaseHzInterfaceDictEntity refreshdbkey = refreshDBKEY();
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         /*if(redisTemplate.hasKey(refreshdbkey.getCode())){
 | 
	
		
			
				|  |  |             return refreshKey(refreshdbkey,requestdbkey);
 | 
	
		
			
				|  |  |         }*/
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         String appkey = requestdbkey.getAppKey();   //appKey
 | 
	
		
			
				|  |  |         String requstSecret = requestdbkey.getAppPwd();//app密钥
 | 
	
		
			
				|  |  |         String requestTime = DSLUtils.dateToLong(new Date()) + "";//时间戳
 | 
	
		
			
				|  |  |         String url = requestdbkey.getUrl();  //请求url
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         //sign 格式:APP_KEY + APP秘钥+时间戳,经过MD5加密生成的串(字母小写)
 | 
	
		
			
				|  |  |         String sign = MD5Utils.encoderByMd5(appkey + requstSecret + requestTime);
 | 
	
		
			
				|  |  |         params.put("appKey", appkey);
 | 
	
		
			
				|  |  |         params.put("sign", sign);
 | 
	
		
			
				|  |  |         params.put("requestTime", requestTime);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         JSONObject resultObj = HttpToolUtil.httpURLConnection_sendPost(url, params);
 | 
	
		
			
				|  |  | //        logger.info("接口返回值:"+resultObj.toString());
 | 
	
		
			
				|  |  | //        System.out.println("接口返回值:"+resultObj.toString());
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         //请求密钥
 | 
	
		
			
				|  |  |         JSONObject datasObj = JSONObject.parseObject(resultObj.get("datas").toString());
 | 
	
		
			
				|  |  |         requestdbkey.setRequestSecret(datasObj.get("requestSecret").toString());
 | 
	
		
			
				|  |  |         requestdbkey.setRequestSecretEndTime(DateUtil.strToDateLong(datasObj.get("requestSecretEndTime").toString()));
 | 
	
		
			
				|  |  |         //刷新密钥
 | 
	
		
			
				|  |  |         refreshdbkey.setRefreshSecret(datasObj.get("refreshSecret").toString());
 | 
	
		
			
				|  |  |         baseHzInterfaceDictDao.save(requestdbkey);
 | 
	
		
			
				|  |  |         baseHzInterfaceDictDao.save(refreshdbkey);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         redisTemplate.opsForValue().set(requestdbkey.getCode(),datasObj.get("requestSecret").toString(),14, TimeUnit.MINUTES);
 | 
	
		
			
				|  |  |         redisTemplate.opsForValue().set(refreshdbkey.getCode(),datasObj.get("refreshSecret").toString(),47, TimeUnit.HOURS);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         return resultObj.toString();
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     // 请求密钥 15分钟过期
 | 
	
		
			
				|  |  |     public BaseHzInterfaceDictEntity requestDBKEY(){
 | 
	
		
			
				|  |  |         return baseHzInterfaceDictDao.findByStatusAndCode(1,"dbmyhq");
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     // 刷新密钥 48小时过期
 | 
	
		
			
				|  |  |     public BaseHzInterfaceDictEntity refreshDBKEY(){
 | 
	
		
			
				|  |  |         return baseHzInterfaceDictDao.findByStatusAndCode(1,"dbmysxhq");
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | }
 |