Commit ecc42b4a by Wyh

Merge remote-tracking branch 'origin/dev' into dev

# Conflicts:
#	base-module/src/main/java/com/gingersoft/gsa/cloud/app/GsaCloudApplication.java
#	base-module/src/main/java/com/gingersoft/gsa/cloud/config/globalconfig/applyOptions/MyGlobalHttpHandler.java
#	table-module/src/main/java/com/gingersoft/gsa/cloud/table/mvp/ui/adapter/BillItemAdapter.java
parents 9ed1d78e 17ab71e1
<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.jess.arms"
>
<manifest package="com.jess.arms">
</manifest>
......@@ -48,8 +48,11 @@ import com.jess.arms.mvp.IView;
import java.io.File;
import java.lang.reflect.Field;
import java.security.MessageDigest;
import java.text.NumberFormat;
import java.util.List;
import java.util.Locale;
import java.util.UUID;
/**
* ================================================
......@@ -648,11 +651,6 @@ public class DeviceUtils {
context.startActivity(intent);
}
public static String getIMEI(Context context) {
TelephonyManager tel = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
return tel.getDeviceId();
}
public static String getPhoneType() {
return Build.MODEL;
}
......@@ -873,6 +871,164 @@ public class DeviceUtils {
}
/**
* 获得设备硬件标识
*
* @param context 上下文
* @return 设备硬件标识
*/
public static String getDeviceId(Context context) {
StringBuilder sbDeviceId = new StringBuilder();
//获得设备默认IMEI(>=6.0 需要ReadPhoneState权限)
String imei = getIMEI(context);
//获得AndroidId(无需权限)
String androidid = getAndroidId(context);
//获得设备序列号(无需权限)
String serial = getSERIAL();
//获得硬件uuid(根据硬件相关属性,生成uuid)(无需权限)
String uuid = getDeviceUUID().replace("-", "");
//追加imei
if (imei != null && imei.length() > 0) {
sbDeviceId.append(imei);
sbDeviceId.append("|");
}
//追加androidid
if (androidid != null && androidid.length() > 0) {
sbDeviceId.append(androidid);
sbDeviceId.append("|");
}
//追加serial
if (serial != null && serial.length() > 0) {
sbDeviceId.append(serial);
sbDeviceId.append("|");
}
//追加硬件uuid
if (uuid != null && uuid.length() > 0) {
sbDeviceId.append(uuid);
}
//生成SHA1,统一DeviceId长度
if (sbDeviceId.length() > 0) {
try {
byte[] hash = getHashByString(sbDeviceId.toString());
String sha1 = bytesToHex(hash);
if (sha1 != null && sha1.length() > 0) {
//返回最终的DeviceId
return sha1;
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
//如果以上硬件标识数据均无法获得,
//则DeviceId默认使用系统随机数,这样保证DeviceId不为空
return UUID.randomUUID().toString().replace("-", "");
}
//需要获得READ_PHONE_STATE权限,>=6.0,默认返回null
private static String getIMEI(Context context) {
try {
TelephonyManager tm = (TelephonyManager)
context.getSystemService(Context.TELEPHONY_SERVICE);
return tm.getDeviceId();
} catch (Exception ex) {
ex.printStackTrace();
}
return "";
}
/**
* 获得设备的AndroidId
*
* @param context 上下文
* @return 设备的AndroidId
*/
private static String getAndroidId(Context context) {
try {
return Settings.Secure.getString(context.getContentResolver(),
Settings.Secure.ANDROID_ID);
} catch (Exception ex) {
ex.printStackTrace();
}
return "";
}
/**
* 获得设备序列号(如:WTK7N16923005607), 个别设备无法获取
*
* @return 设备序列号
*/
private static String getSERIAL() {
try {
return Build.SERIAL;
} catch (Exception ex) {
ex.printStackTrace();
}
return "";
}
/**
* 获得设备硬件uuid
* 使用硬件信息,计算出一个随机数
*
* @return 设备硬件uuid
*/
private static String getDeviceUUID() {
try {
String dev = "3883756" +
Build.BOARD.length() % 10 +
Build.BRAND.length() % 10 +
Build.DEVICE.length() % 10 +
Build.HARDWARE.length() % 10 +
Build.ID.length() % 10 +
Build.MODEL.length() % 10 +
Build.PRODUCT.length() % 10 +
Build.SERIAL.length() % 10;
return new UUID(dev.hashCode(),
Build.SERIAL.hashCode()).toString();
} catch (Exception ex) {
ex.printStackTrace();
return "";
}
}
/**
* 取SHA1
* @param data 数据
* @return 对应的hash值
*/
private static byte[] getHashByString(String data)
{
try{
MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
messageDigest.reset();
messageDigest.update(data.getBytes("UTF-8"));
return messageDigest.digest();
} catch (Exception e){
return "".getBytes();
}
}
/**
* 转16进制字符串
* @param data 数据
* @return 16进制字符串
*/
private static String bytesToHex(byte[] data){
StringBuilder sb = new StringBuilder();
String stmp;
for (int n = 0; n < data.length; n++){
stmp = (Integer.toHexString(data[n] & 0xFF));
if (stmp.length() == 1)
sb.append("0");
sb.append(stmp);
}
return sb.toString().toUpperCase(Locale.CHINA);
}
}
......@@ -152,12 +152,16 @@ 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'
//美團金剛狼日誌框架
implementation rootProject.ext.dependencies['logan']
//RecyclerView 流式佈局layoutManager
api 'com.google.android:flexbox:1.0.0'
// 用于生成Java文件的库
// implementation 'com.squareup:javapoet:1.13.0'
// implementation 'com.google.auto.service:auto-service:1.0-rc6'
// annotationProcessor 'com.google.auto.service:auto-service:1.0-rc6'
api rootProject.ext.dependencies["permissionx"]
api rootProject.ext.dependencies["design"]
......@@ -172,7 +176,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 sResturantInfoManager = null;
/**
* 品牌信息
*/
private BrandInfo brandInfo;
/**
* 餐廳信息
*/
private RestaurantInfo restaurantInfo;
private ResturantInfoManager() {
}
public static ResturantInfoManager newInstance() {
if (sResturantInfoManager == null) {
synchronized (ResturantInfoManager.class) {
if (sResturantInfoManager == null) {
sResturantInfoManager = new ResturantInfoManager();
}
}
}
return sResturantInfoManager;
}
public void putResturantInfo(RestaurantInfo info) {
SPUtils.put(UserConstans.gsPosShopId, info.getGsPosShopId());
SPUtils.put(UserConstans.restaurantId, info.getRestaurantId());
SPUtils.put(UserConstans.restaurantName, info.getRestaurantName());
}
public void putBrandInfo(BrandInfo info) {
SPUtils.put(UserConstans.brandId, info.getBrandId());
SPUtils.put(UserConstans.brandName, info.getBrandName());
}
public void removeResturantInfo() {
SPUtils.remove(UserConstans.gsPosShopId);
SPUtils.remove(UserConstans.restaurantId);
SPUtils.remove(UserConstans.restaurantName);
}
public void removeBrandInfo() {
SPUtils.remove(UserConstans.gsPosShopId);
SPUtils.remove(UserConstans.restaurantId);
SPUtils.remove(UserConstans.restaurantName);
}
}
package com.gingersoft.gsa.cloud.constans;
package com.gingersoft.gsa.cloud.account.user;
/**
* Created by Wyh on 2019/12/21.
*/
public class UserConstans {
public final static String IS_LOGIN = "is_login";
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 +26,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.restaurant.ResturantInfoManager;
import com.gingersoft.gsa.cloud.account.user.info.UserInfo;
import com.gingersoft.gsa.cloud.account.user.state.LoginedState;
import com.gingersoft.gsa.cloud.account.user.state.LogoutState;
import com.gingersoft.gsa.cloud.account.user.state.UserState;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import lombok.Getter;
import lombok.Setter;
/**
* @author : bin
* @create date: 2020-11-21
* @update date: 2020-11-21
* @description:用戶接口和狀態管理類
*/
@Getter
@Setter
public class UserContext {
private static UserContext sUserContextManger = null;
/**
* 用戶狀態
*/
private UserState state = new LogoutState();
/**
* 用戶信息
*/
private UserInfo info;
private UserContext() {
}
public static UserContext newInstance() {
if (sUserContextManger == null) {
synchronized (UserContext.class) {
if (sUserContextManger == null) {
sUserContextManger = new UserContext();
}
}
}
return sUserContextManger;
}
public void logined(){
state.logined();
}
public void logOut(){
state.logOut();
}
public void toTargetPage(String componentName,String actionName){
state.toTargetPage(componentName,actionName);
}
/**
* 用戶是否登錄
* @return
*/
public boolean isLogin(){
if(state instanceof LoginedState){
return true;
}
return false;
}
public void putUserInfo(UserInfo info) {
SPUtils.put(UserConstans.token, info.getUserName());
SPUtils.put(UserConstans.memberId, info.getUserName());
SPUtils.put(UserConstans.memberName, info.getUserName());
}
public void removeUserInfo(){
SPUtils.remove(UserConstans.token);
SPUtils.remove(UserConstans.memberId);
SPUtils.remove(UserConstans.memberName);
//刪除用戶信息的同時 將品牌,餐廳信息一起刪除
ResturantInfoManager.newInstance().removeBrandInfo();
ResturantInfoManager.newInstance().removeResturantInfo();
}
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.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.state;
import com.billy.cc.core.component.CC;
import com.gingersoft.gsa.cloud.account.user.UserContext;
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 LoginedState implements UserState{
@Override
public void logined() {
//跳轉登錄頁面
CC.obtainBuilder("User.Component.Login")
.setActionName("showActivityA")
.build()
.call();
}
@Override
public void logOut() {
//設置用戶狀態為登出狀態
UserContext.newInstance().setState(new LogoutState());
UserContext.newInstance().logOut();
}
@Override
public void toTargetPage(String componentName, String actionName) {
CC.obtainBuilder(componentName)
.setActionName(actionName)
.build()
.call();
}
}
package com.gingersoft.gsa.cloud.account.user.state;
import com.billy.cc.core.component.CC;
import com.gingersoft.gsa.cloud.account.restaurant.ResturantInfoManager;
import com.gingersoft.gsa.cloud.account.user.UserConstans;
import com.gingersoft.gsa.cloud.account.user.UserContext;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.constans.PrintConstans;
/**
* @author : bin
* @create date: 2020-11-21
* @update date: 2020-11-21
* @description:未登錄狀態
*/
public class LogoutState implements UserState{
@Override
public void logined() {
//設置用戶狀態為登錄狀態
UserContext.newInstance().setState(new LoginedState());
UserContext.newInstance().logined();
}
@Override
public void logOut() {
SPUtils.put(UserConstans.IS_LOGIN, false);
UserContext.newInstance().removeUserInfo();
//关闭Prj打印服務
CC.obtainBuilder("Component.Print")
.setActionName("stopPrintService")
.build()
.call();
//跳轉登陸頁面
CC.obtainBuilder("User.Component.Login")
.setActionName("showActivityA")
.build()
.call();
}
@Override
public void toTargetPage(String componentName, String actionName) {
CC.obtainBuilder(componentName)
.setActionName(actionName)
.build()
.call();
}
}
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 logined();
/**
* 登出
*/
void logOut();
/**
* 跳轉到目標頁
* @param componentName 目標組件名
* @param actionName 目標activity名
*/
void toTargetPage(String componentName,String actionName);
}
......@@ -7,10 +7,10 @@ import android.content.pm.PackageManager;
import android.content.res.Configuration;
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.dianping.logan.OnLoganProtocolStatus;
import com.didichuxing.doraemonkit.DoraemonKit;
import com.elvishew.xlog.LogConfiguration;
import com.elvishew.xlog.LogLevel;
......@@ -31,13 +31,12 @@ 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.xlog.MyBackupStrategy;
import com.gingersoft.gsa.cloud.config.DoraemonKitConfig;
import com.gingersoft.gsa.cloud.config.expandconfig.ExpandInfoSetting;
import com.gingersoft.gsa.cloud.config.expandconfig.FunctionExtendedConfiguration;
import com.gingersoft.gsa.cloud.config.expandconfig.UIStyleExtendedConfiguration;
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.logan.LoganManager;
import com.gingersoft.gsa.cloud.ui.loadsir.CustomCallback;
import com.gingersoft.gsa.cloud.ui.loadsir.EmptyCallback;
import com.gingersoft.gsa.cloud.ui.loadsir.ErrorCallback;
......@@ -51,18 +50,24 @@ import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.footer.ClassicsFooter;
import com.scwang.smartrefresh.layout.header.ClassicsHeader;
import java.io.File;
import java.util.Locale;
import java.util.logging.LogManager;
import me.jessyan.autosize.AutoSize;
import me.jessyan.autosize.AutoSizeConfig;
import me.jessyan.autosize.onAdaptListener;
import me.jessyan.retrofiturlmanager.RetrofitUrlManager;
import com.gingersoft.gsa.cloud.config.expandconfig.UIStyleExtendedConfiguration;
import com.gingersoft.gsa.cloud.config.expandconfig.FunctionExtendedConfiguration;
import com.gingersoft.gsa.cloud.config.expandconfig.ExpandInfoSetting;
/**
* Created by Wyh on 2019/12/21.
*/
public class GsaCloudApplication extends BaseApplication {
private static final String TAG = GsaCloudApplication.class.getSimpleName();
/**
* 系统上下文
*/
......@@ -75,14 +80,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 = "";
......@@ -106,16 +103,20 @@ public class GsaCloudApplication extends BaseApplication {
@Override
public void onCreate() {
super.onCreate();
mAppContext = this;
isLogin = (boolean) SPUtils.get(PrintConstans.IS_LOGIN, false);
isLogin = (boolean) SPUtils.get(UserConstans.IS_LOGIN, false);
CC.enableVerboseLog(true);
CC.enableDebug(true);
CC.enableRemoteCC(true);
//初始化美團日誌框架
initLogan();
LoganManager.w_action(TAG, TAG + ": onCreate start.....");
//初始化服務器地址
initDomainUrl();
//初始化側滑回退
// QMUISwipeBackActivityManager.init(this);
//初始化主題管理器
......@@ -142,22 +143,32 @@ 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);
LoganManager.w_action(TAG, TAG + ": onCreate end.....");
}
/**
* 初始化美團日誌框架
*/
private void initLogan() {
com.dianping.logan.LoganConfig config = new com.dianping.logan.LoganConfig.Builder()
.setCachePath(getFilesDir().getAbsolutePath())
.setPath(getExternalFilesDir(null).getAbsolutePath()
+ File.separator + LoganConfig.FILE_NAME)
.setEncryptKey16(LoganConfig.EncryptKey16.getBytes())
.setEncryptIV16(LoganConfig.EncryptIV16.getBytes())
.build();
Logan.init(config);
Logan.setOnLoganProtocolStatus(new OnLoganProtocolStatus() {
@Override
public void loganProtocolStatus(String cmd, int code) {
LoganManager.w_code(TAG,"loganProtocolStatus: "+cmd);
}
});
}
/**
* 初始化滴滴開發,測試輔助工具哆啦A夢
*/
private void initDoraemonKit() {
DoraemonKit.install(getAppContext(), DoraemonKitConfig.PRODUCE_ID);
}
......@@ -198,7 +209,7 @@ public class GsaCloudApplication extends BaseApplication {
.addCallback(new LoadingCallback())
.addCallback(new TimeoutCallback())
.addCallback(new CustomCallback())
// .setDefaultCallback(LoadingCallback.class)//设置默认状态页 已有加載彈窗,加上這個會導致兩個加載
.setDefaultCallback(LoadingCallback.class)//设置默认状态页
.commit();
}
......@@ -241,10 +252,6 @@ public class GsaCloudApplication extends BaseApplication {
RetrofitUrlManager.getInstance().putDomain("ricepon_member", HttpsConstans.RICEPON_MEMBER_61177);
//餐廳模塊請求地址
RetrofitUrlManager.getInstance().putDomain("ricepon_restaurant", HttpsConstans.ROOT_SERVER_ADDRESS_FORMAL_RESTAURANT);
//供應商模塊請求地址
RetrofitUrlManager.getInstance().putDomain("ricepon-purchase", HttpsConstans.ROOT_SERVER_ADDRESS_RICEPON_PURCHASE);
}
private void initPrint() {
......@@ -463,7 +470,7 @@ public class GsaCloudApplication extends BaseApplication {
SPUtils.remove(UserConstans.memberName);
SPUtils.remove(UserConstans.brandRestaurantInfos);
SPUtils.remove(UserConstans.gsPosShopId);
SPUtils.put(PrintConstans.IS_LOGIN, false);
SPUtils.put(UserConstans.IS_LOGIN, false);
//关闭Prj打印服務
CC.obtainBuilder("Component.Print")
.setActionName("stopPrintService")
......
......@@ -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,7 +375,10 @@ public class MemberInfo implements Serializable {
}
public String getMemberName() {
return memberName;
if(!TextUtils.isEmpty(memberName)){
return memberName;
}
return getLevelName();
}
public void setMemberName(String 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.LoganManager;
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);
LoganManager.w_crash(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) {
......@@ -50,6 +50,7 @@ public class LogUtil {
//剩余部分
d(TAG, msg);
}
public static void d(String tagName, String msg) {
if (isPrintLog && msg != null) {
int strLength = msg.length();
......
......@@ -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:8082/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());
}
......
package com.gingersoft.gsa.cloud.config.globalconfig.applyOptions;
import com.gingersoft.gsa.cloud.app.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.BuildConfig;
import com.gingersoft.gsa.cloud.base.utils.encryption.Aes;
import com.gingersoft.gsa.cloud.constans.AppConstans;
import com.jess.arms.http.GlobalHttpHandler;
......@@ -15,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) {
......@@ -26,36 +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");
builder.set("uid", GsaCloudApplication.getMemberId() + "");
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);
} else if (BuildConfig.DEBUG) {
builder.set("uuid", "999");
}
// 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.LoganManager;
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());
LoganManager.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.LoganManager;
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}",
LoganManager.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",
LoganManager.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",
response.request().url(),
responseBody.string(),
(t2 - t1) / 1e6d,
response.headers()
));
LoganManager.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.LoganManager;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
......@@ -20,8 +21,11 @@ import io.reactivex.schedulers.Schedulers;
@SuppressLint("NewApi")
public class MyActivityLifecycle implements Application.ActivityLifecycleCallbacks {
private static final String TAG = MyActivityLifecycle.class.getSimpleName();
@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
LoganManager.w_action(TAG, TAG + ": onActivityCreated");
// EventBus.getDefault().register(activity);
if (!activity.getIntent().getBooleanExtra("isInitToolbar", false)) {
//由于加强框架的兼容性,故将 setContentView 放到 onActivityCreated 之后,onActivityStarted 之前执行
......@@ -34,11 +38,13 @@ public class MyActivityLifecycle implements Application.ActivityLifecycleCallbac
@Override
public void onActivityStarted(Activity activity) {
LoganManager.w_action(TAG, TAG + ": onActivityStarted");
}
@Override
public void onActivityResumed(Activity activity) {
String name = activity.getClass().getSimpleName();
LoganManager.w_action(TAG, TAG + ": onActivityResumed");
if (name.equals("NewMainActivity")) {
Observable.create(new ObservableOnSubscribe<Void>() {
......@@ -71,19 +77,22 @@ public class MyActivityLifecycle implements Application.ActivityLifecycleCallbac
@Override
public void onActivityPaused(Activity activity) {
LoganManager.w_action(TAG, TAG + ": onActivityPaused");
}
@Override
public void onActivityStopped(Activity activity) {
// GsaCloudApplication.getAppContext().setCurrentActivity(null);
LoganManager.w_action(TAG, TAG + ": onActivityStopped");
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
LoganManager.w_action(TAG, TAG + ": onActivitySaveInstanceState");
}
@Override
public void onActivityDestroyed(Activity activity) {
LoganManager.w_action(TAG, TAG + ": onActivityDestroyed");
// EventBus.getDefault().unregister(activity);
//横竖屏切换或配置改变时, Activity 会被重新创建实例, 但 Bundle 中的基础数据会被保存下来,移除该数据是为了保证重新创建的实例可以正常工作
activity.getIntent().removeExtra("isInitToolbar");
......
......@@ -19,7 +19,6 @@ public class MyAppLifecycles implements AppLifecycles {
@Override
public void onCreate(Application application) {
// initTimber();
initLeakCanary(application);
initFragmentation();
// initARouter(application);
......@@ -69,13 +68,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.content.Context;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import com.gingersoft.gsa.cloud.logan.LoganManager;
@SuppressLint("NewApi")
public class MyFragmentLifecycle extends FragmentManager.FragmentLifecycleCallbacks {
private static final String TAG = MyFragmentLifecycle.class.getSimpleName();
@Override
public void onFragmentAttached(@NonNull FragmentManager fm, @NonNull Fragment f, @NonNull Context context) {
LoganManager.w_action(TAG, TAG + ": onFragmentAttached");
}
@Override
public void onFragmentCreated(@NonNull FragmentManager fm, @NonNull Fragment f, @Nullable Bundle savedInstanceState) {
LoganManager.w_action(TAG, TAG + ": onFragmentCreated");
}
@Override
public void onFragmentActivityCreated(@NonNull FragmentManager fm, @NonNull Fragment f,
@Nullable Bundle savedInstanceState) {
LoganManager.w_action(TAG, TAG + ": onFragmentActivityCreated");
}
@Override
public void onFragmentViewCreated(@NonNull FragmentManager fm, @NonNull Fragment f,
@NonNull View v, @Nullable Bundle savedInstanceState) {
LoganManager.w_action(TAG, TAG + ": onFragmentViewCreated");
}
@Override
public void onFragmentStarted(@NonNull FragmentManager fm, @NonNull Fragment f) {
LoganManager.w_action(TAG, TAG + ": onFragmentStarted");
}
@Override
public void onFragmentResumed(@NonNull FragmentManager fm, @NonNull Fragment f) {
LoganManager.w_action(TAG, TAG + ": onFragmentResumed");
}
@Override
public void onFragmentPaused(@NonNull FragmentManager fm, @NonNull Fragment f) {
LoganManager.w_action(TAG, TAG + ": onFragmentPaused");
}
@Override
public void onFragmentStopped(@NonNull FragmentManager fm, @NonNull Fragment f) {
LoganManager.w_action(TAG, TAG + ": onFragmentStopped");
}
@Override
public void onFragmentSaveInstanceState(@NonNull FragmentManager fm, @NonNull Fragment f,
@NonNull Bundle outState) {
LoganManager.w_action(TAG, TAG + ": onFragmentSaveInstanceState");
}
@Override
public void onFragmentViewDestroyed(@NonNull FragmentManager fm, @NonNull Fragment f) {
LoganManager.w_action(TAG, TAG + ": onFragmentViewDestroyed");
}
@Override
public void onFragmentDestroyed(@NonNull FragmentManager fm, @NonNull Fragment f) {
LoganManager.w_action(TAG, TAG + ": onFragmentDestroyed");
}
@Override
public void onFragmentDetached(@NonNull FragmentManager fm, @NonNull Fragment f) {
LoganManager.w_action(TAG, TAG + ": onFragmentDetached");
}
}
......@@ -77,11 +77,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;
//--------------------------------------配置-----------------------------------------------------------------------------------
/**
......@@ -146,6 +156,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;
......@@ -159,6 +170,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:
//預發佈
......@@ -173,6 +185,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;
......@@ -183,6 +196,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;
......@@ -193,6 +207,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;
......@@ -203,6 +218,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;
......
......@@ -5,7 +5,6 @@ public class PrintConstans {
public static final int PRINT_TIMEOUT = 5 * 1000;//打印機連接超時時間
//默認打印方式
public final static String DEFAULT_PRINT_METHOD = "default_print";
public final static String IS_LOGIN = "is_login";
public final static String LOCAL_PRINT = "local_print";
public final static String IP_PRINT = "ip_print";
public final static String SETTLEMENT_REPORT = "settlement_report";
......
package com.gingersoft.gsa.cloud.function;
import com.gingersoft.gsa.cloud.database.bean.Function;
import java.util.List;
/**
* @author : bin
* @create date: 2020-11-23
* @update date: 2020-11-23
* @description:定義所有功能列表的操作
*/
public interface XFunctionAction {
List<Function> getFunctionItems(String targetResKey);
Function getFunctionItem(String targetResKey);
void updateFunctions(List<Function> functions);
}
package com.gingersoft.gsa.cloud.function;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author : bin
* @create date: 2020-11-21
* @update date: 2020-11-21
* @description:標識單個功能是否顯示,如:
*
* @BindView(R2.id.btn_send_order)
* Button btn_send_order;
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface XFunctionItem {
String [] value();
}
package com.gingersoft.gsa.cloud.function;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author : bin
* @create date: 2020-11-21
* @update date: 2020-11-21
* @description: 標識所在的頁面RecycleView,GridView等功能組數據源,如NewMainActivity頁面下有多個RecycleView
* * 每個RecycleView就是一個{@link XFunctionItems}}
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface XFunctionItems {
String [] value();
}
package com.gingersoft.gsa.cloud.function;
import com.gingersoft.gsa.cloud.account.user.info.UserInfo;
import com.gingersoft.gsa.cloud.account.user.state.LogoutState;
import com.gingersoft.gsa.cloud.account.user.state.UserState;
import com.gingersoft.gsa.cloud.database.bean.Function;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author : bin
* @create date: 2020-11-23
* @update date: 2020-11-23
* @description:
*/
public class XFunctionManager implements XFunctionAction {
private static XFunctionManager sXFunctionManager = null;
/**
* 所有功能數據
*/
private HashMap<String, Function> mFunctionMap = new HashMap<>();
private XFunctionManager() {
}
public static XFunctionManager newInstance() {
if (sXFunctionManager == null) {
sXFunctionManager = new XFunctionManager();
}
return sXFunctionManager;
}
@Override
public List<Function> getFunctionItems(String targetResKey) {
List<Function> functions = new ArrayList<>();
if (mFunctionMap.size() == 0) {
return functions;
}
Iterator entries = mFunctionMap.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry entry = (Map.Entry) entries.next();
String resUrl = (String) entry.getKey();
//獲取具體的功能組,如table/bottom/init下的table/bottom組
String[] keyRes = resUrl.split("/");
if (keyRes.length > 1) {
resUrl = resUrl.substring(0, keyRes[keyRes.length - 1].length());
if(resUrl.equals(targetResKey)){
/**
* 匹配功能組成功{@link XFunctionItems}
*/
Function item = (Function) entry.getValue();
functions.add(item) ;
}
}
}
return functions;
}
@Override
public Function getFunctionItem(String targetResKey) {
if (mFunctionMap.size() == 0) {
return null;
}
Iterator entries = mFunctionMap.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry entry = (Map.Entry) entries.next();
String resUrl = (String) entry.getKey();
if (targetResKey.equals(resUrl)) {
/**
* 匹配單個功能成功{@link XFunctionItem}
*/
Function item = (Function) entry.getValue();
return item;
}
}
return null;
}
@Override
public void updateFunctions(List<Function> functions) {
if (functions == null) {
return;
}
if (mFunctionMap.size() > 0) {
mFunctionMap.clear();
}
for (Function function : functions) {
mFunctionMap.put(function.getResUrl(), function);
}
}
}
package com.gingersoft.gsa.cloud.function;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.TypeSpec;
import org.openjdk.javax.annotation.processing.AbstractProcessor;
import org.openjdk.javax.annotation.processing.ProcessingEnvironment;
import org.openjdk.javax.annotation.processing.Processor;
import org.openjdk.javax.annotation.processing.RoundEnvironment;
import org.openjdk.javax.lang.model.SourceVersion;
import org.openjdk.javax.lang.model.element.Element;
import org.openjdk.javax.lang.model.element.ElementKind;
import org.openjdk.javax.lang.model.element.Modifier;
import org.openjdk.javax.lang.model.element.TypeElement;
import java.util.Set;
/**
* @author : bin
* @create date: 2020-11-22
* @update date: 2020-11-22
* @description:
*/
//@AutoService(Processor.class)
public class XFunctionProcessor extends AbstractProcessor {
// 2
@Override
public synchronized void init(ProcessingEnvironment env) {
}
// 3
@Override
public boolean process(Set<? extends TypeElement> annoations, RoundEnvironment roundEnv) {
// for (Element element : roundEnv.getElementsAnnotatedWith(XFunctionComponent.class)) {
// if (element.getKind() != ElementKind.CLASS) {
// continue;
//// }
/**
* 遍歷所有組件註解
*/
// for (Element element2 : roundEnv.getElementsAnnotatedWith(XFunctionPage.class)) {
// if (element2.getKind() != ElementKind.CLASS) {
// continue;
// }
/**
* 遍歷所有Activity、Fragment、Dialog等頁面註解
*/
// for (Element element3 : roundEnv.getElementsAnnotatedWith(XFunctionItems.class)) {
// if (element3.getKind() != ElementKind.METHOD) {
// continue;
// }
// /**
// * 遍歷所有RecycleView,GridView等功能組註解
// */
//
// }
// for (Element element4 : roundEnv.getElementsAnnotatedWith(XFunctionItem.class)) {
// if (element4.getKind() != ElementKind.METHOD) {
// continue;
// }
// /**
// * 遍歷所有button,textview等單個功能註解
// */
//
// }
// }
// }
return true;
}
// 4
@Override
public Set<String> getSupportedAnnotationTypes() {
return null;
}
// 5
@Override
public SourceVersion getSupportedSourceVersion() {
return null;
}
}
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.OnLoganProtocolStatus;
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;
import com.qmuiteam.qmui.util.QMUIDeviceHelper;
/**
* @author : bin
* @create date: 2020-11-21
* @update date: 2020-11-21
* @description:
*/
public class LoganManager {
private static final String TAG = LoganManager.class.getSimpleName();
public static void w_code(String TAG, String log) {
Logan.w(log, LoganConfig.CODE_LEVLE);
printLog(TAG, log);
}
public static void w_action(String TAG, String log) {
Logan.w(log, LoganConfig.ACTION_LEVLE);
printLog(TAG, log);
}
public static void w_network(String log) {
Logan.w(log, LoganConfig.NETWORK_LEVLE);
//網絡日誌比較重要立即寫入本地
// Logan.f();
// printLog("Network", log);
}
public static void w_crash(String log) {
Logan.w(log, LoganConfig.CRASH_LEVLE);
//cash日誌比較重要立即寫入本地
Logan.f();
printLog("AppCrashHandler", 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 TAG, String log) {
if (BuildConfig.DEBUG) {
LogUtil.d(TAG, log);
}
}
/**
* 上傳日誌到服務器
*/
public static void uploadLog(Context context, boolean showToast) {
String memberId = GsaCloudApplication.getMemberName() + "_" + GsaCloudApplication.getMemberId();
String deviceId = DeviceUtils.getDeviceId(GsaCloudApplication.getAppContext());
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);
}
});
}
}
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) {
//積分支付
......@@ -551,7 +555,7 @@ public class OrderPayView extends LinearLayout {
* @param payMethod
* @param memberIntegral 會員積分
* @param memberPointRedeemCash 積分兌換現金比率
* @param paymentDifference 還差多少錢
* @param paymentDifference 還差多少錢
* @param addPayMethod 新增積分支付
* @return
*/
......@@ -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
......
......@@ -103,6 +103,7 @@ ext {
// "fragmentation-core" : "me.yokeyword:fragmentation-core:${version["fragmentationVersion"]}",
// "fragmentation-swipeback" : "me.yokeyword:fragmentation-swipeback:${version["fragmentationVersion"]}",
"constraintlayout" : "androidx.constraintlayout:constraintlayout:1.1.3",//constraintlayout約束佈局
"javapoet" : "com.squareup:javapoet:1.11.1",
//test
"junit" : "junit:junit:4.12",
......
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;
......
......@@ -4,6 +4,7 @@ import android.app.Activity;
import android.app.Application;
import android.content.Intent;
import com.gingersoft.gsa.cloud.account.user.UserConstans;
import com.gingersoft.gsa.cloud.app.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.utils.gson.GsonUtils;
import com.gingersoft.gsa.cloud.base.utils.okhttpUtils.OkHttp3Utils;
......@@ -97,7 +98,7 @@ public class BaseLoginPresenter<M extends BaseLoginContract.Model, V extends Bas
public void onNext(@NonNull LoginBean info) {
if (info.isSuccess()) {
GsaCloudApplication.isLogin = true;
SPUtils.put(PrintConstans.IS_LOGIN, true);
SPUtils.put(UserConstans.IS_LOGIN, true);
GsaCloudApplication.userName = info.getData().getUser().getUserName();
mRootView.showMessage("登陸成功");
mRootView.loginSuccess(info);
......
......@@ -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;
......@@ -625,7 +626,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;
......
......@@ -17,7 +17,6 @@ import com.gingersoft.gsa.cloud.table.mvp.model.bean.response.BaseOrderResponse;
import com.gingersoft.gsa.cloud.database.bean.Food;
import com.gingersoft.gsa.cloud.database.utils.FoodDaoUtils;
import com.gingersoft.gsa.cloud.table.mvp.contract.MealStandContract;
import com.gingersoft.gsa.cloud.table.mvp.model.bean.FoodReason;
import com.gingersoft.gsa.cloud.table.mvp.model.service.MealService;
import com.gingersoft.gsa.cloud.table.mvp.model.service.MemberService;
import com.gingersoft.gsa.cloud.table.mvp.model.service.OrderPayService;
......
......@@ -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() + " 無法使用此折扣");
......
package com.gingersoft.gsa.cloud.table.mvp.model.function;
import com.gingersoft.gsa.cloud.function.FModule;
import com.gingersoft.gsa.cloud.table.R;
/**
* @author : bin
* @create date: 2020-11-21
* @update date: 2020-11-21
* @description:
*/
public class TableFunctionFactory {
/**
* 餐檯頁
*/
public static final FModule[] bottom = {
new FModule("table/bottom/init", R.mipmap.table_init, 0),
new FModule("table/bottom/initSkyorder", R.mipmap.table_paper, 0),
new FModule("table/bottom/move", R.mipmap.table_move, 0),
new FModule("table/bottom/skyorder", 0, 0),
new FModule("table/bottom/splite", R.mipmap.table_splite, 0),
new FModule("table/bottom/parper", R.mipmap.table_paper, 0),
};
}
......@@ -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();
}
}
......@@ -941,7 +951,7 @@ public abstract class BaseOrderPresenter<M extends BaseOrderContract.Model, V ex
setChildScAbleByMainAble(newFoodList);
setChildDiscountByMainAblediscount(newFoodList);
TableBean.DataBean tableBean = mDoshokuOrder.getOpenTableInfo();
TableBean.DataBean tableBean = mDoshokuOrder.getOpenTableInfo();
int restaurantId = GsaCloudApplication.getRestaurantId();
CreateOrderRequest request = new CreateOrderRequest();
......@@ -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) {
OrderPayView orderPayView = IActivity.getGsaPayView();
if (orderPayView != null) {
orderPayView.updateOrderPay(getTotalAmount());
}
//更新服務費中劃線
mBillItemAdapter.setFreeServiceStauts(useFreeServicePayMethod);
//更新總金額
updateBillInfo();
updateBillInfo(new UpdateBillInfoEndListener() {
@Override
public void onUpdateEnd() {
OrderPayView orderPayView = IActivity.getGsaPayView();
if (orderPayView != null) {
orderPayView.updateOrderPay(getTotalAmount());
}
}
});
}
/**
......
......@@ -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 = "";
......
......@@ -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.LoganManager;
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();
LoganManager.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));
}
......
......@@ -7,8 +7,8 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.gingersoft.gsa.cloud.base.order.billItem.BillItem;
import com.gingersoft.gsa.cloud.base.order.billItem.BillOrderMoney;
import com.gingersoft.gsa.cloud.base.order.billItem.BillItem;
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 +96,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