package com.template.services.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageInfo;
import com.template.common.constanst.Constanst;
import com.template.common.utils.*;
import com.template.mapper.SmartUserMapper;
import com.template.mapper.WechatScanLoginMapper;
import com.template.model.pojo.SmartUser;
import com.template.model.tongji.*;
import com.template.model.weixin.AccessToken;
import com.template.model.weixin.HttpParame;
import com.template.model.weixin.PhoneAccessToken;
import com.template.model.weixin.WechatUserUnionID;
import com.template.services.WechatScanLoginService;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
Title: WechatScanLoginServiceImpl
* Description: 业务接口实现
* @author fengyong
* @date 2018年9月7日
*/
@Service
public class WechatScanLoginServiceImpl implements WechatScanLoginService {
@Autowired
public SmartUserMapper smartUserMapper;
@Autowired
public WechatScanLoginMapper wechatScanLoginMapper;
/**
* Title: wechatLoginUrl
* Description: 网页授权回调地址处理
* @return
* @throws UnsupportedEncodingException
*/
@Override
public Map wechatLoginUrl() {
String content = Constanst.PWD_MD5+DateUtils.getYYYYMMdd();
byte[] encrypt = AesUtil.encrypt(content, AesUtil.PASSWORD_SECRET_KEY, 16);
String parseByte2HexStr = AesUtil.parseByte2HexStr(encrypt);
Map map = new HashMap();
String url = HttpParame.AUTHORIZATION_URL;
url = url.replaceAll("APPID", PropertiesUtil.getValue(HttpParame.APPID));
try {
url = url.replaceAll("REDIRECT_URI", URLEncoder.encode(
PropertiesUtil.getValue(HttpParame.REDIRECT_URI),"UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
url = url.replaceAll("SCOPE", "snsapi_login");
url = url.replace("STATE", parseByte2HexStr); //加密state进行验证 回调地址当天有效 防止恶意攻击
map.put("url", url);
return map;
}
@Override
public Map wechatBindUrl(String phone,String messageCode) {
String content = Constanst.PWD_MD5+ DateUtils.getYYYYMMdd();
byte[] encrypt = AesUtil.encrypt(content, AesUtil.PASSWORD_SECRET_KEY, 16);
String parseByte2HexStr = AesUtil.parseByte2HexStr(encrypt);
Map map = new HashMap();
String url = HttpParame.BIND_URL;
url = url.replaceAll("APPID", PropertiesUtil.getValue(HttpParame.APPID));
try {
url = url.replaceAll("REDIRECT_URI", URLEncoder.encode(
PropertiesUtil.getValue(HttpParame.BIND_URI)+"?phone="+phone+"&messageCode="+messageCode,"UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//url = url.replaceAll("SCOPE", "snsapi_login");
url = url.replaceAll("SCOPE", "snsapi_login");
url = url.replace("STATE", parseByte2HexStr); //加密state进行验证 回调地址当天有效 防止恶意攻击
map.put("url", url);
return map;
}
/**
* Title: getAccessToken
* Description: 用户授权后获取用户唯一标识
* @param code
* @return
*/
@Override
public AccessToken getAccessToken(String code) {
String accessTokenUrl = HttpParame.ACCESS_TOKEN_URL;
accessTokenUrl = accessTokenUrl.replaceAll("APPID", PropertiesUtil.getValue(HttpParame.APPID));
accessTokenUrl = accessTokenUrl.replaceAll("SECRET", PropertiesUtil.getValue(HttpParame.SECRET));
accessTokenUrl = accessTokenUrl.replaceAll("CODE", code);
String responseContent = HttpClientUtils.getInstance().sendHttpGet(accessTokenUrl);
if (responseContent == null || responseContent == "") {
return null;
}
JSONObject parseObject = JSONObject.parseObject(responseContent);
AccessToken accessToken = JSONObject.toJavaObject(parseObject, AccessToken.class);
return accessToken;
}
/**
* Title: getAccessToken
* Description: 用户授权后获取用户唯一标识
* @return
*/
@Override
public PhoneAccessToken getPhoneAccessToken() {
String accessTokenUrl = HttpParame.PHONE_TOKEN_URL;
accessTokenUrl = accessTokenUrl.replaceAll("XAPPID", PropertiesUtil.getValue(HttpParame.APPIDX));
accessTokenUrl = accessTokenUrl.replaceAll("XSECRET", PropertiesUtil.getValue(HttpParame.SECRETX));
String responseContent = HttpClientUtils.getInstance().sendHttpGet(accessTokenUrl);
if (responseContent == null || responseContent == "") {
return null;
}
JSONObject parseObject = JSONObject.parseObject(responseContent);
PhoneAccessToken accessToken = JSONObject.toJavaObject(parseObject, PhoneAccessToken.class);
return accessToken;
}
/**
* Title: getUserUnionID
* Description: 获取用户统一标识。针对一个微信开放平台帐号下的应用,
* 同一用户的unionid在多个应用中是唯一的。
* 此方法不牵扯到多个应用时候可以不用。
*
* 此处用到只是为了获取微信扫码用户的省份城市(此信息获取的只是微信用户所填的城市省份,
* 并不是用户的实时位置信息,如果用户未填写是获取不到的。)
*
* @return
*/
@Override
public WechatUserUnionID getUserUnionID() {
String unionIDUrl = HttpParame.GET_UNIONID_URL;
unionIDUrl = unionIDUrl.replace("ACCESS_TOKEN", PropertiesUtil.getValue(HttpParame.ACCESS_TOKEN));
unionIDUrl = unionIDUrl.replace("OPENID", PropertiesUtil.getValue(HttpParame.OPENID));
String responseContent = HttpClientUtils.getInstance().sendHttpGet(unionIDUrl);
if (responseContent == null || responseContent == "") {
return null;
}
JSONObject parseObject = JSONObject.parseObject(responseContent);
WechatUserUnionID userUnionID = JSONObject.toJavaObject(parseObject, WechatUserUnionID.class);
return userUnionID;
}
@Override
public SmartUser selectByOpenid(String openid){
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq( "open_id", openid);
List users = smartUserMapper.selectList(queryWrapper);
if (users==null || users.size()<=0){
return null;
}
return users.get(0);
}
@Override
public SmartUser selectByCardNo(String CardNo){
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq( "card_no", CardNo);
List users = smartUserMapper.selectList(queryWrapper);
if (users==null || users.size()<=0){
return null;
}
return users.get(0);
}
@Override
public int updateSmartUser(SmartUser sa) {
int result = smartUserMapper.updateById(sa);
return result;
}
// 用户类别统计
@Override
public List getUserIdTj(){
return wechatScanLoginMapper.getUserIdTj();
}
// 用户总数
@Override
public All getUserIdTjt(){
return wechatScanLoginMapper.getUserIdTjt();
}
// 水表总计
@Override
public DAll getWaterTj(){
return wechatScanLoginMapper.getWaterTj();
}
// 电表总计
@Override
public DAll getElcTj(){
return wechatScanLoginMapper.getElcTj();
}
@Override
public void insertMonthMeter(String month){
List waterl = wechatScanLoginMapper.getWaterTjByMonAndBuild(month);
List elcl = wechatScanLoginMapper.getElcTjByMonAndBuild(month);
for (int i = 0; i < waterl.size(); i++) {
EnergyTj e = wechatScanLoginMapper.getTjByMon(waterl.get(i).getName(),waterl.get(i).getMeterName(),month,"0");
if (e==null){
waterl.get(i).setType(0);
waterl.get(i).setDate(month);
wechatScanLoginMapper.insertMonthMeter(waterl.get(i));
} else {
waterl.get(i).setId(e.getId());
wechatScanLoginMapper.updateMonthMeter(waterl.get(i));
}
}
for (int j = 0; j < elcl.size(); j++) {
EnergyTj w = wechatScanLoginMapper.getTjByMon(elcl.get(j).getName(),elcl.get(j).getMeterName(),month,"1");
if (w==null){
elcl.get(j).setType(1);
elcl.get(j).setDate(month);
wechatScanLoginMapper.insertMonthMeter(elcl.get(j));
} else {
elcl.get(j).setId(w.getId());
wechatScanLoginMapper.updateMonthMeter(elcl.get(j));
}
}
}
@Override
public void insertDayMeter(String day){
List waterl = wechatScanLoginMapper.getWaterTjByDayAndBuild(day);
List elcl = wechatScanLoginMapper.getElcTjByDayAndBuild(day);
for (int i = 0; i < waterl.size(); i++) {
EnergyTj w = wechatScanLoginMapper.getTjByDay(waterl.get(i).getName(),waterl.get(i).getMeterName(),day,"0");
if (w==null){
waterl.get(i).setType(0);
waterl.get(i).setDate(day);
wechatScanLoginMapper.insertDayMeter(waterl.get(i));
} else {
waterl.get(i).setId(w.getId());
wechatScanLoginMapper.updateDayMeter(waterl.get(i));
}
}
for (int j = 0; j < elcl.size(); j++) {
EnergyTj e = wechatScanLoginMapper.getTjByDay(elcl.get(j).getName(),elcl.get(j).getMeterName(),day,"1");
if (e==null){
elcl.get(j).setType(1);
elcl.get(j).setDate(day);
wechatScanLoginMapper.insertDayMeter(elcl.get(j));
} else {
elcl.get(j).setId(e.getId());
wechatScanLoginMapper.updateDayMeter(elcl.get(j));
}
}
}
// 每个月各水表数据
@Override
public List getMonWater() throws ParseException {
List dates = TimeExchange2.getLastSevenMonth();
List lm = new ArrayList<>();
for (int i = 0; i < dates.size(); i++) {
MonthMeterDetail mm = new MonthMeterDetail();
List list = wechatScanLoginMapper.getMonWater(dates.get(i));
mm.setDate(TimeExchange2.ToSimpleMonth(TimeExchange2.StringToDate(dates.get(i),"yyyy-MM"))+"月");
mm.setLt(list);
lm.add(mm);
}
return lm;
}
// 每个月各电表数据
@Override
public List getMonElc() throws ParseException {
List dates = TimeExchange2.getLastSevenMonth();
List lm = new ArrayList<>();
for (int i = 0; i < dates.size(); i++) {
MonthMeterDetail mm = new MonthMeterDetail();
List list = wechatScanLoginMapper.getMonElc(dates.get(i));
mm.setDate(TimeExchange2.ToSimpleMonth(TimeExchange2.StringToDate(dates.get(i),"yyyy-MM"))+"月");
mm.setLt(list);
lm.add(mm);
}
return lm;
}
// 区域能耗统计
@Override
public PageInfo getMeterMonthPage(@Param("meterMonthData")MeterMonthData meterMonthData){
List list = wechatScanLoginMapper.getMeterMonthPage(meterMonthData);
PageInfo meterPageInfo = new PageInfo<>(list);
return meterPageInfo;
}
// 实时抄表
@Override
public PageInfo getMeterDayPage(@Param("meterMonthData")MeterMonthData meterMonthData){
List list = wechatScanLoginMapper.getMeterDayPage(meterMonthData);
PageInfo meterPageInfo = new PageInfo<>(list);
return meterPageInfo;
}
}