Commit dc42b76e by 宁斌

訂單詳情完善

parents cd58cb90 7410f941
package com.gingersoft.gsa.cloud.main.mvp.contract;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.BusinessBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.HomeTurnoverBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.BusinessDetailsBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.MainBusinessBean;
import com.jess.arms.mvp.IModel;
import com.jess.arms.mvp.IView;
......@@ -9,7 +10,6 @@ import java.util.List;
import java.util.Map;
import io.reactivex.Observable;
import okhttp3.RequestBody;
/**
......@@ -27,13 +27,15 @@ import okhttp3.RequestBody;
public interface BusinessReportContract {
//对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
interface View extends IView {
void loadChart(Map<String, HomeTurnoverBean.DataBean> data);
void loadChart(List<MainBusinessBean.DataBean> data);
void loadAdapter(List<BusinessBean> businessBeans);
}
//Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存
interface Model extends IModel {
Observable<HomeTurnoverBean> getRestaurantBusinessInfo(RequestBody requestBody);
Observable<MainBusinessBean> getRestaurantBusinessAmount(Map<String, String> map);
Observable<BusinessDetailsBean> getRestaurantBusinessDetails(Map<String, String> map);
}
}
package com.gingersoft.gsa.cloud.main.mvp.contract;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.HomeTurnoverBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.MainBusinessBean;
import com.jess.arms.mvp.IView;
import com.jess.arms.mvp.IModel;
......@@ -30,7 +31,7 @@ public interface HomeContract {
//Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存
interface Model extends IModel {
Observable<HomeTurnoverBean> getRestaurantReport(RequestBody requestBody);
Observable<MainBusinessBean> getRestaurantReport(RequestBody requestBody);
Observable<String> getRestaurantFunList(String restaurantId);
}
......
package com.gingersoft.gsa.cloud.main.mvp.contract;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.HomeTurnoverBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.MainBusinessBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.MainOrderInfoChartBean;
import com.jess.arms.mvp.IModel;
import com.jess.arms.mvp.IView;
import java.util.List;
import java.util.Map;
import io.reactivex.Observable;
import okhttp3.RequestBody;
......@@ -27,14 +26,14 @@ import okhttp3.RequestBody;
public interface MainTopContract {
//对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
interface View extends IView {
void loadBusinessInfo(Map<String, HomeTurnoverBean.DataBean> dataBeanMap);
void loadBusinessInfo(List<MainBusinessBean.DataBean> dataBean);
void loadChart(List<MainOrderInfoChartBean.DataBean> dataBeans);
}
//Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存
interface Model extends IModel {
Observable<HomeTurnoverBean> getRestaurantReport(RequestBody requestBody);
Observable<MainBusinessBean> getRestaurantReport(String restaurantId);
Observable<MainOrderInfoChartBean> getOrderInfoChart(RequestBody requestBody);
}
......
......@@ -5,6 +5,7 @@ import com.jess.arms.mvp.IModel;
import com.jess.arms.mvp.IView;
import java.util.List;
import java.util.Map;
import io.reactivex.Observable;
import okhttp3.RequestBody;
......@@ -25,11 +26,13 @@ import okhttp3.RequestBody;
public interface SalesContract {
//对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
interface View extends IView {
void loadInfo(List<SalesFoodsBean.DataBean> info);
void loadInfo(List<SalesFoodsBean.DataBean.SalesRankingBean> salesRanking);
}
//Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存
interface Model extends IModel {
Observable<SalesFoodsBean> getSalesReportInfo(Map<String, Object> map);
Observable<SalesFoodsBean> getSalesReportInfo(RequestBody requestBody);
}
}
package com.gingersoft.gsa.cloud.main.mvp.contract;
import com.gingersoft.gsa.cloud.base.common.bean.BaseResult;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.SendSettlement;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.SettlementReport;
import com.jess.arms.base.DefaultAdapter;
import com.jess.arms.mvp.IView;
import com.jess.arms.mvp.IModel;
import com.jess.arms.mvp.IView;
import io.reactivex.Observable;
import okhttp3.RequestBody;
......@@ -32,6 +31,8 @@ public interface SettlementReportContract {
void setSettlementReportItem5Adapter(DefaultAdapter adapter);
void returnSettlementData(SettlementReport.DataBean datasBean);
//打印清機報表
void printRepore();
}
//Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存
......
......@@ -3,18 +3,19 @@ package com.gingersoft.gsa.cloud.main.mvp.model;
import android.app.Application;
import com.gingersoft.gsa.cloud.main.mvp.contract.BusinessReportContract;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.HomeTurnoverBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.BusinessDetailsBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.MainBusinessBean;
import com.gingersoft.gsa.cloud.main.mvp.model.service.MainReportService;
import com.google.gson.Gson;
import com.jess.arms.di.scope.FragmentScope;
import com.jess.arms.integration.IRepositoryManager;
import com.jess.arms.mvp.BaseModel;
import java.util.Map;
import javax.inject.Inject;
import io.reactivex.Observable;
import me.jessyan.retrofiturlmanager.RetrofitUrlManager;
import okhttp3.RequestBody;
/**
......@@ -49,9 +50,14 @@ public class BusinessReportModel extends BaseModel implements BusinessReportCont
}
@Override
public Observable<HomeTurnoverBean> getRestaurantBusinessInfo(RequestBody requestBody) {
RetrofitUrlManager.getInstance().putDomain("common", "http://a.ricepon.com:61177/member-web/api/");
public Observable<MainBusinessBean> getRestaurantBusinessAmount(Map<String, String> map) {
return mRepositoryManager.obtainRetrofitService(MainReportService.class)
.getRestaurantAmount(map);
}
@Override
public Observable<BusinessDetailsBean> getRestaurantBusinessDetails(Map<String, String> map) {
return mRepositoryManager.obtainRetrofitService(MainReportService.class)
.getRestaurantReport(requestBody);
.getRestaurantDetails(map);
}
}
\ No newline at end of file
......@@ -2,18 +2,16 @@ package com.gingersoft.gsa.cloud.main.mvp.model;
import android.app.Application;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.HomeTurnoverBean;
import com.gingersoft.gsa.cloud.main.mvp.contract.HomeContract;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.MainBusinessBean;
import com.gingersoft.gsa.cloud.main.mvp.model.service.MainReportService;
import com.google.gson.Gson;
import com.jess.arms.di.scope.FragmentScope;
import com.jess.arms.integration.IRepositoryManager;
import com.jess.arms.mvp.BaseModel;
import com.jess.arms.di.scope.FragmentScope;
import javax.inject.Inject;
import com.gingersoft.gsa.cloud.main.mvp.contract.HomeContract;
import io.reactivex.Observable;
import me.jessyan.retrofiturlmanager.RetrofitUrlManager;
import okhttp3.RequestBody;
......@@ -51,10 +49,10 @@ public class HomeModel extends BaseModel implements HomeContract.Model {
}
@Override
public Observable<HomeTurnoverBean> getRestaurantReport(RequestBody requestBody) {
public Observable<MainBusinessBean> getRestaurantReport(RequestBody requestBody) {
RetrofitUrlManager.getInstance().putDomain("common", "https://m.ricepon.com/member-web/api/");
return mRepositoryManager.obtainRetrofitService(MainReportService.class)
.getRestaurantReport(requestBody);
.getRestaurantReport("");
}
@Override
......
......@@ -3,7 +3,7 @@ package com.gingersoft.gsa.cloud.main.mvp.model;
import android.app.Application;
import com.gingersoft.gsa.cloud.main.mvp.contract.MainTopContract;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.HomeTurnoverBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.MainBusinessBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.MainOrderInfoChartBean;
import com.gingersoft.gsa.cloud.main.mvp.model.service.MainReportService;
import com.google.gson.Gson;
......@@ -14,7 +14,6 @@ import com.jess.arms.mvp.BaseModel;
import javax.inject.Inject;
import io.reactivex.Observable;
import me.jessyan.retrofiturlmanager.RetrofitUrlManager;
import okhttp3.RequestBody;
......@@ -50,15 +49,13 @@ public class MainTopModel extends BaseModel implements MainTopContract.Model {
}
@Override
public Observable<HomeTurnoverBean> getRestaurantReport(RequestBody requestBody) {
RetrofitUrlManager.getInstance().putDomain("common", "http://a.ricepon.com:61177/member-web/api/");
public Observable<MainBusinessBean> getRestaurantReport(String restaurantId) {
return mRepositoryManager.obtainRetrofitService(MainReportService.class)
.getRestaurantReport(requestBody);
.getRestaurantReport(restaurantId);
}
@Override
public Observable<MainOrderInfoChartBean> getOrderInfoChart(RequestBody requestBody) {
RetrofitUrlManager.getInstance().putDomain("common", "http://a.ricepon.com:61177/member-web/api/");
return mRepositoryManager.obtainRetrofitService(MainReportService.class)
.getOrderInfoChart(requestBody);
}
......
......@@ -13,7 +13,6 @@ import com.jess.arms.mvp.BaseModel;
import javax.inject.Inject;
import io.reactivex.Observable;
import me.jessyan.retrofiturlmanager.RetrofitUrlManager;
import okhttp3.RequestBody;
......@@ -50,7 +49,6 @@ public class PaymentMethodReportModel extends BaseModel implements PaymentMethod
@Override
public Observable<PaymentMethodBean> getPaymentInfo(RequestBody requestBody) {
RetrofitUrlManager.getInstance().putDomain("common", "http://a.ricepon.com:61177/member-web/api/");
return mRepositoryManager.obtainRetrofitService(MainReportService.class)
.getPaymentInfo(requestBody);
}
......
......@@ -10,10 +10,11 @@ import com.jess.arms.di.scope.FragmentScope;
import com.jess.arms.integration.IRepositoryManager;
import com.jess.arms.mvp.BaseModel;
import java.util.Map;
import javax.inject.Inject;
import io.reactivex.Observable;
import me.jessyan.retrofiturlmanager.RetrofitUrlManager;
import okhttp3.RequestBody;
......@@ -49,8 +50,13 @@ public class SalesModel extends BaseModel implements SalesContract.Model {
}
@Override
public Observable<SalesFoodsBean> getSalesReportInfo(Map<String, Object> map) {
return mRepositoryManager.obtainRetrofitService(MainReportService.class)
.getSalesReportInfo(map);
}
@Override
public Observable<SalesFoodsBean> getSalesReportInfo(RequestBody requestBody) {
RetrofitUrlManager.getInstance().putDomain("common", "http://a.ricepon.com:61177/member-web/api/");
return mRepositoryManager.obtainRetrofitService(MainReportService.class)
.getSalesReportInfo(requestBody);
}
......
package com.gingersoft.gsa.cloud.main.mvp.model.bean;
public class BusinessDetailsBean {
/**
* success : true
* sysTime : 1583995203737
* data : {"prices":7749,"scamount":0,"disamount":0,"rounding":0,"payamount":0,"tipsPrice":0,"totamount":9025,"totalMeals":9025,"takeawayTotal":0}
*/
private boolean success;
private long sysTime;
private DataBean data;
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public long getSysTime() {
return sysTime;
}
public void setSysTime(long sysTime) {
this.sysTime = sysTime;
}
public DataBean getData() {
return data;
}
public void setData(DataBean data) {
this.data = data;
}
public static class DataBean {
/**
* //#項目銷售總數
* private double prices;
* //服務費
* private double scamount;
* //折扣
* private double disamount;
* //賬單小數
* private double rounding;
* //簽單
* private double payamount;
* //貼士
* private double tipsPrice;
* //賬單金額總數
* private double totamount;
* //堂食總數
* private double totalMeals;
* //外賣總數
* private double takeawayTotal;
*/
private double prices;
private double scamount;
private double disamount;
private double rounding;
private double payamount;
private double tipsPrice;
private double totamount;
private double totalMeals;
private double takeawayTotal;
private int num;//賬單數
private int person;//人數
public double getPrices() {
return prices;
}
public void setPrices(double prices) {
this.prices = prices;
}
public double getScamount() {
return scamount;
}
public void setScamount(double scamount) {
this.scamount = scamount;
}
public double getDisamount() {
return disamount;
}
public void setDisamount(double disamount) {
this.disamount = disamount;
}
public double getRounding() {
return rounding;
}
public void setRounding(double rounding) {
this.rounding = rounding;
}
public double getPayamount() {
return payamount;
}
public void setPayamount(double payamount) {
this.payamount = payamount;
}
public double getTipsPrice() {
return tipsPrice;
}
public void setTipsPrice(double tipsPrice) {
this.tipsPrice = tipsPrice;
}
public double getTotamount() {
return totamount;
}
public void setTotamount(double totamount) {
this.totamount = totamount;
}
public double getTotalMeals() {
return totalMeals;
}
public void setTotalMeals(double totalMeals) {
this.totalMeals = totalMeals;
}
public double getTakeawayTotal() {
return takeawayTotal;
}
public void setTakeawayTotal(double takeawayTotal) {
this.takeawayTotal = takeawayTotal;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getPerson() {
return person;
}
public void setPerson(int person) {
this.person = person;
}
}
}
package com.gingersoft.gsa.cloud.main.mvp.model.bean;
import java.util.List;
/**
* 首頁營業數據
*/
public class MainBusinessBean {
/**
* success : true
* sysTime : 1583994555935
* data : [{"date":"2020-03-11","totalAmount":0,"person":186,"num":46,"price":4619},{"date":"2020-03-12","totalAmount":0,"person":0,"num":0,"price":2614}]
*/
private boolean success;
private long sysTime;
private List<DataBean> data;
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public long getSysTime() {
return sysTime;
}
public void setSysTime(long sysTime) {
this.sysTime = sysTime;
}
public List<DataBean> getData() {
return data;
}
public void setData(List<DataBean> data) {
this.data = data;
}
public static class DataBean {
/**
* date : 2020-03-11 時間
* totalAmount : 0 今日營業額
* person : 186 人數
* num : 46 訂單數
* price : 4619 項目銷售總金額
*/
private String date;//首頁信息時間,,其他地方為空
private String startingTime;//營業分析報表時間,其他地方為空
private float totalAmount;//今日營業額 淨值
private int person;
private int num;
private float price;//項目銷售總金額
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public float getTotalAmount() {
return totalAmount;
}
public void setTotalAmount(float totalAmount) {
this.totalAmount = totalAmount;
}
public int getPerson() {
return person;
}
public void setPerson(int person) {
this.person = person;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public String getStartingTime() {
return startingTime;
}
public void setStartingTime(String startingTime) {
this.startingTime = startingTime;
}
}
}
......@@ -7,15 +7,16 @@ import java.util.List;
* 销售分析——食品top10
*/
public class SalesFoodsBean {
/**
* success : true
* sysTime : 1582703198491
* data : [{"sumTotal":596990.68,"sumNum":11629,"foodName":"冲绳黑糖奶盖茶","averageTotal":51.34,"percentageTotal":"100%","percentageNum":"100%"}]
* sysTime : 1584013508073
* data : {"salesAnalysis":[],"salesRanking":[{"productName":"青菜","price":0,"number":87,"amount":0},{"productName":"火鍋","price":200,"number":75,"amount":15000},{"productName":"牛奶","price":5,"number":40,"amount":200},{"productName":"雞米花","price":20,"number":29,"amount":580},{"productName":"豆漿","price":5,"number":25,"amount":125},{"productName":"拉麵","price":50,"number":20,"amount":1000},{"productName":"燒麥","price":5,"number":20,"amount":100},{"productName":"餃子","price":10,"number":19,"amount":190},{"productName":"包子","price":5,"number":18,"amount":90},{"productName":"抄時蔬","price":20,"number":9,"amount":180},{"productName":"煲仔飯","price":25,"number":7,"amount":175},{"productName":"牛肉炒飯","price":15,"number":6,"amount":90},{"productName":"奶茶-顯示","price":15,"number":5,"amount":75},{"productName":"王老吉","price":10,"number":5,"amount":50},{"productName":"西紅柿蛋湯","price":20,"number":4,"amount":80},{"productName":"青椒炒肉","price":20,"number":3,"amount":60},{"productName":"壽司","price":20,"number":2,"amount":40},{"productName":"¥","price":0,"number":1,"amount":0}]}
*/
private boolean success;
private long sysTime;
private List<DataBean> data;
private DataBean data;
public boolean isSuccess() {
return success;
......@@ -33,77 +34,78 @@ public class SalesFoodsBean {
this.sysTime = sysTime;
}
public List<DataBean> getData() {
public DataBean getData() {
return data;
}
public void setData(List<DataBean> data) {
public void setData(DataBean data) {
this.data = data;
}
public static class DataBean {
/**
* sumTotal : 596990.68
* sumNum : 11629
* foodName : 冲绳黑糖奶盖茶
* averageTotal : 51.34
* percentageTotal : 100%
* percentageNum : 100%
*/
private double sumTotal;
private int sumNum;
private String foodName;
private double averageTotal;
private String percentageTotal;
private String percentageNum;
public double getSumTotal() {
return sumTotal;
}
public void setSumTotal(double sumTotal) {
this.sumTotal = sumTotal;
}
public int getSumNum() {
return sumNum;
}
public void setSumNum(int sumNum) {
this.sumNum = sumNum;
}
public String getFoodName() {
return foodName;
}
public void setFoodName(String foodName) {
this.foodName = foodName;
}
public double getAverageTotal() {
return averageTotal;
}
private List<?> salesAnalysis;
private List<SalesRankingBean> salesRanking;
public void setAverageTotal(double averageTotal) {
this.averageTotal = averageTotal;
public List<?> getSalesAnalysis() {
return salesAnalysis;
}
public String getPercentageTotal() {
return percentageTotal;
public void setSalesAnalysis(List<?> salesAnalysis) {
this.salesAnalysis = salesAnalysis;
}
public void setPercentageTotal(String percentageTotal) {
this.percentageTotal = percentageTotal;
public List<SalesRankingBean> getSalesRanking() {
return salesRanking;
}
public String getPercentageNum() {
return percentageNum;
public void setSalesRanking(List<SalesRankingBean> salesRanking) {
this.salesRanking = salesRanking;
}
public void setPercentageNum(String percentageNum) {
this.percentageNum = percentageNum;
public static class SalesRankingBean {
/**
* productName : 青菜
* price : 0.0 單價
* number : 87 數量
* amount : 0 總金額
*/
private String productName;
private double price;
private int number;
private int amount;
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
}
}
}
package com.gingersoft.gsa.cloud.main.mvp.model.service;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.HomeTurnoverBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.BusinessDetailsBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.MainBusinessBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.MainOrderInfoChartBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.PaymentMethodBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.SalesFoodsBean;
import java.util.Map;
import io.reactivex.Observable;
import me.jessyan.retrofiturlmanager.RetrofitUrlManager;
import okhttp3.RequestBody;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
/**
* Created by Wyh on 2020/1/10.
......@@ -19,17 +24,40 @@ import retrofit2.http.Query;
*/
public interface MainReportService {
//支付分析報表
@Headers({"Domain-Name: wechat_report"})
@POST("wx/findPayMode" + RetrofitUrlManager.IDENTIFICATION_PATH_SIZE + 2)
Observable<PaymentMethodBean> getPaymentInfo(@Body RequestBody requestBody);
//銷售分析報表
@Headers({"Domain-Name: gsa_report"})
@GET("restaurantOperation/sales/analysis" + RetrofitUrlManager.IDENTIFICATION_PATH_SIZE + 2)
Observable<SalesFoodsBean> getSalesReportInfo(@QueryMap Map<String, Object> map);
//銷售分析報表
@Headers({"Domain-Name: wechat_report"})
@POST("wx/findFoodTop" + RetrofitUrlManager.IDENTIFICATION_PATH_SIZE + 2)
Observable<SalesFoodsBean> getSalesReportInfo(@Body RequestBody requestBody);
//營業信息
@POST("wx/doBusiness" + RetrofitUrlManager.IDENTIFICATION_PATH_SIZE + 2)
Observable<HomeTurnoverBean> getRestaurantReport(@Body RequestBody requestBody);
//
@Headers({"Domain-Name: gsa_report"})
@GET("restaurantOperation/business" + RetrofitUrlManager.IDENTIFICATION_PATH_SIZE + 2)
Observable<MainBusinessBean> getRestaurantReport(@Query("restaurantId") String restaurantId);
//營業詳情
@Headers({"Domain-Name: gsa_report"})
@GET("restaurantOperation/business/dtails" + RetrofitUrlManager.IDENTIFICATION_PATH_SIZE + 2)
Observable<BusinessDetailsBean> getRestaurantDetails(@QueryMap Map<String, String> map);
//營業金額
@Headers({"Domain-Name: gsa_report"})
@GET("restaurantOperation/business/amount" + RetrofitUrlManager.IDENTIFICATION_PATH_SIZE + 2)
Observable<MainBusinessBean> getRestaurantAmount(@QueryMap Map<String, String> map);
@Headers({"Domain-Name: wechat_report"})
@POST("wx/findOrderInfoChart" + RetrofitUrlManager.IDENTIFICATION_PATH_SIZE + 2)
Observable<MainOrderInfoChartBean> getOrderInfoChart(@Body RequestBody requestBody);
//獲取首頁功能列表
@GET("user/resource/list" + RetrofitUrlManager.IDENTIFICATION_PATH_SIZE + 2)
Observable<String> getRestaurantFunList(@Query("restaurantId") String restaurantId);
......
package com.gingersoft.gsa.cloud.main.mvp.model.service;
import com.gingersoft.gsa.cloud.base.common.bean.BaseResult;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.SendSettlement;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.SettlementReport;
......@@ -8,9 +7,8 @@ import io.reactivex.Observable;
import me.jessyan.retrofiturlmanager.RetrofitUrlManager;
import okhttp3.RequestBody;
import retrofit2.http.Body;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Query;
......@@ -26,6 +24,7 @@ public interface SettlementService {
@POST("RestaurantOperation/add" + RetrofitUrlManager.IDENTIFICATION_PATH_SIZE + 2)
Observable<SendSettlement> sendSettlement(@Body RequestBody requestBody);
@Headers({"Domain-Name: settlement_report_server"})
@GET("ricepon-report/api/restaurantOperation/report" + RetrofitUrlManager.IDENTIFICATION_PATH_SIZE + 2)
Observable<SettlementReport> getSettlementReport(@Query("restaurantId") int restaurantId);
......
......@@ -2,18 +2,20 @@ package com.gingersoft.gsa.cloud.main.mvp.presenter;
import android.app.Application;
import com.gingersoft.gsa.cloud.base.utils.constans.HttpsConstans;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.base.utils.MoneyUtil;
import com.gingersoft.gsa.cloud.main.mvp.contract.BusinessReportContract;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.BusinessBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.HomeTurnoverBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.BusinessDetailsBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.MainBusinessBean;
import com.jess.arms.di.scope.FragmentScope;
import com.jess.arms.http.imageloader.ImageLoader;
import com.jess.arms.integration.AppManager;
import com.jess.arms.mvp.BasePresenter;
import com.jess.arms.utils.RxLifecycleUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -22,11 +24,8 @@ import javax.inject.Inject;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.schedulers.Schedulers;
import me.jessyan.retrofiturlmanager.RetrofitUrlManager;
import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber;
import okhttp3.FormBody;
import okhttp3.RequestBody;
/**
......@@ -66,73 +65,95 @@ public class BusinessReportPresenter extends BasePresenter<BusinessReportContrac
this.mApplication = null;
}
public void getRestaurantBusinessInfo(String restaurantId, String startTime, String endTime) {
RequestBody requestBody = new FormBody.Builder()
.add("restaurantId", restaurantId)
.add("startTime", startTime)//TimeUtils.getYesterdayTime(TimeUtils.DATE_FORMAT_DATE)
.add("endTime", endTime)//TimeUtils.getCurrentTimeInString(TimeUtils.DATE_FORMAT_DATE)
.build();
mModel.getRestaurantBusinessInfo(requestBody)
public void getRestaurantAmount(String restaurantId, String startTime, String endTime) {
Map<String, String> map = new HashMap<>();
map.put("restaurantId", restaurantId);
map.put("startTime", startTime);
map.put("endTime", endTime);
mModel.getRestaurantBusinessAmount(map)
.subscribeOn(Schedulers.io())
.doOnSubscribe(disposable -> mRootView.showLoading(""))
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.doAfterTerminate(() -> mRootView.hideLoading())
.compose(RxLifecycleUtils.bindToLifecycle(mRootView))
.subscribe(new ErrorHandleSubscriber<HomeTurnoverBean>(mErrorHandler) {
.subscribe(new ErrorHandleSubscriber<MainBusinessBean>(mErrorHandler) {
@Override
public void onNext(@NonNull HomeTurnoverBean info) {
public void onNext(@NonNull MainBusinessBean info) {
if (info != null && info.isSuccess()) {
if (info.getData() != null) {
mRootView.loadChart(info.getData());
loadAdapterInfo(info.getData());
}
} else {
mRootView.showMessage("營業信息獲取失敗");
}
}
});
}
@Override
public void onComplete() {
super.onComplete();
RetrofitUrlManager.getInstance().putDomain("common", HttpsConstans.ROOT_SERVER_ADDRESS_FORMAL);
}
public void getRestaurantBusinessInfo(String restaurantId, String startTime, String endTime) {
Map<String, String> map = new HashMap<>();
map.put("restaurantId", restaurantId);
map.put("startTime", startTime);
map.put("endTime", endTime);
mModel.getRestaurantBusinessDetails(map)
.subscribeOn(Schedulers.io())
.doOnSubscribe(disposable -> mRootView.showLoading(""))
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.doAfterTerminate(() -> mRootView.hideLoading())
.compose(RxLifecycleUtils.bindToLifecycle(mRootView))
.subscribe(new ErrorHandleSubscriber<BusinessDetailsBean>(mErrorHandler) {
@Override
public void onError(Throwable t) {
super.onError(t);
RetrofitUrlManager.getInstance().putDomain("common", HttpsConstans.ROOT_SERVER_ADDRESS_FORMAL);
public void onNext(@NonNull BusinessDetailsBean info) {
if (info != null && info.isSuccess()) {
loadAdapterInfo(info.getData());
} else {
mRootView.showMessage("營業信息獲取失敗");
}
}
});
}
private String[] itemNames = new String[]{"項目銷售總金額", "折扣", "服務費", "賬單小數", "簽單", "營業金額淨值", "貼士", "堂食總數", "外賣總數", "單數", "平均每單", "人數", "平均每人"};
private void loadAdapterInfo(Map<String, HomeTurnoverBean.DataBean> data) {
HomeTurnoverBean.DataBean dataBean = data.get(TimeUtils.getOldDate(0));
private void loadAdapterInfo(BusinessDetailsBean.DataBean dataBean) {
//底部信息默認顯示今天的數據
List<BusinessBean> businessBeans = new ArrayList<>();
if (dataBean != null && dataBean.getBusiness_amount() != null) {
businessBeans.add(new BusinessBean(itemNames[0], dataBean.getBusiness_amount()));
businessBeans.add(new BusinessBean(itemNames[1], dataBean.getDiscount()));
businessBeans.add(new BusinessBean(itemNames[2], dataBean.getServicecharge()));
businessBeans.add(new BusinessBean(itemNames[3], dataBean.getBill_decimal()));
businessBeans.add(new BusinessBean(itemNames[4], "簽單"));
businessBeans.add(new BusinessBean(itemNames[5], "營業金額淨值"));
businessBeans.add(new BusinessBean(itemNames[6], dataBean.getTipsAmount()));
businessBeans.add(new BusinessBean(itemNames[7], dataBean.getBillNum_table()));
businessBeans.add(new BusinessBean(itemNames[8], dataBean.getBillNum_Takeout()));
businessBeans.add(new BusinessBean(itemNames[9], dataBean.getNumber_bill()));
float averageBill = Float.parseFloat(dataBean.getBusiness_amount()) / Float.parseFloat(dataBean.getNumber_bill());
businessBeans.add(new BusinessBean(itemNames[10], averageBill + ""));//"平均每單"
businessBeans.add(new BusinessBean(itemNames[11], dataBean.getPeople()));//人數
float averageConsumption = Float.parseFloat(dataBean.getBusiness_amount()) / Float.parseFloat(dataBean.getPeople());
businessBeans.add(new BusinessBean(itemNames[12], averageConsumption + ""));//平均每人
if (dataBean != null) {
businessBeans.add(new BusinessBean(itemNames[0], String.valueOf(dataBean.getPrices())));
businessBeans.add(new BusinessBean(itemNames[1], String.valueOf(dataBean.getDisamount())));
businessBeans.add(new BusinessBean(itemNames[2], String.valueOf(dataBean.getScamount())));
businessBeans.add(new BusinessBean(itemNames[3], String.valueOf(dataBean.getRounding())));
businessBeans.add(new BusinessBean(itemNames[4], String.valueOf(dataBean.getPayamount())));
//折扣+賬單小數+簽單
double expenditure = MoneyUtil.sum(MoneyUtil.sum(dataBean.getDisamount(), dataBean.getRounding()), dataBean.getPayamount());
//服務費和貼士
double extraIncome = MoneyUtil.sum(dataBean.getScamount(), dataBean.getTipsPrice());
//"營業金額淨值"為項目銷售總金額-折扣+服務費-賬單小數-簽單
businessBeans.add(new BusinessBean(itemNames[5], String.valueOf(MoneyUtil.sub(MoneyUtil.sum(dataBean.getPrices(), extraIncome), expenditure))));
businessBeans.add(new BusinessBean(itemNames[6], String.valueOf(dataBean.getTipsPrice())));
businessBeans.add(new BusinessBean(itemNames[7], String.valueOf(dataBean.getTotalMeals())));
businessBeans.add(new BusinessBean(itemNames[8], String.valueOf(dataBean.getTakeawayTotal())));
businessBeans.add(new BusinessBean(itemNames[9], String.valueOf(dataBean.getNum())));//單數
BigDecimal averageBill = new BigDecimal(0);
if (dataBean.getNum() != 0) {
averageBill = MoneyUtil.divide(dataBean.getPrices(), dataBean.getNum());
}
businessBeans.add(new BusinessBean(itemNames[10], String.valueOf(averageBill)));//"平均每單"
businessBeans.add(new BusinessBean(itemNames[11], String.valueOf(dataBean.getPerson())));//人數
BigDecimal averageConsumption = new BigDecimal(0);
if (dataBean.getPerson() != 0) {
averageConsumption = MoneyUtil.divide(dataBean.getPrices(), dataBean.getPerson());
}
businessBeans.add(new BusinessBean(itemNames[12], String.valueOf(averageConsumption)));//平均每人
} else {
//為空,全部顯示0
for (int i = 0; i < itemNames.length; i++) {
businessBeans.add(new BusinessBean(itemNames[i], "0"));
businessBeans.add(new BusinessBean(itemNames[i], String.valueOf(0)));
}
}
mRootView.loadAdapter(businessBeans);
......
package com.gingersoft.gsa.cloud.main.mvp.presenter;
import android.app.Application;
import android.util.Log;
import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.utils.constans.HttpsConstans;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.HomeTurnoverBean;
import com.jess.arms.integration.AppManager;
import com.gingersoft.gsa.cloud.main.mvp.contract.HomeContract;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.MainBusinessBean;
import com.jess.arms.di.scope.FragmentScope;
import com.jess.arms.mvp.BasePresenter;
import com.jess.arms.http.imageloader.ImageLoader;
import com.jess.arms.integration.AppManager;
import com.jess.arms.mvp.BasePresenter;
import com.jess.arms.utils.RxLifecycleUtils;
import javax.inject.Inject;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
......@@ -21,14 +23,6 @@ import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber;
import okhttp3.FormBody;
import okhttp3.RequestBody;
import javax.inject.Inject;
import com.gingersoft.gsa.cloud.main.mvp.contract.HomeContract;
import com.jess.arms.utils.RxLifecycleUtils;
import java.util.HashMap;
import java.util.Map;
/**
* ================================================
......@@ -81,13 +75,13 @@ public class HomePresenter extends BasePresenter<HomeContract.Model, HomeContrac
.observeOn(AndroidSchedulers.mainThread())
.doAfterTerminate(() -> mRootView.hideLoading())
.compose(RxLifecycleUtils.bindToLifecycle(mRootView))
.subscribe(new ErrorHandleSubscriber<HomeTurnoverBean>(mErrorHandler) {
.subscribe(new ErrorHandleSubscriber<MainBusinessBean>(mErrorHandler) {
@Override
public void onNext(@NonNull HomeTurnoverBean info) {
public void onNext(@NonNull MainBusinessBean info) {
if (info != null && info.isSuccess()) {
if (info.getData() != null) {
mRootView.loadBusinessInfo(info.getData());
// mRootView.loadBusinessInfo(info.getData());
}
} else {
mRootView.showMessage("營業報表獲取失敗");
......
......@@ -2,10 +2,8 @@ package com.gingersoft.gsa.cloud.main.mvp.presenter;
import android.app.Application;
import com.gingersoft.gsa.cloud.base.utils.constans.HttpsConstans;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.main.mvp.contract.MainTopContract;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.HomeTurnoverBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.MainBusinessBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.MainOrderInfoChartBean;
import com.jess.arms.di.scope.FragmentScope;
import com.jess.arms.http.imageloader.ImageLoader;
......@@ -18,7 +16,6 @@ import javax.inject.Inject;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.schedulers.Schedulers;
import me.jessyan.retrofiturlmanager.RetrofitUrlManager;
import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber;
import okhttp3.FormBody;
......@@ -63,22 +60,22 @@ public class MainTopPresenter extends BasePresenter<MainTopContract.Model, MainT
}
public void getRestaurantReport(String restaurantId) {
RequestBody requestBody = new FormBody.Builder()
.add("restaurantId", restaurantId)
.add("startTime", TimeUtils.getOldDate(-1))
.add("endTime", TimeUtils.getCurrentTimeInString(TimeUtils.DATE_FORMAT_DATE))
.build();
mModel.getRestaurantReport(requestBody)
// RequestBody requestBody = new FormBody.Builder()
// .add("restaurantId", restaurantId)
// .add("startTime", TimeUtils.getOldDate(-1))
// .add("endTime", TimeUtils.getCurrentTimeInString(TimeUtils.DATE_FORMAT_DATE))
// .build();
mModel.getRestaurantReport(restaurantId)
.subscribeOn(Schedulers.io())
.doOnSubscribe(disposable -> mRootView.showLoading(""))
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.doAfterTerminate(() -> mRootView.hideLoading())
.compose(RxLifecycleUtils.bindToLifecycle(mRootView))
.subscribe(new ErrorHandleSubscriber<HomeTurnoverBean>(mErrorHandler) {
.subscribe(new ErrorHandleSubscriber<MainBusinessBean>(mErrorHandler) {
@Override
public void onNext(@NonNull HomeTurnoverBean info) {
public void onNext(@NonNull MainBusinessBean info) {
if (info != null && info.isSuccess()) {
if (info.getData() != null) {
mRootView.loadBusinessInfo(info.getData());
......@@ -87,18 +84,6 @@ public class MainTopPresenter extends BasePresenter<MainTopContract.Model, MainT
mRootView.showMessage("營業信息獲取失敗");
}
}
@Override
public void onComplete() {
super.onComplete();
// RetrofitUrlManager.getInstance().putDomain("common", HttpsConstans.ROOT_SERVER_ADDRESS_FORMAL);
}
@Override
public void onError(Throwable t) {
super.onError(t);
// RetrofitUrlManager.getInstance().putDomain("common", HttpsConstans.ROOT_SERVER_ADDRESS_FORMAL);
}
});
}
......@@ -124,13 +109,11 @@ public class MainTopPresenter extends BasePresenter<MainTopContract.Model, MainT
@Override
public void onComplete() {
super.onComplete();
RetrofitUrlManager.getInstance().putDomain("common", HttpsConstans.ROOT_SERVER_ADDRESS_FORMAL);
}
@Override
public void onError(Throwable t) {
super.onError(t);
RetrofitUrlManager.getInstance().putDomain("common", HttpsConstans.ROOT_SERVER_ADDRESS_FORMAL);
}
});
}
......
......@@ -2,7 +2,6 @@ package com.gingersoft.gsa.cloud.main.mvp.presenter;
import android.app.Application;
import com.gingersoft.gsa.cloud.base.utils.constans.HttpsConstans;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.main.mvp.contract.SalesContract;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.SalesFoodsBean;
......@@ -12,14 +11,14 @@ import com.jess.arms.integration.AppManager;
import com.jess.arms.mvp.BasePresenter;
import com.jess.arms.utils.RxLifecycleUtils;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.schedulers.Schedulers;
import me.jessyan.retrofiturlmanager.RetrofitUrlManager;
import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber;
import okhttp3.FormBody;
......@@ -64,12 +63,11 @@ public class SalesPresenter extends BasePresenter<SalesContract.Model, SalesCont
}
public void getSalesReportInfo(String restaurantId, String startTime) {
RequestBody requestBody = new FormBody.Builder()
.add("restaurantId", restaurantId)
.add("startTime", startTime)//TimeUtils.getYesterdayTime(TimeUtils.DATE_FORMAT_DATE)
.add("endTime", TimeUtils.getOldDate(1))//TimeUtils.getCurrentTimeInString(TimeUtils.DATE_FORMAT_DATE)
.build();
mModel.getSalesReportInfo(requestBody)
Map<String, Object> map = new HashMap<>();
map.put("restaurantId", restaurantId);
map.put("startTime", startTime);
map.put("endTime", TimeUtils.getOldDate(1));
mModel.getSalesReportInfo(map)
.subscribeOn(Schedulers.io())
.doOnSubscribe(disposable -> mRootView.showLoading(""))
.subscribeOn(AndroidSchedulers.mainThread())
......@@ -82,24 +80,44 @@ public class SalesPresenter extends BasePresenter<SalesContract.Model, SalesCont
public void onNext(@NonNull SalesFoodsBean info) {
if (info != null && info.isSuccess()) {
if (info.getData() != null) {
info.getData().removeAll(Collections.singleton(null));
mRootView.loadInfo(info.getData());
mRootView.loadInfo(info.getData().getSalesRanking());
}
} else {
mRootView.showMessage("銷售信息獲取失敗");
}
}
});
}
@Override
public void onComplete() {
super.onComplete();
RetrofitUrlManager.getInstance().putDomain("common", HttpsConstans.ROOT_SERVER_ADDRESS_FORMAL);
}
/**
* 獲取微信公眾號的報表數據
* @param startTime
*/
public void getSalesReportInfo(String startTime) {
RequestBody requestBody = new FormBody.Builder()
.add("restaurantId", "26")
.add("startTime", startTime)
.add("endTime", TimeUtils.getOldDate(1))
.build();
mModel.getSalesReportInfo(requestBody)
.subscribeOn(Schedulers.io())
.doOnSubscribe(disposable -> mRootView.showLoading(""))
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.doAfterTerminate(() -> mRootView.hideLoading())
.compose(RxLifecycleUtils.bindToLifecycle(mRootView))
.subscribe(new ErrorHandleSubscriber<SalesFoodsBean>(mErrorHandler) {
@Override
public void onError(Throwable t) {
super.onError(t);
RetrofitUrlManager.getInstance().putDomain("common", HttpsConstans.ROOT_SERVER_ADDRESS_FORMAL);
public void onNext(@NonNull SalesFoodsBean info) {
if (info != null && info.isSuccess()) {
if (info.getData() != null) {
// info.getData().removeAll(Collections.singleton(null));
// mRootView.loadInfo(info.getData());
}
} else {
mRootView.showMessage("銷售信息獲取失敗");
}
}
});
}
......
package com.gingersoft.gsa.cloud.main.mvp.presenter;
import android.app.Application;
import android.text.TextUtils;
import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.utils.constans.HttpsConstans;
import com.gingersoft.gsa.cloud.main.mvp.contract.SettlementContract;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.SettlementReport;
import com.jess.arms.integration.AppManager;
import com.jess.arms.di.scope.ActivityScope;
import com.jess.arms.mvp.BasePresenter;
import com.jess.arms.http.imageloader.ImageLoader;
import com.jess.arms.integration.AppManager;
import com.jess.arms.mvp.BasePresenter;
import com.jess.arms.utils.RxLifecycleUtils;
import javax.inject.Inject;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import me.jessyan.retrofiturlmanager.RetrofitUrlManager;
import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber;
import javax.inject.Inject;
import com.gingersoft.gsa.cloud.main.mvp.contract.SettlementContract;
import com.jess.arms.utils.RxLifecycleUtils;
/**
* ================================================
......@@ -76,7 +72,6 @@ public class SettlementPresenter extends BasePresenter<SettlementContract.Model,
@Override
public void onSubscribe(Disposable d) {
super.onSubscribe(d);
RetrofitUrlManager.getInstance().putDomain("common", HttpsConstans.ROOT_SETTLEMENT_REPORT_SERVER_ADDRESS_FORMAL);
}
@Override
......@@ -89,18 +84,6 @@ public class SettlementPresenter extends BasePresenter<SettlementContract.Model,
// mRootView.showMessage("獲取報表失敗");
}
}
@Override
public void onComplete() {
super.onComplete();
RetrofitUrlManager.getInstance().putDomain("common", HttpsConstans.ROOT_SERVER_ADDRESS_FORMAL);
}
@Override
public void onError(Throwable t) {
super.onError(t);
RetrofitUrlManager.getInstance().putDomain("common", HttpsConstans.ROOT_SERVER_ADDRESS_FORMAL);
}
});
}
}
......@@ -3,10 +3,8 @@ package com.gingersoft.gsa.cloud.main.mvp.presenter;
import android.app.Application;
import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.common.bean.BaseResult;
import com.gingersoft.gsa.cloud.base.utils.JsonUtils;
import com.gingersoft.gsa.cloud.base.utils.constans.HttpsConstans;
import com.gingersoft.gsa.cloud.main.R;
import com.gingersoft.gsa.cloud.main.mvp.contract.SettlementReportContract;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.SendSettlement;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.SettlementReport;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.SettlementReportItem;
......@@ -14,31 +12,28 @@ import com.gingersoft.gsa.cloud.main.mvp.model.bean.SettlementReportItem5;
import com.gingersoft.gsa.cloud.main.mvp.ui.activity.SettlementReportActivity;
import com.gingersoft.gsa.cloud.main.mvp.ui.adapter.SettlementReportItem5Adapter;
import com.gingersoft.gsa.cloud.main.mvp.ui.adapter.SettlementReportItemAdapter;
import com.jess.arms.integration.AppManager;
import com.jess.arms.di.scope.ActivityScope;
import com.jess.arms.mvp.BasePresenter;
import com.jess.arms.http.imageloader.ImageLoader;
import com.jess.arms.integration.AppManager;
import com.jess.arms.mvp.BasePresenter;
import com.jess.arms.utils.RxLifecycleUtils;
import com.qmuiteam.qmui.widget.dialog.QMUIDialog;
import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import me.jessyan.retrofiturlmanager.RetrofitUrlManager;
import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber;
import okhttp3.FormBody;
import okhttp3.RequestBody;
import javax.inject.Inject;
import com.gingersoft.gsa.cloud.main.mvp.contract.SettlementReportContract;
import com.jess.arms.utils.RxLifecycleUtils;
import com.qmuiteam.qmui.widget.dialog.QMUIDialog;
import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction;
import java.util.ArrayList;
import java.util.List;
/**
* ================================================
......@@ -129,14 +124,16 @@ public class SettlementReportPresenter extends BasePresenter<SettlementReportCon
if (dataBean != null) {
if (dataBean.getTable() == null || (dataBean.getTable() != null && dataBean.getTable().size() == 0)) {
mRootView.showMessage("清機成功");
getSettlementReport();
//打印清機報表
mRootView.printRepore();
} else {
//還有檯未結賬
showSettlementErrorDialog("仍有臺號未結賬,請先結賬;" + "\n" + getTables(dataBean.getTable()));
}
} else {
mRootView.showMessage("清機成功");
getSettlementReport();
//打印清機報表
mRootView.printRepore();
}
} else {
mRootView.showMessage("清機失敗");
......@@ -159,7 +156,6 @@ public class SettlementReportPresenter extends BasePresenter<SettlementReportCon
@Override
public void onSubscribe(Disposable d) {
super.onSubscribe(d);
RetrofitUrlManager.getInstance().putDomain("common", HttpsConstans.ROOT_SETTLEMENT_REPORT_SERVER_ADDRESS_FORMAL);
}
@Override
......@@ -172,18 +168,6 @@ public class SettlementReportPresenter extends BasePresenter<SettlementReportCon
// mRootView.showMessage("獲取報表失敗");
}
}
@Override
public void onComplete() {
super.onComplete();
RetrofitUrlManager.getInstance().putDomain("common", HttpsConstans.ROOT_SERVER_ADDRESS_FORMAL);
}
@Override
public void onError(Throwable t) {
super.onError(t);
RetrofitUrlManager.getInstance().putDomain("common", HttpsConstans.ROOT_SERVER_ADDRESS_FORMAL);
}
});
}
......
......@@ -121,7 +121,6 @@ public class NewMainActivity extends BaseActivity<NewMainPresenter> implements N
@Override
public void initData(@Nullable Bundle savedInstanceState) {
// mPresenter.requestExternalStoragePermission();
//初始化側邊欄菜單項
initSideMenu();
......
package com.gingersoft.gsa.cloud.main.mvp.ui.activity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ScrollView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.billy.cc.core.component.CC;
import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.utils.LanguageUtils;
import com.gingersoft.gsa.cloud.base.utils.PrintTransitUtils;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtil;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.main.R;
import com.gingersoft.gsa.cloud.main.R2;
import com.gingersoft.gsa.cloud.main.di.component.DaggerSettlementReportComponent;
import com.gingersoft.gsa.cloud.main.mvp.contract.SettlementReportContract;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.SettlementReport;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.SettlementReportItem;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.SettlementReportItem5;
import com.gingersoft.gsa.cloud.main.mvp.presenter.SettlementReportPresenter;
import com.gingersoft.gsa.cloud.ui.widget.dialog.LoadingDialog;
import com.jess.arms.base.BaseActivity;
import com.jess.arms.base.DefaultAdapter;
import com.jess.arms.di.component.AppComponent;
import com.jess.arms.utils.ArmsUtils;
import com.gingersoft.gsa.cloud.main.mvp.contract.SettlementReportContract;
import com.gingersoft.gsa.cloud.main.mvp.presenter.SettlementReportPresenter;
import com.jess.arms.utils.DeviceUtils;
import com.qmuiteam.qmui.alpha.QMUIAlphaButton;
import com.qmuiteam.qmui.widget.QMUITopBar;
import com.qmuiteam.qmui.widget.dialog.QMUIDialog;
import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction;
......@@ -37,12 +43,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.OnClick;
......@@ -91,6 +91,12 @@ public class SettlementReportActivity extends BaseActivity<SettlementReportPrese
private SettlementReport.DataBean mSettlementReportBean;
private static SettlementReportActivity settlementReportActivity;
public static SettlementReportActivity getInstance() {
return settlementReportActivity;
}
@Override
public void setupActivityComponent(@NonNull AppComponent appComponent) {
......@@ -109,7 +115,6 @@ public class SettlementReportActivity extends BaseActivity<SettlementReportPrese
@Override
public void initData(@Nullable Bundle savedInstanceState) {
}
@Override
......@@ -383,6 +388,30 @@ public class SettlementReportActivity extends BaseActivity<SettlementReportPrese
});
}
@Override
public void printRepore() {
//清機成功,打印
PrintTransitUtils.getInstance().setPrintView(scrollView);
CC.obtainBuilder("Component.Print")
.addParam("type", 4)//清機打印
.setActionName("printActivity")
.build()
.callAsyncCallbackOnMainThread((cc, result) -> {
//打印完之後,清除view
PrintTransitUtils.getInstance().setPrintView(null);
if (mPresenter != null) {
mPresenter.getSettlementReport();
}
// Log.e("error", "是否成功打印:" + result.isSuccess());
// if (result.isSuccess()) {
// //打印成功
// showMessage("打印成功!");
// } else {
// showMessage("打印失敗!");
// }
});
}
private Map<String, SettlementReport.DataBean.AnalysisBean> getAnalysisBeanMap(List<SettlementReport.DataBean.AnalysisBean> analysisBeanList) {
Map<String, SettlementReport.DataBean.AnalysisBean> analysisBeanMap = new HashMap<>();
for (int i = 0; i < analysisBeanList.size(); i++) {
......
......@@ -2,29 +2,36 @@ package com.gingersoft.gsa.cloud.main.mvp.ui.adapter;
import android.content.Context;
import androidx.annotation.Nullable;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.gingersoft.gsa.cloud.base.utils.MoneyUtil;
import com.gingersoft.gsa.cloud.main.R;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.SalesFoodsBean;
import java.util.List;
import androidx.annotation.Nullable;
import static java.math.BigDecimal.ROUND_HALF_UP;
/**
* Created by Wyh on 2020/2/24.
*/
public class FoodRankingAdapter extends BaseQuickAdapter<SalesFoodsBean.DataBean, BaseViewHolder> {
public class FoodRankingAdapter extends BaseQuickAdapter<SalesFoodsBean.DataBean.SalesRankingBean, BaseViewHolder> {
private Context mContext;
private double totalAmount;//所有菜品加起來的銷售額
private int totalNum;//所有菜品加起來的銷售數量
public FoodRankingAdapter(Context mContext, @Nullable List<SalesFoodsBean.DataBean> data) {
public FoodRankingAdapter(Context mContext, @Nullable List<SalesFoodsBean.DataBean.SalesRankingBean> data, double totalAmount, int totalNum) {
super(R.layout.item_food_ranking, data);
this.mContext = mContext;
this.totalAmount = totalAmount;
this.totalNum = totalNum;
}
@Override
protected void convert(BaseViewHolder helper, SalesFoodsBean.DataBean item) {
protected void convert(BaseViewHolder helper, SalesFoodsBean.DataBean.SalesRankingBean item) {
if (helper.getAdapterPosition() == 0) {
helper.setTextColor(R.id.tv_ranking_foodname, mContext.getResources().getColor(R.color.theme_hint_color));
helper.setTextColor(R.id.tv_ranking_food_sales_num, mContext.getResources().getColor(R.color.theme_hint_color));
......@@ -47,12 +54,12 @@ public class FoodRankingAdapter extends BaseQuickAdapter<SalesFoodsBean.DataBean
helper.setTextColor(R.id.tv_ranking_proportion_quantity, mContext.getResources().getColor(R.color.color_3c));
helper.setTextColor(R.id.tv_ranking_ratio_amount, mContext.getResources().getColor(R.color.color_3c));
helper.setText(R.id.tv_ranking_food_unit_price, item.getAverageTotal() + "");
helper.setText(R.id.tv_ranking_foodname, item.getFoodName());
helper.setText(R.id.tv_ranking_food_sales_num, item.getSumNum() + "");
helper.setText(R.id.tv_ranking_food_sales_amount, item.getSumTotal() + "");
helper.setText(R.id.tv_ranking_proportion_quantity, item.getPercentageNum());
helper.setText(R.id.tv_ranking_ratio_amount, item.getPercentageTotal());
helper.setText(R.id.tv_ranking_food_unit_price, item.getPrice() + "");
helper.setText(R.id.tv_ranking_foodname, item.getProductName());
helper.setText(R.id.tv_ranking_food_sales_num, item.getNumber() + "");
helper.setText(R.id.tv_ranking_food_sales_amount, item.getAmount() + "");
helper.setText(R.id.tv_ranking_proportion_quantity, (MoneyUtil.divide(item.getNumber(), totalNum, 2, ROUND_HALF_UP) * 100) + "%");
helper.setText(R.id.tv_ranking_ratio_amount, (MoneyUtil.divide(item.getAmount(), totalAmount, 2, ROUND_HALF_UP) * 100) + "%");
}
}
}
......@@ -3,6 +3,8 @@ package com.gingersoft.gsa.cloud.main.mvp.ui.adapter;
import android.content.Context;
import android.view.View;
import androidx.annotation.Nullable;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.gingersoft.gsa.cloud.main.R;
......@@ -10,22 +12,20 @@ import com.gingersoft.gsa.cloud.main.mvp.model.bean.SalesFoodsBean;
import java.util.List;
import androidx.annotation.Nullable;
/**
* Created by Wyh on 2020/2/24.
* 排序編號adapter
*/
public class SortNumberingAdapter extends BaseQuickAdapter<SalesFoodsBean.DataBean, BaseViewHolder> {
public class SortNumberingAdapter extends BaseQuickAdapter<SalesFoodsBean.DataBean.SalesRankingBean, BaseViewHolder> {
private Context mContext;
public SortNumberingAdapter(Context mContext, @Nullable List<SalesFoodsBean.DataBean> data) {
public SortNumberingAdapter(Context mContext, @Nullable List<SalesFoodsBean.DataBean.SalesRankingBean> data) {
super(R.layout.item_ranking_numbering, data);
this.mContext = mContext;
}
@Override
protected void convert(BaseViewHolder helper, SalesFoodsBean.DataBean item) {
protected void convert(BaseViewHolder helper, SalesFoodsBean.DataBean.SalesRankingBean item) {
helper.getView(R.id.iv_ranking_numbering).setVisibility(View.GONE);
if (helper.getAdapterPosition() == 0) {
helper.setText(R.id.tv_ranking_numbering, "排序");
......
......@@ -23,7 +23,7 @@ import com.gingersoft.gsa.cloud.main.R2;
import com.gingersoft.gsa.cloud.main.di.component.DaggerBusinessReportComponent;
import com.gingersoft.gsa.cloud.main.mvp.contract.BusinessReportContract;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.BusinessBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.HomeTurnoverBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.MainBusinessBean;
import com.gingersoft.gsa.cloud.main.mvp.presenter.BusinessReportPresenter;
import com.gingersoft.gsa.cloud.main.mvp.ui.adapter.BusinessInfoAdapter;
import com.gingersoft.gsa.cloud.ui.AAChartCore.AAChartCoreLib.AAChartConfiger.AAChartModel;
......@@ -39,6 +39,7 @@ import com.jess.arms.utils.ArmsUtils;
import java.text.ParseException;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -100,6 +101,7 @@ public class BusinessReportFragment extends BaseFragment<BusinessReportPresenter
@Override
public void initData(@Nullable Bundle savedInstanceState) {
//獲取一段時間內的營業信息,默認獲取七天的數據
mPresenter.getRestaurantAmount(GsaCloudApplication.getRestaurantId(mContext) + "", TimeUtils.getOldDate(-6), TimeUtils.getOldDate(1));
mPresenter.getRestaurantBusinessInfo(GsaCloudApplication.getRestaurantId(mContext) + "", TimeUtils.getOldDate(-6), TimeUtils.getOldDate(1));
mRestaurantName.setText(GsaCloudApplication.getRestaurantName(mContext));
......@@ -176,12 +178,11 @@ public class BusinessReportFragment extends BaseFragment<BusinessReportPresenter
}
/**
* 加載營業信息圖表
*/
@Override
public void loadChart(Map<String, HomeTurnoverBean.DataBean> data) {
public void loadChart(List<MainBusinessBean.DataBean> data) {
Object[] chartData = new Object[7];
String[] xData = new String[7];
......@@ -189,19 +190,26 @@ public class BusinessReportFragment extends BaseFragment<BusinessReportPresenter
xData[i] = TimeUtils.getDistanceDate(-6 + i, Calendar.DATE, TimeUtils.DEFAULT_DATE_MD);
}
Map<String, MainBusinessBean.DataBean> map = new HashMap<>();
for (int i = 0; i < data.size(); i++) {
map.put(data.get(i).getStartingTime(), data.get(i));
}
double yAxisTickInterval = 0;
//第一條線
for (int i = 0; i < 7; i++) {
//通過今年年份+月份+日期,獲取對應的對象
HomeTurnoverBean.DataBean bean = data.get(TimeUtils.getDistanceDate(0, Calendar.YEAR, DEFAULT_DATE_Y) + xData[i]);
if (bean != null && bean.getBusiness_amount() != null) {
chartData[i] = Integer.parseInt(bean.getBusiness_amount());
yAxisTickInterval = Math.max(yAxisTickInterval, Integer.parseInt(bean.getBusiness_amount()));
MainBusinessBean.DataBean bean = map.get(TimeUtils.getDistanceDate(0, Calendar.YEAR, DEFAULT_DATE_Y) + xData[i]);
if (bean != null) {
chartData[i] = bean.getTotalAmount();
yAxisTickInterval = Math.max(yAxisTickInterval, bean.getTotalAmount());
} else {
chartData[i] = 0;
}
}
//配置線形圖
AAChartModel aaChartModel = configureColorfulGradientSplineChart(xData, chartData, (int) (yAxisTickInterval / 6));
//如果這幾天的數據都為0,設置默認最大數為18000,間隔為3000
if (yAxisTickInterval == 0) {
aaChartModel.yAxisMax(18000f);
aaChartModel.yAxisTickInterval(3000);
......@@ -245,7 +253,7 @@ public class BusinessReportFragment extends BaseFragment<BusinessReportPresenter
.yAxisLineColor("#018EF2")
.series(new AASeriesElement[]{
new AASeriesElement()
.name("今天")
.name("營業額")
.lineWidth(4f)
.color(linearGradientColor)
.data(todayData)
......@@ -253,6 +261,7 @@ public class BusinessReportFragment extends BaseFragment<BusinessReportPresenter
);
}
@Override
public void loadAdapter(List<BusinessBean> businessBeans) {
if (businessInfoAdapter == null) {
......@@ -284,7 +293,8 @@ public class BusinessReportFragment extends BaseFragment<BusinessReportPresenter
TimePickerUtils.showReportTimePicker(mContext, cal, (date, v1) ->
{
mTvStartTime.setText(TimeUtils.DATE_FORMAT_DATE.format(date));
mPresenter.getRestaurantBusinessInfo("26", mTvStartTime.getText().toString(), TimeUtils.getOldDate(0));
mPresenter.getRestaurantAmount(GsaCloudApplication.getRestaurantId(mContext) + "", mTvStartTime.getText().toString(), TimeUtils.getOldDate(1));
mPresenter.getRestaurantBusinessInfo(GsaCloudApplication.getRestaurantId(mContext) + "", mTvStartTime.getText().toString(), TimeUtils.getOldDate(1));
});
}
}
......
......@@ -10,15 +10,19 @@ import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.utils.MoneyUtil;
import com.gingersoft.gsa.cloud.base.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils;
import com.gingersoft.gsa.cloud.main.R;
import com.gingersoft.gsa.cloud.main.R2;
import com.gingersoft.gsa.cloud.main.di.component.DaggerMainTopComponent;
import com.gingersoft.gsa.cloud.main.mvp.contract.MainTopContract;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.HomeTurnoverBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.MainBusinessBean;
import com.gingersoft.gsa.cloud.main.mvp.model.bean.MainOrderInfoChartBean;
import com.gingersoft.gsa.cloud.main.mvp.presenter.MainTopPresenter;
import com.gingersoft.gsa.cloud.main.mvp.ui.activity.NewMainActivity;
......@@ -37,8 +41,6 @@ import com.jess.arms.utils.ArmsUtils;
import java.util.List;
import java.util.Map;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
......@@ -117,13 +119,20 @@ public class MainTopFragment extends BaseFragment<MainTopPresenter> implements M
@Override
public void initData(@Nullable Bundle savedInstanceState) {
getInfo();
// getInfo();
time.setText(TimeUtils.getCurrentTimeInString(TimeUtils.dateFormatYMDE));
}
private void getInfo() {
mPresenter.getRestaurantReport(GsaCloudApplication.getRestaurantId(mContext) + "");//GsaCloudApplication.getRestaurantId(mContext) 獲取餐廳營業信息
mPresenter.getOrderInfoChart(GsaCloudApplication.getRestaurantId(mContext) + "");
mPresenter.getRestaurantReport(GsaCloudApplication.getRestaurantId(mContext) + "");//GsaCloudApplication.getRestaurantId(mContext) 獲取餐廳營業信息
}
@Override
public void onResume() {
super.onResume();
getInfo();
}
/**
......@@ -206,44 +215,60 @@ public class MainTopFragment extends BaseFragment<MainTopPresenter> implements M
}
@Override
public void loadBusinessInfo(Map<String, HomeTurnoverBean.DataBean> dataBeanMap) {
//通過今天的日期取得今天的報表信息
HomeTurnoverBean.DataBean bean = dataBeanMap.get(TimeUtils.getCurrentTimeInString(TimeUtils.DATE_FORMAT_DATE));//TimeUtils.getCurrentTimeInString(TimeUtils.DATE_FORMAT_DATE)
HomeTurnoverBean.DataBean yesterdayBean = dataBeanMap.get(TimeUtils.getOldDate(-1));//TimeUtils.getCurrentTimeInString(TimeUtils.DATE_FORMAT_DATE)
if (bean != null) {
tvTurnover.setText(bean.getBusiness_amount());
tvProjectAmount.setText(bean.getSales());
tvConsumersNumber.setText(bean.getPeople());
tvBillNumber.setText(bean.getNumber_bill());
if (Float.parseFloat(bean.getPeople()) != 0) {
public void loadBusinessInfo(List<MainBusinessBean.DataBean> dataBeans) {
MainBusinessBean.DataBean todayBean = null;
MainBusinessBean.DataBean yesterdayBean = null;
for (MainBusinessBean.DataBean dataBean : dataBeans) {
if (!TextUtil.isEmptyOrNullOrUndefined(dataBean.getDate())) {
if (dataBean.getDate().equals(TimeUtils.getOldDate(0))) {
todayBean = dataBean;
} else if (dataBean.getDate().equals(TimeUtils.getOldDate(-1))) {
yesterdayBean = dataBean;
}
}
}
if (todayBean != null) {
tvTurnover.setText(String.valueOf(todayBean.getTotalAmount()));//今日營業額,淨值
tvProjectAmount.setText(String.valueOf(todayBean.getPrice()));
tvConsumersNumber.setText(String.valueOf(todayBean.getPerson()));
tvBillNumber.setText(String.valueOf(todayBean.getNum()));
if (todayBean.getPerson() != 0) {
//人均消費
tvPerCapitaConsumption.setText(Float.parseFloat(bean.getBusiness_amount()) / Float.parseFloat(bean.getPeople()) + "");
tvPerCapitaConsumption.setText(String.valueOf(MoneyUtil.totalFoodPrice(todayBean.getPrice() / todayBean.getPerson())));
} else {
tvPerCapitaConsumption.setText(String.valueOf(0));
}
if (Integer.parseInt(bean.getNumber_bill()) != 0) {
if (todayBean.getNum() != 0) {
//每單平均消費
tvAveragePerOrder.setText(Float.parseFloat(bean.getBusiness_amount()) / Integer.parseInt(bean.getNumber_bill()) + "");
tvAveragePerOrder.setText(String.valueOf(MoneyUtil.totalFoodPrice(todayBean.getPrice() / todayBean.getNum())));
} else {
tvAveragePerOrder.setText(String.valueOf(0));
}
//通過今天的日期取得今天的報表信息
if (yesterdayBean != null) {
double turnover = MoneyUtil.sub(Double.parseDouble(bean.getBusiness_amount()), Double.parseDouble(yesterdayBean.getBusiness_amount()));
//获得昨日和今日營業額的差,淨值
double turnover = MoneyUtil.sub(todayBean.getTotalAmount(), yesterdayBean.getTotalAmount());
ivTurnoverTrend.setVisibility(View.VISIBLE);
ivTurnoverTrend.setImageResource(getTrendImg(turnover));
tvTurnoverTrend.setText(String.format(getString(R.string.format_one_point), turnover));
tvTurnoverTrend.setText(String.format(getString(R.string.format_one_point), Math.abs(turnover)));
double sales = MoneyUtil.sub(Double.parseDouble(bean.getSales()), Double.parseDouble(yesterdayBean.getSales()));
tvProjectAmountTrend.setText(String.format(getString(R.string.format_one_point), sales));
//項目總金額
double sales = MoneyUtil.sub(todayBean.getPrice(), yesterdayBean.getPrice());
tvProjectAmountTrend.setText(String.format(getString(R.string.format_one_point), Math.abs(sales)));
ivProjectAmountState.setVisibility(View.VISIBLE);
ivProjectAmountState.setImageResource(getTrendImg(sales));
int people = Integer.parseInt(bean.getPeople()) - Integer.parseInt(yesterdayBean.getPeople());
//人數
int people = MoneyUtil.sub(todayBean.getPerson(), yesterdayBean.getPerson());
ivPeopleTrend.setImageResource(getTrendImg(people));
ivPeopleTrend.setVisibility(View.VISIBLE);
tvPeopleTrend.setText(people + "");
tvPeopleTrend.setText(String.valueOf(Math.abs(people)));
int billNum = Integer.parseInt(bean.getNumber_bill()) - Integer.parseInt(yesterdayBean.getNumber_bill());
//賬單數
int billNum = todayBean.getNum() - yesterdayBean.getNum();
ivBillTrend.setImageResource(getTrendImg(billNum));
ivBillTrend.setVisibility(View.VISIBLE);
tvBillTrend.setText(billNum + "");
tvBillTrend.setText(String.valueOf(Math.abs(billNum)));
}
}
}
......@@ -357,12 +382,10 @@ public class MainTopFragment extends BaseFragment<MainTopPresenter> implements M
}
private int getTrendImg(double amount) {
if (amount > 0) {
if (amount >= 0) {
return R.drawable.ic_rise;
} else if (amount < 0) {
return R.drawable.ic_down;
} else {
return -1;
return R.drawable.ic_down;
}
}
......
......@@ -9,7 +9,14 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.utils.MoneyUtil;
import com.gingersoft.gsa.cloud.base.utils.time.TimePickerUtils;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils;
......@@ -40,15 +47,11 @@ import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.OnClick;
import static com.jess.arms.utils.Preconditions.checkNotNull;
import static java.math.BigDecimal.ROUND_HALF_UP;
/**
......@@ -101,7 +104,6 @@ public class SalesFragment extends BaseFragment<SalesPresenter> implements Sales
@Override
public void initData(@Nullable Bundle savedInstanceState) {
mPresenter.getSalesReportInfo(GsaCloudApplication.getRestaurantId(mContext) + "", TimeUtils.getYear(-1));
mTvStartTime.setText(TimeUtils.getYear(-1));
mTvEndTime.setText(TimeUtils.getOldDate(0));
}
......@@ -175,10 +177,19 @@ public class SalesFragment extends BaseFragment<SalesPresenter> implements Sales
}
private double totalAmount = 0;//所有菜品加起來的銷售額
private int totalNum = 0;//所有菜品加起來的銷售數量
@Override
public void loadInfo(List<SalesFoodsBean.DataBean> info) {
List<SalesFoodsBean.DataBean> rankings = new ArrayList<>(info);
rankings.add(0, new SalesFoodsBean.DataBean());
public void loadInfo(List<SalesFoodsBean.DataBean.SalesRankingBean> salesRanking) {
for (SalesFoodsBean.DataBean.SalesRankingBean salesRankingBean : salesRanking) {
totalAmount = MoneyUtil.sum(totalAmount, salesRankingBean.getAmount());
totalNum = totalNum + salesRankingBean.getNumber();
}
List<SalesFoodsBean.DataBean.SalesRankingBean> rankings = new ArrayList<>(salesRanking);
rankings.add(0, new SalesFoodsBean.DataBean.SalesRankingBean());
if (mSortNumberingAdapter == null) {
//序號adapter
rvSortNumbering.setLayoutManager(new LinearLayoutManager(mContext) {
......@@ -202,15 +213,15 @@ public class SalesFragment extends BaseFragment<SalesPresenter> implements Sales
};
lm.setOrientation(RecyclerView.VERTICAL);
rvFoodRanking.setLayoutManager(lm);
foodRankingAdapter = new FoodRankingAdapter(mContext, rankings);
foodRankingAdapter = new FoodRankingAdapter(mContext, rankings, totalAmount, totalNum);
rvFoodRanking.setAdapter(foodRankingAdapter);
} else {
foodRankingAdapter.setNewData(rankings);
}
loadChart(info);
loadChart(salesRanking);
}
private void loadChart(List<SalesFoodsBean.DataBean> info) {
private void loadChart(List<SalesFoodsBean.DataBean.SalesRankingBean> info) {
//是否以百分比顯示值
salesChart.setUsePercentValues(true);
//不顯示右側底部小字
......@@ -269,14 +280,17 @@ public class SalesFragment extends BaseFragment<SalesPresenter> implements Sales
setData(info);
}
private void setData(List<SalesFoodsBean.DataBean> info) {
private void setData(List<SalesFoodsBean.DataBean.SalesRankingBean> info) {
//計算總和
ArrayList<PieEntry> entries = new ArrayList<>();
// NOTE: The order of the entries when being added to the entries array determines their position around the center of
// the chart.
if (info != null) {
for (int i = 0; i < info.size(); i++) {
if (info.get(i) != null)
entries.add(new PieEntry(Float.parseFloat(info.get(i).getPercentageTotal().replace("%", "")), info.get(i).getFoodName()));
if (info.get(i) != null) {
//金額佔比
entries.add(new PieEntry(MoneyUtil.divide(info.get(i).getAmount(), totalAmount, 2, ROUND_HALF_UP), info.get(i).getProductName()));
}
}
}
PieDataSet dataSet = new PieDataSet(entries, "Election Results");
......@@ -345,4 +359,6 @@ public class SalesFragment extends BaseFragment<SalesPresenter> implements Sales
});
}
}
}
......@@ -15,7 +15,7 @@
<com.google.android.material.tabs.TabLayout
android:id="@+id/table_layout"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_42"
android:layout_height="@dimen/tabIndicator_height"
app:tabIndicator="@drawable/tablayout_indicator"
app:tabIndicatorColor="@color/theme_color"
app:tabIndicatorFullWidth="false"/>
......
......@@ -13,88 +13,89 @@
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:layout_marginTop="?attr/qmui_topbar_height"
android:layout_marginBottom="@dimen/dp_45"
android:background="@color/theme_white_color"
android:layout_marginTop="?attr/qmui_topbar_height">
android:descendantFocusability="beforeDescendants"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="@dimen/dp_10">
<TextView
android:id="@+id/tv_last_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingBottom="@dimen/dp_5"
android:text="上次清機時間:2020-3-1 21:59:18"
android:textColor="@color/red"
android:textSize="@dimen/sp_16" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/dp_10"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tv_last_time"
android:id="@+id/tv_restaurant_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingBottom="@dimen/dp_5"
android:text="上次清機時間:2020-3-1 21:59:18"
android:textColor="@color/red"
android:text="店鋪名稱:gingersoft"
android:textColor="@color/black"
android:textSize="@dimen/sp_16" />
<LinearLayout
<TextView
android:id="@+id/tv_business_area_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tv_restaurant_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="店鋪名稱:gingersoft"
android:textColor="@color/black"
android:textSize="@dimen/sp_16" />
<TextView
android:id="@+id/tv_business_area_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="店鋪名稱:gingersoft"
android:textColor="@color/black"
android:textSize="@dimen/sp_16" />
<TextView
android:id="@+id/tv_start_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_5"
android:text=""
android:textColor="@color/black"
android:textSize="@dimen/sp_14" />
<TextView
android:id="@+id/tv_end_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_5"
android:text=""
android:textColor="@color/black"
android:textSize="@dimen/sp_14" />
</LinearLayout>
android:text="店鋪名稱:gingersoft"
android:textColor="@color/black"
android:textSize="@dimen/sp_16" />
<View
<TextView
android:id="@+id/tv_start_time"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_0_5"
android:layout_marginTop="@dimen/dp_8"
android:background="@color/theme_grey_color" />
<!-- <com.gingersoft.gsa.cloud.base.widget.NoScrollRecyclerView-->
<!-- android:id="@+id/rv_settlement_report_item"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:divider="@null"-->
<!-- android:fadeScrollbars="false" />-->
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_5"
android:text=""
android:textColor="@color/black"
android:textSize="@dimen/sp_14" />
<com.gingersoft.gsa.cloud.base.widget.NoScrollRecyclerView
android:id="@+id/rv_settlement_report_item2"
<TextView
android:id="@+id/tv_end_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@null"
android:paddingTop="@dimen/dp_8"
android:fadeScrollbars="false" />
android:layout_marginTop="@dimen/dp_5"
android:text=""
android:textColor="@color/black"
android:textSize="@dimen/sp_14" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="@dimen/dp_0_5"
android:layout_marginTop="@dimen/dp_8"
android:background="@color/theme_grey_color" />
<!-- <com.gingersoft.gsa.cloud.base.widget.NoScrollRecyclerView-->
<!-- android:id="@+id/rv_settlement_report_item"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:divider="@null"-->
<!-- android:fadeScrollbars="false" />-->
<com.gingersoft.gsa.cloud.base.widget.NoScrollRecyclerView
android:id="@+id/rv_settlement_report_item2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@null"
android:fadeScrollbars="false"
android:paddingTop="@dimen/dp_8" />
</LinearLayout>
</ScrollView>
<com.qmuiteam.qmui.alpha.QMUIAlphaButton
......
......@@ -220,7 +220,7 @@
android:text="较昨日:"
android:textColor="#3c3c3c"
android:textSize="@dimen/sp_12"
android:visibility="invisible" />
android:visibility="gone" />
</LinearLayout>
<!-- 消費人數-->
......
......@@ -16,6 +16,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_20"
android:singleLine="true"
android:textColor="@color/theme_color"
android:textSize="@dimen/sp_17" />
......@@ -24,9 +25,10 @@
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="@dimen/dp_5"
android:layout_marginBottom="@dimen/dp_20"
android:layout_weight="1"
android:singleLine="true"
android:textColor="@color/color_3c"
android:layout_marginBottom="@dimen/dp_20"
android:textSize="@dimen/sp_12" />
<include layout="@layout/include_horizontal_color_ccc_dividing_line" />
......
......@@ -7,12 +7,20 @@
android:name=".mvp.ui.activity.IpPrintActivity"
android:launchMode="singleTop"
android:theme="@style/print_TranslucentTheme" />
<activity
android:name=".mvp.ui.activity.PrintActivity"
android:launchMode="singleTop"
android:theme="@style/print_TranslucentTheme" />
<activity android:name=".mvp.ui.activity.PrinterListActivity" />
<activity android:name=".mvp.ui.activity.PrinterAddActivity" />
<meta-data
android:name="com.gingersoft.gsa.cloud.globalconfig.GlobalConfiguration"
android:value="ConfigModule" />
</application>
</manifest>
......@@ -6,22 +6,27 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application
android:name=".MyApp"
android:name="com.gingersoft.gsa.cloud.base.application.GsaCloudApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_logo"
android:supportsRtl="true"
android:networkSecurityConfig="@xml/network_android"
android:theme="@style/AppTheme">
<!-- <activity-->
<!-- android:name=".mvp.ui.activity.PrintActivity"-->
<!-- android:theme="@style/print_TranslucentTheme" />-->
<activity android:name=".mvp.ui.activity.PrintActivity" />
<activity android:name=".mvp.ui.activity.PrinterAddActivity" />
<activity
android:name=".mvp.ui.activity.IpPrintActivity"
android:theme="@style/print_TranslucentTheme" /> <!-- PrinterListActivity android:theme="@style/print_TranslucentTheme" -->
<activity android:name=".mvp.ui.activity.PrinterAddActivity">
android:theme="@style/print_TranslucentTheme" />
<activity android:name=".mvp.ui.activity.PrinterListActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.VIEW" />
......@@ -30,6 +35,9 @@
</intent-filter>
</activity>
<meta-data
android:name="com.gingersoft.gsa.cloud.globalconfig.GlobalConfiguration"
android:value="ConfigModule" />
</application>
</manifest>
\ No newline at end of file
......@@ -3,6 +3,8 @@ package com.joe.print;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import com.billy.cc.core.component.CC;
import com.billy.cc.core.component.CCResult;
......
package com.joe.print.di.component;
import com.jess.arms.di.component.AppComponent;
import com.jess.arms.di.scope.FragmentScope;
import com.joe.print.di.module.IpPrintListActivityModule;
import com.joe.print.mvp.ui.fragment.IpPrintListActivityFragment;
import dagger.Component;
@FragmentScope
@Component(modules = IpPrintListActivityModule.class, dependencies = AppComponent.class)
public interface IpPrintListActivityComponent {
void inject(IpPrintListActivityFragment fragment);
}
\ No newline at end of file
package com.joe.print.di.component;
import dagger.Component;
import com.jess.arms.di.component.AppComponent;
import com.joe.print.di.module.LocalPrintModule;
import com.jess.arms.di.scope.FragmentScope;
import com.joe.print.mvp.ui.fragment.LocalPrintFragment;
@FragmentScope
@Component(modules = LocalPrintModule.class, dependencies = AppComponent.class)
public interface LocalPrintComponent {
void inject(LocalPrintFragment fragment);
}
\ No newline at end of file
package com.joe.print.di.module;
import com.jess.arms.di.scope.FragmentScope;
import dagger.Module;
import dagger.Provides;
import com.joe.print.mvp.contract.IpPrintListActivityContract;
import com.joe.print.mvp.model.IpPrintListActivityModel;
@Module
public class IpPrintListActivityModule {
private IpPrintListActivityContract.View view;
/**
* 构建IpPrintListActivityModule时,将View的实现类传进来,这样就可以提供View的实现类给presenter
*
* @param view
*/
public IpPrintListActivityModule(IpPrintListActivityContract.View view) {
this.view = view;
}
@FragmentScope
@Provides
IpPrintListActivityContract.View provideIpPrintListActivityView() {
return this.view;
}
@FragmentScope
@Provides
IpPrintListActivityContract.Model provideIpPrintListActivityModel(IpPrintListActivityModel model) {
return model;
}
}
\ No newline at end of file
package com.joe.print.di.module;
import com.jess.arms.di.scope.FragmentScope;
import dagger.Module;
import dagger.Provides;
import com.joe.print.mvp.contract.LocalPrintContract;
import com.joe.print.mvp.model.LocalPrintModel;
@Module
public class LocalPrintModule {
private LocalPrintContract.View view;
/**
* 构建LocalPrintModule时,将View的实现类传进来,这样就可以提供View的实现类给presenter
*
* @param view
*/
public LocalPrintModule(LocalPrintContract.View view) {
this.view = view;
}
@FragmentScope
@Provides
LocalPrintContract.View provideLocalPrintView() {
return this.view;
}
@FragmentScope
@Provides
LocalPrintContract.Model provideLocalPrintModel(LocalPrintModel model) {
return model;
}
}
\ No newline at end of file
package com.joe.print.mvp.contract;
import com.gingersoft.gsa.cloud.base.common.bean.BaseResult;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.jess.arms.mvp.IView;
import com.jess.arms.mvp.IModel;
import java.util.List;
import io.reactivex.Observable;
import okhttp3.RequestBody;
public interface IpPrintListActivityContract {
//对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
interface View extends IView {
void loadPrinterList(List<PrinterDeviceBean> deviceBeans);
void loadFile();
}
//Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存
interface Model extends IModel {
Observable<BaseResult> getPrinterList(int restaurantId);
Observable<BaseResult> deletePrinter(RequestBody requestBody);
}
}
package com.joe.print.mvp.contract;
import com.jess.arms.mvp.IView;
import com.jess.arms.mvp.IModel;
public interface LocalPrintContract {
//对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
interface View extends IView {
}
//Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存
interface Model extends IModel {
}
}
......@@ -26,13 +26,9 @@ import okhttp3.RequestBody;
public interface PrintListContract {
//对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
interface View extends IView {
void loadPrinterList(List<PrinterDeviceBean> deviceBeans);
}
//Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存
interface Model extends IModel {
Observable<BaseResult> getPrinterList(int restaurantId);
Observable<BaseResult> deletePrinter(RequestBody requestBody);
}
}
......@@ -25,6 +25,8 @@ public interface PrinterAddContract {
//对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
interface View extends IView {
void addPrinterSuccess(PrinterDeviceBean printerDeviceBean);
void updatePrinterSuccess(PrinterDeviceBean printerDeviceBean);
}
//Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存
......
package com.joe.print.mvp.model;
import android.app.Application;
import com.gingersoft.gsa.cloud.base.common.bean.BaseResult;
import com.google.gson.Gson;
import com.jess.arms.di.scope.FragmentScope;
import com.jess.arms.integration.IRepositoryManager;
import com.jess.arms.mvp.BaseModel;
import com.joe.print.mvp.contract.IpPrintListActivityContract;
import com.joe.print.mvp.model.server.PrintInfoService;
import javax.inject.Inject;
import io.reactivex.Observable;
import okhttp3.RequestBody;
@FragmentScope
public class IpPrintListActivityModel extends BaseModel implements IpPrintListActivityContract.Model {
@Inject
Gson mGson;
@Inject
Application mApplication;
@Inject
public IpPrintListActivityModel(IRepositoryManager repositoryManager) {
super(repositoryManager);
}
@Override
public void onDestroy() {
super.onDestroy();
this.mGson = null;
this.mApplication = null;
}
@Override
public Observable<BaseResult> getPrinterList(int restaurantId) {
return mRepositoryManager.obtainRetrofitService(PrintInfoService.class)
.getPrinterList(restaurantId);
}
@Override
public Observable<BaseResult> deletePrinter(RequestBody requestBody) {
return mRepositoryManager.obtainRetrofitService(PrintInfoService.class)
.deletePrinterList(requestBody);
}
}
\ No newline at end of file
package com.joe.print.mvp.model;
import android.app.Application;
import com.google.gson.Gson;
import com.jess.arms.integration.IRepositoryManager;
import com.jess.arms.mvp.BaseModel;
import com.jess.arms.di.scope.FragmentScope;
import javax.inject.Inject;
import com.joe.print.mvp.contract.LocalPrintContract;
@FragmentScope
public class LocalPrintModel extends BaseModel implements LocalPrintContract.Model {
@Inject
Gson mGson;
@Inject
Application mApplication;
@Inject
public LocalPrintModel(IRepositoryManager repositoryManager) {
super(repositoryManager);
}
@Override
public void onDestroy() {
super.onDestroy();
this.mGson = null;
this.mApplication = null;
}
}
\ No newline at end of file
......@@ -49,15 +49,4 @@ public class PrintListModel extends BaseModel implements PrintListContract.Model
this.mApplication = null;
}
@Override
public Observable<BaseResult> getPrinterList(int restaurantId) {
return mRepositoryManager.obtainRetrofitService(PrintInfoService.class)
.getPrinterList(restaurantId);
}
@Override
public Observable<BaseResult> deletePrinter(RequestBody requestBody) {
return mRepositoryManager.obtainRetrofitService(PrintInfoService.class)
.deletePrinterList(requestBody);
}
}
\ No newline at end of file
package com.joe.print.mvp.presenter;
import android.app.Application;
import com.gingersoft.gsa.cloud.base.common.bean.BaseResult;
import com.gingersoft.gsa.cloud.base.common.bean.PrinterManger.PrinterManager;
import com.gingersoft.gsa.cloud.base.utils.JsonUtils;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.jess.arms.di.scope.FragmentScope;
import com.jess.arms.http.imageloader.ImageLoader;
import com.jess.arms.integration.AppManager;
import com.jess.arms.mvp.BasePresenter;
import com.jess.arms.utils.RxLifecycleUtils;
import com.joe.print.mvp.contract.IpPrintListActivityContract;
import java.util.List;
import javax.inject.Inject;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber;
import okhttp3.FormBody;
import okhttp3.RequestBody;
@FragmentScope
public class IpPrintListActivityPresenter extends BasePresenter<IpPrintListActivityContract.Model, IpPrintListActivityContract.View> {
@Inject
RxErrorHandler mErrorHandler;
@Inject
Application mApplication;
@Inject
ImageLoader mImageLoader;
@Inject
AppManager mAppManager;
@Inject
public IpPrintListActivityPresenter(IpPrintListActivityContract.Model model, IpPrintListActivityContract.View rootView) {
super(model, rootView);
}
@Override
public void onDestroy() {
super.onDestroy();
this.mErrorHandler = null;
this.mAppManager = null;
this.mImageLoader = null;
this.mApplication = null;
}
/**
* 獲取打印機列表
*
* @param restaurantId 餐廳id
*/
public void getPrinterList(int restaurantId) {
mModel.getPrinterList(restaurantId)
.subscribeOn(Schedulers.io())
.doOnSubscribe(disposable -> mRootView.showLoading(""))
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.doAfterTerminate(() -> mRootView.hideLoading())
.compose(RxLifecycleUtils.bindToLifecycle(mRootView))
.subscribe(new ErrorHandleSubscriber<BaseResult>(mErrorHandler) {
@Override
public void onNext(BaseResult baseResult) {
if (baseResult.isSuccess()) {
List<PrinterDeviceBean> deviceBeans = JsonUtils.parseArray(baseResult.getData(), PrinterDeviceBean.class);
if (deviceBeans != null && deviceBeans.size() > 0) {
mRootView.loadPrinterList(deviceBeans);
PrinterManager.getPrinterManager().setDeviceBeans(deviceBeans);
} else {
mRootView.loadFile();
}
} else {
mRootView.loadFile();
}
}
});
}
/**
* 刪除打印機
*
* @param ids 打印機id,可以傳多個 例如:1,2,3
*/
public void deletePrinter(String ids) {
RequestBody requestBody = new FormBody.Builder()
.add("id", ids)
.build();
mModel.deletePrinter(requestBody)
.subscribeOn(Schedulers.io())
.doOnSubscribe(disposable -> mRootView.showLoading(""))
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.doAfterTerminate(() -> mRootView.hideLoading())
.compose(RxLifecycleUtils.bindToLifecycle(mRootView))
.subscribe(new ErrorHandleSubscriber<BaseResult>(mErrorHandler) {
@Override
public void onNext(BaseResult baseResult) {
}
});
}
}
package com.joe.print.mvp.presenter;
import android.app.Application;
import com.jess.arms.di.scope.FragmentScope;
import com.jess.arms.http.imageloader.ImageLoader;
import com.jess.arms.integration.AppManager;
import com.jess.arms.mvp.BasePresenter;
import com.joe.print.mvp.contract.LocalPrintContract;
import javax.inject.Inject;
import me.jessyan.rxerrorhandler.core.RxErrorHandler;
@FragmentScope
public class LocalPrintPresenter extends BasePresenter<LocalPrintContract.Model, LocalPrintContract.View> {
@Inject
RxErrorHandler mErrorHandler;
@Inject
Application mApplication;
@Inject
ImageLoader mImageLoader;
@Inject
AppManager mAppManager;
@Inject
public LocalPrintPresenter(LocalPrintContract.Model model, LocalPrintContract.View rootView) {
super(model, rootView);
}
@Override
public void onDestroy() {
super.onDestroy();
this.mErrorHandler = null;
this.mAppManager = null;
this.mImageLoader = null;
this.mApplication = null;
}
}
......@@ -2,27 +2,15 @@ package com.joe.print.mvp.presenter;
import android.app.Application;
import com.gingersoft.gsa.cloud.base.common.bean.BaseResult;
import com.gingersoft.gsa.cloud.base.utils.JsonUtils;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.jess.arms.di.scope.ActivityScope;
import com.jess.arms.http.imageloader.ImageLoader;
import com.jess.arms.integration.AppManager;
import com.jess.arms.mvp.BasePresenter;
import com.jess.arms.utils.RxLifecycleUtils;
import com.joe.print.mvp.contract.PrintListContract;
import com.gingersoft.gsa.cloud.base.common.bean.PrinterManger.PrinterManager;
import java.util.List;
import javax.inject.Inject;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber;
import okhttp3.FormBody;
import okhttp3.RequestBody;
/**
......@@ -61,55 +49,4 @@ public class PrintListPresenter extends BasePresenter<PrintListContract.Model, P
this.mImageLoader = null;
this.mApplication = null;
}
/**
* 獲取打印機列表
*
* @param restaurantId 餐廳id
*/
public void getPrinterList(int restaurantId) {
mModel.getPrinterList(restaurantId)
.subscribeOn(Schedulers.io())
.doOnSubscribe(disposable -> mRootView.showLoading(""))
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.doAfterTerminate(() -> mRootView.hideLoading())
.compose(RxLifecycleUtils.bindToLifecycle(mRootView))
.subscribe(new ErrorHandleSubscriber<BaseResult>(mErrorHandler) {
@Override
public void onNext(BaseResult baseResult) {
if(baseResult.isSuccess()){
List<PrinterDeviceBean> deviceBeans = JsonUtils.parseArray(baseResult.getData(), PrinterDeviceBean.class);
if(deviceBeans != null && deviceBeans.size() > 0){
mRootView.loadPrinterList(deviceBeans);
PrinterManager.getPrinterManager().setDeviceBeans(deviceBeans);
}
}
}
});
}
/**
* 刪除打印機
* @param ids 打印機id,可以傳多個 例如:1,2,3
*/
public void deletePrinter(String ids){
RequestBody requestBody = new FormBody.Builder()
.add("id", ids)
.build();
mModel.deletePrinter(requestBody)
.subscribeOn(Schedulers.io())
.doOnSubscribe(disposable -> mRootView.showLoading(""))
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.doAfterTerminate(() -> mRootView.hideLoading())
.compose(RxLifecycleUtils.bindToLifecycle(mRootView))
.subscribe(new ErrorHandleSubscriber<BaseResult>(mErrorHandler) {
@Override
public void onNext(BaseResult baseResult) {
}
});
}
}
......@@ -125,6 +125,7 @@ public class PrinterAddPresenter extends BasePresenter<PrinterAddContract.Model,
public void onNext(BaseResult baseResult) {
if (baseResult.isSuccess()) {
mRootView.showMessage("保存成功");
mRootView.updatePrinterSuccess(printerDeviceBean);
mRootView.killMyself();
}
}
......
package com.joe.print.mvp.print;
public class PrintConstans {
//默認打印機數據
public static final String DEFAULT_PRINT_IP = "default_print_ip";
public static final String DEFAULT_PRINT_PORT = "default_print_port";
public static final String DEFAULT_PRINT_PAPER = "default_print_paper";
}
......@@ -20,6 +20,7 @@ import com.gingersoft.gsa.cloud.base.common.bean.TableBean;
import com.gingersoft.gsa.cloud.base.common.bean.mealManage.MyOrderManage;
import com.gingersoft.gsa.cloud.base.common.bean.mealManage.OpenTableManage;
import com.gingersoft.gsa.cloud.base.utils.MoneyUtil;
import com.gingersoft.gsa.cloud.base.utils.PrintTransitUtils;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.base.utils.view.ImageUtils;
import com.gingersoft.gsa.cloud.base.utils.view.LayoutToBitmapUtils;
......@@ -128,6 +129,9 @@ public class PrintUtils {
}
}
}
} else if (type == 4) {
//清機報表
bitmaps.add(getReportBitmap(mContext));
}
return bitmaps;
}
......@@ -203,9 +207,7 @@ public class PrintUtils {
//加载条形码
// ImageView ivBarCode = view.findViewById(R.id.iv_bar_code);
// ivBarCode.setImageBitmap(BitmapUtil.generateBitmap("12312112131", 2, 450, 150));
LayoutToBitmapUtils.layoutView(context, view);//先测量view
//580為程序支持的打印紙最大寬度
return ImageUtils.zoomDrawable(LayoutToBitmapUtils.loadBitmapFromView(view), paperWidth);//将view轉bitmap
return viewToBitmap(context, view);
}
/**
......@@ -268,7 +270,7 @@ public class PrintUtils {
BigDecimal totalAmount = new BigDecimal(0);
for (OrderDetail OrderDetail : MyOrderManage.getInstance().getOrderFoodList()) {
totalAmount = MoneyUtil.sum(totalAmount, MoneyUtil.priceCalculation(OrderDetail.getPrice(), OrderDetail.getNumber()));
totalAmount = MoneyUtil.sum(totalAmount, OrderDetail.getPrice());
}
//總金額
mTvTotalAmount.setText(totalAmount + "");
......@@ -278,9 +280,7 @@ public class PrintUtils {
//加载条形码
// ImageView ivBarCode = view.findViewById(R.id.iv_bar_code);
// ivBarCode.setImageBitmap(BitmapUtil.generateBitmap("12312112131", 2, 450, 150));
LayoutToBitmapUtils.layoutView(context, view);//先测量view
//580為程序支持的打印紙最大寬度
return ImageUtils.zoomDrawable(LayoutToBitmapUtils.loadBitmapFromView(view), paperWidth);//将view轉bitmap
return viewToBitmap(context, view);
}
......@@ -327,15 +327,30 @@ public class PrintUtils {
//操作人員
tvOperator.setText(GsaCloudApplication.userName);
LayoutToBitmapUtils.layoutView(context, view);//先测量view
//580為程序支持的打印紙最大寬度
return ImageUtils.zoomDrawable(LayoutToBitmapUtils.loadBitmapFromView(view), paperWidth);//将view轉bitmap
return viewToBitmap(context, view);
}
/**
* 獲取測試打印bitmap
*
* @param context
* @return
*/
private static Bitmap getTestPrintBitmap(Context context) {
View view = LinearLayout.inflate(context, R.layout.print_test, null);
return viewToBitmap(context, view);
}
private static Bitmap getReportBitmap(Context mContext) {
View view = PrintTransitUtils.getInstance().getPrintView();
if (view != null) {
return viewToBitmap(mContext, view);
}
return null;
}
private static Bitmap getTestPrintBitmap(Context context){
View view = LinearLayout.inflate(context, R.layout.print_test, null);
public static Bitmap viewToBitmap(Context context, View view) {
LayoutToBitmapUtils.layoutView(context, view);//先测量view
//580為程序支持的打印紙最大寬度
return ImageUtils.zoomDrawable(LayoutToBitmapUtils.loadBitmapFromView(view), paperWidth);//将view轉bitmap
......
......@@ -40,6 +40,7 @@ import com.joe.print.R;
import com.joe.print.di.component.DaggerPrintComponent;
import com.joe.print.mvp.contract.PrintContract;
import com.joe.print.mvp.presenter.PrintPresenter;
import com.joe.print.mvp.print.PrintConstans;
import com.joe.print.mvp.print.PrintStatus;
import com.joe.print.mvp.print.PrintUtils;
import com.joe.print.mvp.ui.adapter.DialogPrinterListAdapter;
......@@ -81,6 +82,7 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
* 1:印單
* 2:結賬單
* 3:廚房單
* 4:清機報表
*/
private int type = -1;
......@@ -113,7 +115,7 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
//獲取打印類型,根據打印類型生成對應的bitmap
type = CCUtil.getNavigateParam(this, "type", 1001);
//380 540
List<Bitmap> bitmaps = PrintUtils.getPrintBitmap(mContext, type, 360);
List<Bitmap> bitmaps = PrintUtils.getPrintBitmap(mContext, type, paperWidth);
if (bitmaps.size() <= 0) {
printFile();
finish();
......@@ -194,13 +196,24 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
* IP打印
*/
private void ipPrint() {
if (PrinterManager.getPrinterManager().getDeviceBeans() != null
&& PrinterManager.getPrinterManager().getDeviceBeans().size() > 0) {
//如果本地保存有打印設備
showPrinterList();
//獲取默認選中的IP打印機
if(Objects.equals(SPUtils.get(mContext, PrintConstans.DEFAULT_PRINT_IP, ""), "")){
//如果沒有獲取到默認打印機IP
if (PrinterManager.getPrinterManager().getDeviceBeans() != null
&& PrinterManager.getPrinterManager().getDeviceBeans().size() > 0) {
//如果本地保存有打印設備
showPrinterList();
} else {
//網絡獲取打印設備
mPresenter.getPrinterList(GsaCloudApplication.getRestaurantId(mContext));
}
} else {
//網絡獲取打印設備
mPresenter.getPrinterList(GsaCloudApplication.getRestaurantId(mContext));
//如果有默認選中打印機
PrinterDeviceBean printerDeviceBean = new PrinterDeviceBean();
printerDeviceBean.setIp((String) SPUtils.get(mContext, PrintConstans.DEFAULT_PRINT_IP, ""));
printerDeviceBean.setPort((Integer) SPUtils.get(mContext, PrintConstans.DEFAULT_PRINT_PORT, 0));
printerDeviceBean.setType((Integer) SPUtils.get(mContext, PrintConstans.DEFAULT_PRINT_PAPER, 0));
startToIpPrint(printerDeviceBean);
}
}
......
......@@ -15,6 +15,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.jess.arms.base.BaseActivity;
......@@ -25,6 +26,7 @@ import com.joe.print.R2;
import com.joe.print.di.component.DaggerPrinterAddComponent;
import com.joe.print.mvp.contract.PrinterAddContract;
import com.joe.print.mvp.presenter.PrinterAddPresenter;
import com.joe.print.mvp.print.PrintConstans;
import com.qmuiteam.qmui.widget.QMUITopBar;
import butterknife.BindView;
......@@ -53,7 +55,7 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem
private PrinterDeviceBean printerDeviceBean;
private boolean isEditPrinter = false;//是否是編輯打印機
private boolean isDefault = false;//是否是默認打印機
@Override
public void setupActivityComponent(@NonNull AppComponent appComponent) {
DaggerPrinterAddComponent //如找不到该类,请编译一下项目
......@@ -71,6 +73,8 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem
@Override
public void initData(@Nullable Bundle savedInstanceState) {
isDefault = getIntent().getBooleanExtra("isDefault", false);
// etPort.setInputType(EditorInfo.TYPE_CLASS_NUMBER);
String[] ips = new String[4];
// if (BuildConfig.DEBUG) {
......@@ -220,6 +224,16 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem
finish();
}
@Override
public void updatePrinterSuccess(PrinterDeviceBean item) {
//修改打印機成功,如果這個打印機是用戶設置的默認打印機,則需要更新信息
if(isDefault){
SPUtils.put(mContext, PrintConstans.DEFAULT_PRINT_IP, item.getIp());
SPUtils.put(mContext, PrintConstans.DEFAULT_PRINT_PORT, item.getPort());
SPUtils.put(mContext, PrintConstans.DEFAULT_PRINT_PAPER, item.getType());
}
}
class MyTextWatcher implements TextWatcher {
public EditText mEditText;
......
package com.joe.print.mvp.ui.activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.ViewGroup;
import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.common.bean.PrinterManger.PrinterManager;
import com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;
import com.gingersoft.gsa.cloud.ui.adapter.TabFragmentAdapter;
import com.gingersoft.gsa.cloud.ui.view.MyTableView;
import com.jess.arms.base.BaseActivity;
import com.jess.arms.di.component.AppComponent;
import com.jess.arms.utils.ArmsUtils;
......@@ -17,24 +18,13 @@ import com.joe.print.R2;
import com.joe.print.di.component.DaggerPrintListComponent;
import com.joe.print.mvp.contract.PrintListContract;
import com.joe.print.mvp.presenter.PrintListPresenter;
import com.joe.print.mvp.ui.adapter.PrinterListAdapter;
import com.joe.print.mvp.ui.fragment.IpPrintListActivityFragment;
import com.joe.print.mvp.ui.fragment.LocalPrintFragment;
import com.qmuiteam.qmui.widget.QMUITopBar;
import com.yanzhenjie.recyclerview.SwipeMenuCreator;
import com.yanzhenjie.recyclerview.SwipeMenuItem;
import com.yanzhenjie.recyclerview.SwipeRecyclerView;
import com.yanzhenjie.recyclerview.touch.OnItemMoveListener;
import com.yanzhenjie.recyclerview.touch.OnItemStateChangedListener;
import com.yanzhenjie.recyclerview.widget.DefaultItemDecoration;
import java.util.Collections;
import java.util.ArrayList;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.core.view.ViewCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import static com.jess.arms.utils.Preconditions.checkNotNull;
......@@ -54,12 +44,15 @@ import static com.jess.arms.utils.Preconditions.checkNotNull;
*/
public class PrinterListActivity extends BaseActivity<PrintListPresenter> implements PrintListContract.View {
@BindView(R2.id.rc_print_list)
SwipeRecyclerView mRvPrintList;
@BindView(R2.id.printer_home_bar)
QMUITopBar topBar;
@BindView(R2.id.print_table_layout)
MyTableView mTabLayout;
@BindView(R2.id.print_viewpager)
ViewPager mViewPager;
private PrinterListAdapter printListAdapter;
private TabFragmentAdapter mTabFragmentAdapter;
@Override
public void setupActivityComponent(@NonNull AppComponent appComponent) {
......@@ -78,52 +71,29 @@ public class PrinterListActivity extends BaseActivity<PrintListPresenter> implem
@Override
public void initData(@Nullable Bundle savedInstanceState) {
// mPresenter.getPrinterList(GsaCloudApplication.getRestaurantId(mContext));
}
@Override
protected void onResume() {
super.onResume();
mPresenter.getPrinterList(GsaCloudApplication.getRestaurantId(mContext));
initViewPager();
}
/**
* 創建右側刪除按鈕
*/
private SwipeMenuCreator mSwipeMenuCreator = (swipeLeftMenu, swipeRightMenu, position) -> {
int width = getResources().getDimensionPixelSize(R.dimen.dp_70);
// 1. MATCH_PARENT 自适应高度,保持和Item一样高;
// 2. 指定具体的高,比如80;
// 3. WRAP_CONTENT,自身高度,不推荐;
int height = ViewGroup.LayoutParams.MATCH_PARENT;
// 添加右侧的按鈕。
SwipeMenuItem deleteItem = new SwipeMenuItem(mContext).setBackground(
R.color.theme_color)
// .setImage(R.drawable.ic_action_delete)
.setText("刪除")
.setTextColor(Color.WHITE)
.setWidth(width)
.setHeight(height);
swipeRightMenu.addMenuItem(deleteItem);// 添加一个按钮到右侧侧菜单。
};
/**
* Item的拖拽/侧滑删除时,手指状态发生变化监听。
* 设置Viewpager的适配器
*/
private OnItemStateChangedListener mOnItemStateChangedListener = (viewHolder, actionState) -> {
if (actionState == OnItemStateChangedListener.ACTION_STATE_DRAG) {
// mActionBar.setSubtitle("状态:拖拽");
// // 拖拽的时候背景就透明了,这里我们可以添加一个特殊背景。
viewHolder.itemView.setBackgroundColor(ContextCompat.getColor(mContext, R.color.color_ccc));
} else if (actionState == OnItemStateChangedListener.ACTION_STATE_SWIPE) {
// mActionBar.setSubtitle("状态:滑动删除");
} else if (actionState == OnItemStateChangedListener.ACTION_STATE_IDLE) {
// mActionBar.setSubtitle("状态:手指松开");
// 在手松开的时候还原背景。
ViewCompat.setBackground(viewHolder.itemView,
ContextCompat.getDrawable(mContext, R.color.white));
}
};
private void initViewPager() {
List<String> titles = new ArrayList<>();
titles.add("本機打印");
titles.add("網絡打印");
List<Fragment> mFragments = new ArrayList<>();
mFragments.add(LocalPrintFragment.newInstance());
mFragments.add(IpPrintListActivityFragment.newInstance());
//实例化适配器
mTabFragmentAdapter = new TabFragmentAdapter(getSupportFragmentManager(), 1);
//设置加载的Fragment集合
mTabFragmentAdapter.setFragments(mFragments);
//设置Viewpager的适配器
mViewPager.setAdapter(mTabFragmentAdapter);
mTabLayout.setTitles(titles).setupWithViewPager(mViewPager);//TabLayout绑定ViewPager
}
@Override
public void initIntent() {
......@@ -166,8 +136,7 @@ public class PrinterListActivity extends BaseActivity<PrintListPresenter> implem
@Override
public void showMessage(@NonNull String message) {
checkNotNull(message);
// ArmsUtils.snackbarText(message);
ToastUtils.show(mContext, message);
ArmsUtils.makeText(mContext, message);
}
@Override
......@@ -181,65 +150,5 @@ public class PrinterListActivity extends BaseActivity<PrintListPresenter> implem
finish();
}
private List<PrinterDeviceBean> devicess;
@Override
public void loadPrinterList(List<PrinterDeviceBean> deviceBeans) {
PrinterManager.getPrinterManager().setDeviceBeans(deviceBeans);
devicess = deviceBeans;
if (printListAdapter == null) {
mRvPrintList.setOnItemClickListener((view, adapterPosition) -> {
//打開打印機詳情
Intent intent = new Intent(mContext, PrinterAddActivity.class);
intent.putExtra("printerInfo", devicess.get(adapterPosition));
startActivity(intent);
});
//menu 右侧菜單點擊事件
mRvPrintList.setOnItemMenuClickListener((menuBridge, position) -> {
menuBridge.closeMenu();
mPresenter.deletePrinter(devicess.get(position).getId() + "");
devicess.remove(position);
printListAdapter.notifyItemRemoved(position);
}); // Item的Menu点击。
mRvPrintList.setOnItemStateChangedListener(mOnItemStateChangedListener); // 监听Item的手指状态,拖拽、侧滑、松开。
mRvPrintList.setLongPressDragEnabled(true); // 长按拖拽,默认关闭。
mRvPrintList.setOnItemMoveListener(new OnItemMoveListener() {
@Override
public boolean onItemMove(RecyclerView.ViewHolder srcHolder, RecyclerView.ViewHolder targetHolder) {
// 不同的ViewType不能拖拽换位置。
if (srcHolder.getItemViewType() != targetHolder.getItemViewType()) return false;
// 真实的Position:通过ViewHolder拿到的position都需要减掉HeadView的数量。
int fromPosition = srcHolder.getAdapterPosition() - mRvPrintList.getHeaderCount();
int toPosition = targetHolder.getAdapterPosition() - mRvPrintList.getHeaderCount();
if (fromPosition < toPosition) {
for (int i = fromPosition; i < toPosition; i++) {
Collections.swap(devicess, i, i + 1);
}
} else {
for (int i = fromPosition; i > toPosition; i--) {
Collections.swap(devicess, i, i - 1);
}
}
printListAdapter.notifyItemMoved(fromPosition, toPosition);
return true;// 返回true表示处理了,返回false表示你没有处理。
}
@Override
public void onItemDismiss(RecyclerView.ViewHolder srcHolder) {
// int adapterPosition = srcHolder.getAdapterPosition();
// int position = adapterPosition - mRvPrintList.getHeaderCount();
}
});// 监听拖拽和侧滑删除,更新UI和数据源。
printListAdapter = new PrinterListAdapter(devicess, mContext);
mRvPrintList.setLayoutManager(new LinearLayoutManager(this));
//分割线
mRvPrintList.addItemDecoration(new DefaultItemDecoration(ContextCompat.getColor(this, R.color.line_color)));
mRvPrintList.setSwipeMenuCreator(mSwipeMenuCreator); // 菜单创建器。
mRvPrintList.setAdapter(printListAdapter);
} else {
printListAdapter.notifyData(devicess);
}
}
}
package com.joe.print.mvp.ui.adapter;
import android.content.Context;
import android.widget.RadioButton;
import androidx.annotation.Nullable;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.joe.print.R;
import com.joe.print.mvp.print.PrintConstans;
import java.util.List;
import androidx.annotation.Nullable;
/**
* Created by Wyh on 2020/1/16.
*/
public class PrinterListAdapter extends BaseQuickAdapter<PrinterDeviceBean, BaseViewHolder> {
private Context mContext;
private int selectPosition = -1;
private String selectPrintIp;//默認選中的打印機IP
private Integer selectPrintPort;//默認選中的打印機端口號
private int paperType;//默認選中的打印機紙張類型
public PrinterListAdapter(@Nullable List<PrinterDeviceBean> data, Context mContext) {
super(R.layout.printer_item, data);
this.mContext = mContext;
selectPrintIp = (String) SPUtils.get(mContext, PrintConstans.DEFAULT_PRINT_IP, "");
if ((Integer) SPUtils.get(mContext, PrintConstans.DEFAULT_PRINT_PORT, -1) != -1) {
selectPrintPort = (int) SPUtils.get(mContext, PrintConstans.DEFAULT_PRINT_PORT, 0);
}
paperType = (int) SPUtils.get(mContext, PrintConstans.DEFAULT_PRINT_PAPER, 0);
}
@Override
protected void convert(BaseViewHolder helper, PrinterDeviceBean item) {
if (selectPosition == -1) {
//ip、端口、紙張類型也要一致才是默認打印機
if (selectPrintIp.equals(item.getIp()) && paperType == item.getType()) {
if (selectPrintPort != null && item.getPort() != null) {
if (selectPrintPort.equals(item.getPort())) {
((RadioButton) helper.getView(R.id.cb_printer_item)).setChecked(true);
selectPosition = helper.getAdapterPosition();
}
} else if (selectPrintPort == null && item.getPort() == null) {
((RadioButton) helper.getView(R.id.cb_printer_item)).setChecked(true);
selectPosition = helper.getAdapterPosition();
}
} else {
((RadioButton) helper.getView(R.id.cb_printer_item)).setChecked(false);
}
} else if (selectPosition == helper.getAdapterPosition()) {
((RadioButton) helper.getView(R.id.cb_printer_item)).setChecked(true);
} else {
((RadioButton) helper.getView(R.id.cb_printer_item)).setChecked(false);
}
helper.setText(R.id.tv_printer_name, item.getIp() + "");
helper.setText(R.id.tv_printer_ip, String.format(mContext.getString(R.string.print_ip), item.getIp()));
helper.setText(R.id.tv_printer_port, String.format(mContext.getString(R.string.print_port), item.getPort() + ""));
// helper.
if (item.getPort() == null) {
helper.setText(R.id.tv_printer_port, String.format(mContext.getString(R.string.print_port), ""));
} else {
helper.setText(R.id.tv_printer_port, String.format(mContext.getString(R.string.print_port), item.getPort() + ""));
}
// helper.setOnCheckedChangeListener(R.id.cb_printer_item, (buttonView, isChecked) -> {
// if (getRecyclerView() != null) {
// if (getRecyclerView().isComputingLayout()) {//如果recyclerView在刷新時
// getRecyclerView().post(() -> setSelectPrint(helper, item, isChecked));
// } else {
// setSelectPrint(helper, item, isChecked);
// }
// }
// });
helper.setOnClickListener(R.id.cb_printer_item, v -> {
if (getRecyclerView() != null) {
if (getRecyclerView().isComputingLayout()) {//如果recyclerView在刷新時
getRecyclerView().post(() -> setSelectPrint(helper, item, true));
} else {
setSelectPrint(helper, item, true);
}
}
});
}
/**
* 設置默認選中打印機
*
* @param helper
* @param item
* @param isChecked
*/
private void setSelectPrint(BaseViewHolder helper, PrinterDeviceBean item, boolean isChecked) {
if (isChecked) {
SPUtils.put(mContext, PrintConstans.DEFAULT_PRINT_IP, item.getIp());
SPUtils.put(mContext, PrintConstans.DEFAULT_PRINT_PORT, item.getPort());
SPUtils.put(mContext, PrintConstans.DEFAULT_PRINT_PAPER, item.getType());
if (selectPosition != -1) {
notifyItemChanged(selectPosition);
}
selectPosition = helper.getAdapterPosition();
ToastUtils.show(mContext, "已設置默認打印機");
}
}
public int getSelectPosition() {
return selectPosition;
}
public void setSelectPosition(int selectPosition) {
this.selectPosition = selectPosition;
}
public void notifyData(List<PrinterDeviceBean> data) {
this.mData = data;
selectPrintIp = (String) SPUtils.get(mContext, PrintConstans.DEFAULT_PRINT_IP, "");
if (SPUtils.get(mContext, PrintConstans.DEFAULT_PRINT_PORT, null) != null) {
selectPrintPort = (int) SPUtils.get(mContext, PrintConstans.DEFAULT_PRINT_PORT, 0);
}
paperType = (int) SPUtils.get(mContext, PrintConstans.DEFAULT_PRINT_PAPER, 0);
super.notifyDataSetChanged();
}
}
package com.joe.print.mvp.ui.fragment;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.core.view.ViewCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.common.bean.PrinterManger.PrinterManager;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.jess.arms.base.BaseFragment;
import com.jess.arms.di.component.AppComponent;
import com.jess.arms.utils.ArmsUtils;
import com.joe.print.R;
import com.joe.print.R2;
import com.joe.print.di.component.DaggerIpPrintListActivityComponent;
import com.joe.print.di.module.IpPrintListActivityModule;
import com.joe.print.mvp.contract.IpPrintListActivityContract;
import com.joe.print.mvp.presenter.IpPrintListActivityPresenter;
import com.joe.print.mvp.print.PrintConstans;
import com.joe.print.mvp.ui.activity.PrinterAddActivity;
import com.joe.print.mvp.ui.adapter.PrinterListAdapter;
import com.yanzhenjie.recyclerview.SwipeMenuCreator;
import com.yanzhenjie.recyclerview.SwipeMenuItem;
import com.yanzhenjie.recyclerview.SwipeRecyclerView;
import com.yanzhenjie.recyclerview.touch.OnItemMoveListener;
import com.yanzhenjie.recyclerview.touch.OnItemStateChangedListener;
import com.yanzhenjie.recyclerview.widget.DefaultItemDecoration;
import java.util.Collections;
import java.util.List;
import butterknife.BindView;
import butterknife.OnClick;
import static com.jess.arms.utils.Preconditions.checkNotNull;
public class IpPrintListActivityFragment extends BaseFragment<IpPrintListActivityPresenter> implements IpPrintListActivityContract.View, View.OnClickListener {
@BindView(R2.id.rc_ip_print)
SwipeRecyclerView mRvPrintList;
private PrinterListAdapter printListAdapter;
@BindView(R2.id.tv_add_print)
TextView mTvAddPrint;
public static IpPrintListActivityFragment newInstance() {
IpPrintListActivityFragment fragment = new IpPrintListActivityFragment();
return fragment;
}
@Override
public void setupFragmentComponent(@NonNull AppComponent appComponent) {
DaggerIpPrintListActivityComponent //如找不到该类,请编译一下项目
.builder()
.appComponent(appComponent)
.ipPrintListActivityModule(new IpPrintListActivityModule(this))
.build()
.inject(this);
}
@Override
public View initView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_ip_print_list, container, false);
}
@Override
public void initData(@Nullable Bundle savedInstanceState) {
}
@Override
public void onResume() {
super.onResume();
mPresenter.getPrinterList(GsaCloudApplication.getRestaurantId(mContext));
}
/**
* 通过此方法可以使 Fragment 能够与外界做一些交互和通信, 比如说外部的 Activity 想让自己持有的某个 Fragment 对象执行一些方法,
* 建议在有多个需要与外界交互的方法时, 统一传 {@link Message}, 通过 what 字段来区分不同的方法, 在 {#setData(Object)}
* 方法中就可以 {@code switch} 做不同的操作, 这样就可以用统一的入口方法做多个不同的操作, 可以起到分发的作用
* <p>
* 调用此方法时请注意调用时 Fragment 的生命周期, 如果调用 {#setData(Object)} 方法时 {还没执行
* 但在 {@link #setData(Object)} 里却调用了 Presenter 的方法, 是会报空的, 因为 Dagger 注入是在 {@link (Bundle)} 方法中执行的
* 然后才创建的 Presenter, 如果要做一些初始化操作,可以不必让外部调用 { #setData(Object)}, 在 {@link #initData(Bundle)} 中初始化就可以了
* <p>
* Example usage:
* <pre>
* public void setData(@Nullable Object data) {
* if (data != null && data instanceof Message) {
* switch (((Message) data).what) {
* case 0:
* loadData(((Message) data).arg1);
* break;
* case 1:
* refreshUI();
* break;
* default:
* //do something
* break;
* }
* }
* }
*
* // call setData(Object):
* Message data = new Message();
* data.what = 0;
* data.arg1 = 1;
* fragment.setData(data);
* </pre>
*
* @param data 当不需要参数时 {@code data} 可以为 {@code null}
*/
@Override
public void setData(@Nullable Object data) {
}
@Override
public void showLoading(String message) {
}
@Override
public void hideLoading() {
}
@Override
public void showMessage(@NonNull String message) {
checkNotNull(message);
ArmsUtils.snackbarText(message);
}
@Override
public void launchActivity(@NonNull Intent intent) {
checkNotNull(intent);
ArmsUtils.startActivity(intent);
}
@Override
public void killMyself() {
}
/**
* 創建右側刪除按鈕
*/
private SwipeMenuCreator mSwipeMenuCreator = (swipeLeftMenu, swipeRightMenu, position) -> {
int width = getResources().getDimensionPixelSize(R.dimen.dp_70);
// 1. MATCH_PARENT 自适应高度,保持和Item一样高;
// 2. 指定具体的高,比如80;
// 3. WRAP_CONTENT,自身高度,不推荐;
int height = ViewGroup.LayoutParams.MATCH_PARENT;
// 添加右侧的按鈕。
SwipeMenuItem deleteItem = new SwipeMenuItem(mContext).setBackground(
R.color.theme_color)
// .setImage(R.drawable.ic_action_delete)
.setText("刪除")
.setTextColor(Color.WHITE)
.setWidth(width)
.setHeight(height);
swipeRightMenu.addMenuItem(deleteItem);// 添加一个按钮到右侧侧菜单。
};
/**
* Item的拖拽/侧滑删除时,手指状态发生变化监听。
*/
private OnItemStateChangedListener mOnItemStateChangedListener = (viewHolder, actionState) -> {
if (actionState == OnItemStateChangedListener.ACTION_STATE_DRAG) {
// mActionBar.setSubtitle("状态:拖拽");
// // 拖拽的时候背景就透明了,这里我们可以添加一个特殊背景。
viewHolder.itemView.setBackgroundColor(ContextCompat.getColor(mContext, R.color.color_ccc));
} else if (actionState == OnItemStateChangedListener.ACTION_STATE_SWIPE) {
// mActionBar.setSubtitle("状态:滑动删除");
} else if (actionState == OnItemStateChangedListener.ACTION_STATE_IDLE) {
// mActionBar.setSubtitle("状态:手指松开");
// 在手松开的时候还原背景。
ViewCompat.setBackground(viewHolder.itemView,
ContextCompat.getDrawable(mContext, R.color.white));
}
};
private List<PrinterDeviceBean> devicess;
@Override
public void loadPrinterList(List<PrinterDeviceBean> deviceBeans) {
mRvPrintList.setVisibility(View.VISIBLE);
mTvAddPrint.setVisibility(View.GONE);
PrinterManager.getPrinterManager().setDeviceBeans(deviceBeans);
devicess = deviceBeans;
if (printListAdapter == null) {
mRvPrintList.setOnItemClickListener((view, adapterPosition) -> {
//item點擊事件 打開打印機詳情
Intent intent = new Intent(mContext, PrinterAddActivity.class);
intent.putExtra("printerInfo", devicess.get(adapterPosition));
if(printListAdapter.getSelectPosition() == adapterPosition){
//如果當前點擊的是默認打印機,那麼編輯後的信息需要保存
intent.putExtra("isDefault", true);
}
startActivity(intent);
});
//menu 右侧菜單點擊事件
mRvPrintList.setOnItemMenuClickListener((menuBridge, position) -> {
//刪除按鈕點擊事件
menuBridge.closeMenu();
//調用刪除接口
mPresenter.deletePrinter(devicess.get(position).getId() + "");
if (printListAdapter.getSelectPosition() == position) {
//如果刪除的是當前選中的默認打印機,那麼移除默認打印機
SPUtils.remove(mContext, PrintConstans.DEFAULT_PRINT_IP);
SPUtils.remove(mContext, PrintConstans.DEFAULT_PRINT_PORT);
SPUtils.remove(mContext, PrintConstans.DEFAULT_PRINT_PAPER);
printListAdapter.setSelectPosition(-1);
}
devicess.remove(position);
printListAdapter.notifyItemRemoved(position);
});
// Item的Menu点击。
mRvPrintList.setOnItemStateChangedListener(mOnItemStateChangedListener); // 监听Item的手指状态,拖拽、侧滑、松开。
mRvPrintList.setLongPressDragEnabled(true); // 长按拖拽,默认关闭。
mRvPrintList.setOnItemMoveListener(new OnItemMoveListener() {
@Override
public boolean onItemMove(RecyclerView.ViewHolder srcHolder, RecyclerView.ViewHolder targetHolder) {
// 不同的ViewType不能拖拽换位置。
if (srcHolder.getItemViewType() != targetHolder.getItemViewType()) return false;
// 真实的Position:通过ViewHolder拿到的position都需要减掉HeadView的数量。
int fromPosition = srcHolder.getAdapterPosition() - mRvPrintList.getHeaderCount();
int toPosition = targetHolder.getAdapterPosition() - mRvPrintList.getHeaderCount();
if (fromPosition < toPosition) {
for (int i = fromPosition; i < toPosition; i++) {
Collections.swap(devicess, i, i + 1);
}
} else {
for (int i = fromPosition; i > toPosition; i--) {
Collections.swap(devicess, i, i - 1);
}
}
printListAdapter.notifyItemMoved(fromPosition, toPosition);
return true;// 返回true表示处理了,返回false表示你没有处理。
}
@Override
public void onItemDismiss(RecyclerView.ViewHolder srcHolder) {
// int adapterPosition = srcHolder.getAdapterPosition();
// int position = adapterPosition - mRvPrintList.getHeaderCount();
}
});// 监听拖拽和侧滑删除,更新UI和数据源。
printListAdapter = new PrinterListAdapter(devicess, mContext);
mRvPrintList.setLayoutManager(new LinearLayoutManager(mContext));
//分割线
mRvPrintList.addItemDecoration(new DefaultItemDecoration(ContextCompat.getColor(mContext, R.color.line_color)));
mRvPrintList.setSwipeMenuCreator(mSwipeMenuCreator); // 菜单创建器。
// mRvPrintList.setAdapter(printListAdapter);
printListAdapter.bindToRecyclerView(mRvPrintList);
} else {
printListAdapter.notifyData(devicess);
}
}
@Override
public void loadFile() {
mRvPrintList.setVisibility(View.GONE);
mTvAddPrint.setVisibility(View.VISIBLE);
}
@OnClick(R2.id.tv_add_print)
@Override
public void onClick(View v) {
if (v.getId() == R.id.tv_add_print) {
startActivity(new Intent(mContext, PrinterAddActivity.class));
}
}
}
package com.joe.print.mvp.ui.fragment;
import android.content.Intent;
import android.os.Bundle;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.jess.arms.base.BaseFragment;
import com.jess.arms.di.component.AppComponent;
import com.jess.arms.utils.ArmsUtils;
import com.joe.print.R;
import com.joe.print.di.component.DaggerLocalPrintComponent;
import com.joe.print.di.module.LocalPrintModule;
import com.joe.print.mvp.contract.LocalPrintContract;
import com.joe.print.mvp.presenter.LocalPrintPresenter;
import static com.jess.arms.utils.Preconditions.checkNotNull;
/**
* 本機打印配置頁
*/
public class LocalPrintFragment extends BaseFragment<LocalPrintPresenter> implements LocalPrintContract.View {
public static LocalPrintFragment newInstance() {
LocalPrintFragment fragment = new LocalPrintFragment();
return fragment;
}
@Override
public void setupFragmentComponent(@NonNull AppComponent appComponent) {
DaggerLocalPrintComponent //如找不到该类,请编译一下项目
.builder()
.appComponent(appComponent)
.localPrintModule(new LocalPrintModule(this))
.build()
.inject(this);
}
@Override
public View initView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_local_print, container, false);
}
@Override
public void initData(@Nullable Bundle savedInstanceState) {
}
/**
* 通过此方法可以使 Fragment 能够与外界做一些交互和通信, 比如说外部的 Activity 想让自己持有的某个 Fragment 对象执行一些方法,
* 建议在有多个需要与外界交互的方法时, 统一传 {@link Message}, 通过 what 字段来区分不同的方法, 在 {@link #setData(Object)}
* 方法中就可以 {@code switch} 做不同的操作, 这样就可以用统一的入口方法做多个不同的操作, 可以起到分发的作用
* <p>
* 调用此方法时请注意调用时 Fragment 的生命周期, 如果调用 {@link #setData(Object)} 方法时 {@link (Bundle)} 还没执行
* 但在 {@link #setData(Object)} 里却调用了 Presenter 的方法, 是会报空的, 因为 Dagger 注入是在 {@link (Bundle)} 方法中执行的
* 然后才创建的 Presenter, 如果要做一些初始化操作,可以不必让外部调用 {@link #setData(Object)}, 在 {@link #initData(Bundle)} 中初始化就可以了
* <p>
* Example usage:
* <pre>
* public void setData(@Nullable Object data) {
* if (data != null && data instanceof Message) {
* switch (((Message) data).what) {
* case 0:
* loadData(((Message) data).arg1);
* break;
* case 1:
* refreshUI();
* break;
* default:
* //do something
* break;
* }
* }
* }
*
* // call setData(Object):
* Message data = new Message();
* data.what = 0;
* data.arg1 = 1;
* fragment.setData(data);
* </pre>
*
* @param data 当不需要参数时 {@code data} 可以为 {@code null}
*/
@Override
public void setData(@Nullable Object data) {
}
@Override
public void showLoading(String message) {
}
@Override
public void hideLoading() {
}
@Override
public void showMessage(@NonNull String message) {
checkNotNull(message);
ArmsUtils.snackbarText(message);
}
@Override
public void launchActivity(@NonNull Intent intent) {
checkNotNull(intent);
ArmsUtils.startActivity(intent);
}
@Override
public void killMyself() {
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<com.yanzhenjie.recyclerview.SwipeRecyclerView
android:id="@+id/rc_ip_print"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/dp_10"
android:paddingRight="@dimen/dp_10" />
<TextView
android:id="@+id/tv_add_print"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/shape_border_bg"
android:text="添加打印機"
android:padding="@dimen/dp_10"
android:textColor="@color/theme_color" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="本地打印機列表"
android:textColor="@color/theme_333_color" />
</LinearLayout>
\ No newline at end of file
......@@ -13,12 +13,19 @@
app:qmui_topbar_text_btn_color_state_list="@color/theme_white_color"
app:qmui_topbar_title_color="@color/theme_white_color" />
<com.yanzhenjie.recyclerview.SwipeRecyclerView
android:id="@+id/rc_print_list"
<com.gingersoft.gsa.cloud.ui.view.MyTableView
android:id="@+id/print_table_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/dp_10"
android:paddingRight="@dimen/dp_10" />
android:layout_height="@dimen/tabIndicator_height"
app:tabIndicator="@drawable/tablayout_indicator"
app:tabIndicatorColor="@color/theme_color"
app:tabIndicatorFullWidth="false" />
<androidx.viewpager.widget.ViewPager
android:id="@+id/print_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
\ No newline at end of file
......@@ -7,7 +7,7 @@
android:paddingTop="@dimen/dp_10"
android:paddingBottom="@dimen/dp_10">
<CheckBox
<RadioButton
android:id="@+id/cb_printer_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
......
package com.gingersoft.gsa.cloud.base.adapter.print;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.chad.library.adapter.base.BaseQuickAdapter;
......@@ -7,6 +9,7 @@ import com.chad.library.adapter.base.BaseViewHolder;
import com.gingersoft.gsa.cloud.base.R;
import com.gingersoft.gsa.cloud.base.common.bean.OrderDetail;
import java.math.BigDecimal;
import java.util.List;
/**
......@@ -14,21 +17,31 @@ import java.util.List;
*/
public class KitChenPrintFoodAdapter extends BaseQuickAdapter<OrderDetail, BaseViewHolder> {
private int indentation = 0;
public KitChenPrintFoodAdapter(@Nullable List<OrderDetail> data) {
super(R.layout.print_kitchen_item_food, data);
}
@Override
protected void convert(BaseViewHolder helper, OrderDetail item) {
TextView textView = helper.getView(R.id.tv_food_name);
if (helper.getAdapterPosition() == 0) {
//只第一次測量一下
indentation = new BigDecimal(textView.getPaint().measureText("哈")).setScale(0, BigDecimal.ROUND_HALF_UP).intValue();
}
int paddingLeft;
if (item.getItemType() == 2) {
//細項,縮進
helper.setText(R.id.tv_food_number, "\u3000" + item.getNumber());
paddingLeft = indentation;
} else if (item.getItemType() == 3) {
//細項,縮進
helper.setText(R.id.tv_food_number, "\u3000\u3000" + item.getNumber());
paddingLeft = indentation * 2;
} else {
helper.setText(R.id.tv_food_number, item.getNumber() + "");
paddingLeft = 0;
}
textView.setPadding(paddingLeft, textView.getPaddingTop(), textView.getPaddingRight(), textView.getPaddingBottom());
helper.setText(R.id.tv_food_name, item.getProductName());
helper.setText(R.id.tv_food_number, String.valueOf(item.getNumber()));
}
}
......@@ -22,6 +22,7 @@ import com.gingersoft.gsa.cloud.base.BuildConfig;
import com.gingersoft.gsa.cloud.base.R;
import com.gingersoft.gsa.cloud.base.common.bean.CurrentAndroidSetting;
import com.gingersoft.gsa.cloud.base.utils.AidlUtil;
import com.gingersoft.gsa.cloud.base.utils.constans.HttpsConstans;
import com.gingersoft.gsa.cloud.base.utils.constans.UserConstans;
import com.gingersoft.gsa.cloud.base.utils.crash.AppCrashHandler;
import com.gingersoft.gsa.cloud.base.utils.file.FileUtils;
......@@ -40,6 +41,8 @@ import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.footer.ClassicsFooter;
import com.scwang.smartrefresh.layout.header.ClassicsHeader;
import me.jessyan.retrofiturlmanager.RetrofitUrlManager;
/**
* Created by Wyh on 2019/12/21.
*/
......@@ -148,6 +151,19 @@ public class GsaCloudApplication extends BaseApplication {
Log.e("error", "GsaCloudApplication打印初始化失敗:" + e.getMessage());
}
}
//需要單獨配置域名URL的,在接口上添加@Headers({"Domain-Name: settlement_report_server"}),不添加則是使用默認域名
setGlobalDomain();
//清機報表請求地址
RetrofitUrlManager.getInstance().putDomain("settlement_report_server", HttpsConstans.ROOT_SETTLEMENT_REPORT_SERVER_ADDRESS_FORMAL);
//gsa報表請求地址
RetrofitUrlManager.getInstance().putDomain("gsa_report", HttpsConstans.REPORT_SERVER_ADDRESS);
//微信報表請求地址
RetrofitUrlManager.getInstance().putDomain("wechat_report", HttpsConstans.WECHAR_REPORT_SERVER_ADDRESS);
}
public static void setGlobalDomain() {
//配置全局默認URL
RetrofitUrlManager.getInstance().setGlobalDomain(HttpsConstans.ROOT_SERVER_ADDRESS_FORMAL);
}
private void initXLog() {
......
......@@ -2,7 +2,6 @@ package com.gingersoft.gsa.cloud.base.common.bean;
import com.gingersoft.gsa.cloud.base.common.bean.mealManage.MyOrderManage;
import com.gingersoft.gsa.cloud.database.bean.ComboItem;
import com.gingersoft.gsa.cloud.database.bean.FoodCombo;
import com.gingersoft.gsa.cloud.database.bean.Food;
import com.gingersoft.gsa.cloud.database.bean.Modifier;
......@@ -512,7 +511,7 @@ public class OrderDetail implements Serializable {
orderDetail.setPrice(orderDetailsBean.getPrice() * orderDetailsBean.getNumber());
orderDetail.setVisible(orderDetailsBean.getStatus() == 0);
// orderDetail.setAutomod(foods.getAutomod());
orderDetail.setIsfood(orderDetailsBean.getType() == FOOD_TYPE ? true : false);
orderDetail.setIsfood(orderDetailsBean.getType() == FOOD_TYPE);
orderDetail.setNew(false);
orderDetail.setType(orderDetailsBean.getType());
orderDetail.setItemType(getItemType(orderDetailsBean, parentOrderDetail));
......
......@@ -6,6 +6,8 @@ import com.elvishew.xlog.XLog;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import static java.math.BigDecimal.ROUND_HALF_UP;
/**
* Created by Administrator on 2018/9/10 0010.
*/
......@@ -13,7 +15,7 @@ import java.text.DecimalFormat;
public class MoneyUtil {
// 總金額小數位
public static int rounding,RoundingDecimal;
public static int rounding, RoundingDecimal;
// (直接截取) : 食品 細項 折扣 會員折扣 合計 服務費
public static int ItemDecimals;
......@@ -245,7 +247,7 @@ public class MoneyUtil {
}
public static double getDecimalMoney(double money, int decimal) {
return new BigDecimal(String.valueOf(money)).setScale(decimal, BigDecimal.ROUND_HALF_UP).doubleValue();
return new BigDecimal(String.valueOf(money)).setScale(decimal, ROUND_HALF_UP).doubleValue();
}
/**
......@@ -259,7 +261,7 @@ public class MoneyUtil {
public static double priceCalculation(double price, int number) {
BigDecimal b1 = new BigDecimal(price);
BigDecimal b2 = new BigDecimal(number);
return (b1.multiply(b2)).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
return (b1.multiply(b2)).setScale(1, ROUND_HALF_UP).doubleValue();
}
/**
......@@ -303,6 +305,59 @@ public class MoneyUtil {
}
/**
* 計算除 保留兩位小數,四捨五入
*
* @param v1
* @param v2
* @return
*/
public static BigDecimal divide(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2, 2, ROUND_HALF_UP);
}
/**
* 計算除
* @param v1
* @param v2
* @param scale 保留幾位小數
* @param RoundingMode ROUND_HALF_UP為四捨五入
* @return
*/
public static float divide(double v1, double v2, int scale, int RoundingMode) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2, scale, RoundingMode).floatValue();
}
/**
* 計算除
* @param v1
* @param v2
* @param scale 保留幾位小數
* @return
*/
public static float divide(double v1, double v2, int scale) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2, scale, ROUND_HALF_UP).floatValue();
}
/**
* 計算差
*
* @param v1
* @param v2
* @return
*/
public static int sub(int v1, int v2) {
BigDecimal b1 = new BigDecimal(String.valueOf(v1));
BigDecimal b2 = new BigDecimal(String.valueOf(v2));
return b1.subtract(b2).intValue();
}
/**
* 食品总价保留两位
*
* @param totalPrice
......@@ -310,6 +365,6 @@ public class MoneyUtil {
*/
public static double totalFoodPrice(double totalPrice) {
BigDecimal b = new BigDecimal(totalPrice);
return b.setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
return b.setScale(1, ROUND_HALF_UP).doubleValue();
}
}
package com.gingersoft.gsa.cloud.base.utils;
import android.view.View;
public class PrintTransitUtils {
static PrintTransitUtils printTransitUtils;
/**
* 用於打印的view
*/
private View printView;
public static PrintTransitUtils getInstance() {
if (printTransitUtils == null) {
printTransitUtils = new PrintTransitUtils();
}
return printTransitUtils;
}
public View getPrintView() {
return printView;
}
public void setPrintView(View printView) {
this.printView = printView;
}
}
......@@ -12,4 +12,7 @@ public class HttpsConstans {
public static String ROOT_SERVER_ADDRESS_FORMAL2 = "http://gingersoft.tpddns.cn:53000/mock/49/ricepon-cloud-gsa/api/";//測試服務器
public static String ROOT_SETTLEMENT_REPORT_SERVER_ADDRESS_FORMAL = "http://a.ricepon.com:58201/";//清機接口地址
public static String REPORT_SERVER_ADDRESS = "http://a.ricepon.com:58201/ricepon-report/api/";//報表地址
public static String WECHAR_REPORT_SERVER_ADDRESS = "http://a.ricepon.com:61177/member-web/api/";//微信公眾號報表地址:首頁曲線圖數據,支付分析報表數據
}
......@@ -28,6 +28,11 @@ public class SPUtils {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
if(object == null) {
editor.remove(key);
SharedPreferencesCompat.apply(editor);
return;
}
if (object instanceof String) {
editor.putString(key, (String) object);
} else if (object instanceof Integer) {
......
......@@ -22,9 +22,9 @@ public class PrinterDeviceBean implements Serializable {
private Long dbid;
private Integer restaurantId;
private String ip;
private Integer port;
private int type;
private String ip;//ip
private Integer port;//端口
private int type;//打印機紙張類型 為1時是58mm,否則是88mm
@Generated(hash = 626885316)
public PrinterDeviceBean() {
......
......@@ -38,17 +38,21 @@ public class MyGlobalHttpHandler implements GlobalHttpHandler {
token = Aes.aesEncrypt("9_" + memberId + "_" + System.currentTimeMillis() + "_" + loginToken);
token = token.replaceAll("\r|\n", "");
}
// String token = "e64a3959460141a4996d92ab07b0e14b";
Headers.Builder builder = new Headers.Builder();
builder.set("mobileVersion", android.os.Build.VERSION.RELEASE);//set表示name1是唯一的,会覆盖掉已经存在的,add不会覆盖已经存在的头,可以存在多个
builder.set("mobielModel", android.os.Build.MODEL);
builder.set("apptype", AppConstans.APP_TYPE);
builder.set("appinfo", AppUtils.getVerName(GsaCloudApplication.getAppContext()));
builder.set("mobileId", "1");
Headers headers = request.headers();
if (headers != null) {
for (int i = 0; i < headers.size(); i++) {
builder.set(headers.name(i), headers.value(i));
}
}
if (GsaCloudApplication.isLogin)
builder.set("token", token);
builder.set("Domain-Name", "common");
// builder.set("Domain-Name", "common");
return chain.request().newBuilder()
.headers(builder.build())
......
......@@ -28,6 +28,6 @@ public class MyOkhttpConfiguration implements ClientModule.OkhttpConfiguration {
//使用一行代码监听 Retrofit/Okhttp 上传下载进度监听,以及 Glide 加载进度监听 详细使用方法查看 https://github.com/JessYanCoding/ProgressManager
ProgressManager.getInstance().with(builder);
//让 Retrofit 同时支持多个 BaseUrl 以及动态改变 BaseUrl. 详细使用请方法查看 https://github.com/JessYanCoding/RetrofitUrlManager
RetrofitUrlManager.getInstance().with(builder);
RetrofitUrlManager.getInstance().with(builder).build();
}
}
package com.gingersoft.gsa.cloud.ui.adapter;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
import java.util.List;
/**
* Created by Wyh on 2020/2/24.
*/
......@@ -34,4 +34,5 @@ public class TabFragmentAdapter extends FragmentStatePagerAdapter {
public int getCount() {
return mFragments == null ? 0 : mFragments.size();
}
}
package com.gingersoft.gsa.cloud.ui.view;
import android.content.Context;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.viewpager.widget.ViewPager;
import com.gingersoft.gsa.cloud.base.R;
import com.google.android.material.tabs.TabLayout;
import java.util.List;
import java.util.Objects;
public class MyTableView extends TabLayout {
private List<String> titles;
public MyTableView(@NonNull Context context) {
super(context);
}
public MyTableView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public MyTableView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public MyTableView setTitles(List<String> titles) {
this.titles = titles;
return this;
}
@Override
public void setupWithViewPager(@Nullable ViewPager viewPager) {
super.setupWithViewPager(viewPager);
// setTabsFromPagerAdapter(viewPager);//TabLayout的标签从Adapter中获取
//用来循环适配器中的视图总数
for (int i = 0; i < (titles != null ? titles.size() : 0); i++) {
//获取每一个tab对象
TabLayout.Tab tabAt = getTabAt(i);
if (tabAt != null) {
//将每一个条目设置我们自定义的视图
tabAt.setCustomView(R.layout.layout_table_item);
//默认选中第一个
if (i == 0) {
// 设置第一个tab的TextView是被选择的样式
setSelectTab(tabAt, true);
}
//通过tab对象找到自定义视图的ID
TextView textView = Objects.requireNonNull(tabAt.getCustomView()).findViewById(R.id.tv_tab);
textView.setText(titles.get(i));//设置tab上的文字
}
}
addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
setSelectTab(tab, true);
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
setSelectTab(tab, false);
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
private void setSelectTab(TabLayout.Tab tabAt, boolean isSelected) {
if (tabAt.getCustomView() != null) {
TextView tab = tabAt.getCustomView().findViewById(R.id.tv_tab);//第一个tab被选中
tab.setSelected(isSelected);
//设置选中标签的文字大小
tab.setTextSize(TypedValue.COMPLEX_UNIT_PX, isSelected ? getResources().getDimensionPixelSize(R.dimen.sp_16) : getResources().getDimensionPixelSize(R.dimen.sp_14));
tab.getPaint().setFakeBoldText(isSelected);
}
}
}
......@@ -458,7 +458,6 @@ public class PagerSlidingTabStrip extends HorizontalScrollView {
}
}
// Log.e("....>",""+width);
// 设置底部横线与文字宽度一致
if (indicatorinFollower) {
canvas.drawRect(lineLeft + (lineRight - lineLeft - width) / 2, height - indicatorHeight, lineLeft + width + (lineRight - lineLeft - width) / 2, height, rectPaint);
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="@dimen/dp_8" />
<stroke
android:width="@dimen/dp_1"
android:color="@color/theme_color" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:id="@+id/item_kitchen_print_layout"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
......
......@@ -18,6 +18,8 @@
<!-- 头部标题 -->
<dimen name="head_height">48dp</dimen>
<dimen name="tabIndicator_height">@dimen/dp_42</dimen>
<dimen name="head_margin">20dp</dimen>
<dimen name="head_size">16sp</dimen>
......
......@@ -274,7 +274,7 @@
<style name="Print_large_text_style">
<item name="android:textColor">@color/theme_333_color</item>
<item name="android:textSize">@dimen/sp_48</item>
<item name="android:textSize">@dimen/sp_24</item>
</style>
<style name="report_food_ranking">
......
......@@ -9,6 +9,7 @@
android:label="@string/table_app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:networkSecurityConfig="@xml/network_android"
android:theme="@style/AppTheme.Base">
<activity android:name=".mvp.ui.activity.orderManager.OrderDetailActivity"/>
<activity android:name=".mvp.ui.activity.orderManager.OrderCenterActivity" />
......
......@@ -41,7 +41,7 @@ public class OrderDetailFoodAdapter extends BaseQuickAdapter<OrderDetail, BaseVi
break;
}
tv_food_name.setText(productName);
helper.setText(R.id.tv_food_number, item.getNumber());
helper.setText(R.id.tv_food_number, String.valueOf(item.getNumber()));
helper.setText(R.id.tv_food_total, "$" + item.getPrice() * item.getNumber());
}
......
......@@ -20,7 +20,7 @@ public class OrderDetailPayMethodAdapter extends BaseQuickAdapter<OrderDetail, B
@Override
protected void convert(BaseViewHolder helper, OrderDetail item) {
helper.setText(R.id.tv_name, item.getNumber());
helper.setText(R.id.tv_name, String.valueOf(item.getNumber()));
helper.setText(R.id.tv_money, "$" + item.getPrice() * item.getNumber());
}
......
......@@ -15,10 +15,10 @@
<application
android:name="com.gingersoft.gsa.cloud.base.application.GsaCloudApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_logo"
android:icon="@mipmap/ic_launcher"
android:label="@string/user_login_name"
android:networkSecurityConfig="@xml/network_android"
android:roundIcon="@mipmap/ic_logo"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:replace="android:label">
......
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="user_login_colorPrimary">#3F51B5</color>
<color name="user_login_colorPrimaryDark">#303F9F</color>
<color name="user_login_colorAccent">#FF4081</color>
</resources>
<resources>
<!-- Base application theme. -->
<style name="user_login_AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/user_login_colorPrimary</item>
<item name="colorPrimaryDark">@color/user_login_colorPrimaryDark</item>
<item name="colorAccent">@color/user_login_colorAccent</item>
</style>
</resources>
......@@ -6,6 +6,10 @@ import android.widget.Button;
import android.widget.RadioButton;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.utils.constans.HttpsConstans;
import com.gingersoft.gsa.cloud.user.login.R;
import com.gingersoft.gsa.cloud.user.login.R2;
......@@ -16,8 +20,6 @@ import com.jess.arms.base.BaseActivity;
import com.jess.arms.di.component.AppComponent;
import com.jess.arms.utils.ArmsUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import butterknife.BindView;
import static com.jess.arms.utils.Preconditions.checkNotNull;
......@@ -79,6 +81,7 @@ public class SwitchServerActivity extends BaseActivity<SwitchServerPresenter> im
} else {
HttpsConstans.ROOT_SERVER_ADDRESS_FORMAL = HttpsConstans.ROOT_SERVER_ADDRESS_FORMAL_HK;
}
GsaCloudApplication.setGlobalDomain();
finish();
startActivity(new Intent(mContext, LoginActivity.class));
});
......
......@@ -4,11 +4,12 @@ import android.content.Intent;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.ScaleAnimation;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout;
import com.gingersoft.gsa.cloud.base.utils.constans.UserConstans;
import com.gingersoft.gsa.cloud.base.utils.crash.AppCrashHandler;
import com.gingersoft.gsa.cloud.base.utils.encryption.Aes;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.ui.bean.mode.LoginBean;
......@@ -21,7 +22,9 @@ import com.gingersoft.gsa.cloud.user.login.mvp.contract.WelcomeContract;
import com.gingersoft.gsa.cloud.user.login.mvp.presenter.WelcomePresenter;
import com.jess.arms.di.component.AppComponent;
import com.jess.arms.utils.ArmsUtils;
import java.util.List;
import butterknife.BindView;
import static com.jess.arms.utils.Preconditions.checkNotNull;
......@@ -65,7 +68,7 @@ public class WelcomeActivity extends LoginInterfaceImpl<WelcomePresenter> implem
//自動登陸
String pwd = Aes.aesDecrypt((String) SPUtils.get(mContext, UserConstans.LOGIN_PASSWORD, ""));
mPresenter.login(SPUtils.get(mContext, UserConstans.LOGIN_USERNAME, "") + "", pwd);
} else{
} else {
startActivity(new Intent(mContext, LoginActivity.class));
}
}
......
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<background android:drawable="@mipmap/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<background android:drawable="@mipmap/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>
\ No newline at end of file

2.89 KB | W: | H:

5.01 KB | W: | H:

user-login/src/main/res/mipmap-hdpi/ic_launcher.png
user-login/src/main/res/mipmap-hdpi/ic_launcher.png
user-login/src/main/res/mipmap-hdpi/ic_launcher.png
user-login/src/main/res/mipmap-hdpi/ic_launcher.png
  • 2-up
  • Swipe
  • Onion skin

4.79 KB | W: | H:

6.4 KB | W: | H:

user-login/src/main/res/mipmap-hdpi/ic_launcher_round.png
user-login/src/main/res/mipmap-hdpi/ic_launcher_round.png
user-login/src/main/res/mipmap-hdpi/ic_launcher_round.png
user-login/src/main/res/mipmap-hdpi/ic_launcher_round.png
  • 2-up
  • Swipe
  • Onion skin

2.01 KB | W: | H:

3.02 KB | W: | H:

user-login/src/main/res/mipmap-mdpi/ic_launcher.png
user-login/src/main/res/mipmap-mdpi/ic_launcher.png
user-login/src/main/res/mipmap-mdpi/ic_launcher.png
user-login/src/main/res/mipmap-mdpi/ic_launcher.png
  • 2-up
  • Swipe
  • Onion skin

2.72 KB | W: | H:

3.67 KB | W: | H:

user-login/src/main/res/mipmap-mdpi/ic_launcher_round.png
user-login/src/main/res/mipmap-mdpi/ic_launcher_round.png
user-login/src/main/res/mipmap-mdpi/ic_launcher_round.png
user-login/src/main/res/mipmap-mdpi/ic_launcher_round.png
  • 2-up
  • Swipe
  • Onion skin

4.38 KB | W: | H:

7.32 KB | W: | H:

user-login/src/main/res/mipmap-xhdpi/ic_launcher.png
user-login/src/main/res/mipmap-xhdpi/ic_launcher.png
user-login/src/main/res/mipmap-xhdpi/ic_launcher.png
user-login/src/main/res/mipmap-xhdpi/ic_launcher.png
  • 2-up
  • Swipe
  • Onion skin

6.73 KB | W: | H:

9.51 KB | W: | H:

user-login/src/main/res/mipmap-xhdpi/ic_launcher_round.png
user-login/src/main/res/mipmap-xhdpi/ic_launcher_round.png
user-login/src/main/res/mipmap-xhdpi/ic_launcher_round.png
user-login/src/main/res/mipmap-xhdpi/ic_launcher_round.png
  • 2-up
  • Swipe
  • Onion skin

6.24 KB | W: | H:

12 KB | W: | H:

user-login/src/main/res/mipmap-xxhdpi/ic_launcher.png
user-login/src/main/res/mipmap-xxhdpi/ic_launcher.png
user-login/src/main/res/mipmap-xxhdpi/ic_launcher.png
user-login/src/main/res/mipmap-xxhdpi/ic_launcher.png
  • 2-up
  • Swipe
  • Onion skin

10.2 KB | W: | H:

15.7 KB | W: | H:

user-login/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
user-login/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
user-login/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
user-login/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
  • 2-up
  • Swipe
  • Onion skin

8.91 KB | W: | H:

16.6 KB | W: | H:

user-login/src/main/res/mipmap-xxxhdpi/ic_launcher.png
user-login/src/main/res/mipmap-xxxhdpi/ic_launcher.png
user-login/src/main/res/mipmap-xxxhdpi/ic_launcher.png
user-login/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  • 2-up
  • Swipe
  • Onion skin

14.8 KB | W: | H:

22.3 KB | W: | H:

user-login/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
user-login/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
user-login/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
user-login/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
  • 2-up
  • Swipe
  • Onion skin
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="user_login_title_color">@color/theme_333_color</color>
<color name="user_login_edit_color">@color/theme_hint_color</color>
</resources>
......@@ -2,5 +2,4 @@
<string name="user_login_name" translatable="false">GSA-Cloud</string>
<string name="user_login_welcome_login" translatable="false">歡迎登陸商戶端</string>
</resources>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment