package com.bean.freezer;
import static org.junit.Assert.fail;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.bean.gnet.UUIDGenerator;
import com.common.SouthOrder;
import com.dao.recharge.RechargeDao;
import com.utils.HttpClientUtils;
import base.bean.Fbean;
import common.Logger;
/**
* @describtion: 插入設備日用量數據工具類
* @author robin 2020年6月23日 上午11:11:26
*
*/
public class FreezerGenerator {
public static void main(String[] args) {
// 數據手動連接6步曲
System.out.print("數據庫手動連接");
Connection conn = getConnection();
Logger logger = Logger.getLogger(FreezerGenerator.class);
List<Date> dateTime = getDateTime();
// 1.調取用戶登錄接口
String loginUrl = "https://yun.sinocold.net:5001/api/ExternalApi/login?account=xx&pwd=yy";
String projectUrl = "https://yun.sinocold.net:5001/api/ExternalApi/GetPr?";
String loginInfo = HttpClientUtils.doGet(loginUrl);
JSONObject loginObject = JSONObject.parseObject(loginInfo);
if (!loginObject.getString("Code").equals("200") && loginObject.getString("Message").equals("成功")) {
System.out.println("接口調用失敗!");
} else {
logger.info("登錄成功,開始處理業務邏輯!");
long startTime = System.currentTimeMillis();
if (loginObject != null) {
JSONObject data = loginObject.getJSONObject("Data");
String token = data.getString("token");
JSONArray projectData = data.getJSONArray("ProjectData");
for (int j = 0; j < projectData.size(); j++) {
JSONObject js = projectData.getJSONObject(j);
String companyId = js.getString("CompanyId");
// String companyName = js.getString("CompanyName");
String projectId = js.getString("ProjectId");
String realMonth=null;
// 開關作用,定義在循環外層
boolean flag = true;
// 2.調用獲取項目能耗接口
for (Date date : dateTime) { // System.out.println(new
String day = new SimpleDateFormat("yyyy-MM-dd").format(date);
String projectEnergyUrl = projectUrl + "companyId=" + companyId + "&projectId=" + projectId
+ "&startDate=" + day + "&subentryId=1";// +"&Authorization=Bearer "+token
String coolDevice = HttpClientUtils.doGetByToken(projectEnergyUrl, token);
String month = day.substring(0, 7);// 2020-06 2020-06-22 從昨天開始
String everyDay = day.substring(8, 10);// 22 2020-06-22 從昨天開始
String dday = "D" + everyDay;
System.out.println("查詢日期:" + day + "--------->" + coolDevice + "\t");
JSONObject deviceObject = JSONObject.parseObject(coolDevice);
if (deviceObject.getString("Code").equals("200")&& deviceObject.getString("Message").equals("成功"))
{
JSONObject dataInfo = deviceObject.getJSONObject("Data");
JSONObject innerData = dataInfo.getJSONObject("Data");
JSONArray lastDeviceInfos = innerData.getJSONArray("獨立租戶");
//第二次外層循環flag=false ,每個循環執行 40次
if(!flag) {
for (int i = 0; i < lastDeviceInfos.size(); i++) {
JSONObject singleDevice = lastDeviceInfos.getJSONObject(i);
String id = singleDevice.getString("Id");
String value = singleDevice.getString("value");
// 方法2:JVM直接跟數據庫通訊
try {
String sql2="update Freezer_DayNumber set "+dday+"=? where UUID=? and MON_MON=?";
PreparedStatement statement2 = conn.prepareStatement(sql2);
statement2.setString(1,value);
statement2.setString(2,id);
statement2.setString(3,month);
statement2.executeUpdate();
logger.info("sql語句2-------------->"+sql2);
} catch (SQLException e) {
logger.info("數據庫連接異常!");
e.printStackTrace();
}
}//for循環結尾括號
//如果月份相同,則爲false
}else {
// lastDeviceInfos 循環遍歷冷櫃設備信息 內層for循環執行 40次(因爲40個冷櫃設備),外層日期循環執行一次
for (int i = 0; i < lastDeviceInfos.size(); i++) {
JSONObject singleDevice = lastDeviceInfos.getJSONObject(i);
String id = singleDevice.getString("Id");
String value = singleDevice.getString("value");
// System.out.println(month+"/"+id+"/"+value+"\t");
// String name = singleDevice.getString("name");//可以不插入表
// 數據庫操作 coolDevice信息,最終存入數據庫表
String uuid = UUIDGenerator.generate();
// fb.setA1(id);
// fb.setA2(value);
// fb.setA3(dday);
// fb.setA4(month);
// try {
// //插入表Freezer_DayNumber信息
// rechargeDao.addFreezerDayNumber(fb);
// } catch (Exception e) {
// e.printStackTrace();
// }
// 方法2:JVM直接跟數據庫通訊
try {
// 月份變化的時候執行插入操作
String sql = "insert into Freezer_DayNumber(SY_ID,UUID,MON_MON," + dday
+ ") values (?,?,?,?)";
PreparedStatement statement = conn.prepareStatement(sql);
statement.setString(1, uuid);
statement.setString(2, id);
statement.setString(3, month);
statement.setString(4, value);
statement.executeUpdate();
logger.info("sql語句1-------------->" + sql);
// //月份和上一次循環一樣的話就執行更新操作
// String sql2="update Freezer_DayNumber set "+dday+"=? where UUID=?";
// PreparedStatement statement2 = conn.prepareStatement(sql2);
// statement2.setString(1,value);
// statement2.setString(2,id);
// statement2.executeUpdate();
// logger.info("sql語句2-------------->"+sql2);
// }else {
// //月分變化的時候執行插入操作
// String sql3="insert into Freezer_DayNumber(SY_ID,UUID,MON_MON,"+dday+") values (?,?,?,?)";
// PreparedStatement statement3 = conn.prepareStatement(sql3);
// statement3.setString(1,uuid);
// statement3.setString(2,id);
// statement3.setString(3,month);
// statement3.setString(4,value);
// statement3.executeUpdate();
// logger.info("sql語句3-------------->"+sql3);
// }
/*
* 數據庫查詢語句沒問題 String sql="select * from rooms_man"; ResultSet resultSet =
* statement.executeQuery(sql); while (resultSet.next()) { String rm_id =
* resultSet.getString("rm_id"); logger.info(rm_id); }
*/
} catch (SQLException e) {
logger.info("數據庫連接異常!");
e.printStackTrace();
}
}//for循環結尾括號
}//else結尾 40次循環遍歷過程 結束月
// realMonth = day.substring(0, 7);
//realMonth是結束月、month是開始月
if (everyDay.equals("01")) {
flag = true;
}else {
flag =false;
}
}//if結尾
try {
System.out.println("開始睡眠了,等待10秒");
// 接口調用不能太頻繁
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} //以上是雙層for循環結尾
}
long endTime = System.currentTimeMillis();
logger.info("經歷了:" + (endTime - startTime) / 1000 / 60 + " 分鐘");
}
}
}
private static Connection getConnection() {
String driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
String url = "jdbc:sqlserver://localhost:1433;DatabaseName=JDY";
String userName = "sa";
String password = "11";
try {
// 1.註冊驅動
Class.forName(driverName);
// 2.創建連接對象
Connection connection = DriverManager.getConnection(url, userName, password);
// String sql = "select * from rooms_man";
// 3-1.創建數據庫預處理對象
// PreparedStatement psStatement = connection.prepareStatement(sql);
// psStatement.setXxx(int index,Object val);
// psStatement.executeQuery();
// 3-2.創建數據庫語句對象
// Statement statement = connection.createStatement();
// 4.數據庫查詢
// statement.executeUpdate(sql);
// 5.遍歷結果集
// 6.關閉異常
return connection;
} catch (Exception e) {
System.out.println("數據庫連接失敗!");
e.printStackTrace();
}
return null;
}
private static List<Date> getDateTime() {
// 存日期的數組
List<Date> dateList = new ArrayList<Date>();
Calendar cal = Calendar.getInstance();
Date subTime = null;
Date parseBeginTime = null;
String beginTime = "2020-03-28";
try {
parseBeginTime = new SimpleDateFormat("yyyy-MM-dd").parse(beginTime);
} catch (ParseException e1) {
e1.printStackTrace();
}
do {
try {
// 獲取當前日期的對應天數
int day = cal.get(Calendar.DAY_OF_MONTH);
// 天數減一
cal.set(Calendar.DAY_OF_MONTH, day - 1);
// 獲取昨天日期
subTime = cal.getTime();
dateList.add(subTime);
} catch (Exception e) {
e.printStackTrace();
}
} while (!new SimpleDateFormat("yyyy-MM-dd").format(subTime)
.equals(new SimpleDateFormat("yyyy-MM-dd").format(parseBeginTime)));
return dateList;
}
}
歷經15分鐘,遷移數據OK
表中數據由無變有