package com.yeetou.xinyongkaguanjia.db.service;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.yeetou.xinyongkaguanjia.R;
import com.yeetou.xinyongkaguanjia.db.DBHelper;
import com.yeetou.xinyongkaguanjia.db.base.DbBank;
import com.yeetou.xinyongkaguanjia.db.base.DbBankCard;
import com.yeetou.xinyongkaguanjia.db.base.DbStream;
import com.yeetou.xinyongkaguanjia.db.dao.DbStreamInterface;
import com.yeetou.xinyongkaguanjia.http.base.StreamBase;
import com.yeetou.xinyongkaguanjia.info.MonthPayments;
import com.yeetou.xinyongkaguanjia.info.StreamDayInfo;
import com.yeetou.xinyongkaguanjia.info.StreamInfo;
import com.yeetou.xinyongkaguanjia.info.StreamMonthInfo;
import com.yeetou.xinyongkaguanjia.info.YearMonthPayments;
public class DbStreamService implements DbStreamInterface {
private DBHelper dbHelper;
private Context mContext;
private DbStreamService() {
}
public DbStreamService(Context mContext) {
DBHelper.init(mContext);
this.mContext = mContext;
this.dbHelper = DBHelper.dbHelper();
}
@Override
public List<MonthPayments> getMonthPayments(int year) {
List<MonthPayments> result = new ArrayList<MonthPayments>();
for (int i = 12; i > 0; i--) {
MonthPayments temp = getMonthPayments(year, i);
if (temp.getIncome() == 0 && temp.getExpand() == 0) {
continue;
} else {
result.add(temp);
}
}
return result;
}
@Override
public MonthPayments getMonthPayments(int year, int month) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.rawQuery("select sum(a.amount) as amount from card_streams as a inner join card_bank_cards as b on a.bank_card_id=b._id where b.card_type='credit' and a.year=? and a.month=? and a.ispay=1", new String[] { String.valueOf(year), String.valueOf(month) });
MonthPayments monthPayments = new MonthPayments();
monthPayments.setYear(year);
monthPayments.setMonth(month);
monthPayments.setIncome(0);
monthPayments.setExpand(0);
if (cursor.moveToFirst()) {
monthPayments.setExpand(cursor.getFloat(0));
monthPayments.setIncome(-cursor.getFloat(0));
}
cursor = db.rawQuery("select sum(a.amount) as amount from card_streams as a inner join card_bank_cards as b on a.bank_card_id=b._id where b.card_type='debit' and a.year=? and a.month=? and a.ispay=0", new String[] { String.valueOf(year), String.valueOf(month) });
if (cursor.moveToFirst()) {
monthPayments.setIncome(-cursor.getFloat(0));
}
cursor.close();
return monthPayments;
}
public MonthPayments getCurMonthPayments(String bank_card_id) {
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1;
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = null;
if (bank_card_id != null) {
cursor = db.rawQuery("select sum(case ispay when 1 then amount else 0 end) as expend,sum(case ispay when 0 then amount else 0 end) as income from card_streams where year=? and month=? and bank_card_id=?", new String[] { String.valueOf(year), String.valueOf(month), bank_card_id });
} else {
cursor = db.rawQuery("select sum(case ispay when 1 then amount else 0 end) as expend,sum(case ispay when 0 then amount else 0 end) as income from card_streams where year=? and month=?", new String[] { String.valueOf(year), String.valueOf(month) });
}
MonthPayments monthPayments = new MonthPayments();
monthPayments.setYear(year);
monthPayments.setMonth(month);
monthPayments.setIncome(0);
monthPayments.setExpand(0);
if (cursor.moveToFirst()) {
monthPayments.setExpand(cursor.getFloat(0));
monthPayments.setIncome(-cursor.getFloat(1));
}
cursor.close();
return monthPayments;
}
public Float getBalanceByCard(String bank_card_id) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = null;
if (bank_card_id != null) {
cursor = db.rawQuery("select sum(case ispay when 1 then amount else 0 end) as expend,sum(case ispay when 0 then amount else 0 end) as income from card_streams where bank_card_id=?", new String[] { bank_card_id });
} else {
cursor = db.rawQuery("select sum(case ispay when 1 then amount else 0 end) as expend,sum(case ispay when 0 then amount else 0 end) as income from card_streams", new String[] {});
}
float result = 0;
if (cursor.moveToFirst()) {
result = cursor.getFloat(0) + cursor.getFloat(1);
result = -result;
}
cursor.close();
return result;
}
@Override
public Map<String, Float> getExpandByCategory(String thedate) {
int year = 0, month = 0;
String[] dates = thedate.split("-");
year = Integer.valueOf(dates[0]);
month = Integer.valueOf(dates[1]);
Map<String, Float> map = new HashMap<String, Float>();
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.rawQuery("select category,sum(amount) as amount from card_streams as a inner join card_bank_cards as b on a.bank_card_id=b._id where b.card_type='credit' and a.year=? and a.month=? and a.ispay=1 group by a.category", new String[] { String.valueOf(year), String.valueOf(month) });
while (cursor.moveToNext()) {
map.put(cursor.getString(0), cursor.getFloat(1));
}
cursor.close();
dbHelper.close();
return map;
}
@Override
public List<StreamMonthInfo> getStreams(String thedate, String category) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = null;
int year = 0, month = 0;
if (thedate.equals("全部")) {
year = -1;
month = -1;
} else {
String[] times = thedate.split("-");
year = Integer.valueOf(times[0]);
month = Integer.valueOf(times[1]);
}
if (category.equals("全部")) {
category = "-1";
}
if (year == -1 || month == -1) {
if (category.equals("-1")) {
cursor = db.rawQuery("select * from card_streams where state=0 and currency='RMB' and isPay=1 and message_id=0 and category in ('吃喝','购物','网购','出行','生活','玩乐','爱车')order by year desc,month desc,day desc", new String[] {});
} else {
cursor = db.rawQuery("select * from card_streams where category=? and state=0 and currency='RMB' and isPay=1 and message_id=0 and category in ('吃喝','购物','网购','出行','生活','玩乐','爱车')order by year desc,month desc,day desc", new String[] { category });
}
} else {
if (category.equals("-1")) {
cursor = db.rawQuery("select * from card_streams where year=? and month=? and state=0 and currency='RMB' and isPay=1 and message_id=0 and category in ('吃喝','购物','网购','出行','生活','玩乐','爱车')order by year desc,month desc,day desc", new String[] { String.valueOf(year), String.valueOf(month) });
} else {
cursor = db.rawQuery("select * from card_streams where year=? and month=? and category=? and state=0 and currency='RMB' and isPay=1 and message_id=0 and category in ('吃喝','购物','网购','出行','生活','玩乐','爱车')order by year desc,month desc,day desc", new String[] { String.valueOf(year), String.valueOf(month), category });
}
}
List<StreamMonthInfo> result = cursorToList(cursor);
cursor.close();
return result;
}
public List<StreamMonthInfo> getStreams(String bank_card_id, boolean isCredit) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = null;
if (isCredit) {
cursor = db.rawQuery("select * from card_streams where state=0 and currency='RMB' and isPay=1 and message_id=0 and bank_card_id=? and category in ('吃喝','购物','网购','出行','生活','玩乐','爱车')order by year desc,month desc,day desc", new String[] { bank_card_id });
} else {
cursor = db.rawQuery("select * from card_streams where state=0 and currency='RMB' and bank_card_id=? order by year desc,month desc,day desc", new String[] { bank_card_id });
}
List<StreamMonthInfo> result = cursorToList(cursor);
cursor.close();
return result;
}
@Override
public void save(DbStream dbStream) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("_id", dbStream.getId());
values.put("thedate", dbStream.getThedate());
values.put("year", dbStream.getYear());
values.put("month", dbStream.getMonth());
values.put("day", dbStream.getDay());
values.put("description", dbStream.getDescription());
values.put("amount", dbStream.getAmount());
values.put("category", dbStream.getCategory());
values.put("message_id", dbStream.getMessage_id());
values.put("bank_card_id", dbStream.getBank_card_id());
values.put("bill_id", dbStream.getBill_id());
values.put("state", dbStream.getState());
values.put("currency", dbStream.getCurrency());
values.put("isPay", dbStream.getIsPay());
db.insert("card_streams", null, values);
}
@Override
public Map<String, Float> getExpandByCategory(int year, int month, String bankname, String number) {
Map<String, Float> map = new HashMap<String, Float>();
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.rawQuery("select category,sum(amount) as amount from card_streams where year=? and month=? and bank_name=? and card_number=? and ispay=1 group by category", new String[] { String.valueOf(year), String.valueOf(month), bankname, number });
while (cursor.moveToNext()) {
map.put(cursor.getString(0), cursor.getFloat(1));
}
cursor.close();
dbHelper.close();
if (map.size() == 0)
return null;
else
return map;
}
private List<StreamMonthInfo> cursorToList(Cursor cursor) {
List<StreamMonthInfo> result = new ArrayList<StreamMonthInfo>();
List<StreamDayInfo> streamdays = new ArrayList<StreamDayInfo>();
List<StreamInfo> streams = new ArrayList<StreamInfo>();
StreamMonthInfo currMonth = null;
StreamDayInfo currDay = null;
int currd = 0;
int curry = 0;
int currm = 0;
while (cursor.moveToNext()) {
long thedate = cursor.getLong(1);
int year = cursor.getInt(2);
int month = cursor.getInt(3);
int day = cursor.getInt(4);
String description = cursor.getString(5);
float amount = cursor.getFloat(6);
String category = null;
int bank_card_id = cursor.getInt(9);
int isPay = cursor.getInt(11);
String card_number = cursor.getString(14);
String bank_logo = cursor.getString(15);
String bank_name = cursor.getString(16);
if (isPay != 0) {
category = cursor.getString(7);
} else {
category = "收入";
amount = 0 - amount;
}
StreamInfo streamInfo = new StreamInfo();
streamInfo.setAmount(amount);
streamInfo.setBank(bank_name);
streamInfo.setBank_logo(bank_logo);
streamInfo.setCard_num(card_number);
streamInfo.setCategory(category);
streamInfo.setDes(description);
streamInfo.setTrade_time(thedate);
streamInfo.setBank_id(bank_card_id);
if (curry == year && currm == month && currd == day) {
streams.add(streamInfo);
} else if (curry == year && currm == month && currd != day) {
currd = day;
currDay.setStreams(streams);
streamdays.add(currDay.clone());
streams.clear();
currDay = new StreamDayInfo();
currDay.setDay(day);
currDay.setMonth(month);
currDay.setYear(year);
streams.add(streamInfo);
} else if (curry != year || currm != month) {
if (currMonth != null) {
currDay.setStreams(streams);
streamdays.add(currDay.clone());
streams.clear();
currMonth.setStreamdays(streamdays);
result.add(currMonth.clone());
streamdays.clear();
}
curry = year;
currm = month;
currd = day;
currMonth = new StreamMonthInfo();
currMonth.setMonth(month);
currMonth.setYear(year);
currDay = new StreamDayInfo();
currDay.setDay(day);
currDay.setMonth(month);
currDay.setYear(year);
streams.add(streamInfo);
}
}
if (currMonth != null) {
currDay.setStreams(streams);
streamdays.add(currDay);
currMonth.setStreamdays(streamdays);
result.add(currMonth);
}
return result;
}
// 支出只取信用卡,收入只取储蓄卡
@Override
public List<YearMonthPayments> getMonthPayments() {
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.rawQuery("select year from card_streams group by year", new String[] {});
List<Integer> years = new ArrayList<Integer>();
while (cursor.moveToNext()) {
years.add(cursor.getInt(0));
}
List<YearMonthPayments> result = new ArrayList<YearMonthPayments>();
for (int i = 0; i < years.size(); i++) {
List<MonthPayments> temp = getMonthPayments(years.get(i));
if (temp.size() != 0) {
YearMonthPayments ymp = new YearMonthPayments();
ymp.setMonthPayments(temp);
ymp.setYear(years.get(i));
result.add(ymp);
}
}
return result;
}
public List<MonthPayments> getMonthPaymentsByCard(String bank_card_id, boolean isCredit) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = null;
if (isCredit) {
cursor = db.rawQuery("select sum(amount) as amount,ispay,year,month from card_streams where state=0 and currency='RMB' and isPay=1 and message_id=0 and bank_card_id=? group by year,month order by year desc,month desc", new String[] { bank_card_id });
} else {
cursor = db.rawQuery("select sum(amount) as amount,ispay,year,month from card_streams where state=0 and currency='RMB' and bank_card_id=? group by year,month order by year desc,month desc", new String[] { bank_card_id });
}
List<MonthPayments> result = new ArrayList<MonthPayments>();
MonthPayments monthPayments = new MonthPayments();
monthPayments.setYear(0);
monthPayments.setMonth(0);
while (cursor.moveToNext()) {
int year = cursor.getInt(2);
int month = cursor.getInt(3);
if (year == monthPayments.getYear() && month == monthPayments.getMonth()) {
if (cursor.getInt(1) == 1) {
monthPayments.setExpand(cursor.getFloat(0));
} else {
monthPayments.setIncome(-cursor.getFloat(0));
}
result.add(monthPayments);
monthPayments = new MonthPayments();
monthPayments.setYear(0);
monthPayments.setMonth(0);
} else {
if (monthPayments.getExpand() != 0 || monthPayments.getIncome() != 0) {
result.add(monthPayments);
}
monthPayments = new MonthPayments();
monthPayments.setYear(year);
monthPayments.setMonth(month);
if (cursor.getInt(1) == 1) {
monthPayments.setExpand(cursor.getFloat(0));
} else {
monthPayments.setIncome(-cursor.getFloat(0));
}
}
}
if (monthPayments.getExpand() != 0 || monthPayments.getIncome() != 0) {
result.add(monthPayments);
}
cursor.close();
return result;
}
@Override
public void save(List<DbStream> dbStreams) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
Cursor cur = null;
for (DbStream dbStream : dbStreams) {
delete(dbStream.getId());
values.put("_id", dbStream.getId());
values.put("thedate", dbStream.getThedate());
values.put("year", dbStream.getYear());
values.put("month", dbStream.getMonth());
values.put("day", dbStream.getDay());
values.put("description", dbStream.getDescription());
values.put("amount", dbStream.getAmount());
values.put("category", dbStream.getCategory());
values.put("message_id", dbStream.getMessage_id());
values.put("bank_card_id", dbStream.getBank_card_id());
values.put("bill_id", dbStream.getBill_id());
values.put("state", dbStream.getState());
values.put("currency", dbStream.getCurrency());
values.put("isPay", dbStream.getIsPay());
cur = db.rawQuery("select number,bank_logo,bank_name from card_bank_cards where _id=? limit 1", new String[] { dbStream.getBank_card_id() + "" });
if (cur.moveToFirst()) {
values.put("card_number", cur.getString(0));
values.put("bank_logo", cur.getString(1));
values.put("bank_name", cur.getString(2));
}
db.insert("card_streams", null, values);
}
cur.close();
}
public boolean isNull() {
boolean result = true;
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.rawQuery("select * from card_streams limit 1", new String[] {});
if (cursor.moveToFirst())
result = false;
return result;
}
@Override
public List<String> getAllDate() {
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.rawQuery("select year,month from card_streams as a inner join card_bank_cards as b on a.bank_card_id=b._id where b.card_type='credit' group by year,month", new String[] {});
List<String> result = new ArrayList<String>();
while (cursor.moveToNext()) {
result.add(cursor.getInt(0) + "-" + cursor.getInt(1));
}
cursor.close();
return result;
}
@Override
public void synSaveStreamBase(List<StreamBase> streamBases) {
List<DbStream> dbStreams = new ArrayList<DbStream>();
for (StreamBase sb : streamBases) {
DbStream sbs = sb.toDbStream();
dbStreams.add(sbs);
}
save(dbStreams);
}
private void delete(int id) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.execSQL("delete from card_streams where _id=?", new Integer[] { id });
}
}