Commit c4e6855d by 宁斌

1、統一網絡請求頭HeadersInterceptor 2、加入美團日誌框架logan對(網絡請求,頁面生命週期)進行埋點 3、增加user狀態管理類

parent f99df214
......@@ -152,10 +152,10 @@ dependencies {
//底部功能導航view
api 'com.github.ittianyu:BottomNavigationViewEx:2.0.4'
//滴滴開源 哆啦A夢:辅助开发工具、测试效率工具、视觉辅助工具
// debugImplementation rootProject.ext.dependencies["doraemonkit"]
debugImplementation 'com.didichuxing.doraemonkit:dokitx:3.3.3'
releaseImplementation 'com.didichuxing.doraemonkit:dokitx-no-op:3.3.3'
//美團金剛狼日誌框架
api rootProject.ext.dependencies['logan']
//RecyclerView 流式佈局layoutManager
api 'com.google.android:flexbox:1.0.0'
......@@ -172,7 +172,6 @@ dependencies {
api 'androidx.core:core-ktx:+'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
api 'com.github.huangyanbin:SmartTable:2.2.0'
// api rootProject.ext.dependencies['logan']
}
repositories {
......
package com.gingersoft.gsa.cloud.account.restaurant;
import lombok.Data;
/**
* @author : bin
* @create date: 2020-11-21
* @update date: 2020-11-21
* @description:
*/
@Data
public class BrandInfo {
private int brandId;
private String brandName;
}
package com.gingersoft.gsa.cloud.account.restaurant;
import lombok.Data;
/**
* @author : bin
* @create date: 2020-11-21
* @update date: 2020-11-21
* @description:
*/
@Data
public class RestaurantInfo {
private int restaurantId;
private String restaurantName;
private String gsPosShopId;
}
package com.gingersoft.gsa.cloud.account.restaurant;
import com.gingersoft.gsa.cloud.account.user.UserConstans;
import com.gingersoft.gsa.cloud.account.user.info.UserInfo;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import lombok.Data;
/**
* @author : bin
* @create date: 2020-11-21
* @update date: 2020-11-21
* @description:
*/
@Data
public class ResturantInfoManager {
private static ResturantInfoManager resturantInfoManager = null;
/**
* 品牌信息
*/
private BrandInfo brandInfo;
/**
* 餐廳信息
*/
private RestaurantInfo restaurantInfo;
private ResturantInfoManager() {
}
public static ResturantInfoManager getInstance() {
if (resturantInfoManager == null) {
synchronized (ResturantInfoManager.class) {
if (resturantInfoManager == null) {
resturantInfoManager = new ResturantInfoManager();
}
}
}
return resturantInfoManager;
}
public void setResturantInfoToLocation(RestaurantInfo info) {
// SPUtils.put(UserConstans.restaurantId, info);
// SPUtils.put(UserConstans.restaurantId, info.ge);
// SPUtils.put(UserConstans.restaurantId, restaurantId);
}
}
package com.gingersoft.gsa.cloud.constans;
package com.gingersoft.gsa.cloud.account.user;
/**
* Created by Wyh on 2019/12/21.
*/
public class UserConstans {
public interface UserConstans {
public final static String LOGIN_USERNAME = "login_account";
public final static String LOGIN_PASSWORD = "login_password";
public final static String AUTO_LOGIN = "auto_login";
public final static String IS_GUIDE = "is_guide";
public static String memberId = "member_id";
public static String memberName = "member_name";
......@@ -24,6 +23,4 @@ public class UserConstans {
/**當前賬號下所有餐檯品牌Json*/
public static String brandRestaurantInfos = "brand_restaurant_infos";
//平闆登录状态
public static String FLATBED_LOGIN_STATUS = "flatbed_login_status";
}
package com.gingersoft.gsa.cloud.account.user;
import com.gingersoft.gsa.cloud.account.user.info.UserInfo;
import com.gingersoft.gsa.cloud.account.user.state.UserState;
import lombok.Getter;
import lombok.Setter;
/**
* @author : bin
* @create date: 2020-11-21
* @update date: 2020-11-21
* @description:用戶信息管理:如用戶登錄狀態,用戶信息等。。
*/
@Getter
@Setter
public class UserContextManger {
private static UserContextManger userContextManger = null;
/**
* 用戶狀態
*/
private UserState state;
/**
* 用戶信息
*/
private UserInfo info;
private UserContextManger() {
}
public static UserContextManger getInstance() {
if (userContextManger == null) {
synchronized (UserContextManger.class) {
if (userContextManger == null) {
userContextManger = new UserContextManger();
}
}
}
return userContextManger;
}
}
package com.gingersoft.gsa.cloud.account.user.info;
import java.util.Date;
import lombok.Data;
/**
* @author : bin
* @create date: 2020-11-21
* @update date: 2020-11-21
* @description:
*/
@Data
public class UserInfo {
private Integer userId;
private String userName;
private Integer groupId;
private Integer parentId;
private Integer merchantsId;
private String mobile;
private String email;
private byte status;
private Date createTime;
private String createBy;
private Date updateTime;
private String updateBy;
private String token;
}
package com.gingersoft.gsa.cloud.account.user.info;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.account.user.UserConstans;
/**
* @author : bin
* @create date: 2020-11-21
* @update date: 2020-11-21
* @description:
*/
public class UserInfoManger {
private static UserInfoManger userInfoManger = null;
private UserInfoManger() {
}
public static UserInfoManger getInstance() {
if (userInfoManger == null) {
synchronized (UserInfoManger.class) {
if (userInfoManger == null) {
userInfoManger = new UserInfoManger();
}
}
}
return userInfoManger;
}
public void setUserInfoToLocation(UserInfo info) {
SPUtils.put(UserConstans.token, info.getUserName());
SPUtils.put(UserConstans.memberId, info.getUserName());
SPUtils.put(UserConstans.memberName, info.getUserName());
}
public static String getLoginToken() {
return (String) SPUtils.get(UserConstans.token, "");
}
public static int getMemberId() {
return (int) SPUtils.get(UserConstans.memberId, 0);
}
public static String getMemberName() {
return (String) SPUtils.get(UserConstans.memberName, "");
}
}
package com.gingersoft.gsa.cloud.account.user.state;
import com.billy.cc.core.component.CC;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.constans.PrintConstans;
import com.gingersoft.gsa.cloud.account.user.UserConstans;
/**
* @author : bin
* @create date: 2020-11-21
* @update date: 2020-11-21
* @description:用戶已登錄
*/
public class HasLoginState implements UserState{
@Override
public void toLoginPage() {
}
@Override
public void logOut() {
SPUtils.remove(UserConstans.token);
SPUtils.remove(UserConstans.memberId);
SPUtils.remove(UserConstans.brandId);
SPUtils.remove(UserConstans.brandName);
SPUtils.remove(UserConstans.restaurantId);
SPUtils.remove(UserConstans.restaurantName);
SPUtils.remove(UserConstans.memberName);
SPUtils.remove(UserConstans.brandRestaurantInfos);
SPUtils.remove(UserConstans.gsPosShopId);
SPUtils.put(PrintConstans.IS_LOGIN, false);
//关闭Prj打印服務
CC.obtainBuilder("Component.Print")
.setActionName("stopPrintService")
.build()
.call();
//跳轉登陸頁面
CC.obtainBuilder("User.Component.Login")
.setActionName("showActivityA")
.build()
.call();
}
@Override
public void toTargetPage() {
}
}
package com.gingersoft.gsa.cloud.account.user.state;
import com.billy.cc.core.component.CC;
/**
* @author : bin
* @create date: 2020-11-21
* @update date: 2020-11-21
* @description:用戶未登錄
*/
public class NotLoginState implements UserState{
@Override
public void toLoginPage() {
//跳轉登錄頁面
CC.obtainBuilder("User.Component.Login")
.setActionName("showActivityA")
.build()
.call();
}
@Override
public void logOut() {
}
@Override
public void toTargetPage() {
}
}
package com.gingersoft.gsa.cloud.account.user.state;
/**
* @author : bin
* @create date: 2020-11-21
* @update date: 2020-11-21
* @description: 已登錄 未登錄
* */
public interface UserState {
/**
* 跳轉到登錄頁面
*/
void toLoginPage();
/**
* 登出
*/
void logOut();
/**
* 跳轉到目標也
*/
void toTargetPage();
}
......@@ -9,6 +9,7 @@ import android.os.Build;
import android.os.RemoteException;
import androidx.annotation.NonNull;
import com.billy.cc.core.component.CC;
import com.dianping.logan.Logan;
import com.didichuxing.doraemonkit.DoraemonKit;
import com.elvishew.xlog.LogConfiguration;
import com.elvishew.xlog.LogLevel;
......@@ -31,8 +32,9 @@ import com.gingersoft.gsa.cloud.base.utils.xlog.MyBackupStrategy;
import com.gingersoft.gsa.cloud.config.DoraemonKitConfig;
import com.gingersoft.gsa.cloud.constans.HttpsConstans;
import com.gingersoft.gsa.cloud.constans.PrintConstans;
import com.gingersoft.gsa.cloud.constans.UserConstans;
import com.gingersoft.gsa.cloud.account.user.UserConstans;
import com.gingersoft.gsa.cloud.database.DaoManager;
import com.gingersoft.gsa.cloud.config.LoganConfig;
import com.gingersoft.gsa.cloud.ui.loadsir.CustomCallback;
import com.gingersoft.gsa.cloud.ui.loadsir.EmptyCallback;
import com.gingersoft.gsa.cloud.ui.loadsir.ErrorCallback;
......@@ -46,8 +48,7 @@ import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.footer.ClassicsFooter;
import com.scwang.smartrefresh.layout.header.ClassicsHeader;
import java.util.ArrayList;
import java.util.List;
import java.io.File;
import java.util.Locale;
import me.jessyan.autosize.AutoSize;
import me.jessyan.autosize.AutoSizeConfig;
......@@ -74,14 +75,6 @@ public class GsaCloudApplication extends BaseApplication {
* 是否開啟皮膚切換
*/
public static boolean openSkinMake = false;
/**
* okhttp连接超时20秒
*/
public static int CONNECT_TIMEOUT = 20;
/**
* okhttp读写超时20秒
*/
public static int REQUEST_TIMEOUT = 20;
public static boolean isLogin = false;
public static String userName = "";
......@@ -133,6 +126,7 @@ public class GsaCloudApplication extends BaseApplication {
initPrint();
//初始化日誌管理庫
initXLog();
initLogan();
//初始化crash記錄
AppCrashHandler.getInstance().init(this);
......@@ -141,22 +135,25 @@ public class GsaCloudApplication extends BaseApplication {
//上傳餐廳擴展信息
ExpandInfoSetting.initUpdateExtendedConfiguration(uiStyleConfiguration, functionConfiguration);
// 设定一些通用的属性,这些属性在每次统计事件中都会附带
// 注意:如果此处的属性名与内置属性的名称相同,则内置属性会被覆盖
// Tracker.INSTANCE.addProperty("附加的属性1", "附加的属性1");
// Tracker.INSTANCE.addProperty("附加的属性2", "附加的属性2");
// // 设定上报数据的主机和接口
// // 注意:该方法一定要在Tracker.initialize()方法前调用
// // 否则会由于上报地址未初始化,在触发启动事件时导致崩溃
// Tracker.INSTANCE.setService("host", "path");
// // 设定上报数据的项目名称
// Tracker.INSTANCE.setProjectName("項目名");
// // 设定上报数据的模式
// Tracker.INSTANCE.setMode(TrackerMode.DEBUG_ONLY);
// // 初始化AndroidTracker
// Tracker.INSTANCE.initialize(this);
}
/**
* 初始化美團日誌框架
*/
private void initLogan() {
com.dianping.logan.LoganConfig config = new com.dianping.logan.LoganConfig.Builder()
.setCachePath(getApplicationContext().getFilesDir().getAbsolutePath())
.setPath(getApplicationContext().getExternalFilesDir(null).getAbsolutePath()
+ File.separator + LoganConfig.FILE_NAME)
.setEncryptKey16(LoganConfig.EncryptKey16.getBytes())
.setEncryptIV16(LoganConfig.EncryptIV16.getBytes())
.build();
Logan.init(config);
}
/**
* 初始化滴滴開發,測試輔助工具哆啦A夢
*/
private void initDoraemonKit() {
DoraemonKit.install(getAppContext(), DoraemonKitConfig.PRODUCE_ID);
}
......
......@@ -190,6 +190,9 @@ public class MemberInfo implements Serializable {
private MemberExpireDateBean memberExpireDate;
private VaildTimeBean vaildTime;
public String getLevelName(){
if(!TextUtils.isEmpty(levelName1)) {
return levelName1;
......@@ -213,8 +216,6 @@ public class MemberInfo implements Serializable {
return 0;
}
@Data
public static class CreateTimeBean implements Serializable{
/**
......@@ -374,8 +375,11 @@ public class MemberInfo implements Serializable {
}
public String getMemberName() {
if(!TextUtils.isEmpty(memberName)){
return memberName;
}
return getLevelName();
}
public void setMemberName(String memberName) {
this.memberName = memberName;
......
......@@ -19,6 +19,7 @@ import com.gingersoft.gsa.cloud.base.utils.JsonUtils;
import com.gingersoft.gsa.cloud.base.utils.log.LogUtil;
import com.gingersoft.gsa.cloud.base.utils.okhttpUtils.OkHttp3Utils;
import com.gingersoft.gsa.cloud.constans.HttpsConstans;
import com.gingersoft.gsa.cloud.logan.LoganUtils;
import com.jess.arms.di.component.AppComponent;
import com.jess.arms.utils.ArmsUtils;
import com.jess.arms.utils.DeviceUtils;
......@@ -212,7 +213,8 @@ public class AppCrashHandler implements UncaughtExceptionHandler {
// 把上面获取的堆栈信息转为字符串,打印出来
String stacktrace = result.toString();
printWriter.close();
LogUtil.d(TAG, stacktrace);
LoganUtils.w_crash("AppCrashHandler: "+stacktrace);
//保存错误报告到文件
saveCrashInfo2File(ex);
......
......@@ -13,7 +13,7 @@ public class LogUtil {
//可以全局控制是否打印log日志
private static boolean isPrintLog = true;
private static int LOG_MAXLENGTH = 10000;
private static int LOG_MAXLENGTH = 6000;
private final static String TAG = "LogUtil";
public static void v(String msg) {
......
......@@ -3,6 +3,8 @@ package com.gingersoft.gsa.cloud.base.utils.okhttpUtils;
import com.gingersoft.gsa.cloud.app.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.utils.encryption.Aes;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.config.OkHttpConfig;
import com.gingersoft.gsa.cloud.config.globalconfig.applyOptions.intercept.HeadersInterceptor;
import com.gingersoft.gsa.cloud.config.globalconfig.applyOptions.intercept.LoggingInterceptor;
import com.gingersoft.gsa.cloud.constans.AppConstans;
import com.gingersoft.gsa.cloud.constans.HttpsConstans;
......@@ -43,9 +45,9 @@ public class OkHttp3Utils {
synchronized (OkHttp3Utils.class) {
if (mOkHttpClient == null) {
mOkHttpClient = new OkHttpClient.Builder()
.connectTimeout(GsaCloudApplication.REQUEST_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(GsaCloudApplication.REQUEST_TIMEOUT, TimeUnit.SECONDS)
.addInterceptor(new UserAgentIntercepter())
.connectTimeout(OkHttpConfig.REQUEST_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(OkHttpConfig.REQUEST_TIMEOUT, TimeUnit.SECONDS)
.addInterceptor(new HeadersInterceptor())
.addInterceptor(new LoggingInterceptor())
.build();
......@@ -216,36 +218,36 @@ public class OkHttp3Utils {
/**
* 添加请求头
*/
public static class UserAgentIntercepter implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Headers headers = request.headers();
Headers.Builder builder = new Headers.Builder();
for (int i = 0; i < headers.size(); i++) {
builder.set(headers.name(i), headers.value(i));
}
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", DeviceUtils.getVersionName(GsaCloudApplication.getAppContext()));
builder.set("mobileId", "1");
if (GsaCloudApplication.isLogin) {
String token;
int memberId = GsaCloudApplication.getMemberId();
String loginToken = GsaCloudApplication.getLoginToken();
token = Aes.aesEncrypt("9_" + memberId + "_" + System.currentTimeMillis() + "_" + loginToken);
token = token.replaceAll("\r|\n", "");
builder.set("token", token);
}
Request request1 = chain.request().newBuilder().headers(builder.build()).build();
return chain.proceed(request1);
}
}
// public static class UserAgentIntercepter implements Interceptor {
//
// @Override
// public Response intercept(Chain chain) throws IOException {
// Request request = chain.request();
// Headers headers = request.headers();
//
// Headers.Builder builder = new Headers.Builder();
// for (int i = 0; i < headers.size(); i++) {
// builder.set(headers.name(i), headers.value(i));
// }
//
// 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", DeviceUtils.getVersionName(GsaCloudApplication.getAppContext()));
// builder.set("mobileId", "1");
//
// if (GsaCloudApplication.isLogin) {
// String token;
// int memberId = GsaCloudApplication.getMemberId();
// String loginToken = GsaCloudApplication.getLoginToken();
// token = Aes.aesEncrypt("9_" + memberId + "_" + System.currentTimeMillis() + "_" + loginToken);
// token = token.replaceAll("\r|\n", "");
// builder.set("token", token);
// }
// Request request1 = chain.request().newBuilder().headers(builder.build()).build();
// return chain.proceed(request1);
// }
// }request1
/**
......
package com.gingersoft.gsa.cloud.config;
/**
* @author : bin
* @create date: 2020-11-05
* @update date: 2020-11-05
* @description:
*/
public class LogInfoConfig {
}
package com.gingersoft.gsa.cloud.config;
/**
* @author : bin
* @create date: 2020-11-05
* @update date: 2020-11-05
* @description:美團日誌框架配置
*/
public class LoganConfig {
public static final String FILE_NAME = "logan_v1";
public static final String EncryptKey16 = "0123456789012345";
public static final String EncryptIV16 = "0123456789012345";
public static final String APP_ID = "gingersoft1008611";
public static final String UPLOAD_LOG_URL = "http://192.168.1.113:8080/logan-web/logan/upload.json";
/**
* 代码日志
*/
public static final byte CODE_LEVLE = 1;
/**
* 網絡日誌
*/
public static final byte NETWORK_LEVLE = 2;
/**
* 用戶行為日誌(頁面跳轉,交互,觸摸反饋等)
*/
public static final byte ACTION_LEVLE = 3;
/**
* 崩潰日誌
*/
public static final byte CRASH_LEVLE = 4;
/**
* H5日誌
*/
public static final byte H5_LEVLE = 5;
/**
* native日誌
*/
public static final byte native_LEVLE = 6;
}
package com.gingersoft.gsa.cloud.config;
/**
* @author : bin
* @create date: 2020-11-21
* @update date: 2020-11-21
* @description:
*/
public class OkHttpConfig {
/**
* okhttp连接超时20秒
*/
public static final byte CONNECT_TIMEOUT = 20;
/**
* okhttp读写超时20秒
*/
public static final byte REQUEST_TIMEOUT = 20;
}
......@@ -10,6 +10,7 @@ import com.gingersoft.gsa.cloud.config.globalconfig.applyOptions.MyRetrofitConfi
import com.gingersoft.gsa.cloud.config.globalconfig.applyOptions.MyRxCacheConfiguration;
import com.gingersoft.gsa.cloud.config.globalconfig.lifecyclesOptioins.MyActivityLifecycle;
import com.gingersoft.gsa.cloud.config.globalconfig.lifecyclesOptioins.MyAppLifecycles;
import com.gingersoft.gsa.cloud.config.globalconfig.lifecyclesOptioins.MyFragmentLifecycle;
import com.gingersoft.gsa.cloud.constans.HttpsConstans;
import com.jess.arms.base.delegate.AppLifecycles;
import com.jess.arms.di.module.GlobalConfigModule;
......@@ -55,6 +56,7 @@ public class GlobalConfiguration implements ConfigModule {
@Override
public void injectFragmentLifecycle(Context context, List<FragmentManager.FragmentLifecycleCallbacks> lifecycles) {
//向Fragment的生命周期中注入一些自定义逻辑
lifecycles.add(new MyFragmentLifecycle());
}
......
......@@ -14,7 +14,6 @@ import okhttp3.Response;
public class MyGlobalHttpHandler implements GlobalHttpHandler {
private final String TAG = this.getClass().getSimpleName();
@Override
public Response onHttpResultResponse(String httpResult, Interceptor.Chain chain, Response response) {
......@@ -25,35 +24,8 @@ public class MyGlobalHttpHandler implements GlobalHttpHandler {
@Override
public Request onHttpRequestBefore(Interceptor.Chain chain, Request request) {
// 统一处理http请求。eg:给request统一添加token或者header以及参数加密等操作
String requestBody = request.toString();
String token = "";
if (GsaCloudApplication.isLogin) {
int memberId = GsaCloudApplication.getMemberId();
String loginToken = GsaCloudApplication.getLoginToken();
token = Aes.aesEncrypt("9_" + memberId + "_" + System.currentTimeMillis() + "_" + loginToken);
token = token.replaceAll("\r|\n", "");
}
Headers.Builder builder = new Headers.Builder();
builder.set("mobileVersion", android.os.Build.VERSION.RELEASE);
builder.set("mobielModel", android.os.Build.MODEL);
builder.set("apptype", AppConstans.APP_TYPE);
builder.set("appinfo", DeviceUtils.getVersionName(GsaCloudApplication.getAppContext()));
builder.set("mobileId", "1");
Headers headers = request.headers();
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");
return chain.request().newBuilder()
.headers(builder.build())
.build();
}
}
......@@ -3,6 +3,7 @@ package com.gingersoft.gsa.cloud.config.globalconfig.applyOptions;
import android.content.Context;
import com.gingersoft.gsa.cloud.app.GsaCloudApplication;
import com.gingersoft.gsa.cloud.config.OkHttpConfig;
import com.jess.arms.di.module.ClientModule;
import java.util.concurrent.TimeUnit;
......@@ -23,9 +24,9 @@ public class MyOkhttpConfiguration implements ClientModule.OkhttpConfiguration {
@Override
public void configOkhttp(Context context, OkHttpClient.Builder builder) {
// builder.sslSocketFactory(); //支持 Https,详情请百度
builder.connectTimeout(GsaCloudApplication.CONNECT_TIMEOUT, TimeUnit.SECONDS);
builder.writeTimeout(GsaCloudApplication.REQUEST_TIMEOUT, TimeUnit.SECONDS);
builder.readTimeout(GsaCloudApplication.REQUEST_TIMEOUT, TimeUnit.SECONDS);
builder.connectTimeout(OkHttpConfig.CONNECT_TIMEOUT, TimeUnit.SECONDS);
builder.writeTimeout(OkHttpConfig.REQUEST_TIMEOUT, TimeUnit.SECONDS);
builder.readTimeout(OkHttpConfig.REQUEST_TIMEOUT, TimeUnit.SECONDS);
//使用一行代码监听 Retrofit/Okhttp 上传下载进度监听,以及 Glide 加载进度监听 详细使用方法查看 https://github.com/JessYanCoding/ProgressManager
ProgressManager.getInstance().with(builder);
//让 Retrofit 同时支持多个 BaseUrl 以及动态改变 BaseUrl. 详细使用请方法查看 https://github.com/JessYanCoding/RetrofitUrlManager
......
......@@ -8,8 +8,8 @@ import android.text.TextUtils;
import com.billy.cc.core.component.CC;
import com.gingersoft.gsa.cloud.base.R;
import com.gingersoft.gsa.cloud.app.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.utils.log.LogUtil;
import com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils;
import com.gingersoft.gsa.cloud.logan.LoganUtils;
import com.google.gson.JsonIOException;
import com.google.gson.JsonParseException;
import com.jess.arms.utils.ArmsUtils;
......@@ -50,7 +50,9 @@ public class MyResponseErrorListener implements ResponseErrorListener {
}
// ArmsUtils.snackbarText(msg);
// LogUtil.d("handleResponseError: " + t.getMessage());
LogUtil.d(TAG, t.getMessage());
LoganUtils.w_network("請求錯誤: "+t.getMessage());
if (!TextUtils.isEmpty(msg)) {
ToastUtils.show(context, msg);
}
......
......@@ -3,8 +3,10 @@ package com.gingersoft.gsa.cloud.config.globalconfig.applyOptions;
import android.content.Context;
import com.gingersoft.gsa.cloud.base.BuildConfig;
import com.gingersoft.gsa.cloud.config.globalconfig.applyOptions.intercept.LoggingInterceptor;
import com.gingersoft.gsa.cloud.config.globalconfig.applyOptions.intercept.HeadersInterceptor;
import com.jess.arms.di.module.ClientModule;
import me.jessyan.retrofiturlmanager.RetrofitUrlManager;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
......@@ -17,7 +19,7 @@ public class MyRetrofitConfiguration implements ClientModule.RetrofitConfigurati
if (BuildConfig.DEBUG) {
clientBuilder.addInterceptor(new LoggingInterceptor());//使用自定义的Log拦截器
}
// clientBuilder.addInterceptor(new UserAgentInterceptor());//使用自定义User-Agent
// builder.client(RetrofitUrlManager.getInstance().with(clientBuilder).build());
clientBuilder.addInterceptor(new HeadersInterceptor());//使用自定义User-Agent
builder.client(RetrofitUrlManager.getInstance().with(clientBuilder).build());
}
}
package com.gingersoft.gsa.cloud.config.globalconfig.applyOptions.intercept;
import com.gingersoft.gsa.cloud.app.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.utils.encryption.Aes;
import com.gingersoft.gsa.cloud.constans.AppConstans;
import com.jess.arms.utils.DeviceUtils;
import java.io.IOException;
import okhttp3.Headers;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
/**
* 添加請求頭信息
*/
public class HeadersInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request originalRequest = chain.request();
Headers.Builder builder = new Headers.Builder();
builder.set("mobileVersion", android.os.Build.VERSION.RELEASE);
builder.set("mobielModel", android.os.Build.MODEL);
builder.set("apptype", AppConstans.APP_TYPE);
builder.set("appinfo", DeviceUtils.getVersionName(GsaCloudApplication.getAppContext()));
builder.set("mobileId", "1");
Headers headers = originalRequest.headers();
for (int i = 0; i < headers.size(); i++) {
builder.set(headers.name(i), headers.value(i));
}
if (GsaCloudApplication.isLogin) {
builder.set("token", getToken());
}
Request requestWithUserAgent = originalRequest.newBuilder()
.headers(builder.build())
.build();
return chain.proceed(requestWithUserAgent);
}
private String getToken() {
String token = "";
if (GsaCloudApplication.isLogin) {
int memberId = GsaCloudApplication.getMemberId();
String loginToken = GsaCloudApplication.getLoginToken();
token = Aes.aesEncrypt("9_" + memberId + "_" + System.currentTimeMillis() + "_" + loginToken);
token = token.replaceAll("\r|\n", "");
}
return token;
}
}
\ No newline at end of file
package com.gingersoft.gsa.cloud.config.globalconfig.applyOptions.intercept;
import com.gingersoft.gsa.cloud.base.utils.log.LogUtil;
import com.gingersoft.gsa.cloud.logan.LoganUtils;
import java.io.IOException;
......@@ -27,11 +27,11 @@ public class LoggingInterceptor implements Interceptor {
sb.append(body.encodedName(i) + "=" + body.encodedValue(i) + ",");
}
sb.delete(sb.length() - 1, sb.length());
LogUtil.d("CSDN_LQR", String.format("發送請求 %s on %s %n%s %nRequestParams:{%s}",
LoganUtils.w_network( String.format("發送請求 %s on %s %n%s %nRequestParams:{%s}",
request.url(), chain.connection(), request.headers(), sb.toString()));
}
} else {
LogUtil.d("CSDN_LQR", String.format("發送請求 %s on %s%n%s",
LoganUtils.w_network(String.format("發送請求 %s on %s%n%s",
request.url(), chain.connection(), request.headers()));
}
Response response = chain.proceed(request);
......@@ -40,13 +40,13 @@ public class LoggingInterceptor implements Interceptor {
//因为response.body().string()之后,response中的流会被关闭,程序会报错,我们需要创建出一
//个新的response给应用层处理
ResponseBody responseBody = response.peekBody(1024 * 1024);
LogUtil.d("CSDN_LQR",
String.format("接收響應: [%s] %n返回json:【%s】 %.1fms %n%s",
LoganUtils.w_network( String.format("接收響應: [%s] %n返回json:【%s】 %.1fms %n%s",
response.request().url(),
responseBody.string(),
(t2 - t1) / 1e6d,
response.headers()
));
return response;
}
}
\ No newline at end of file
package com.gingersoft.gsa.cloud.config.globalconfig.applyOptions.intercept;
import java.io.IOException;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
/**
* 添加UA拦截器,B站请求API需要加上UA才能正常使用
*/
public class UserAgentInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request originalRequest = chain.request();
Request requestWithUserAgent = originalRequest.newBuilder()
// .removeHeader("User-Agent")
// .addHeader("User-Agent", Api.COMMON_UA_STR)
.build();
return chain.proceed(requestWithUserAgent);
}
}
\ No newline at end of file
......@@ -10,6 +10,7 @@ import com.gingersoft.gsa.cloud.app.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.utils.CommonConfiguration;
import com.gingersoft.gsa.cloud.database.utils.FoodComboDaoUtils;
import com.gingersoft.gsa.cloud.database.utils.ModifierDaoUtils;
import com.gingersoft.gsa.cloud.logan.LoganUtils;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
......@@ -22,6 +23,7 @@ public class MyActivityLifecycle implements Application.ActivityLifecycleCallbac
@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
LoganUtils.w_action(activity.getClass().getSimpleName() + ": onActivityCreated");
// EventBus.getDefault().register(activity);
if (!activity.getIntent().getBooleanExtra("isInitToolbar", false)) {
//由于加强框架的兼容性,故将 setContentView 放到 onActivityCreated 之后,onActivityStarted 之前执行
......@@ -34,11 +36,13 @@ public class MyActivityLifecycle implements Application.ActivityLifecycleCallbac
@Override
public void onActivityStarted(Activity activity) {
LoganUtils.w_action(activity.getClass().getSimpleName() + ": onActivityStarted");
}
@Override
public void onActivityResumed(Activity activity) {
String name = activity.getClass().getSimpleName();
LoganUtils.w_action(name + ": onActivityResumed");
if (name.equals("NewMainActivity")) {
Observable.create(new ObservableOnSubscribe<Void>() {
......@@ -71,19 +75,22 @@ public class MyActivityLifecycle implements Application.ActivityLifecycleCallbac
@Override
public void onActivityPaused(Activity activity) {
LoganUtils.w_action(activity.getClass().getSimpleName() + ": onActivityPaused");
}
@Override
public void onActivityStopped(Activity activity) {
// GsaCloudApplication.getAppContext().setCurrentActivity(null);
LoganUtils.w_action(activity.getClass().getSimpleName() + ": onActivityStopped");
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
LoganUtils.w_action(activity.getClass().getSimpleName() + ": onActivitySaveInstanceState");
}
@Override
public void onActivityDestroyed(Activity activity) {
LoganUtils.w_action(activity.getClass().getSimpleName() + ": onActivityDestroyed");
// EventBus.getDefault().unregister(activity);
//横竖屏切换或配置改变时, Activity 会被重新创建实例, 但 Bundle 中的基础数据会被保存下来,移除该数据是为了保证重新创建的实例可以正常工作
activity.getIntent().removeExtra("isInitToolbar");
......
......@@ -4,6 +4,7 @@ import android.app.Application;
import android.content.Context;
import com.gingersoft.gsa.cloud.base.BuildConfig;
import com.gingersoft.gsa.cloud.logan.LoganUtils;
import com.jess.arms.base.delegate.AppLifecycles;
import com.squareup.leakcanary.LeakCanary;
import com.squareup.leakcanary.RefWatcher;
......@@ -19,7 +20,7 @@ public class MyAppLifecycles implements AppLifecycles {
@Override
public void onCreate(Application application) {
// initTimber();
LoganUtils.w_action(application.getClass().getSimpleName() + ": onCreate.....");
initLeakCanary(application);
initFragmentation();
// initARouter(application);
......@@ -69,13 +70,6 @@ public class MyAppLifecycles implements AppLifecycles {
mRefWatcher = BuildConfig.USE_CANARY ? LeakCanary.install(application) : RefWatcher.DISABLED;
}
private void initTimber() {
// if (BuildConfig.LOG_DEBUG) {
// Timber日志打印
// Timber.plant(new Timber.DebugTree());
// }
}
public RefWatcher getRefWatcher() {
return mRefWatcher;
}
......
package com.gingersoft.gsa.cloud.config.globalconfig.lifecyclesOptioins;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import com.billy.cc.core.component.CC;
import com.gingersoft.gsa.cloud.app.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.utils.CommonConfiguration;
import com.gingersoft.gsa.cloud.database.utils.FoodComboDaoUtils;
import com.gingersoft.gsa.cloud.database.utils.ModifierDaoUtils;
import com.gingersoft.gsa.cloud.logan.LoganUtils;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.schedulers.Schedulers;
@SuppressLint("NewApi")
public class MyFragmentLifecycle extends FragmentManager.FragmentLifecycleCallbacks {
@Override
public void onFragmentAttached(@NonNull FragmentManager fm, @NonNull Fragment f, @NonNull Context context) {
LoganUtils.w_action(f.getClass().getSimpleName() + ": onFragmentAttached");
}
@Override
public void onFragmentCreated(@NonNull FragmentManager fm, @NonNull Fragment f, @Nullable Bundle savedInstanceState) {
LoganUtils.w_action(f.getClass().getSimpleName() + ": onFragmentCreated");
}
@Override
public void onFragmentActivityCreated(@NonNull FragmentManager fm, @NonNull Fragment f,
@Nullable Bundle savedInstanceState) {
LoganUtils.w_action(f.getClass().getSimpleName() + ": onFragmentActivityCreated");
}
@Override
public void onFragmentViewCreated(@NonNull FragmentManager fm, @NonNull Fragment f,
@NonNull View v, @Nullable Bundle savedInstanceState) {
LoganUtils.w_action(f.getClass().getSimpleName() + ": onFragmentViewCreated");
}
@Override
public void onFragmentStarted(@NonNull FragmentManager fm, @NonNull Fragment f) {
LoganUtils.w_action(f.getClass().getSimpleName() + ": onFragmentStarted");
}
@Override
public void onFragmentResumed(@NonNull FragmentManager fm, @NonNull Fragment f) {
LoganUtils.w_action(f.getClass().getSimpleName() + ": onFragmentResumed");
}
@Override
public void onFragmentPaused(@NonNull FragmentManager fm, @NonNull Fragment f) {
LoganUtils.w_action(f.getClass().getSimpleName() + ": onFragmentPaused");
}
@Override
public void onFragmentStopped(@NonNull FragmentManager fm, @NonNull Fragment f) {
LoganUtils.w_action(f.getClass().getSimpleName() + ": onFragmentStopped");
}
@Override
public void onFragmentSaveInstanceState(@NonNull FragmentManager fm, @NonNull Fragment f,
@NonNull Bundle outState) {
LoganUtils.w_action(f.getClass().getSimpleName() + ": onFragmentSaveInstanceState");
}
@Override
public void onFragmentViewDestroyed(@NonNull FragmentManager fm, @NonNull Fragment f) {
LoganUtils.w_action(f.getClass().getSimpleName() + ": onFragmentViewDestroyed");
}
@Override
public void onFragmentDestroyed(@NonNull FragmentManager fm, @NonNull Fragment f) {
LoganUtils.w_action(f.getClass().getSimpleName() + ": onFragmentDestroyed");
}
@Override
public void onFragmentDetached(@NonNull FragmentManager fm, @NonNull Fragment f) {
LoganUtils.w_action(f.getClass().getSimpleName() + ": onFragmentDetached");
}
}
......@@ -76,11 +76,21 @@ public class HttpsConstans {
public static String SYSTEM_PATH = "/ricepon-system/api/";
public static String API_RICEPON_MEMBER = "/ricepon-member/api/";
//---------------------------------------打印skyorder QRCode----------------------------------------------------------------------------------
/**
* QRCode相關
*/
public static final String PRINT_QRCODE_ADDRESS_URL_FORMAL = "http://m.ricepon.com";
public static final String PRINT_QRCODE_SUFFIX = "/member-web/qrcode/qrcode.html?WMP0&?arg=";
public static final String PRINT_QRCODE_ADDRESS_URL_HK = "http://hktest.ricepon.com:61177";
//---------------------------------------打印Skyorder QRCode----------------------------------------------------------------------------------
public static final String PRINT_SKY_QRCODE_SUFFIX = "/member-web/qrcode/qrcode.html?WMP0&?arg=";
public static String PRINT_SKY_QRCODE_ADDRESS = PRINT_QRCODE_ADDRESS_URL_FORMAL + PRINT_SKY_QRCODE_SUFFIX;
//----------------------------------------打印積分QRCode-----------------------------------------------------------------------------------------
public static final String PRINT_QRCODE_SUFFIX = "/member-web/qrcode/qrcode.html?arg=";
public static String PRINT_QRCODE_ADDRESS = PRINT_QRCODE_ADDRESS_URL_FORMAL + PRINT_QRCODE_SUFFIX;
//--------------------------------------配置-----------------------------------------------------------------------------------
/**
......@@ -142,6 +152,7 @@ public class HttpsConstans {
RICEPON_MEMBER_SERVER_ADDRESS = WECHAR_REPORT_FORMAL_ADDRESS + WECHAR_REPORT_PATH;
SYSTEM_URL = HTTP_ADDRESS_URL_FORMAL + SYSTEM_PATH;
ROOT_SERVER = HTTP_ADDRESS_URL_FORMAL;
PRINT_QRCODE_ADDRESS = PRINT_QRCODE_ADDRESS_URL_FORMAL + PRINT_QRCODE_SUFFIX;
break;
case 1:
RICEPON_MEMBER_61177 = WECHAR_REPORT_TEST_ADDRESS + API_RICEPON_MEMBER;
......@@ -154,6 +165,7 @@ public class HttpsConstans {
WECHAR_REPORT_SERVER_ADDRESS = WECHAR_REPORT_TEST_ADDRESS + WECHAR_REPORT_PATH;//正式:WECHAR_REPORT_FORMAL_ADDRESS 測試:WECHAR_REPORT_TEST_ADDRESS
SYSTEM_URL = ROOT_HK_TEST_URL + SYSTEM_PATH;
ROOT_SERVER = HTTP_ADDRESS_URL_HK;
PRINT_QRCODE_ADDRESS = PRINT_QRCODE_ADDRESS_URL_HK + PRINT_QRCODE_SUFFIX;
break;
case 2:
//預發佈
......@@ -167,6 +179,7 @@ public class HttpsConstans {
WECHAR_REPORT_SERVER_ADDRESS = HTTP_ADDRESS_URL_PRE + WECHAR_REPORT_PATH;
SYSTEM_URL = HTTP_ADDRESS_URL_PRE + SYSTEM_PATH;
ROOT_SERVER = HTTP_ADDRESS_URL_PRE;
PRINT_QRCODE_ADDRESS = PRINT_QRCODE_ADDRESS_URL_FORMAL + PRINT_QRCODE_SUFFIX;
break;
case 3:
RICEPON_MEMBER_61177 = WECHAR_REPORT_TEST_ADDRESS + API_RICEPON_MEMBER;
......@@ -177,6 +190,7 @@ public class HttpsConstans {
REPORT_SERVER_ADDRESS = REPORT_TEST_ADDRESS + REPORT_PATH;
WECHAR_REPORT_SERVER_ADDRESS = WECHAR_REPORT_TEST_ADDRESS + WECHAR_REPORT_PATH;//正式:WECHAR_REPORT_FORMAL_ADDRESS 測試:WECHAR_REPORT_TEST_ADDRESS
SYSTEM_URL = ROOT_SERVER_ZHI_WANG_HK + SYSTEM_PATH;
PRINT_QRCODE_ADDRESS = PRINT_QRCODE_ADDRESS_URL_HK + PRINT_QRCODE_SUFFIX;
break;
case 4:
RICEPON_MEMBER_61177 = WECHAR_REPORT_TEST_ADDRESS + API_RICEPON_MEMBER;
......@@ -187,6 +201,7 @@ public class HttpsConstans {
REPORT_SERVER_ADDRESS = REPORT_TEST_ADDRESS + REPORT_PATH;
WECHAR_REPORT_SERVER_ADDRESS = WECHAR_REPORT_TEST_ADDRESS + WECHAR_REPORT_PATH;//正式:WECHAR_REPORT_FORMAL_ADDRESS 測試:WECHAR_REPORT_TEST_ADDRESS
SYSTEM_URL = ROOT_SERVER_YOU_CHANG_HK + SYSTEM_PATH;
PRINT_QRCODE_ADDRESS = PRINT_QRCODE_ADDRESS_URL_HK + PRINT_QRCODE_SUFFIX;
break;
case 5:
RICEPON_MEMBER_61177 = WECHAR_REPORT_TEST_ADDRESS + API_RICEPON_MEMBER;
......@@ -197,6 +212,7 @@ public class HttpsConstans {
REPORT_SERVER_ADDRESS = REPORT_TEST_ADDRESS + REPORT_PATH;
WECHAR_REPORT_SERVER_ADDRESS = WECHAR_REPORT_TEST_ADDRESS + WECHAR_REPORT_PATH;//正式:WECHAR_REPORT_FORMAL_ADDRESS 測試:WECHAR_REPORT_TEST_ADDRESS
SYSTEM_URL = ROOT_SERVER_SHI_SHU_HK + SYSTEM_PATH;
PRINT_QRCODE_ADDRESS = PRINT_QRCODE_ADDRESS_URL_HK + PRINT_QRCODE_SUFFIX;
break;
}
ricepon_wechat = HttpsConstans.ROOT_URL + HttpsConstans.URL_RICEPON_WECHAT;
......
package com.gingersoft.gsa.cloud.logan;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import com.dianping.logan.Logan;
import com.dianping.logan.SendLogCallback;
import com.gingersoft.gsa.cloud.app.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.BuildConfig;
import com.gingersoft.gsa.cloud.base.utils.log.LogUtil;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.config.LoganConfig;
import com.jess.arms.utils.ArmsUtils;
import com.jess.arms.utils.DeviceUtils;
/**
* @author : bin
* @create date: 2020-11-21
* @update date: 2020-11-21
* @description:
*/
public class LoganUtils {
private static final String TAG = LoganUtils.class.getSimpleName();
/**
* 上傳日誌到服務器
*/
public static void uploadLog(Context context, boolean showToast) {
String memberId = GsaCloudApplication.getMemberName() + "_" + GsaCloudApplication.getMemberId();
String deviceId = DeviceUtils.getIMEI(GsaCloudApplication.getAppContext()) != null ? DeviceUtils.getIMEI(GsaCloudApplication.getAppContext()) : "redmi";
String AppVersion = DeviceUtils.getVersionName(GsaCloudApplication.getAppContext()) + "_" + DeviceUtils.getVersionCode(GsaCloudApplication.getAppContext());
String BuildVersion = android.os.Build.VERSION.RELEASE + "";
Logan.s(LoganConfig.UPLOAD_LOG_URL, TimeUtils.getCurrentDate(TimeUtils.DATE_FORMAT_DATE), LoganConfig.APP_ID, memberId, deviceId,
BuildVersion, AppVersion, new SendLogCallback() {
@Override
public void onLogSendCompleted(int statusCode, byte[] data) {
final String resultData = data != null ? new String(data) : "";
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
if (BuildConfig.DEBUG && showToast) {
if (statusCode == 200) {
ArmsUtils.makeText(context, "日誌上傳成功");
} else {
ArmsUtils.makeText(context, "日誌上傳失敗");
}
}
}
});
Log.d(TAG, "upload result, httpCode: " + statusCode + ", details: " + resultData);
}
});
}
public static void w_code(String log) {
Logan.w(log, LoganConfig.CODE_LEVLE);
printLog(log);
}
public static void w_action(String log) {
Logan.w(log, LoganConfig.ACTION_LEVLE);
}
public static void w_network(String log) {
Logan.w(log, LoganConfig.NETWORK_LEVLE);
//網絡日誌比較重要立即寫入本地
// Logan.f();
printLog(log);
}
public static void w_crash(String log) {
Logan.w(log, LoganConfig.CRASH_LEVLE);
//cash日誌比較重要立即寫入本地
Logan.f();
printLog(log);
}
public static void w_H5(String log) {
Logan.w(log, LoganConfig.H5_LEVLE);
}
public static void w_native(String log) {
Logan.w(log, LoganConfig.native_LEVLE);
}
private static void printLog(String log) {
if (BuildConfig.DEBUG) {
// LogUtil.d(log);
}
}
}
package com.gingersoft.gsa.cloud.menu;
/**
* @author : bin
* @create date: 2020-11-03
* @update date: 2020-11-03
* @description:
*/
public interface Menu {
}
......@@ -141,7 +141,7 @@ public class OrderPayView extends LinearLayout {
double paymentDifference = getPaymentDifference();
if (!addPayMethodCondtion(method,paymentDifference)) {
if (!addPayMethodCondtion(method, paymentDifference)) {
return;
}
......@@ -188,7 +188,7 @@ public class OrderPayView extends LinearLayout {
int notifyPosition = mBillMoneyList.size() - 1;
mBillMoneyAdapter.setSelect_position(notifyPosition);
mBillMoneyAdapter.notifyItemChanged(notifyPosition);
mBillMoneyAdapter.notifyDataSetChanged();
rv_bill_money.scrollToPosition(notifyPosition);
//設置差額狀態
......@@ -232,10 +232,14 @@ public class OrderPayView extends LinearLayout {
//Exact
view.findViewById(R.id.btn_exact).setOnClickListener(v -> {
if (getSelectBillMoney() == null) {
PayMethod selectPayMethod = getSelectBillMoney();
if (selectPayMethod == null) {
ToastUtils.show(context, "請選擇支付方式");
return;
}
boolean useFreeServicePayMethod = isUseFreeServicePayMethod(selectPayMethod);
setWhetherFreeServiceCallback(useFreeServicePayMethod);
pressExact();
setDifferenceText(context);
});
......@@ -271,7 +275,7 @@ public class OrderPayView extends LinearLayout {
this.addView(view);
}
private boolean addPayMethodCondtion(PayMethod method,double paymentDifference) {
private boolean addPayMethodCondtion(PayMethod method, double paymentDifference) {
boolean isIntegralPayMethod = isIntegralPayMethod(method);
if (isIntegralPayMethod) {
//積分支付
......@@ -673,7 +677,7 @@ public class OrderPayView extends LinearLayout {
tv_total.setText("$" + totalAmount);
}
public void updateOrderPay(double totalAmount){
public void updateOrderPay(double totalAmount) {
setTotalAmount(totalAmount);
initOrderDetail();
setDifferenceText(GsaCloudApplication.getAppContext());
......
......@@ -44,7 +44,6 @@
android:visibility="invisible" />
</FrameLayout>
<TextView
android:id="@+id/tv_total_text"
android:layout_width="wrap_content"
......@@ -58,7 +57,6 @@
android:textSize="@dimen/sp_22"
android:textStyle="bold"
android:visibility="visible" />
</LinearLayout>
<TextView
......
package com.gingersoft.gsa.delivery_pick_mode.data.network
import android.util.Log
import com.gingersoft.gsa.cloud.app.GsaCloudApplication
import com.gingersoft.gsa.cloud.base.utils.encryption.Aes
import com.gingersoft.gsa.cloud.config.globalconfig.applyOptions.intercept.HeadersInterceptor
import com.gingersoft.gsa.cloud.config.globalconfig.applyOptions.intercept.LoggingInterceptor
import com.gingersoft.gsa.cloud.constans.AppConstans
import com.gingersoft.gsa.cloud.constans.HttpsConstans
import com.gingersoft.gsa.cloud.constans.HttpsConstans.ROOT_SERVER
import com.gingersoft.gsa.cloud.constans.HttpsConstans.URK_RICEPON_GSA
import com.jess.arms.utils.DeviceUtils
import okhttp3.Headers
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.converter.scalars.ScalarsConverterFactory
......@@ -26,7 +19,7 @@ object ServiceCreator {
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.addInterceptor(LoggingInterceptor())
.addInterceptor(UserAgentIntercepter())
.addInterceptor(HeadersInterceptor())
private lateinit var builder: Retrofit.Builder
private lateinit var builder2: Retrofit.Builder
......@@ -110,32 +103,32 @@ object ServiceCreator {
/**
* 添加请求头
*/
class UserAgentIntercepter : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
val headers = request.headers()
val builder = Headers.Builder()
for (i in 0 until headers.size()) {
builder.set(headers.name(i), headers.value(i))
}
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", DeviceUtils.getVersionName(GsaCloudApplication.getAppContext()))
builder.set("mobileId", "1")
if (GsaCloudApplication.isLogin) {
var token: String
val memberId = GsaCloudApplication.getMemberId()
val loginToken = GsaCloudApplication.getLoginToken()
token = Aes.aesEncrypt("9_" + memberId + "_" + System.currentTimeMillis() + "_" + loginToken)
token = token.replace("\r|\n".toRegex(), "")
builder.set("token", token)
}
val request1 = chain.request().newBuilder().headers(builder.build()).build()
return chain.proceed(request1)
}
}
// class UserAgentIntercepter : Interceptor {
// override fun intercept(chain: Interceptor.Chain): Response {
// val request = chain.request()
// val headers = request.headers()
//
// val builder = Headers.Builder()
// for (i in 0 until headers.size()) {
// builder.set(headers.name(i), headers.value(i))
// }
//
// 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", DeviceUtils.getVersionName(GsaCloudApplication.getAppContext()))
// builder.set("mobileId", "1")
//
// if (GsaCloudApplication.isLogin) {
// var token: String
// val memberId = GsaCloudApplication.getMemberId()
// val loginToken = GsaCloudApplication.getLoginToken()
// token = Aes.aesEncrypt("9_" + memberId + "_" + System.currentTimeMillis() + "_" + loginToken)
// token = token.replace("\r|\n".toRegex(), "")
// builder.set("token", token)
// }
// val request1 = chain.request().newBuilder().headers(builder.build()).build()
// return chain.proceed(request1)
// }
// }
}
\ No newline at end of file
......@@ -14,7 +14,7 @@ import com.gingersoft.gsa.cloud.base.utils.JsonUtils;
import com.gingersoft.gsa.cloud.base.utils.RestaurantInfoUtils;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.base.widget.DialogUtils;
import com.gingersoft.gsa.cloud.constans.UserConstans;
import com.gingersoft.gsa.cloud.account.user.UserConstans;
import com.gingersoft.gsa.cloud.login.R;
import com.gingersoft.gsa.cloud.login.mvp.bean.LoginLimitBean;
import com.gingersoft.gsa.cloud.login.mvp.presenter.BaseLoginPresenter;
......
......@@ -19,7 +19,7 @@ import com.gingersoft.gsa.cloud.base.utils.encryption.Aes;
import com.gingersoft.gsa.cloud.base.utils.log.LogUtil;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.base.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.constans.UserConstans;
import com.gingersoft.gsa.cloud.account.user.UserConstans;
import com.gingersoft.gsa.cloud.login.R;
import com.gingersoft.gsa.cloud.login.R2;
import com.gingersoft.gsa.cloud.login.di.component.DaggerLoginComponent;
......
......@@ -20,7 +20,7 @@ import androidx.viewpager2.widget.ViewPager2;
import com.gingersoft.gsa.cloud.app.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.utils.encryption.Aes;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.constans.UserConstans;
import com.gingersoft.gsa.cloud.account.user.UserConstans;
import com.gingersoft.gsa.cloud.login.R;
import com.gingersoft.gsa.cloud.login.R2;
import com.gingersoft.gsa.cloud.login.di.component.DaggerWelcomeComponent;
......
......@@ -38,6 +38,7 @@ public class ShoppingCart {
}
return shoppingCart;
}
/**
* 外送/自取 的訂單數據
*/
......@@ -271,14 +272,16 @@ public class ShoppingCart {
byte discountType = BillItem.NOMAL_DISCOUNT_TYPE;
for (int i = multyDiscountArrays.size() - 1; i >= 0; i--) {
MultyDiscount discount = multyDiscountArrays.get(i);
String discountName = discount.getName();
if (discount instanceof NomalDiscount) {
discountType = BillItem.NOMAL_DISCOUNT_TYPE;
} else if (discount instanceof MemberDiscount) {
discountType = BillItem.MEMBER_DISCOUNT_TYPE;
discountName = discount.getName() + ((MemberDiscount) discount).getMemberDiscount().getMemberDiscount()+"%";
} else if (discount instanceof CouponDiscount) {
discountType = BillItem.COUPON_DISCOUNT_TYPE;
}
DiscountItem discountItem = new DiscountItem(discount.getName(), discount.getDiscountMoney(), discount.getStatus(), discountType);
DiscountItem discountItem = new DiscountItem(discountName, discount.getDiscountMoney(), discount.getStatus(), discountType);
discountItem.setDiscount(discount);
billItemList.add(discountItem);
}
......
......@@ -426,7 +426,7 @@ public class MealCommodity implements Commodity {
mealCommodity.setNumber(1);
mealCommodity.setPrice(discountPrice);
mealCommodity.setUnit_price(discountPrice);
if (BaseOrder.isCurrentOrderType(FoodSummaryConstans.RESTAURANT_MODE)) {
if (BaseOrder.isTableToMeal()) {
mealCommodity.setOrderId(DoshokuOrder.getInstance().getOrderId());
} else {
mealCommodity.setOrderId(TakeawayOrder.getInstance().getOrderId());
......
......@@ -55,6 +55,20 @@ public abstract class BaseOrder {
return false;
}
/**
* 是否在餐廳用餐
* @return
*/
public static boolean isTableToMeal() {
/**
* 餐檯模式,skyorder到餐廳用餐
*/
if (orderType == FoodSummaryConstans.RESTAURANT_MODE || orderType == FoodSummaryConstans.SKYORDER) {
return true;
}
return false;
}
protected void initialization() {
orderType = FoodSummaryConstans.RESTAURANT_MODE;
......
......@@ -44,7 +44,6 @@ public class PrintBill extends PrinterRoot {
DoshokuOrder doshokuOrder = DoshokuOrder.getInstance();
ShoppingCart shoppingCart = doshokuOrder.getShoppingCart();
List<OrderDetail> foodList = shoppingCart.getOrderCommodityList();
TableBean.DataBean tableBean = doshokuOrder.getOpenTableInfo();
......
......@@ -51,6 +51,7 @@ import com.gingersoft.gsa.cloud.print.PrinterWriter58mm;
import com.gingersoft.gsa.cloud.print.bean.OrderDetails;
import com.gingersoft.gsa.cloud.print.bean.PrintContent;
import com.gingersoft.gsa.cloud.print.bean.PrintQRCodeContent;
import com.google.zxing.WriterException;
import com.hyweb.n5.lib.constant.PrinterConstant;
import com.hyweb.n5.lib.util.PrinterUtil;
import com.hyweb.n5.server.aidl.IOnPrintCallback;
......@@ -621,7 +622,12 @@ public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedLis
llIntegralQrcode.setVisibility(View.GONE);
} else {
llIntegralQrcode.setVisibility(View.VISIBLE);
Bitmap QRImage = QRCodeUtil.createQRImage(integralQrcode, 180, 180);
Bitmap QRImage = null;
try {
QRImage = QRCodeUtil.makeQRImage(integralQrcode, 220, 220);
} catch (WriterException e) {
e.printStackTrace();
}
ivIntegralQrcode.setImageBitmap(QRImage);
}
return view;
......
......@@ -76,8 +76,8 @@
<ImageView
android:id="@+id/iv_integral_qrcode"
android:layout_width="@dimen/dp_250"
android:layout_height="@dimen/dp_250"
android:layout_width="@dimen/dp_220"
android:layout_height="@dimen/dp_220"
android:layout_marginTop="@dimen/dp_5"/>
<TextView
......
......@@ -82,6 +82,7 @@ public class TableBean {
* maxSeatCount : 8
* SplitStatus : 0
* skyQRCode:
* scanId : 1117359
*/
private int id;
......
......@@ -49,6 +49,11 @@ public class MealDiscountAction implements Strategy<Discount> {
return;
}
double mixTotalAomout = getMixTotalAomout(mSelectMixOrderMealList);
if(discount.getType() == 0 && discount.getAmount() > mixTotalAomout){
//金額折扣總額不能超過 食品總金額
ArmsUtils.makeText(mContext, "折扣金額不可以超過食品總金額!");
return;
}
if (discount.getMinBillAmount() > mixTotalAomout) {
//最小賬單金額
ArmsUtils.makeText(mContext, "小於最小賬單金額$" + discount.getMinBillAmount() + " 無法使用此折扣");
......
......@@ -103,7 +103,7 @@ public class PrintSkyorderAction extends TableAction {
String printBottomInfo = GsaCloudApplication.functionConfiguration.getSkyQRCodePrintBottomInfoVaule();
String QR = "\"" + printQRCodeResponse.getQrcode() + "\"";
String QRCodeContent = HttpsConstans.PRINT_QRCODE_ADDRESS + "{\"type\":" + PRINT_type + ",\"QR\":" + QR + "}";
String QRCodeContent = HttpsConstans.PRINT_SKY_QRCODE_ADDRESS + "{\"type\":" + PRINT_type + ",\"QR\":" + QR + "}";
QRCodeContent = QRCodeContent.replace("WMP0", "WMP" + printQRCodeResponse.getIsWeChatMiniProgram());
PrintQRCodeContent printQRCodeBean = new PrintQRCodeContent();
......
......@@ -34,10 +34,12 @@ import com.gingersoft.gsa.cloud.table.mvp.model.bean.request.AddOrderRequest;
import com.gingersoft.gsa.cloud.table.mvp.model.bean.request.CreateOrderRequest;
import com.gingersoft.gsa.cloud.table.mvp.ui.activity.MealStandActivity;
import com.gingersoft.gsa.cloud.table.mvp.ui.activity.OrderContentActivity;
import com.gingersoft.gsa.cloud.table.mvp.ui.activity.OrderPayActivity;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.BillItemAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.SelectMealAdapter;
import com.gingersoft.gsa.cloud.constans.ExpandConstant;
import com.gingersoft.gsa.cloud.database.bean.Discount;
import com.gingersoft.gsa.cloud.ui.view.OrderPayView;
import com.gingersoft.gsa.cloud.ui.widget.dialog.CommonTipDialog;
import com.gingersoft.gsa.cloud.zxing.MipcaCaptureActivity;
import com.jess.arms.di.scope.ActivityScope;
......@@ -176,7 +178,7 @@ public abstract class BaseOrderPresenter<M extends BaseOrderContract.Model, V ex
}
BaseOrder baseOrder = OrderFactory.createOrder(BaseOrder.orderType);
if (BaseOrder.isCurrentOrderType(FoodSummaryConstans.RESTAURANT_MODE)) {
if (BaseOrder.isTableToMeal()) {
mDoshokuOrder = (DoshokuOrder) baseOrder;
mTableInfo = mDoshokuOrder.getOpenTableInfo();
} else {
......@@ -251,6 +253,10 @@ public abstract class BaseOrderPresenter<M extends BaseOrderContract.Model, V ex
});
}
public void updateBillInfo() {
updateBillInfo(null);
}
/**
* 更新賬單信息
* 1、更新食品折扣
......@@ -261,7 +267,7 @@ public abstract class BaseOrderPresenter<M extends BaseOrderContract.Model, V ex
* 6、更新賬單小數項
* 7、總金額
*/
public void updateBillInfo() {
public void updateBillInfo(UpdateBillInfoEndListener updateBillInfoEndListener) {
mShoppingCart.resetBeforeBillCalculation();
//更新食品折扣
......@@ -371,16 +377,20 @@ public abstract class BaseOrderPresenter<M extends BaseOrderContract.Model, V ex
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Double>() {
@Override
public void accept(Double totalAmount) throws Exception {
if (mOrderContentActivity != null) {
mOrderContentActivity.initOrderBill(wholeAmount, totalAmount);
}
public void accept(Double totalAmount) {
//更新總金額
mShoppingCart.setTotalAmount(totalAmount);
//刷新美食Item數據
mSelectMealAdapter.notifyDataSetChanged();
//刷新賬單Item數據
mBillItemAdapter.notifyDataSetChanged();
//刷新美食Item數據
mSelectMealAdapter.notifyDataSetChanged();
if (mOrderContentActivity != null) {
mOrderContentActivity.initOrderBill(wholeAmount, totalAmount);
}
if (updateBillInfoEndListener != null) {
updateBillInfoEndListener.onUpdateEnd();
}
}
});
}
......@@ -779,7 +789,7 @@ public abstract class BaseOrderPresenter<M extends BaseOrderContract.Model, V ex
double foodTotal = getFoodTotal();
for (BillItem item : mBillItemList) {
if (!filterType(item.getType(), filterTypes)) {
if (item.getType() == BillItem.SERVERCHARGE_TYPE && mBillItemAdapter.getFreeServiceStauts()) {
if (item instanceof ServiceChargeItem && mBillItemAdapter.getFreeServiceStauts()) {
//TODO 免服務費
} else {
foodTotal = MoneyUtil.sum(foodTotal, item.getMoney());
......@@ -813,7 +823,7 @@ public abstract class BaseOrderPresenter<M extends BaseOrderContract.Model, V ex
public double getTotalAmount() {
double foodTotal = getFoodTotal();
for (BillItem item : mBillItemList) {
if (item.getType() == BillItem.SERVERCHARGE_TYPE && mBillItemAdapter.getFreeServiceStauts()) {
if (item instanceof ServiceChargeItem && mBillItemAdapter.getFreeServiceStauts()) {
//TODO 免服務費
} else {
foodTotal = MoneyUtil.sum(foodTotal, item.getMoney());
......@@ -836,7 +846,7 @@ public abstract class BaseOrderPresenter<M extends BaseOrderContract.Model, V ex
*/
protected Double getRounding() {
for (BillItem item : mBillItemList) {
if (item.getType() == BillItem.ROUNDING_TYPE) {
if (item instanceof RoundingItem) {
return item.getMoney();
}
}
......@@ -1405,12 +1415,12 @@ public abstract class BaseOrderPresenter<M extends BaseOrderContract.Model, V ex
});
}
public DoshokuOrder getDoshokuOrder() {
return mDoshokuOrder;
}
public ShoppingCart getShoppingCart() {
return mShoppingCart;
}
public interface UpdateBillInfoEndListener {
void onUpdateEnd();
}
}
......@@ -153,7 +153,7 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod
//獨佔折扣刪除其他折扣
int start_position = mSelectMealAdapter.getSelect_full_start_position();
int end_position = mSelectMealAdapter.getSelect_full_end_position();
for (int i = 0; i < mOrderMealList.size(); i++) {
for (int i = mOrderMealList.size() - 1; i >= 0; i--) {
if (start_position <= i && i <= end_position) {
OrderDetail orderMealItem = mOrderMealList.get(i);
if (orderMealItem.getDiscount() != null) {
......@@ -992,11 +992,6 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod
mRootView.showMessage(info.getErrMsg());
}
}
@Override
public void onError(Throwable t) {
super.onError(t);
}
});
}
......@@ -1670,26 +1665,6 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod
}
}
public Food getFoodByFid(long fid) {
for (int i = 0; i < mFoodList.size(); i++) {
Food foodBean = mFoodList.get(i);
if (fid == foodBean.getId()) {
return foodBean;
}
}
return null;
}
public Modifier getModifierByMid(long mid) {
for (int i = 0; i < mModifierList.size(); i++) {
Modifier modifier = mModifierList.get(i);
if (mid == modifier.getMid()) {
return modifier;
}
}
return null;
}
/**
* 標識食品是否为组合食品
*
......
......@@ -257,7 +257,7 @@ public class OrderContentPresenter extends BaseOrderPresenter<OrderContentContra
if (mFunctionList.size() > 0) {
mFunctionList.clear();
}
if (BaseOrder.isCurrentOrderType(FoodSummaryConstans.RESTAURANT_MODE)) {
if (BaseOrder.isTableToMeal()) {
if (mDoshokuOrder.isModifyOrder()) {
//修改訂單隱藏送單,印單功能
mFunctionList.add(new Function("結賬", Color.parseColor("#FFFFFF"), Color.parseColor("#DC0000"), 24));
......
......@@ -13,6 +13,7 @@ import com.gingersoft.gsa.cloud.base.utils.JsonUtils;
import com.gingersoft.gsa.cloud.base.utils.MoneyUtil;
import com.gingersoft.gsa.cloud.base.utils.gson.GsonUtils;
import com.gingersoft.gsa.cloud.constans.FoodSummaryConstans;
import com.gingersoft.gsa.cloud.constans.HttpsConstans;
import com.gingersoft.gsa.cloud.table.BuildConfig;
import com.gingersoft.gsa.cloud.table.mvp.contract.OrderPayContract;
import com.gingersoft.gsa.cloud.table.mvp.model.bean.response.OrderPayResponse;
......@@ -177,7 +178,7 @@ public class OrderPayPresenter extends BaseOrderPresenter<OrderPayContract.Model
mDoshokuOrder.setOldPoints(orderPayRespose.getOldPoints());
} else {
if (!TextUtils.isEmpty(orderPayRespose.getVerifyCode())) {
mDoshokuOrder.setIntegralQrcode(orderPayRespose.getVerifyCode());
mDoshokuOrder.setIntegralQrcode(HttpsConstans.PRINT_QRCODE_ADDRESS + orderPayRespose.getVerifyCode());
}
}
}
......@@ -288,14 +289,18 @@ public class OrderPayPresenter extends BaseOrderPresenter<OrderPayContract.Model
}
public void setFreeServiceStauts(boolean useFreeServicePayMethod) {
//更新服務費中劃線
mBillItemAdapter.setFreeServiceStauts(useFreeServicePayMethod);
//更新總金額
updateBillInfo(new UpdateBillInfoEndListener() {
@Override
public void onUpdateEnd() {
OrderPayView orderPayView = IActivity.getGsaPayView();
if (orderPayView != null) {
orderPayView.updateOrderPay(getTotalAmount());
}
//更新服務費中劃線
mBillItemAdapter.setFreeServiceStauts(useFreeServicePayMethod);
//更新總金額
updateBillInfo();
}
});
}
/**
......
......@@ -13,11 +13,13 @@ import com.gingersoft.gsa.cloud.app.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.common.bean.BaseResult;
import com.gingersoft.gsa.cloud.base.order.bean.response.OrderResponse;
import com.gingersoft.gsa.cloud.base.order.commodity.OrderDetail;
import com.gingersoft.gsa.cloud.base.order.order.BaseOrder;
import com.gingersoft.gsa.cloud.base.order.order.DoshokuOrder;
import com.gingersoft.gsa.cloud.base.table.bean.TableBean;
import com.gingersoft.gsa.cloud.base.table.bean.TableExtBean;
import com.gingersoft.gsa.cloud.base.utils.JsonUtils;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.constans.FoodSummaryConstans;
import com.gingersoft.gsa.cloud.table.ComponentTable;
import com.gingersoft.gsa.cloud.table.R;
import com.gingersoft.gsa.cloud.table.mvp.contract.TableContract;
......@@ -121,6 +123,7 @@ public class TablePresenter extends BasePresenter<TableContract.Model, TableCont
private String originalTableName = "";
private long originalTableId;
private String originalTableNumber = "";
private long originalScanId;
/**
* 转台需要转到台名、id、分檯編號
*/
......@@ -429,6 +432,11 @@ public class TablePresenter extends BasePresenter<TableContract.Model, TableCont
}
doshokuOrder.setOpenTableInfo(openTableBean);
if (openTableBean.getScanId() != null) {
BaseOrder.orderType = FoodSummaryConstans.SKYORDER;
} else {
BaseOrder.orderType = FoodSummaryConstans.RESTAURANT_MODE;
}
mRootView.startMealStandActivity();
} else {
CommonTipDialog.showSurpisedDialog(IActivity, respose.getErrMsg(), null, null, null, null, null);
......@@ -530,6 +538,9 @@ public class TablePresenter extends BasePresenter<TableContract.Model, TableCont
originalTableName = tableBean.getTableName();
originalTableId = tableBean.getId();
originalTableNumber = tableBean.getTableNumber();
if (tableBean.getScanId() != null) {
originalScanId = tableBean.getScanId().longValue();
}
mRootView.setTableActionContentText("由: " + originalTableName + " 轉到 ");
} else {
if (tableBean.getUseStatus() == 1) {
......@@ -554,13 +565,14 @@ public class TablePresenter extends BasePresenter<TableContract.Model, TableCont
});
}
public void turnTable(long originalTableId, long targetTableId, String tableNumber, String targetTableNumber, boolean isMergeTable) {
public void turnTable(long originalTableId, long targetTableId, String tableNumber, String targetTableNumber, long originalScanId, boolean isMergeTable) {
RequestBody requestBody = new FormBody.Builder()
.add("id", String.valueOf(originalTableId))
.add("tableId", String.valueOf(targetTableId))
.add("tableNumber", tableNumber)
.add("targetTableNumber", targetTableNumber)
.add("scanId", String.valueOf(originalScanId))
.build();
mModel.turnTable(requestBody)
......@@ -866,7 +878,7 @@ public class TablePresenter extends BasePresenter<TableContract.Model, TableCont
@Override
public void onClick(QMUIDialog dialog, int index) {
dialog.dismiss();
turnTable(originalTableId, targetTableId, originalTableNumber, targetTableNumber, finalIsMergeTable);
turnTable(originalTableId, targetTableId, originalTableNumber, targetTableNumber, originalScanId, finalIsMergeTable);
}
});
dialogBuilder.addAction("取消", new QMUIDialogAction.ActionListener() {
......@@ -915,7 +927,6 @@ public class TablePresenter extends BasePresenter<TableContract.Model, TableCont
*/
public boolean doTableAction(TableBean.DataBean dataBean) {
if (mTableAction != null) {
mTableAction.action(dataBean);
mTableAction.setActionListener(new TableAction.OnActionListener() {
@Override
......@@ -966,6 +977,7 @@ public class TablePresenter extends BasePresenter<TableContract.Model, TableCont
mRootView.canceTableAction();
}
});
mTableAction.action(dataBean);
return true;
}
return false;
......@@ -978,6 +990,7 @@ public class TablePresenter extends BasePresenter<TableContract.Model, TableCont
originalTableName = "";
originalTableId = 0;
originalTableNumber = "";
originalScanId = 0;
targetTableName = "";
targetTableId = 0;
targetTableNumber = "";
......
......@@ -28,6 +28,7 @@ import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
......@@ -38,7 +39,9 @@ import com.gingersoft.gsa.cloud.app.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.common.bean.MemberInfo;
import com.gingersoft.gsa.cloud.base.order.bean.response.OrderResponse;
import com.gingersoft.gsa.cloud.base.order.billItem.BillItem;
import com.gingersoft.gsa.cloud.base.order.cart.ShoppingCart;
import com.gingersoft.gsa.cloud.base.order.commodity.OrderDetail;
import com.gingersoft.gsa.cloud.base.order.discount.MultyDiscount;
import com.gingersoft.gsa.cloud.base.order.order.BaseOrder;
import com.gingersoft.gsa.cloud.base.order.order.DoshokuOrder;
import com.gingersoft.gsa.cloud.base.table.bean.TableBean;
......@@ -74,6 +77,10 @@ import com.gingersoft.gsa.cloud.ui.view.SearchKeyBoardView;
import com.gingersoft.gsa.cloud.ui.widget.dialog.CommonTipDialog;
import com.gingersoft.gsa.cloud.ui.widget.dialog.LoadingDialog;
import com.gingersoft.gsa.cloud.zxing.MipcaCaptureActivity;
import com.google.android.flexbox.FlexDirection;
import com.google.android.flexbox.FlexWrap;
import com.google.android.flexbox.FlexboxLayoutManager;
import com.google.android.flexbox.JustifyContent;
import com.jess.arms.base.BaseFragmentActivity;
import com.jess.arms.base.DefaultAdapter;
import com.jess.arms.di.component.AppComponent;
......@@ -315,7 +322,7 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter>
}
mPresenter.toFindMeal(inputText);
});
if (BaseOrder.isCurrentOrderType(FoodSummaryConstans.RESTAURANT_MODE) && !DoshokuOrder.getInstance().isModifyOrder()) {
if (BaseOrder.isTableToMeal() && !DoshokuOrder.getInstance().isModifyOrder()) {
//根据倒计时时间自动退出当前页面
initAutoQuit();
}
......@@ -352,7 +359,7 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter>
mPresenter.resetSelected();
mPresenter.updateOrderFoodNumber();
mPresenter.updateFoodSoldoutCtrData();
if (BaseOrder.isCurrentOrderType(FoodSummaryConstans.RESTAURANT_MODE) && DoshokuOrder.getInstance().getMemberInfo() != null) {
if (BaseOrder.isTableToMeal() && DoshokuOrder.getInstance().getMemberInfo() != null) {
useMember();
}
initOrderDetail();
......@@ -619,9 +626,11 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter>
dialog.dismiss();
DoshokuOrder.getInstance().setMemberInfo(mMemberInfo);
//添加会员折扣行
mPresenter.getShoppingCart()
.addMultyDiscount(mPresenter.getShoppingCart()
.createMemberDiscount(mMemberInfo, BillItem.BILL_ITEM_NO_ORDER_STATUS));
ShoppingCart shoppingCart = mPresenter.getShoppingCart();
MultyDiscount multyDiscount = shoppingCart.createMemberDiscount(mMemberInfo, BillItem.BILL_ITEM_NO_ORDER_STATUS);
shoppingCart.addMultyDiscount(multyDiscount);
mPresenter.updateBillInfo();
useMember();
......@@ -652,16 +661,17 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter>
}
}
});
mUseMemberDialog.build();
}
mUseMemberDialog.setMemberInfo(DoshokuOrder.getInstance().getMemberInfo());
mUseMemberDialog.build().show();
mUseMemberDialog.show();
}
@Override
public void updateMemberInfo(MemberInfo memberInfo) {
this.mMemberInfo = memberInfo;
if (mUseMemberDialog != null) {
mUseMemberDialog.updateMemberInfo(memberInfo);
mUseMemberDialog.setMemberInfo(memberInfo);
}
}
......@@ -705,7 +715,7 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter>
//防抖處理
int id = v.getId();
if (id == R.id.btn_numberman) {
if (BaseOrder.isCurrentOrderType(FoodSummaryConstans.TAKEAWAY_TYPE)) {
if (BaseOrder.isTableToMeal()) {
return;
}
showChoosePeopleNumDialog(true);
......@@ -780,7 +790,7 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter>
case 3:
case 4:
case 5:
if (BuildConfig.DEBUG && BaseOrder.isCurrentOrderType(FoodSummaryConstans.RESTAURANT_MODE)) {
if (BuildConfig.DEBUG && BaseOrder.isTableToMeal()) {
if (i == 1) {
OrderResponse order = DoshokuOrder.getInstance().getOrderPlaced();
if (order != null) {
......@@ -823,7 +833,6 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter>
} else if (id == R.id.iv_fine_back) {
showViewModeVisibility(MealConstant.combo_ViewMode);
}
}
......@@ -835,14 +844,12 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter>
public void returnTableActivity(boolean initTable) {
if (mPresenter.hasNesOrderFoods()) {
if (mPresenter.hasNesOrderFoods()) {
//没有过重复下单提示且有未送单食品,提示用户
String tip = LanguageUtils.get_language_system(this, "food.not.delivered.tip", "有食品未送單, 確認離開?");
Class[] parameterTypes = {boolean.class};
Object[] parameters = {initTable};
CommonTipDialog.showSurpisedDialog(this, tip, MealStandActivity.class, this,
"returnBeforeActivity", parameterTypes, parameters);
}
} else {
returnBeforeActivity(initTable);
}
......@@ -850,11 +857,13 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter>
public void returnBeforeActivity(boolean initTable) {
SPUtils.put(MealConstant.EXIT_IS_PLU_MODE, isPluMode);
if (BaseOrder.isCurrentOrderType(FoodSummaryConstans.RESTAURANT_MODE) && initTable && !DoshokuOrder.getInstance().isModifyOrder()) {
if (BaseOrder.isTableToMeal() && initTable && !DoshokuOrder.getInstance().isModifyOrder()) {
TableBean.DataBean dataBean = DoshokuOrder.getInstance().getOpenTableInfo();
if (dataBean != null) {
//通知更新餐台状态
EventBus.getDefault().post(new InitTableEvent(dataBean.getId(), dataBean.getTableNumber()), "initTable_status_event");
}
}
killMyself();
}
......@@ -1036,7 +1045,16 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter>
@Override
public void setDiscountRecycleLayoutManager(int orientation) {
FlexboxLayoutManager flexboxLayoutManager = new FlexboxLayoutManager(mContext);
//主轴为水平方向,起点在左端。
flexboxLayoutManager.setFlexDirection(FlexDirection.ROW);
//按正常方向换行
flexboxLayoutManager.setFlexWrap(FlexWrap.WRAP);
//交叉轴的起点对齐。
flexboxLayoutManager.setJustifyContent(JustifyContent.FLEX_START);
discountRecycleLayoutManager = new GridLayoutManager(this, 1, LinearLayoutManager.VERTICAL, false);
// rv_discount.addItemDecoration(new DividerItemDecoration(mContext, ArmsUtils.getColor(mContext, R.color.theme_white_color)));
rv_discount.setLayoutManager(discountRecycleLayoutManager);
rv_discount.setItemAnimator(new DefaultItemAnimator());
}
......@@ -1046,19 +1064,6 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter>
DecimalFormat df = new DecimalFormat("###.00");
String span = df.format((double) size / foodGroupColumn);
int spanCount = (int) Math.ceil(Double.parseDouble(span)); //33.333
boolean twoRow = spanCount > 1 && spanCount < 2 || spanCount == 2;
// if (size <= foodGroupColumn) {
// setFoodGroupRecycleLayoutManager(GridLayoutManager.HORIZONTAL);
// foodGroupRecycleLayoutManager.setSpanCount(1);
// } else if (twoRow) {
// setFoodGroupRecycleLayoutManager(GridLayoutManager.VERTICAL);
// foodGroupRecycleLayoutManager.setSpanCount(foodGroupColumn);
// } else {
// setFoodGroupRecycleLayoutManager(GridLayoutManager.HORIZONTAL);
// foodGroupRecycleLayoutManager.setSpanCount(foodGroupColumn);
// }
}
@Override
......@@ -1195,7 +1200,7 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter>
@Override
public void initLayoutVisible() {
if (BaseOrder.isCurrentOrderType(FoodSummaryConstans.RESTAURANT_MODE) && DoshokuOrder.getInstance().isModifyOrder()) {
if (BaseOrder.isTableToMeal() && DoshokuOrder.getInstance().isModifyOrder()) {
//修改訂單隱藏送單功能
fl_send_order.setVisibility(View.GONE);
}
......
......@@ -195,9 +195,9 @@ public class OrderContentActivity extends BaseFragmentActivity<OrderContentPrese
mPresenter.initTopFunctionData();
mPresenter.initAdapter();
mPresenter.initItemListener();
initTopInfo(BaseOrder.orderType);
initTopInfo();
initOrderBill(mPresenter.getFoodTotal(), mPresenter.getTotalAmount());
if (BaseOrder.isCurrentOrderType(FoodSummaryConstans.RESTAURANT_MODE) && !DoshokuOrder.getInstance().isModifyOrder()) {
if (BaseOrder.isTableToMeal() && !DoshokuOrder.getInstance().isModifyOrder()) {
//根据倒计时时间自动退出当前页面
initAutoQuit();
}
......@@ -215,8 +215,13 @@ public class OrderContentActivity extends BaseFragmentActivity<OrderContentPrese
tv_total.setText("$" + totalAmount);
}
private void initTopInfo(int orderType) {
if (orderType == FoodSummaryConstans.RESTAURANT_MODE) {
private void initTopInfo() {
if (BaseOrder.isCurrentOrderType(FoodSummaryConstans.TAKEAWAY_TYPE)) {
btn_table.setText("外賣");
btn_people_num.setText("1");
tv_time.setText("時間:" + TimeUtils.getCurrentDate(TimeUtils.DATE_FORMAT_DATE_HM));
tv_server_main.setText("");
} else {
TableBean.DataBean tableInfo = mDoshokuOrder.getOpenTableInfo();
Date dd = mDoshokuOrder.getOpenTableTime();
String openTime = String.format("%tH:%tM", dd, dd);
......@@ -230,11 +235,6 @@ public class OrderContentActivity extends BaseFragmentActivity<OrderContentPrese
btn_people_num.setText(tableInfo.getPerson() + "");
tv_time.setText("時間:" + openTime);
tv_server_main.setText(GsaCloudApplication.getMemberName());
} else if (orderType == FoodSummaryConstans.TAKEAWAY_TYPE) {
btn_table.setText("外賣");
btn_people_num.setText("1");
tv_time.setText("時間:" + TimeUtils.getCurrentDate(TimeUtils.DATE_FORMAT_DATE_HM));
tv_server_main.setText("");
}
}
......
......@@ -118,13 +118,6 @@ public class OrderPayActivity extends BaseActivity<OrderPayPresenter> implements
context.startActivity(intent);
}
public static void startOrderPayActivityFormRefund(Context context, String response) {
Intent intent = new Intent(context, OrderPayActivity.class);
intent.setAction("REFUND_RESP");
intent.putExtra("REFUND_DATA", response);
context.startActivity(intent);
}
@Override
public void setupActivityComponent(@NonNull AppComponent appComponent) {
DaggerOrderPayComponent //如找不到该类,请编译一下项目
......
......@@ -13,10 +13,9 @@ import android.widget.SimpleAdapter;
import android.widget.TextView;
import com.billy.cc.core.component.CC;
import com.gingersoft.gsa.cloud.base.order.order.BaseOrder;
import com.gingersoft.gsa.cloud.base.table.bean.TableBean;
import com.gingersoft.gsa.cloud.base.utils.log.LogUtil;
import com.gingersoft.gsa.cloud.constans.FoodSummaryConstans;
import com.gingersoft.gsa.cloud.logan.LoganUtils;
import com.gingersoft.gsa.cloud.table.R;
import com.gingersoft.gsa.cloud.table.R2;
import com.gingersoft.gsa.cloud.table.di.component.DaggerTableComponent;
......@@ -58,7 +57,6 @@ import java.util.Map;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.DefaultItemAnimator;
......@@ -226,6 +224,7 @@ public class TableActivity extends BaseFragmentActivity<TablePresenter> implemen
.addParam("fromPage", 2)
.build()
.call();
LoganUtils.uploadLog(mContext,true);
}
});
mTopBar.setTitle("餐檯模式");
......@@ -382,7 +381,6 @@ public class TableActivity extends BaseFragmentActivity<TablePresenter> implemen
@Override
public void startMealStandActivity() {
BaseOrder.orderType = FoodSummaryConstans.RESTAURANT_MODE;
startActivity(new Intent(this, MealStandActivity.class));
}
......
......@@ -9,6 +9,7 @@ import android.widget.TextView;
import com.gingersoft.gsa.cloud.base.order.billItem.BillOrderMoney;
import com.gingersoft.gsa.cloud.base.order.billItem.BillItem;
import com.gingersoft.gsa.cloud.base.order.billItem.ServiceChargeItem;
import com.gingersoft.gsa.cloud.table.R;
import com.gingersoft.gsa.cloud.table.R2;
import com.gingersoft.gsa.cloud.table.mvp.ui.activity.OrderContentActivity;
......@@ -96,7 +97,7 @@ public class BillItemAdapter extends DefaultAdapter<BillItem> {
tv_money.setText(cashStr + datasBean.getMoney());
}
if (datasBean.getType() == BillOrderMoney.SERVERCHARGE_TYPE) {
if (datasBean instanceof ServiceChargeItem) {
if (isUseFreeServicePayMethod) {
// 中划线
tv_title.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);
......
......@@ -152,8 +152,6 @@ public class TableAdapter extends DefaultAdapter<TableBean.DataBean> {
int person = 0;
if (item.getPerson() != 0) {
person = item.getPerson();
} else {
person = item.getSeatCount();
}
tv_people.setVisibility(View.VISIBLE);
tv_people.setText(person + "人");
......
......@@ -5,7 +5,9 @@ import android.graphics.Color;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import com.gingersoft.gsa.cloud.app.GsaCloudApplication;
import com.gingersoft.gsa.cloud.database.bean.Discount;
import com.gingersoft.gsa.cloud.table.R;
......@@ -14,7 +16,9 @@ import com.gingersoft.gsa.cloud.ui.view.BeveLabelView;
import com.jess.arms.base.BaseHolder;
import com.jess.arms.base.DefaultAdapter;
import com.jess.arms.utils.ArmsUtils;
import java.util.List;
import butterknife.BindView;
/**
......@@ -56,6 +60,8 @@ public class DiscountAdapter extends DefaultAdapter<Discount> {
class DiscountItemHolder extends BaseHolder<Discount> {
@BindView(R2.id.rl_container)
FrameLayout rl_container;
@BindView(R2.id.tv_name)
TextView tv_name;
@BindView(R2.id.blv_soldout)
......@@ -92,10 +98,10 @@ public class DiscountAdapter extends DefaultAdapter<Discount> {
private void setColor(Discount datasBean) {
String colorRes = datasBean.getColor();
if (!TextUtils.isEmpty(colorRes) && colorRes.startsWith("#")) {
tv_name.setBackgroundColor(Color.parseColor(colorRes));
rl_container.setBackgroundColor(Color.parseColor(colorRes));
} else {
int color = ArmsUtils.getColor(mContext, R.color.light_blue_900);
tv_name.setBackgroundColor(color);
rl_container.setBackgroundColor(color);
}
int fontColor = ArmsUtils.getColor(mContext, R.color.theme_white_color);
tv_name.setTextColor(fontColor);
......
......@@ -195,10 +195,20 @@ public class SelectMealAdapter extends DefaultAdapter<OrderDetail> {
tv_discount_money.setVisibility(View.INVISIBLE);
if (datasBean.isModify()) {
if (datasBean.getType() == OrderDetail.MODIFIER_TYPE) {
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) tv_number.getLayoutParams();
layoutParams.rightMargin = ArmsUtils.getDimens(mContext,R.dimen.dp_15);
tv_number.setLayoutParams(layoutParams);
}
tv_modify_before_number.setText(String.valueOf(datasBean.getModifyBeforeNumber()));
tv_modify_before_number.setVisibility(View.VISIBLE);
} else {
tv_modify_before_number.setVisibility(View.INVISIBLE);
if (datasBean.getType() == OrderDetail.MODIFIER_TYPE) {
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) tv_number.getLayoutParams();
layoutParams.rightMargin = 0;
tv_number.setLayoutParams(layoutParams);
}
}
}
......@@ -632,8 +642,9 @@ public class SelectMealAdapter extends DefaultAdapter<OrderDetail> {
* @return
*/
private boolean hasChild3Food(OrderDetail orderDetail) {
if (orderDetail.getItemType() == 3)
if (orderDetail.getItemType() == 3) {
return false;
}
for (int i = 0; i < mInfos.size(); i++) {
if (mInfos.get(i).getItemType() == 3 && mInfos.get(i).getParentIndex() == orderDetail.getMyIndex()) {
return true;
......@@ -643,8 +654,9 @@ public class SelectMealAdapter extends DefaultAdapter<OrderDetail> {
}
public boolean hasChildFood(OrderDetail orderDetail) {
if (orderDetail.getItemType() == 3)
if (orderDetail.getItemType() == 3) {
return false;
}
for (int i = 0; i < mInfos.size(); i++) {
if (mInfos.get(i).getParentIndex() == orderDetail.getMyIndex()) {
return true;
......
......@@ -71,8 +71,6 @@ public class UseMemberDialog extends Dialog {
private MemberInfoAdapter mMemberInfoAdapter;
private List<SectionTextItem> mMemberInfoList;
private MemberInfo memberInfo;
public UseMemberDialog(Context context) {
super(context, R.style.QMUI_BottomSheet);
......@@ -206,7 +204,6 @@ public class UseMemberDialog extends Dialog {
public UseMemberDialog build() {
View contentView = buildViews();
setContentView(contentView, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, (int) (QMUIDisplayHelper.getScreenHeight(mContext) * 0.65)));
updateMemberInfo(memberInfo);
return this;
}
......@@ -297,7 +294,7 @@ public class UseMemberDialog extends Dialog {
};
}
public void updateMemberInfo(MemberInfo memberInfo) {
public void setMemberInfo(MemberInfo memberInfo) {
if (memberInfo != null) {
if (mMemberInfoList == null) {
mMemberInfoList = new ArrayList<>();
......@@ -340,9 +337,6 @@ public class UseMemberDialog extends Dialog {
btn_scan.setVisibility(!show ? View.VISIBLE : View.GONE);
}
public void setMemberInfo(MemberInfo memberInfo) {
this.memberInfo = memberInfo;
}
private String getTvPhone() {
return ed_phone.getText().toString();
......
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
<com.qmuiteam.qmui.alpha.QMUIAlphaFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/rl_container"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:padding="@dimen/dp_6">
<com.gingersoft.gsa.cloud.ui.view.BeveLabelView
android:id="@+id/blv_soldout"
......@@ -20,17 +21,14 @@
<com.qmuiteam.qmui.alpha.QMUIAlphaTextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="1px"
android:layout_marginRight="1px"
android:gravity="center"
android:padding="@dimen/dp_2"
android:text="food"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="@color/theme_white_color"
android:textSize="@dimen/sp_16" />
</FrameLayout>
</com.qmuiteam.qmui.alpha.QMUIAlphaFrameLayout>
......@@ -183,7 +183,7 @@
android:text="30"
android:textColor="@color/orange_200"
android:textSize="@dimen/sp_16"
android:visibility="gone" />
android:visibility="visible" />
<TextView
android:id="@+id/tv_number"
......@@ -194,5 +194,4 @@
android:text="20"
android:textColor="@color/theme_black"
android:textSize="@dimen/sp_20" />
</RelativeLayout>
\ No newline at end of file
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