Commit 97c4767f by Wyh

8.07 1、是否打印賬單上問題 2、報警推送內容優化 3、心跳斷開報警優化 3、套餐不能打印PRJ問題 4、賬單印單打印多張功能…

8.07 1、是否打印賬單上問題 2、報警推送內容優化 3、心跳斷開報警優化 3、套餐不能打印PRJ問題 4、賬單印單打印多張功能 5、歷史訂單詳情顯示多種支付方式 6、加入lalamove配送方式 7、打印機默認字體大小調整 8、針式打印流程優化

Signed-off-by: Wyh <1239658231>
parent 98706bfa
......@@ -44,7 +44,7 @@ android {
/**
* 版本号
*/
schemaVersion 13
schemaVersion 14
/**
* greendao输出dao的数据库操作实体类文件夹(相对路径 包名+自定义路径名称,包将创建于包名的直接路径下)
*/
......
......@@ -705,14 +705,14 @@ public class OrderDetail implements Serializable {
for (OrderDetails.DataBean.PRODUCTNAMEBean.ChildBeanX childBeanX : productnameBean.getChild()) {
if (childBeanX != null) {
//判斷是否打印,為true的時候會同時打印主項
if (isPrint(childBeanX.getPrintTo(), type)) {
if (childBeanX.getPrintToBill() == 1) {
isCheck = true;
break;
}
if (childBeanX.getChild() != null) {
for (OrderDetails.DataBean.PRODUCTNAMEBean.ChildBeanX.ChildBean childBean : childBeanX.getChild()) {
//判斷是否打印,為true的時候會同時打印主項
if (isPrint(childBean.getPrintTo(), type)) {
if (childBean.getPrintToBill() == 1) {
isCheck2 = true;
break;
}
......@@ -721,7 +721,7 @@ public class OrderDetail implements Serializable {
}
}
}
if (isCheck || isPrint(productnameBean.getPrintToBill(), Double.valueOf(productnameBean.getPRICE()), productnameBean.getPrintTo(), type)) {
if (isCheck || isPrintTo(productnameBean.getPrintToBill(), Double.valueOf(productnameBean.getPRICE()), productnameBean.getPrintTo(), type)) {
// 細項勾選了||主項勾選了||主項價格不為0 主項就會打印
orderDetailList.add(getOrderDetailByProductnameBean(productnameBean.getPRODUCT_NAME(), Integer.parseInt(productnameBean.getNum()), Double.valueOf(productnameBean.getPRICE()), 1));
addFoodItem(type, orderDetailList, productnameBean, isCheck2);
......@@ -750,8 +750,8 @@ public class OrderDetail implements Serializable {
for (OrderDetails.DataBean.PRODUCTNAMEBean.ChildBeanX childBeanX : productnameBean.getChild()) {
if (childBeanX != null) {
if (isCheck2 || isPrint(childBeanX.getPrintToBill(), Double.valueOf(childBeanX.getPRICE()), childBeanX.getPrintTo(), type)) {
// 二級細項勾選了||細項勾選了||細項價格不為0 項就會打印
if (isCheck2 || isPrintToBill(childBeanX.getPrintToBill(), Double.valueOf(childBeanX.getPRICE()))) {
// 二級細項勾選了||細項勾選了||細項價格不為0 項就會打印
orderDetailList.add(getOrderDetailByProductnameBean(childBeanX.getPRODUCT_NAME(), Integer.parseInt(childBeanX.getNum()), Double.valueOf(childBeanX.getPRICE()), 2));
addSecondFood(type, orderDetailList, childBeanX);
} else {
......@@ -773,7 +773,7 @@ public class OrderDetail implements Serializable {
private static void addSecondFood(int type, List<OrderDetail> orderDetailList, OrderDetails.DataBean.PRODUCTNAMEBean.ChildBeanX childBeanX) {
if (childBeanX.getChild() != null) {
for (OrderDetails.DataBean.PRODUCTNAMEBean.ChildBeanX.ChildBean childBean : childBeanX.getChild()) {
if (isPrint(childBeanX.getPrintToBill(), Double.valueOf(childBeanX.getPRICE()), childBeanX.getPrintTo(), type)) {
if (isPrintToBill(childBeanX.getPrintToBill(), Double.valueOf(childBeanX.getPRICE()))) {
//如果二級細項勾選了||價格不為0 二級細項就打印
orderDetailList.add(getOrderDetailByProductnameBean(childBean.getPRODUCT_NAME(), Integer.parseInt(childBean.getNum()), Double.valueOf(childBean.getPRICE()), 3));
}
......@@ -782,9 +782,13 @@ public class OrderDetail implements Serializable {
}
private static boolean isPrint(int printToBill, double price, int printTo, int type) {
private static boolean isPrintTo(int printToBill, double price, int printTo, int type) {
//printTo和price不為0 都會打印
return (!(printToBill == 0 && price == 0) || isPrint(printTo, type));
return isPrintToBill(printToBill, price) || isPrint(printTo, type);
}
private static boolean isPrintToBill(int printToBill, double price) {
return !(printToBill == 0 && price == 0);
}
/**
......@@ -1009,6 +1013,7 @@ public class OrderDetail implements Serializable {
orderDetail.setType(FOOD_TYPE);
orderDetail.setItemType(2);
orderDetail.setProp(prop);
orderDetail.setPrintseting(foodCombo.getPrintSeting());
// orderDetail.setComboAuto(foodCombo.isAutoMode());
if (isRvMealClicked) {
//手动点击细项 才将子食品作为主体被选中
......
......@@ -256,11 +256,21 @@ public class OkHttp3Utils {
* 心跳接口報錯,推送給相關人員
*/
public static void noticePersonnel(String errCode, String pushContent) {
String restaurantInfo = "品牌名:" +
GsaCloudApplication.getBrandName(GsaCloudApplication.getAppContext()) +
"餐廳名:" +
GsaCloudApplication.getRestaurantName(GsaCloudApplication.getAppContext()) +
"餐廳ID:" +
GsaCloudApplication.getRestaurantId(GsaCloudApplication.getAppContext()) +
"報錯CODE:" +
errCode +
"報錯原因:" +
pushContent;
RequestBody requestBody = new FormBody.Builder()
.add("code", errCode)//錯誤碼
.add("shopId", GsaCloudApplication.getGsPosShopId(GsaCloudApplication.getAppContext()))
.add("source", GsaCloudApplication.getAppName() + "")//錯誤來源
.add("pushContent", "報錯內容:" + pushContent)//推送內容
.add("pushContent", restaurantInfo)//推送內容
.add("version", DeviceUtils.getVersionName(GsaCloudApplication.getAppContext()))//系統版本
.build();
OkHttp3Utils.post(HttpsConstans.ROOT_URL + "/member-web/api/monitor/pushAlarm", requestBody)
......
......@@ -18,6 +18,11 @@ public class TextUtil {
str.equals("null") || str.equals("undefined");
}
public static boolean isNotEmptyOrNullOrUndefined(String str) {
return str != null && str.length() != 0 &&
!str.equals("null") && !str.equals("undefined");
}
public static String isEmptyReturnString(String str) {
if (str == null || str.length() == 0 ||
str.equals("null") || str.equals("undefined")) {
......
package com.gingersoft.gsa.cloud.constans;
public class PrintConstans {
//默認打印機數據
public static final String DEFAULT_PRINT_IP = "default_print_ip";
public static final String DEFAULT_PRINT_PORT = "default_print_port";
public static final String DEFAULT_PRINT_PAPER = "default_print_paper";
public static final int SO_TIMEOUT = 10000;//讀取/輸入io流數據超時的時間
public static final int PRINT_TIMEOUT = 5000;//打印機連接超時時間
public static final int SO_TIMEOUT = 10 * 1000;//讀取/輸入io流數據超時的時間
public static final int PRINT_TIMEOUT = 5 * 1000;//打印機連接超時時間
//默認打印方式
public final static String DEFAULT_PRINT_METHOD = "default_print";
......@@ -34,7 +30,7 @@ public class PrintConstans {
public final static int PRINT_SERVE = 0;//上菜紙
public final static int PRINT_SLIP = 1;//印單
public final static int PRINT_BILL = 2;//結賬單
public final static int PRINT_KITCHEN = 3;//送單,廚房單
public final static int PRINT_KITCHEN = 3;//廚房單
public final static int PRINT_CLEAN_MACHINE = 4;//清機報表 或者其他View
public final static int PRINT_OTHER_ORDER = 5;//接單內容打印 外送印單
public final static int PRINT_INSTRUCTION = 6;//開錢箱
......
......@@ -93,6 +93,27 @@ public class ComboItem {
private byte isMainAccount;
// /**
// * 廚房單打印主項
// */
// private long ktPrintMainItem;
//
// /**
// * 0=系統顏色, 1=黑色, 2=紅色
// */
// private long printFont;
// /**
// * 當金額=0時, 是否打印在帳單上
// */
// private long printToBill;
// /**
// * 0食品清单打印 账单打印//1食品清单不打印 账单不打印//2食品清单打印 账单不打印//3食品清单不打印 账单打印
// */
// private long printTo;
// /**
// * 是否打印价格
// */
// private long ktShowPrice;
/**
* 自定義字段
*/
......@@ -145,12 +166,15 @@ public class ComboItem {
/*** 套餐細項*/
@Transient
private Modifier modifier;
/**
* 打印設定, 用逗號分隔, *=切紙
*/
private String printSeting="";
@Generated(hash = 1123579083)
@Generated(hash = 426398155)
public ComboItem(Long id, long comId, long fid, long qty, double diffAmt, long seqNo, long visible, Date createTime,
String createBy, Date updateTime, long conditions, long isRT, byte deletes, long posId, long restaurant_id,
byte isMainAccount) {
byte isMainAccount, String printSeting) {
this.id = id;
this.comId = comId;
this.fid = fid;
......@@ -167,6 +191,7 @@ public class ComboItem {
this.posId = posId;
this.restaurant_id = restaurant_id;
this.isMainAccount = isMainAccount;
this.printSeting = printSeting;
}
@Generated(hash = 435228340)
......@@ -489,5 +514,52 @@ public class ComboItem {
public void setIsMainAccount(byte isMainAccount) {
this.isMainAccount = isMainAccount;
}
//
// public long getKtPrintMainItem() {
// return ktPrintMainItem;
// }
//
// public void setKtPrintMainItem(long ktPrintMainItem) {
// this.ktPrintMainItem = ktPrintMainItem;
// }
//
// public long getPrintFont() {
// return printFont;
// }
//
// public void setPrintFont(long printFont) {
// this.printFont = printFont;
// }
//
// public long getPrintToBill() {
// return printToBill;
// }
//
// public void setPrintToBill(long printToBill) {
// this.printToBill = printToBill;
// }
//
// public long getPrintTo() {
// return printTo;
// }
//
// public void setPrintTo(long printTo) {
// this.printTo = printTo;
// }
//
// public long getKtShowPrice() {
// return ktShowPrice;
// }
//
// public void setKtShowPrice(long ktShowPrice) {
// this.ktShowPrice = ktShowPrice;
// }
public String getPrintSeting() {
return printSeting;
}
public void setPrintSeting(String printSeting) {
this.printSeting = printSeting;
}
}
......@@ -40,6 +40,7 @@ public class ComboItemDao extends AbstractDao<ComboItem, Long> {
public final static Property PosId = new Property(13, long.class, "posId", false, "POS_ID");
public final static Property Restaurant_id = new Property(14, long.class, "restaurant_id", false, "RESTAURANT_ID");
public final static Property IsMainAccount = new Property(15, byte.class, "isMainAccount", false, "IS_MAIN_ACCOUNT");
public final static Property PrintSeting = new Property(16, String.class, "printSeting", false, "PRINT_SETING");
}
......@@ -70,7 +71,8 @@ public class ComboItemDao extends AbstractDao<ComboItem, Long> {
"\"DELETES\" INTEGER NOT NULL ," + // 12: deletes
"\"POS_ID\" INTEGER NOT NULL ," + // 13: posId
"\"RESTAURANT_ID\" INTEGER NOT NULL ," + // 14: restaurant_id
"\"IS_MAIN_ACCOUNT\" INTEGER NOT NULL );"); // 15: isMainAccount
"\"IS_MAIN_ACCOUNT\" INTEGER NOT NULL ," + // 15: isMainAccount
"\"PRINT_SETING\" TEXT);"); // 16: printSeting
}
/** Drops the underlying database table. */
......@@ -114,6 +116,11 @@ public class ComboItemDao extends AbstractDao<ComboItem, Long> {
stmt.bindLong(14, entity.getPosId());
stmt.bindLong(15, entity.getRestaurant_id());
stmt.bindLong(16, entity.getIsMainAccount());
String printSeting = entity.getPrintSeting();
if (printSeting != null) {
stmt.bindString(17, printSeting);
}
}
@Override
......@@ -151,6 +158,11 @@ public class ComboItemDao extends AbstractDao<ComboItem, Long> {
stmt.bindLong(14, entity.getPosId());
stmt.bindLong(15, entity.getRestaurant_id());
stmt.bindLong(16, entity.getIsMainAccount());
String printSeting = entity.getPrintSeting();
if (printSeting != null) {
stmt.bindString(17, printSeting);
}
}
@Override
......@@ -176,7 +188,8 @@ public class ComboItemDao extends AbstractDao<ComboItem, Long> {
(byte) cursor.getShort(offset + 12), // deletes
cursor.getLong(offset + 13), // posId
cursor.getLong(offset + 14), // restaurant_id
(byte) cursor.getShort(offset + 15) // isMainAccount
(byte) cursor.getShort(offset + 15), // isMainAccount
cursor.isNull(offset + 16) ? null : cursor.getString(offset + 16) // printSeting
);
return entity;
}
......@@ -199,6 +212,7 @@ public class ComboItemDao extends AbstractDao<ComboItem, Long> {
entity.setPosId(cursor.getLong(offset + 13));
entity.setRestaurant_id(cursor.getLong(offset + 14));
entity.setIsMainAccount((byte) cursor.getShort(offset + 15));
entity.setPrintSeting(cursor.isNull(offset + 16) ? null : cursor.getString(offset + 16));
}
@Override
......
......@@ -14,10 +14,10 @@ import org.greenrobot.greendao.identityscope.IdentityScopeType;
// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
/**
* Master of DAO (schema version 13): knows all DAOs.
* Master of DAO (schema version 14): knows all DAOs.
*/
public class DaoMaster extends AbstractDaoMaster {
public static final int SCHEMA_VERSION = 13;
public static final int SCHEMA_VERSION = 14;
/** Creates underlying database table using DAOs. */
public static void createAllTables(Database db, boolean ifNotExists) {
......
......@@ -162,7 +162,7 @@ public class ComboItemDaoUtils {
ArrayList<ComboItem> comboItems = new ArrayList<>();
// String sql = "SELECT c.*,f.FOOD_NAME,f.FOOD_NAME1,f.FOOD_NAME2,f.PRICE,f.AUTO_MOD FROM COMBO_ITEM c join FOOD f on c.FID=f.FID and f.INVISIBLE=0 join FOOD_COMBO r on r.COM_ID=c.COM_ID ";
String sql = "SELECT c.*,f.FOOD_NAME,f.FOOD_NAME1,f.FOOD_NAME2,f.PRICE,f.AUTO_MOD,SELECT_QTY,DEF_MODIFIER,INVISIBLE FROM COMBO_ITEM c join FOOD f on c.FID=f.FID and f.INVISIBLE!=1 join FOOD_COMBO r on r.COM_ID=c.COM_ID and r.DELETES!=1";
String sql = "SELECT c.*,f.FOOD_NAME,f.FOOD_NAME1,f.FOOD_NAME2,f.PRICE,f.AUTO_MOD,f.PRINT_SETING,SELECT_QTY,DEF_MODIFIER,INVISIBLE FROM COMBO_ITEM c join FOOD f on c.FID=f.FID and f.INVISIBLE!=1 join FOOD_COMBO r on r.COM_ID=c.COM_ID and r.DELETES!=1";
if (fid > 0) {
sql = sql + " where r.FID='" + fid + "'";
......@@ -182,6 +182,7 @@ public class ComboItemDaoUtils {
order.setAutoMode(c.getInt(c.getColumnIndex("AUTO_MOD")));
order.setSelectQty(c.getInt(c.getColumnIndex("SELECT_QTY")));
order.setInvisible(c.getLong(c.getColumnIndex("INVISIBLE")));
order.setPrintSeting(c.getString(c.getColumnIndex("PRINT_SETING")));
int deletes = c.getInt(c.getColumnIndex("DELETES"));
String defmodifier = c.getString(c.getColumnIndex("DEF_MODIFIER"));
if (!TextUtils.isEmpty(defmodifier) && !", ".equals(defmodifier)) {
......
......@@ -18,7 +18,6 @@ package com.gingersoft.gsa.cloud.print;
import android.bluetooth.BluetoothDevice;
import android.os.AsyncTask;
import android.util.Log;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
......@@ -190,7 +189,6 @@ public class PrintExecutor {
protected Integer doInBackground(PrintDataMaker... makers) {
if (makers == null || makers.length < 1)
return PrintSocketHolder.ERROR_0;
Log.e("eee", "個數:" + makers.length);
return doRequest(makers[0]);
}
......
......@@ -45,11 +45,12 @@ public class PrintSocketHolder {
public static final int STATE_4 = 4;// 关闭输出流
public static final int ERROR_0 = 0;// 成功
public static final int ERROR_1 = -1;// 生成测试页面数据失败
public static final int ERROR_2 = -2;// 创建Socket失败
public static final int ERROR_2 = -2;// 创建Socket失败,未連接到打印機
public static final int ERROR_3 = -3;// 获取输出流失败
public static final int ERROR_4 = -4;// 写入测试页面数据失败
public static final int ERROR_5 = -5;// 必要参数不能为空
public static final int ERROR_6 = -6;// 关闭Socket出错
public static final int ERROR_100 = -100;// 失败
private static final UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");//蓝牙打印UUID
// private String ip;
......
......@@ -186,7 +186,6 @@ public class PrinterUtils {
return null;
}
ArrayList<byte[]> data = decodeBitmapToDataList(resizeImage, parting);
resizeImage.recycle();
return data;
}
......
......@@ -435,7 +435,6 @@ public abstract class PrinterWriter {
if (scalingImage == null)
return null;
ArrayList<byte[]> data = PrinterUtils.decodeBitmapToDataList(image, heightParting);
image.recycle();
return data;
}
......
......@@ -76,7 +76,6 @@ class OrderDetails {
var orderPayType: Int = 0//0店內支付,1為貨到付款,2是在線支付
var isDelete: Int = 1 //默認為1,為0是第三方物流,其他則是本店配送
var payTime: String? = null
//
var payType: Int = 0//1:積分支付;2:支付寶;3:财付通;4:微信支付;5:貨到付款;6:其他支付
var payName: String? = null
var payAmount: Double = 0.0
......@@ -107,6 +106,7 @@ class OrderDetails {
// * * Order Cancelled Before Collection - 訂單已取消 - 取餐前 8
// * * Order Cancelled After Collection - 訂單已取消 - 取餐后 9
// * * Order Assigned To Another Delivery Man - 已指派另一位配送員 10
var payMultiple: List<PayMultiple>? = null
class PRODUCTNAMEBean : Serializable {
/**
......@@ -124,8 +124,6 @@ class OrderDetails {
var PRODUCT_NAME: String? = null
var child: List<ChildBeanX>? = null
var printseting: String? = null
var printToBill: Int = 1 //當金額=0時,是否打印在賬單上 0 否 1 是
//0食品清单打印 账单打印
//1食品清单不打印 账单不打印
......@@ -154,7 +152,7 @@ class OrderDetails {
//1食品清单不打印 账单不打印
//2食品清单打印 账单不打印
//3食品清单不打印 账单打印
var printTo: Int = 0
// var printTo: Int = 0
class ChildBean : Serializable {
/**
......@@ -175,12 +173,14 @@ class OrderDetails {
//1食品清单不打印 账单不打印
//2食品清单打印 账单不打印
//3食品清单不打印 账单打印
var printTo: Int = 0
// var printTo: Int = 0
}
}
}
data class OrderPayAmountVo(var payTypeId: Int, var amount: Double, var payName: String) : Serializable
data class CouponBean(val couponName: String, val discount_amount: Float) : Serializable
data class PayMultiple(val payTypeId: String, val amount: Double, val payName: String, val points: Double) : Serializable
}
}
\ No newline at end of file
......@@ -2,7 +2,7 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal">
<TextView
......@@ -10,16 +10,18 @@
style="@style/Print_text_style"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.5" />
tools:text="食品名食品名食品名食品名食品名食品名"
android:layout_weight="0.6" />
<TextView
android:id="@+id/tv_food_quantity"
style="@style/Print_text_style"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.2"
android:layout_weight="0.15"
android:layout_gravity="bottom"
android:gravity="right" />
tools:text="X1100024242211222220"
android:gravity="right|center_vertical" />
<TextView
android:id="@+id/tv_food_price"
......@@ -27,6 +29,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_weight="0.3"
android:gravity="right" />
tools:text="價格:$100000"
android:layout_weight="0.25"
android:gravity="right|center_vertical" />
</LinearLayout>
\ No newline at end of file
......@@ -6,5 +6,6 @@
<item name="QMUITabSegmentStyle">@style/QMUITabSegmentStyle</item>
<!-- <item name="android:windowActivityTransitions">false</item>-->
<!-- <item name="android:windowDisablePreview">true</item>-->
<!-- <item name="android:forceDarkAllowed"></item>-->
</style>
</resources>
\ No newline at end of file
......@@ -25,4 +25,6 @@
<item name="layout_for_test" type="id"/>
<item name="topbar_heart_disconnect" type="id"/>
<item type="id" name="statusbarutil_fake_status_bar_view" />
<item type="id" name="statusbarutil_translucent_view" />
</resources>
\ No newline at end of file
......@@ -7,8 +7,8 @@ ext {
targetSdkVersion : 28,
//正式版: 1.0.3 3
//內部測試版:1.2.0 20
versionCode : 21,
versionName : "1.2.1"
versionCode : 5,
versionName : "1.0.5"
]
version = [
......
......@@ -5,15 +5,13 @@ import android.content.Intent;
import com.billy.cc.core.component.CC;
import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.utils.JsonUtils;
import com.gingersoft.gsa.cloud.constans.UserConstans;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.constans.UserConstans;
import com.gingersoft.gsa.cloud.login.mvp.presenter.BaseLoginPresenter;
import com.gingersoft.gsa.cloud.login.mvp.ui.activity.mvp.ui.activity.SwitchServerActivity;
import com.gingersoft.gsa.cloud.ui.bean.mode.BrandsBean;
import com.gingersoft.gsa.cloud.ui.bean.mode.LoginBean;
import com.gingersoft.gsa.cloud.ui.bean.view.SectionRestaurantItem;
import com.gingersoft.gsa.cloud.ui.bean.view.SectionTextItem;
import com.gingersoft.gsa.cloud.ui.widget.dialog.ChooseRestaurantDialog;
import com.gingersoft.gsa.cloud.login.mvp.presenter.BaseLoginPresenter;
import com.gingersoft.gsa.cloud.login.mvp.ui.activity.mvp.ui.activity.SwitchServerActivity;
import com.jess.arms.base.BaseActivity;
import java.util.ArrayList;
......
......@@ -97,7 +97,7 @@ public class BaseLoginPresenter<M extends BaseLoginContract.Model, V extends Bas
@Override
public void onError(Throwable t) {
super.onError(t);
OkHttp3Utils.noticePersonnel(AppConstans.RP_LOGIN_ERROR, t.getMessage());
OkHttp3Utils.noticePersonnel(AppConstans.RP_LOGIN_ERROR, "登陸報錯:"+t.getMessage());
if (IAcitivity instanceof LoginActivity) {
} else {
mRootView.launchActivity(new Intent(IAcitivity, LoginActivity.class));
......
......@@ -15,21 +15,22 @@ import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.gingersoft.gsa.cloud.constans.UserConstans;
import com.gingersoft.gsa.cloud.base.utils.StatusBarUtil;
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.ui.bean.mode.BrandsBean;
import com.gingersoft.gsa.cloud.ui.bean.mode.LoginBean;
import com.gingersoft.gsa.cloud.ui.widget.dialog.ChooseRestaurantDialog;
import com.gingersoft.gsa.cloud.ui.widget.dialog.LoadingDialog;
import com.gingersoft.gsa.cloud.constans.UserConstans;
import com.gingersoft.gsa.cloud.login.R;
import com.gingersoft.gsa.cloud.login.R2;
import com.gingersoft.gsa.cloud.login.di.component.DaggerLoginComponent;
import com.gingersoft.gsa.cloud.login.mvp.contract.LoginContract;
import com.gingersoft.gsa.cloud.login.mvp.contract.LoginInterfaceImpl;
import com.gingersoft.gsa.cloud.login.mvp.presenter.LoginPresenter;
import com.gingersoft.gsa.cloud.ui.bean.mode.BrandsBean;
import com.gingersoft.gsa.cloud.ui.bean.mode.LoginBean;
import com.gingersoft.gsa.cloud.ui.widget.dialog.ChooseRestaurantDialog;
import com.gingersoft.gsa.cloud.ui.widget.dialog.LoadingDialog;
import com.google.android.material.textfield.TextInputEditText;
import com.jess.arms.di.component.AppComponent;
import com.jess.arms.integration.AppManager;
......@@ -95,6 +96,8 @@ public class LoginActivity extends LoginInterfaceImpl<LoginPresenter> implements
@Override
public int initView(@Nullable Bundle savedInstanceState) {
StatusBarUtil.setTransparent(this);
StatusBarUtil.setDarkMode(this);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);//SOFT_INPUT_ADJUST_NOTHING
return R.layout.user_login_activity_login; //如果你不需要框架帮你设置 setContentView(id) 需要自行设置,请返回 0
}
......@@ -102,18 +105,6 @@ public class LoginActivity extends LoginInterfaceImpl<LoginPresenter> implements
@Override
public void initData(@Nullable Bundle savedInstanceState) {
((ImageView)findViewById(R.id.iv_top_bg)).setAdjustViewBounds(true);
// inside your activity (if you did not enable transitions in your theme)
// getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
// set an exit transition
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// getWindow().setExitTransition(new Explode());
// }
//
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// Slide slide = new Slide();
// slide.setDuration(1000);
// getWindow().setExitTransition(slide);
// }
mPresenter.requestExternalStoragePermission();
//顯示記住的登錄名
if (!Objects.equals(SPUtils.get(mContext, UserConstans.LOGIN_USERNAME, ""), "")) {
......
......@@ -15,8 +15,10 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.content.ContextCompat;
import androidx.viewpager2.widget.ViewPager2;
import com.gingersoft.gsa.cloud.base.utils.StatusBarUtil;
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;
......@@ -78,6 +80,7 @@ public class WelcomeActivity extends LoginInterfaceImpl<WelcomePresenter> implem
@Override
public int initView(@Nullable Bundle savedInstanceState) {
StatusBarUtil.setColorNoTranslucent(this, ContextCompat.getColor(this, R.color.white));
return R.layout.activity_welcome; //如果你不需要框架帮你设置 setContentView(id) 需要自行设置,请返回 0
}
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical">
<RadioGroup
......
......@@ -2,6 +2,7 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:background="@color/white"
android:layout_height="match_parent">
<RelativeLayout
......
......@@ -5,6 +5,7 @@
android:layout_height="match_parent"
android:background="@color/theme_white_color"
android:fillViewport="true"
android:fitsSystemWindows="false"
android:orientation="vertical">
<LinearLayout
......@@ -15,18 +16,18 @@
<ImageView
android:id="@+id/iv_top_bg"
android:layout_width="match_parent"
android:scaleType="fitXY"
android:layout_height="wrap_content"
android:scaleType="fitXY"
android:src="@drawable/img_login_top_bg" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="@dimen/dp_20"
android:layout_weight="1"
android:orientation="vertical"
android:paddingLeft="@dimen/dp_19"
android:paddingRight="@dimen/dp_19"
android:layout_marginTop="@dimen/dp_20"
android:orientation="vertical">
android:paddingRight="@dimen/dp_19">
<TextView
android:id="@+id/login_title"
......@@ -83,8 +84,8 @@
android:layout_toLeftOf="@id/iv_clear_account"
android:layout_toRightOf="@id/iv_account"
android:hint="請輸入賬戶名或手機號"
android:maxLines="1"
android:maxLength="16"
android:maxLines="1"
android:paddingRight="@dimen/dp_10" />
</RelativeLayout>
......@@ -138,8 +139,8 @@
android:layout_toRightOf="@id/iv_pwd"
android:hint="輸入6~20個字符"
android:inputType="textPassword"
android:maxLines="1"
android:maxLength="20"
android:maxLines="1"
android:paddingRight="@dimen/dp_10" />
</RelativeLayout>
......@@ -208,17 +209,18 @@
</LinearLayout>
</LinearLayout>
<com.qmuiteam.qmui.alpha.QMUIAlphaButton
android:id="@+id/btn_gsa_user_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/selector_login_btn"
android:gravity="center"
android:layout_gravity="bottom"
android:layout_marginLeft="@dimen/dp_20"
android:layout_marginRight="@dimen/dp_20"
android:layout_marginTop="@dimen/dp_20"
android:layout_marginRight="@dimen/dp_20"
android:layout_marginBottom="@dimen/dp_60"
android:background="@drawable/selector_login_btn"
android:gravity="center"
android:text="登錄"
android:textColor="@color/white"
android:textSize="@dimen/dp_16" />
......
......@@ -255,11 +255,14 @@ public class NewMainActivity extends BaseFragmentActivity<NewMainPresenter> impl
functions.add(new Function((long) 139, 150, 5, "外送/自取", R.drawable.ic_delivery_mode, 0));
// functions.add(new Function((long) 140, 150, 5, "外賣模式", R.drawable.ic_outsourcing_model_close, 0));
// functions.add(new Function((long) 141, 150, 5, "預點餐模式", R.drawable.ic_pre_order_mode_close, 1));
functions.add(new Function((long) 151, 0, 5, "管理", 0, 0));
if (BuildConfig.DEBUG) {
functions.add(new Function((long) 151, 0, 5, "管理", 0, 0));
functions.add(new Function((long) 142, 151, 5, "賬單管理", R.drawable.ic_meals_menu_management, 0));
functions.add(new Function((long) 143, 151, 5, "餐檯管理", R.drawable.ic_dining_table_management, 0));
functions.add(new Function((long) 144, 151, 5, "打印管理", R.drawable.ic_print_management, 0));
}
functions.add(new Function((long) 144, 151, 5, "打印管理", R.drawable.ic_print_management, 0));
if (BuildConfig.DEBUG) {
functions.add(new Function((long) 145, 151, 5, "支付管理", R.drawable.ic_pay_management_close, 1));
functions.add(new Function((long) 146, 151, 5, "折扣管理", R.drawable.ic_discount_management_close, 1));
functions.add(new Function((long) 147, 151, 5, "沽清管理", R.drawable.ic_sell_off_manger, 0));
......
......@@ -2,7 +2,8 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:background="@color/white">
<androidx.constraintlayout.widget.ConstraintLayout
......@@ -113,13 +114,13 @@
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginLeft="@dimen/dp_5"
android:focusableInTouchMode="true"
android:focusable="true"
android:layout_marginTop="@dimen/dp_10"
android:layout_marginRight="@dimen/dp_10"
android:focusable="true"
android:focusableInTouchMode="true"
app:layout_constraintBottom_toTopOf="@id/tv_more_report"
app:layout_constraintLeft_toLeftOf="@id/cv_white_bg"
app:layout_constraintRight_toRightOf="@id/cv_white_bg"
app:layout_constraintBottom_toTopOf="@id/tv_more_report"
app:layout_constraintTop_toBottomOf="@id/tv_today_time" />
......@@ -132,9 +133,9 @@
android:id="@+id/tv_more_report"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/dp_10"
android:paddingLeft="@dimen/dp_10"
android:paddingRight="@dimen/dp_10"
android:paddingBottom="@dimen/dp_10"
android:text="更多報表 >"
android:textColor="#3c3c3c"
android:textSize="@dimen/sp_12"
......
......@@ -160,12 +160,13 @@ class WeatherRepository private constructor(private val network: CoolWeatherNetw
network.cancelOrder(getBody("memberId" to memberId, "orderId" to orderId, "status" to status, "type" to "2", "updateBy" to updateBy, "reasonId" to reasonId, "reasonDesc" to reasonDesc))
}
suspend fun getCancelReason(restaurantId: String, type: String) = withContext(Dispatchers.IO) {
val requestBody = FormBody.Builder()
.add("restaurantId", restaurantId)
.add("type", type)//取消原因類型,1食品取消,2,物流取消,3,訂單取消
.build()
network.getCancelReason(requestBody)
suspend fun getCancelReason(brandId: Int, restaurantId: Int, type: Int) = withContext(Dispatchers.IO) {
// val requestBody = FormBody.Builder()
// .add("brandId", brandId)
// .add("restaurantId", restaurantId)
// .add("type", type)//取消原因類型,1食品取消,2,物流取消,3,訂單取消
// .build()
network.getCancelReason(brandId, restaurantId, type)
}
suspend fun getPayMethod(orderId: String) = withContext(Dispatchers.IO) {
......
......@@ -14,7 +14,7 @@ data class CancelReason(
val id: Int,
val restaurantId: Int,
val sort: Int,
val type: Int,
val type: String,
val uid: Int,
val updateTime: Long
)
......
package com.gingersoft.gsa.other_order_mode.data.model.bean
data class MessageBean(val code: String, val errorMsg: String, val success: Boolean = false, val sysTime: Long = 0, val data: Any? = null)
\ No newline at end of file
......@@ -5,7 +5,9 @@ data class ThirdSend(
val success: Boolean,
val errCode: String,
val errMsg: String,
val sysTime: Long
val sysTime: Long,
val code: String,
val message: String
) {
data class Data(
val createTime: Long,
......
......@@ -72,7 +72,7 @@ class CoolWeatherNetwork {
suspend fun cancelOrder(requestBody: RequestBody) = service.cancelOrder(requestBody).await()
//獲取商家配置的取消訂單的原因
suspend fun getCancelReason(requestBody: RequestBody) = service.getCancelReason(requestBody).await()
suspend fun getCancelReason(brandId: Int, restaurantId: Int, type: Int) = cloudService.getCancelReason(brandId, restaurantId, type).await()
//獲取商家配置的支付方式
suspend fun getPayMethod(requestBody: RequestBody) = service.getPayMethod(requestBody).await()
......
......@@ -20,7 +20,10 @@ import java.util.concurrent.TimeUnit
object ServiceCreator {
private val httpClient = OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.connectTimeout(30, TimeUnit.SECONDS)
.callTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.addInterceptor(LoggingInterceptor())
.addInterceptor(UserAgentIntercepter())
......@@ -33,7 +36,6 @@ object ServiceCreator {
private var BASE_URL3 = "$ROOT_URL/member-web/ricepon-gsa/api/"
private var BASE_URL4 = "$ROOT_URL/ricepon-order/api/"
private val builder = Retrofit.Builder()
.baseUrl(BASE_URL)
.client(httpClient.build())
......@@ -63,6 +65,7 @@ object ServiceCreator {
.client(httpClient.build())
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
fun <T> create(serviceClass: Class<T>): T = builder.build().create(serviceClass)
fun <T> create2(serviceClass: Class<T>): T = builder2.build().create(serviceClass)
......
package com.gingersoft.gsa.other_order_mode.data.network.api
import com.gingersoft.gsa.other_order_mode.data.model.bean.MessageBean
import com.gingersoft.gsa.other_order_mode.data.model.bean.DeliveryAddSuccessConfig
import com.gingersoft.gsa.other_order_mode.data.model.bean.DeliveryConfig
import com.gingersoft.gsa.other_order_mode.data.model.bean.MessageBean
import okhttp3.RequestBody
import retrofit2.Call
import retrofit2.http.Body
......
package com.gingersoft.gsa.other_order_mode.data.network.api
import com.gingersoft.gsa.other_order_mode.data.model.bean.MessageBean
import com.gingersoft.gsa.cloud.print.bean.OrderDetails
import com.gingersoft.gsa.other_order_mode.data.model.bean.*
import okhttp3.RequestBody
import retrofit2.Call
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.Query
interface WeatherService {
......@@ -57,8 +60,8 @@ interface WeatherService {
@POST("order/updateOrderStatus")
fun cancelOrder(@Body requestBody: RequestBody): Call<CancelLogisticsBean>
@POST("restaurantFoodReason/config/list")
fun getCancelReason(@Body requestBody: RequestBody): Call<CancelReason>
@GET("restaurantFoodReason/config/list")
fun getCancelReason(@Query("brandId") brandId:Int, @Query("restaurantId") restaurantId:Int, @Query("type") type:Int): Call<CancelReason>
@POST("order/confirmPay")
fun getPayMethod(@Body requestBody: RequestBody): Call<PayTypeInfo>
......
package com.gingersoft.gsa.other_order_mode.model.viewModel
import androidx.lifecycle.MutableLiveData
import com.gingersoft.gsa.other_order_mode.data.model.bean.MessageBean
import com.gingersoft.gsa.other_order_mode.data.DeliveryRepository
import com.gingersoft.gsa.other_order_mode.data.model.bean.DeliveryAddSuccessConfig
import com.gingersoft.gsa.other_order_mode.data.model.bean.DeliveryConfig
import com.gingersoft.gsa.other_order_mode.data.model.bean.MessageBean
class DeliveryViewModel(private val repository: DeliveryRepository) : BaseViewModel() {
......
......@@ -35,7 +35,6 @@ class HistoryOrderViewModel(private val historyOrderRepository: HistoryOrderRepo
} else {
orderNumber = orderNum
}
historyOrderRepository.getHistoryOrderList(GsaCloudApplication.getRestaurantId(context).toString(), status, startDate, endDate, pageIndex, "10", orderNumber, phone).apply {
this.data?.let {
if (it.size > 0) {
......
......@@ -2,7 +2,6 @@ package com.gingersoft.gsa.other_order_mode.model.viewModel
import android.app.Dialog
import android.content.Context
import android.os.Message
import android.util.Log
import android.view.Gravity
import android.view.WindowManager
......@@ -23,6 +22,7 @@ import com.gingersoft.gsa.cloud.base.utils.other.TextUtil
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils
import com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils
import com.gingersoft.gsa.cloud.base.widget.DialogUtils
import com.gingersoft.gsa.other_order_mode.data.model.bean.MessageBean
import com.gingersoft.gsa.cloud.constans.AppConstans
import com.gingersoft.gsa.cloud.constans.PrintConstans
import com.gingersoft.gsa.cloud.print.bean.OrderDetails
......@@ -37,9 +37,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.json.JSONArray
import org.json.JSONException
import org.json.JSONObject
import java.lang.NullPointerException
class PageViewModel(private val repository: WeatherRepository) : ViewModel() {
......@@ -146,7 +144,7 @@ class PageViewModel(private val repository: WeatherRepository) : ViewModel() {
}, {
//出錯
mOrderList[position].value = null
OkHttp3Utils.noticePersonnel(AppConstans.RP_ORDER_LIST_ERROR, it.message)
OkHttp3Utils.noticePersonnel(AppConstans.RP_ORDER_LIST_ERROR, "獲取訂單列表報錯" + it.message)
OtherOrderUtils.initSoundPool(GsaCloudApplication.getAppContext(), R.raw.raw_get_order_list_error)
})
}
......@@ -308,7 +306,7 @@ class PageViewModel(private val repository: WeatherRepository) : ViewModel() {
break
}
}
if (third) {
if (third && dataBean.isDelete != 0) {
// 如果是第三方物流,調用第三方接口
thirdSend(restaurantId, dataBean, 2, listener)
} else {
......@@ -400,7 +398,7 @@ class PageViewModel(private val repository: WeatherRepository) : ViewModel() {
/**
* 修改訂單狀態並打印
*/
private suspend fun updateOrderAndPrint(restaurantId: String, dataBean: OrderDetails.DataBean, status: Int, listener: (MessageBean) -> Unit) {
private fun updateOrderAndPrint(restaurantId: String, dataBean: OrderDetails.DataBean, status: Int, listener: (MessageBean) -> Unit) {
launch({
repository.gsUpdateOrderStatus(dataBean.ID, status, dataBean.order_type, 1, "", "", "", "0", "", 1, 0).apply {
if (status == 0 || status == 1 || status == 2) {
......@@ -455,7 +453,7 @@ class PageViewModel(private val repository: WeatherRepository) : ViewModel() {
}
}
} else {
OkHttp3Utils.noticePersonnel(AppConstans.RP_UPDATE_ORDER_STATE_ERROR, errorMsg)
OkHttp3Utils.noticePersonnel(AppConstans.RP_UPDATE_ORDER_STATE_ERROR, "修改訂單狀態未成功:$errorMsg")
listener.invoke(getMsgBean(OrderDelivery, errorMsg, false))
}
}
......@@ -521,7 +519,7 @@ class PageViewModel(private val repository: WeatherRepository) : ViewModel() {
/**
* 第三方派送
*/
private suspend fun thirdSend(restaurantId: String, dataBean: OrderDetails.DataBean, status: Int, listener: (MessageBean) -> Unit) {
private fun thirdSend(restaurantId: String, dataBean: OrderDetails.DataBean, status: Int, listener: (MessageBean) -> Unit) {
val third = ThirdItem()
//將食品數據轉為第三方需要的數據
dataBean.PRODUCT_NAME?.let {
......@@ -535,24 +533,43 @@ class PageViewModel(private val repository: WeatherRepository) : ViewModel() {
third.add(thirdItem)
}
}
//調用第三方物流接口
callThird(dataBean, third, restaurantId, status, listener)
}
private fun callThird(dataBean: OrderDetails.DataBean, third: ThirdItem, restaurantId: String, status: Int, listener: (MessageBean) -> Unit) {
launch({
//調用第三方物流接口
repository.thirdDelivery(dataBean.ID.toString(), third).apply {
if (success) {
// listener.invoke(OrderDelivery, true)
updateOrderAndPrint(restaurantId, dataBean, status, listener)
} else if (!TextUtil.isEmptyOrNullOrUndefined(errMsg)) {
listener.invoke(getMsgBean(OrderDelivery, errMsg, false))
//第三方物流接口異常
OkHttp3Utils.noticePersonnel(AppConstans.RP_THIRE_LOGISTICS_ERROR, errMsg)
OkHttp3Utils.noticePersonnel(AppConstans.RP_THIRE_LOGISTICS_ERROR, "第三方物流請求失敗:$errMsg")
} else if (!TextUtil.isEmptyOrNullOrUndefined(message)) {
listener.invoke(getMsgBean(OrderDelivery, message, false))
//第三方物流接口異常
OkHttp3Utils.noticePersonnel(AppConstans.RP_THIRE_LOGISTICS_ERROR, "第三方物流請求失敗:$message")
} else {
listener.invoke(getMsgBean(OrderDelivery, "指派物流失敗", false))
OkHttp3Utils.noticePersonnel(AppConstans.RP_THIRE_LOGISTICS_ERROR, "第三方物流失敗")
OkHttp3Utils.noticePersonnel(AppConstans.RP_THIRE_LOGISTICS_ERROR, "第三方物流請求失敗")
}
}
}, {
OkHttp3Utils.noticePersonnel(AppConstans.RP_THIRE_LOGISTICS_ERROR, it.message)
listener.invoke(getMsgBean(OrderDelivery, "", false))
}, { it ->
if (it is java.io.InterruptedIOException) {
//超時了,獲取訂單詳情,如果訂單未指派物流,那麼再次調用第三方物流接口
getOrderInfo(dataBean.ID.toString()) {
if (it?.data != null && it.data!!.isNotEmpty() && it.data!![0].isDelete == 0) {
//已經指派第三方物流,就調用修改訂單狀態接口
updateOrderAndPrint(restaurantId, dataBean, status, listener)
} else {
callThird(dataBean, third, restaurantId, status, listener)
}
}
} else {
OkHttp3Utils.noticePersonnel(AppConstans.RP_THIRE_LOGISTICS_ERROR, "請求第三方物流接口報錯:" + it.message)
listener.invoke(getMsgBean(OrderDelivery, "", false))
}
})
}
......@@ -732,9 +749,9 @@ class PageViewModel(private val repository: WeatherRepository) : ViewModel() {
/**
* 獲取餐廳配置的取消原因
*/
fun getCancelReason(restaurantId: String, type: String, listener: (CancelReason?) -> Unit) {
fun getCancelReason(brandId: Int, restaurantId: Int, type: Int, listener: (CancelReason?) -> Unit) {
launch({
repository.getCancelReason(restaurantId, type).apply {
repository.getCancelReason(brandId, restaurantId, type).apply {
listener.invoke(this)
}
}, {
......
......@@ -258,18 +258,18 @@ class GetInfoUpdateService : Service() {
if (!this@GetInfoUpdateService.isDestroy) {
// Log.e(TAG, "沒銷毀")
// initSocket()//创建一个新的连接Expected HTTP 101 response but was '502 Bad Gateway'
//連接斷開,定時五秒,如果未重連,播放提示音
RxTimerUtil.delayFun({
initSoundPool(R.raw.raw_disconnect)
myBind?.block?.invoke(true)
//推送給相關人員
OkHttp3Utils.noticePersonnel(AppConstans.RP_HEART_ERROR, "心跳斷開十秒以上未連接成功:" + t.message)
}, 10)
putTimeLog("onFailure連接失敗,等待一分鐘後重新連接")
} else {
webSocket?.cancel()
it.dispatcher().cancelAll()
}
//連接斷開,定時五秒,如果未重連,播放提示音
RxTimerUtil.delayFun({
initSoundPool(R.raw.raw_disconnect)
myBind?.block?.invoke(true)
//推送給相關人員
OkHttp3Utils.noticePersonnel(AppConstans.RP_HEART_ERROR, t.message)
}, 10)
putTimeLog("onFailure連接失敗,等待一分鐘後重新連接")
}
})
it.dispatcher().executorService().shutdown()
......@@ -280,14 +280,14 @@ class GetInfoUpdateService : Service() {
private var lastSoundTime: Long = 0L
fun initSoundPool(resId: Int) {
val nowTime = System.currentTimeMillis()//當前時間減去上次播放的時間,如果超過五秒,那麼才會再次播放提示聲
Log.e("eee", "間隔時間" + (nowTime - lastSoundTime))
putTimeLog("現在時間:$nowTime 上次播放時間:$lastSoundTime")
putTimeLog("新訂單播放:$nowTime")
if (resId == R.raw.newordervocal && nowTime - lastSoundTime > 5000) {
lastSoundTime = System.currentTimeMillis()
Log.e("eee", "間隔時間" + (nowTime - lastSoundTime))
putTimeLog("現在時間:$nowTime 上次播放時間:$lastSoundTime")
putTimeLog("新訂單播放:$nowTime")
lastSoundTime = nowTime
OtherOrderUtils.initSoundPool(this, resId)
} else {
lastSoundTime = System.currentTimeMillis()
lastSoundTime = nowTime
OtherOrderUtils.initSoundPool(this, resId)
}
}
......@@ -308,7 +308,6 @@ class GetInfoUpdateService : Service() {
override fun onDestroy() {
super.onDestroy()
Log.e("eee", "onDestroy")
putTimeLog("服務銷毀onDestroy")
//清除心跳
......
......@@ -44,6 +44,7 @@ class OrderDetailsActivity : BaseActivity() {
private var orderType: Int = 0
private var orderPayType: Int = 0
private var isRead: Int = -1
private var state: Int = -1
lateinit var skeletonScreen: ViewSkeletonScreen
override fun onCreate(savedInstanceState: Bundle?) {
......@@ -63,6 +64,7 @@ class OrderDetailsActivity : BaseActivity() {
orderType = intent.getIntExtra("orderType", 0)//訂單類型
orderPayType = intent.getIntExtra("orderPayType", 0)//訂單支付方式
isRead = intent.getIntExtra("isRead", -1)//是否已讀訂單
state = intent.getIntExtra("orderStatus", -1)//訂單狀態
pageViewModel = ViewModelProvider(this, InjectorUtil.getWeatherModelFactory())[PageViewModel::class.java].apply {
if (isRead == 0) {
......@@ -99,25 +101,32 @@ class OrderDetailsActivity : BaseActivity() {
when (orderDetails.orderStatus) {
2 -> {//製作中
btnList.add(BtnBuilder().getPrintBtn())
if (orderDetails.order_type == 7) {
//製作中的自取,應該製作完成、打印、取消訂單
btnList.add(BtnBuilder().getProductionCompletedBtn())
tv_order_state.setTextColor(resources.getColor(R.color.order_state0_color))
} else {
//製作中的外賣,應該有打印、取消物流、取消訂單
if (state == 0) {
//防止調用了第三方物流接口,沒調用到確認訂單接口
btnList.add(BtnBuilder().getSureBtn())
orderStatusText = "待確認"
tv_order_state.setTextColor(ContextCompat.getColor(this@OrderDetailsActivity, R.color.order_state0_color))
if (orderDetails.isDelete == 0) {
btnList.add(BtnBuilder().getLogisticsBtn())
}
} else {
btnList.add(BtnBuilder().getPrintBtn())
if (orderDetails.order_type == 7) {
//製作中的自取,應該製作完成、打印、取消訂單
btnList.add(BtnBuilder().getProductionCompletedBtn())
tv_order_state.setTextColor(resources.getColor(R.color.order_state0_color))
} else {
btnList.add(BtnBuilder().getAssignDeliveryBtn())
//製作中的外賣,應該有打印、取消物流、取消訂單
if (orderDetails.isDelete == 0) {
btnList.add(BtnBuilder().getLogisticsBtn())
} else {
btnList.add(BtnBuilder().getAssignDeliveryBtn())
}
tv_order_state.setTextColor(resources.getColor(R.color.order_state1_color))
}
tv_order_state.setTextColor(resources.getColor(R.color.order_state1_color))
orderStatusText = "製作中"
}
orderStatusText = "製作中"
// if (orderDetails.isDelete != 0) {
//不是第三方物流才顯示取消訂單
btnList.add(BtnBuilder().getCancelBtn())
// }
}
3 -> {//外賣是送貨中,自取是待取餐
btnList.add(BtnBuilder().getPrintBtn())
......@@ -193,7 +202,7 @@ class OrderDetailsActivity : BaseActivity() {
}
else -> {
showLoading()
updateOrderStatusByBtn(btnList[position].type, orderDetails, GsaCloudApplication.getRestaurantId(this@OrderDetailsActivity).toString()) { msg->
updateOrderStatusByBtn(btnList[position].type, orderDetails, GsaCloudApplication.getRestaurantId(this@OrderDetailsActivity).toString()) { msg ->
cancelDialogForLoading()
when (msg.code) {
DeliveryPrint.toString() -> {//訂單已確認,是否打印成功
......@@ -205,21 +214,21 @@ class OrderDetailsActivity : BaseActivity() {
})
}
PrintCode.toString() -> {
ToastUtils.show(this@OrderDetailsActivity, if (msg.success) {
"打印成功"
} else {
"打印失敗"
})
// ToastUtils.show(this@OrderDetailsActivity, if (msg.success) {
// "打印成功"
// } else {
// "打印失敗"
// })
}
SendCode.toString() -> {
ToastUtils.show(this@OrderDetailsActivity, if (msg.success) {
"已成功指派"
} else if(!TextUtil.isEmptyOrNullOrUndefined(msg.errorMsg)){
} else if (!TextUtil.isEmptyOrNullOrUndefined(msg.errorMsg)) {
msg.errorMsg
} else {
"指派送貨失敗"
})
if(msg.success){
if (msg.success) {
finish()
}
}
......@@ -228,7 +237,7 @@ class OrderDetailsActivity : BaseActivity() {
if (msg.success) {
finish()
ToastUtils.show(this@OrderDetailsActivity, "訂單已確認")
} else if(!TextUtil.isEmptyOrNullOrUndefined(msg.errorMsg)){
} else if (!TextUtil.isEmptyOrNullOrUndefined(msg.errorMsg)) {
ToastUtils.show(this@OrderDetailsActivity, msg.errorMsg)
} else {
ToastUtils.show(this@OrderDetailsActivity, "訂單確認失敗")
......@@ -238,7 +247,7 @@ class OrderDetailsActivity : BaseActivity() {
Closing.toString() -> {
ToastUtils.show(this@OrderDetailsActivity, if (msg.success) {
"結賬成功"
} else if(!TextUtil.isEmptyOrNullOrUndefined(msg.errorMsg)){
} else if (!TextUtil.isEmptyOrNullOrUndefined(msg.errorMsg)) {
msg.errorMsg
} else {
"結賬失敗"
......@@ -250,7 +259,7 @@ class OrderDetailsActivity : BaseActivity() {
}
ToastUtils.show(this@OrderDetailsActivity, if (msg.success) {
"製作完成"
} else if(!TextUtil.isEmptyOrNullOrUndefined(msg.errorMsg)){
} else if (!TextUtil.isEmptyOrNullOrUndefined(msg.errorMsg)) {
msg.errorMsg
} else {
"修改訂單狀態失敗"
......@@ -281,7 +290,7 @@ class OrderDetailsActivity : BaseActivity() {
private fun PageViewModel.cancelOrder(orderDetails: OrderDetails.DataBean) {
//獲取取消原因讓用戶選擇
showLoading()
getCancelReason(GsaCloudApplication.getRestaurantId(this@OrderDetailsActivity).toString(), "3") { cancelReson ->
getCancelReason(GsaCloudApplication.getBrandId(this@OrderDetailsActivity), GsaCloudApplication.getRestaurantId(this@OrderDetailsActivity), 3) { cancelReson ->
cancelDialogForLoading()
if (cancelReson != null && cancelReson.data.isNotEmpty()) {
//如果有配置取消原因
......@@ -339,7 +348,7 @@ class OrderDetailsActivity : BaseActivity() {
private fun PageViewModel.cancelLogistics(orderDetails: OrderDetails.DataBean) {
//獲取取消原因讓用戶選擇
showLoading()
getCancelReason(GsaCloudApplication.getRestaurantId(this@OrderDetailsActivity).toString(), "2") { cancelReson ->
getCancelReason(GsaCloudApplication.getBrandId(this@OrderDetailsActivity), GsaCloudApplication.getRestaurantId(this@OrderDetailsActivity), 2) { cancelReson ->
cancelDialogForLoading()
if (cancelReson != null && cancelReson.data.isNotEmpty()) {
//如果有配置取消原因
......
......@@ -105,8 +105,7 @@ class PayActivity : BaseActivity() {
}
billBeans.add(BillBean("支付金額:", MoneyUtil.sub(orderDetails.TOTAL_AMOUNT!!.toDouble(), orderDetails.discount_amount)))
rv_order_pay_bill.layoutManager = LinearLayoutManager(this)
rv_order_pay_bill.adapter = PayBillAdapter(billBeans)
rv_order_pay_bill.adapter = PayBillAdapter(R.layout.item_pay_bill, billBeans)
}
......
......@@ -10,6 +10,7 @@ import com.chad.library.adapter.base.viewholder.BaseViewHolder
import com.gingersoft.gsa.other_order_mode.R
import com.gingersoft.gsa.other_order_mode.data.model.bean.DeliveryConfig
import com.gingersoft.gsa.other_order_mode.databinding.ItemDeliveryLayoutBinding
import com.gingersoft.gsa.other_order_mode.ui.fragment.UpdateDeliveryFragment
class DeliveryListAdapter(data: MutableList<DeliveryConfig.Data.DeliveryInfo>) : BaseQuickAdapter<DeliveryConfig.Data.DeliveryInfo, DeliveryListAdapter.ViewHolder>(R.layout.item_delivery_layout, data) {
......@@ -26,7 +27,7 @@ class DeliveryListAdapter(data: MutableList<DeliveryConfig.Data.DeliveryInfo>) :
// deliveryType = it.distributionType
deliveryExpenses = "${it.distributionFeeMin}-${it.distributionFeeMax}"
deliveryFee = it.deliveryCost.toString()
deliveryMethod = if (it.type == 1) "物流配送" else "本店配送"
deliveryMethod = UpdateDeliveryFragment.deliveryMethod[it.type]
deliveryDifference = it.lackPrice.toString()
}
}
......
......@@ -6,17 +6,17 @@ import com.chad.library.adapter.base.viewholder.BaseViewHolder
import com.gingersoft.gsa.other_order_mode.R
import com.gingersoft.gsa.other_order_mode.data.model.bean.BillBean
class PayBillAdapter(billBeans: MutableList<BillBean>) : BaseQuickAdapter<BillBean, BaseViewHolder>(R.layout.item_pay_bill, billBeans) {
class PayBillAdapter(layoutId:Int, billBeans: MutableList<BillBean>) : BaseQuickAdapter<BillBean, BaseViewHolder>(layoutId, billBeans) {
override fun convert(holder: BaseViewHolder, item: BillBean) {
holder.setText(R.id.tv_item_pay_name, item.name)
holder.setText(R.id.tv_item_pay_amount, item.amount.toString())
if(item.isRed == 0){
holder.setTextColor(R.id.tv_item_pay_name, ContextCompat.getColor(context, R.color.color_3c))
holder.setTextColor(R.id.tv_item_pay_name, ContextCompat.getColor(context, R.color.color_3c))
holder.setTextColor(R.id.tv_item_pay_amount, ContextCompat.getColor(context, R.color.color_3c))
} else {
holder.setTextColor(R.id.tv_item_pay_name, ContextCompat.getColor(context, R.color.discount_red))
holder.setTextColor(R.id.tv_item_pay_name,ContextCompat.getColor(context, R.color.discount_red))
holder.setTextColor(R.id.tv_item_pay_amount,ContextCompat.getColor(context, R.color.discount_red))
}
}
......
......@@ -25,6 +25,8 @@ import kotlinx.android.synthetic.main.update_delivery_fragment.*
class UpdateDeliveryFragment : BaseFragment(R.layout.update_delivery_fragment) {
companion object {
var deliveryMethod = arrayListOf("本店配送", "zeek", "lalamove")
private const val info = "info"
@JvmStatic
fun newInstance(deliveryConfig: DeliveryConfig.Data.DeliveryInfo?): UpdateDeliveryFragment {
......@@ -41,7 +43,6 @@ class UpdateDeliveryFragment : BaseFragment(R.layout.update_delivery_fragment) {
var pop: QMUIPopup? = null
var deliveryType = arrayListOf("短途送", "中途送", "長途送")
var deliveryMethod = arrayListOf("本店配送", "第三方")
var deliveryTypeTag = arrayListOf("SHORT_RANGE", "STANDARD", "LONG_DISTANCE")
var selectDeliveryType = deliveryTypeTag[0]//用戶當前選中的配送類型
......@@ -75,11 +76,7 @@ class UpdateDeliveryFragment : BaseFragment(R.layout.update_delivery_fragment) {
}
selectDeliveryType = it.distributionType
//備送方式
tv_delivery_method.text = when (it.type) {
0 -> "本店配送"
1 -> "第三方"
else -> ""
}
tv_delivery_method.text = deliveryMethod[it.type]
selectDeliveryMethodPosition = it.type
}
......@@ -115,7 +112,7 @@ class UpdateDeliveryFragment : BaseFragment(R.layout.update_delivery_fragment) {
if (deliveryConfig == null) {
//新增
viewModel.addDeliveryConfig(et_min_delivery_fee.text.toString(), et_max_delivery_fee.text.toString(), ed_delivery_fee.text.toString(), ed_start_delivery_fee.text.toString(), selectDeliveryType, selectDeliveryMethodPosition,
ed_desc.text.toString(), GsaCloudApplication.getRestaurantId(context), GsaCloudApplication.getMemberId(context), ed_difference_fee.text.toString()) { it ->
ed_desc.text.toString(), GsaCloudApplication.getRestaurantId(context), GsaCloudApplication.getMemberId(context), ed_difference_fee.text.toString()) {
cancelDialogForLoading()
if (it != null && it.success) {
ToastUtils.show(context, "保存成功")
......@@ -127,7 +124,7 @@ class UpdateDeliveryFragment : BaseFragment(R.layout.update_delivery_fragment) {
} else {
//編輯
viewModel.updateDeliveryConfig(et_min_delivery_fee.text.toString(), et_max_delivery_fee.text.toString(), ed_delivery_fee.text.toString(), ed_start_delivery_fee.text.toString(), selectDeliveryType, selectDeliveryMethodPosition,
ed_desc.text.toString(), deliveryConfig!!.id, GsaCloudApplication.getRestaurantId(context), GsaCloudApplication.getMemberId(context), ed_difference_fee.text.toString(), 0) { it ->
ed_desc.text.toString(), deliveryConfig!!.id, GsaCloudApplication.getRestaurantId(context), GsaCloudApplication.getMemberId(context), ed_difference_fee.text.toString(), 0) {
cancelDialogForLoading()
if (it != null && it.success) {
ToastUtils.show(context, "修改成功")
......@@ -147,7 +144,7 @@ class UpdateDeliveryFragment : BaseFragment(R.layout.update_delivery_fragment) {
val listView = view.findViewById<RecyclerView>(R.id.ryview)
listView.layoutManager = LinearLayoutManager(context)
adapter = TextAdapter(list)
adapter?.setOnItemClickListener { _, _, _ ->}
adapter?.setOnItemClickListener { _, _, _ -> }
listView.layoutParams.width = (ArmsUtils.getScreenWidth(context) * 0.7).toInt()
listView.adapter = adapter
......
......@@ -14,12 +14,17 @@ import androidx.core.content.ContextCompat
import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.gingersoft.gsa.cloud.base.utils.MoneyUtil
import com.gingersoft.gsa.cloud.base.utils.other.TextUtil
import com.gingersoft.gsa.cloud.base.widget.DialogUtils
import com.gingersoft.gsa.cloud.print.bean.OrderDetails
import com.gingersoft.gsa.other_order_mode.R
import com.gingersoft.gsa.other_order_mode.data.model.bean.BillBean
import com.gingersoft.gsa.other_order_mode.databinding.LayoutOrderInfoDialogNewBinding
import com.gingersoft.gsa.other_order_mode.ui.adapter.FoodListAdapter
import com.gingersoft.gsa.other_order_mode.ui.adapter.PayBillAdapter
import com.jess.arms.utils.ArmsUtils
import java.lang.Double.parseDouble
object OtherOrderUtils {
......@@ -30,9 +35,11 @@ object OtherOrderUtils {
val tvStatus = hepler.getView<TextView>(R.id.tv_order_state)
val orderData = data.data!![0]
val layoutOrderInfoDialogBinding: LayoutOrderInfoDialogNewBinding = DataBindingUtil.bind(hepler.contentView)!!
val totalAmount = orderData.TOTAL_AMOUNT!!.toDouble()
layoutOrderInfoDialogBinding.data = orderData
layoutOrderInfoDialogBinding.isSelf = orderType == 7
layoutOrderInfoDialogBinding.totalAmount = orderData.TOTAL_AMOUNT!!.toDouble()
layoutOrderInfoDialogBinding.totalAmount = totalAmount
//是歷史訂單,就不顯示訂單狀態
layoutOrderInfoDialogBinding.isHistory = isHistory
var btnContent = ""
......@@ -82,15 +89,61 @@ object OtherOrderUtils {
cancelBtnContent = "取消訂單"
}
}
layoutOrderInfoDialogBinding.patMethod = when (orderData.payType) {
1 -> "積分支付"
2 -> "支付寶"
3 -> "财付通"
4 -> "微信支付"
5 -> "貨到付款"
6 -> "其他支付"
else -> ""
// val payName = StringBuffer()
// if (orderData.payMultiple != null) {
// for (payMethod in orderData.payMultiple!!) {
// if (!TextUtil.isEmptyOrNullOrUndefined(payMethod.payName)) {
// payName.append(payMethod.payName)
// payName.append(",")
// }
// }
// if (payName.isNotEmpty()) {
// payName.deleteCharAt(payName.length - 1)
// }
// layoutOrderInfoDialogBinding.payMethod = payName.toString()
// } else {
// layoutOrderInfoDialogBinding.payMethod = when (orderData.payType) {
// 1 -> "積分支付"
// 2 -> "支付寶"
// 3 -> "财付通"
// 4 -> "微信支付"
// 5 -> "貨到付款"
// 6 -> "其他支付"
// else -> ""
// }
// }
val billBeans = ArrayList<BillBean>()
billBeans.add(BillBean("合計:", MoneyUtil.sub(MoneyUtil.sub(totalAmount, orderData.Lunchbox), orderData.DELIVERY_CHARGE), 0))
if (orderData.Lunchbox != 0.0) {
billBeans.add(BillBean("餐盒費:", orderData.Lunchbox, 0))
}
if (orderData.DELIVERY_CHARGE != 0.0) {
billBeans.add(BillBean("送貨費:", orderData.DELIVERY_CHARGE, 0))
}
if (orderData.discount_amount != 0.0) {
billBeans.add(BillBean("折扣:", orderData.discount_amount, 0))
}
billBeans.add(BillBean("總金額:", MoneyUtil.sub(totalAmount, orderData.discount_amount), 0))
// billBeans.add(BillBean("支付金額:", MoneyUtil.sub(totalAmount, orderData.discount_amount), 1))
orderData.couponList?.let {
for (coupon in it) {
if (TextUtil.isNotEmptyOrNullOrUndefined(coupon.couponName)) {
billBeans.add(BillBean(coupon.couponName, parseDouble(coupon.discount_amount.toString()), 1))
}
}
}
orderData.payMultiple?.let {
for (payMultiple in it) {
if (TextUtil.isNotEmptyOrNullOrUndefined(payMultiple.payName)) {
billBeans.add(BillBean(payMultiple.payName + ":", payMultiple.amount, 1))
}
}
}
val rvBillInfo = hepler.getView<RecyclerView>(R.id.recycler_order_details_pay_info)
rvBillInfo.layoutManager = LinearLayoutManager(context)
rvBillInfo.adapter = PayBillAdapter(R.layout.item_orderdetails_bill_info, billBeans)
if (isHistory) {
cancelBtnContent = ""
......
......@@ -39,9 +39,6 @@
name="orderStatus"
type="String" />
<variable
name="patMethod"
type="String" />
<variable
name="estimatedTime"
......@@ -442,166 +439,11 @@
android:background="@color/color_ccc"
app:layout_constraintTop_toBottomOf="@id/rv_food" />
<TextView
android:id="@+id/tv_total_text"
style="@style/otherOrder_bill_textStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/other_order_info_dialog_content_marginLeft"
android:layout_marginTop="@dimen/dp_10"
android:gravity="right"
android:text="合計:"
app:layout_constraintHorizontal_weight="0.7"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/tv_total"
app:layout_constraintTop_toBottomOf="@id/line_food_bottom" />
<TextView
android:id="@+id/tv_total"
style="@style/otherOrder_bill_info_textStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/other_order_info_dialog_content_marginRight"
android:gravity="right"
android:text="@{@string/amount_unit + MoneyUtil.sub(MoneyUtil.sub(Double.parseDouble(data.tOTAL_AMOUNT), data.lunchbox),data.dELIVERY_CHARGE)}"
app:layout_constraintHorizontal_weight="0.3"
app:layout_constraintLeft_toRightOf="@id/tv_total_text"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/tv_total_text" />
<TextView
android:id="@+id/tv_lunchbox_cost_text"
style="@style/otherOrder_bill_textStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_10"
android:text="餐盒費:"
android:visibility="@{data.lunchbox==0?View.GONE:View.VISIBLE}"
app:layout_constraintRight_toRightOf="@id/tv_total_text"
app:layout_constraintTop_toBottomOf="@id/tv_total" />
<TextView
android:id="@+id/tv_lunchbox_cost"
style="@style/otherOrder_bill_info_textStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/other_order_info_dialog_content_marginRight"
android:text="@{@string/amount_unit + data.lunchbox}"
android:visibility="@{data.lunchbox==0?View.GONE:View.VISIBLE}"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/tv_lunchbox_cost_text" />
<TextView
android:id="@+id/tv_delivery_fee_text"
style="@style/otherOrder_bill_textStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_10"
android:text="送貨費:"
android:visibility="@{data.dELIVERY_CHARGE==0?View.GONE:View.VISIBLE}"
app:layout_constraintRight_toRightOf="@id/tv_total_text"
app:layout_constraintTop_toBottomOf="@id/tv_lunchbox_cost" />
<TextView
android:id="@+id/tv_delivery_fee"
style="@style/otherOrder_bill_info_textStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/other_order_info_dialog_content_marginRight"
android:text="@{@string/amount_unit + data.dELIVERY_CHARGE}"
android:visibility="@{data.dELIVERY_CHARGE==0?View.GONE:View.VISIBLE}"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/tv_delivery_fee_text" />
<TextView
android:id="@+id/tv_discount_text"
style="@style/otherOrder_bill_textStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_10"
android:text="折扣:"
android:visibility="@{data.discount_amount==0?View.GONE:View.VISIBLE}"
app:layout_constraintRight_toRightOf="@id/tv_total_text"
app:layout_constraintTop_toBottomOf="@id/tv_delivery_fee" />
<TextView
android:id="@+id/tv_discount"
style="@style/otherOrder_bill_info_textStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/other_order_info_dialog_content_marginRight"
android:text="@{@string/minus_amount_unit + data.discount_amount}"
android:visibility="@{data.discount_amount==0?View.GONE:View.VISIBLE}"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/tv_discount_text" />
<TextView
android:id="@+id/tv_total_amount_text2"
style="@style/otherOrder_bill_textStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_10"
android:text="總金額:"
app:layout_constraintRight_toRightOf="@id/tv_total_text"
app:layout_constraintTop_toBottomOf="@id/tv_discount" />
<TextView
android:id="@+id/tv_total_amount2"
style="@style/otherOrder_bill_info_textStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/other_order_info_dialog_content_marginRight"
android:text="@{@string/amount_unit + MoneyUtil.sub(total_amount, data.discount_amount)}"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/tv_total_amount_text2" />
<TextView
android:id="@+id/tv_pay_amount_text"
style="@style/otherOrder_bill_textStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_10"
android:text="支付金額:"
app:layout_constraintRight_toRightOf="@id/tv_total_text"
app:layout_constraintTop_toBottomOf="@id/tv_total_amount_text2" />
<TextView
android:id="@+id/tv_pay_amount"
style="@style/otherOrder_bill_info_textStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/other_order_info_dialog_content_marginRight"
android:text="@{@string/amount_unit + MoneyUtil.sub(total_amount, data.discount_amount)}"
android:textColor="#FF0000"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/tv_pay_amount_text" />
<TextView
android:id="@+id/tv_pay_method_text"
style="@style/otherOrder_bill_textStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_10"
android:text="支付方式:"
android:visibility="@{patMethod.length()==0?View.GONE:View.VISIBLE}"
app:layout_constraintRight_toRightOf="@id/tv_total_text"
app:layout_constraintTop_toBottomOf="@id/tv_pay_amount_text" />
<TextView
android:id="@+id/tv_pay_method"
style="@style/otherOrder_bill_info_textStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/other_order_info_dialog_content_marginRight"
android:text="@{patMethod}"
android:visibility="@{patMethod.length()==0?View.GONE:View.VISIBLE}"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/tv_pay_method_text" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_order_details_pay_info"
android:layout_width="match_parent"
app:layout_constraintTop_toBottomOf="@id/line_food_bottom"
android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>
......
......@@ -9,26 +9,26 @@ import com.epson.epos2.printer.Printer;
import com.epson.epos2.printer.PrinterStatusInfo;
import com.epson.epos2.printer.ReceiveListener;
import com.gingersoft.gsa.cloud.print.PrintExecutor;
import com.gingersoft.gsa.cloud.print.PrintSocketHolder;
import com.joe.print.mvp.model.bean.PrintInfoBean;
import com.joe.print.mvp.print.utils.MyPrintUtils;
import java.util.ArrayList;
import java.util.List;
import io.reactivex.disposables.Disposable;
public class EpsonPrint implements ReceiveListener {
private final String TAG = this.getClass().getSimpleName();
private Printer mPrinter = null;
private ReceiveListener receiveListener;
// private PrjPrintCallbackListener
private PrintExecutor.OnPrintResultListener resultListener;
private static EpsonPrint epsonPrint;
public static EpsonPrint getInstance() {
public static EpsonPrint
getInstance() {
synchronized (EpsonPrint.class) {
if (epsonPrint == null) {
epsonPrint = new EpsonPrint();
......@@ -42,11 +42,9 @@ public class EpsonPrint implements ReceiveListener {
*
* @return
*/
public boolean initializeObject(Context context, ReceiveListener receiveListener) {
// if (mPrinter != null) {
// return true;
// }
public boolean initializeObject(Context context, ReceiveListener receiveListener,PrintExecutor.OnPrintResultListener resultListener) {
try {
this.resultListener = resultListener;
this.receiveListener = receiveListener;
//第一個參數是機型,第二個參數是語言,
mPrinter = new Printer(Printer.TM_U220, Printer.MODEL_KOREAN, context);
......@@ -58,6 +56,9 @@ public class EpsonPrint implements ReceiveListener {
return true;
}
/**
* 斷開連接
*/
public void disconnectPrinter() {
if (mPrinter == null) {
return;
......@@ -82,13 +83,6 @@ public class EpsonPrint implements ReceiveListener {
}
}
public PrinterStatusInfo getStatus() {
if (mPrinter == null) {
return null;
}
return mPrinter.getStatus();
}
public void finalizeObject() {
if (mPrinter == null) {
return;
......@@ -104,24 +98,8 @@ public class EpsonPrint implements ReceiveListener {
* @return
*/
private boolean createPrintData(Bitmap bitmap) {
// String method = "";
StringBuilder textData = new StringBuilder();
// final int barcodeWidth = 2;
// final int barcodeHeight = 100;
if (mPrinter == null) {
return false;
}
try {
// method = "addPulse";
// mPrinter.addPulse(Printer.PARAM_DEFAULT,
// Printer.PARAM_DEFAULT);
// method = "addTextAlign";
// mPrinter.addPageBegin();
// mPrinter.addTextFont(Printer.FONT_A);
// mPrinter.addTextLang(Printer.LANG_ZH_TW);
mPrinter.addTextAlign(Printer.ALIGN_CENTER);
// method = "addImage";
Log.e("ccc", "Epson寬度:" + bitmap.getWidth() + "高度:" + bitmap.getHeight());
mPrinter.addImage(bitmap, 0, 0,
bitmap.getWidth(),
bitmap.getHeight(),
......@@ -130,97 +108,16 @@ public class EpsonPrint implements ReceiveListener {
Printer.HALFTONE_DITHER,//半色調抖動
Printer.PARAM_DEFAULT,
Printer.COMPRESS_NONE);//壓縮
mPrinter.addCut(Printer.CUT_FEED);
//COLOR_NONE 為普通顏色 COLOR_2為紅色
// mPrinter.addTextSize(2, 2);
// mPrinter.addTextStyle(0,0,1, Printer.COLOR_1);
// mPrinter.addText("炒爐打印測試\n");
//
// //第一個參數不清楚作用,第二個參數ul是加下劃線,第三個參數em是加深顏色,第四個參數color修改文字顏色
// mPrinter.addTextAlign(Printer.ALIGN_LEFT);
// mPrinter.addTextStyle(0,0,0, Printer.COLOR_1);
// mPrinter.addText("時間:" + TimeUtil.getCurrentDate(TimeUtil.dateFormatYMDHMS)+"\n");
// mPrinter.addTextSize(1, 1);
// mPrinter.addText("-------項目-------\n");
// mPrinter.addText("--測試子食品 x1\n");
// mPrinter.addTextAlign(Printer.ALIGN_CENTER);
// mPrinter.addText("----Powered by Gingersoft----\n");
// mPrinter.addTextLang(Printer.LANG_ZH_TW);
// textData.append("------項目-----\n");
// textData.append("測試食品 x1\n");
// textData.append("測試子食品 x1\n");
// mPrinter.addTextSize(3, 3);
// mPrinter.addText(textData.toString());
// textData.setLength(0);
// mPrinter.addFeedLine(2);
// mPrinter.addPageEnd();
mPrinter.addCut(Printer.CUT_FEED);
// textData.append("\n");
// textData.append("7/01/07 16:58 6153 05 0191 134\n");
// textData.append("ST# 21 OP# 001 TE# 01 TR# 747\n");
// textData.append("------------------------------\n");
// method = "addText";
// mPrinter.addText(textData.toString());
// mPrinter.addTextStyle(0,0,0,Printer.COLOR_2);
// mPrinter.addText(textData.toString());
// mPrinter.addCut(Printer.CUT_FEED);
// textData.delete(0, textData.length());
//
// textData.append("400 OHEIDA 3PK SPRINGF 9.99 R\n");
// textData.append("------------------------------\n");
// method = "addText";
// mPrinter.addText(textData.toString());
// textData.delete(0, textData.length());
//
// textData.append("SUBTOTAL 160.38\n");
// textData.append("TAX 14.43\n");
// method = "addText";
// mPrinter.addText(textData.toString());
// textData.delete(0, textData.length());
//
// method = "addTextSize";
// mPrinter.addTextSize(2, 2);
// method = "addText";
// mPrinter.addText("TOTAL 174.81\n");
// method = "addTextSize";
// mPrinter.addTextSize(1, 1);
// method = "addFeedLine";
// mPrinter.addFeedLine(1);
//
// textData.append("CASH 200.00\n");
// textData.append("CHANGE 25.19\n");
// textData.append("------------------------------\n");
// method = "addText";
// mPrinter.addText(textData.toString());
// textData.delete(0, textData.length());
//
// textData.append("Purchased item total number\n");
// textData.append("Sign Up and Save !\n");
// textData.append("With Preferred Saving Card\n");
// method = "addText";
// mPrinter.addText(textData.toString());
// textData.delete(0, textData.length());
// method = "addFeedLine";
// mPrinter.addFeedLine(2);
// mPrinter.addPageEnd();
// mPrinter.addCut(Printer.CUT_FEED);
//
// method = "addBarcode";
// mPrinter.addBarcode("01209457",
// Printer.BARCODE_CODE39,
// Printer.HRI_BELOW,
// Printer.FONT_A,
// 2, 100);
} catch (Exception e) {
e.printStackTrace();
mPrinter.clearCommandBuffer();
return false;
}
// textData = null;
return true;
}
......@@ -369,68 +266,37 @@ public class EpsonPrint implements ReceiveListener {
//重試次數5次
private int resetCount = 5;
private void printData(String ip, Bitmap bitmap) {
mPrinter.clearCommandBuffer();
if (!createPrintData(bitmap)) {
return;
}
if (mPrinter == null) {
updatePrintState(PrintSocketHolder.ERROR_1);
return;
}
connectByIp(ip, mPrinter.getStatus());
if (mPrinter == null) {
updatePrintState(PrintSocketHolder.ERROR_2);
return;
}
PrinterStatusInfo statusInfo = mPrinter.getStatus();
if (statusInfo.getPaper() == 2) {
//沒紙了
updatePrintState(PrintSocketHolder.ERROR_2);
return;
} else if(statusInfo.getConnection() != 1){
//未連接到打印機
updatePrintState(PrintSocketHolder.ERROR_2);
}
try {
mPrinter.sendData(Printer.PARAM_DEFAULT);
} catch (Exception e) {
updatePrintState(PrintSocketHolder.ERROR_4);
mPrinter.clearCommandBuffer();
disconnectPrinter();
isPrint = false;
}
}
private Disposable timerDisposable;
// private void startTimer(long delay) {
// if (timerDisposable != null) {
// timerDisposable.dispose();
// }
// Observable.timer(delay, TimeUnit.SECONDS)
// .subscribe(new Observer<Long>() {
// @Override
// public void onSubscribe(Disposable d) {
// timerDisposable = d;
// }
//
// @Override
// public void onNext(Long aLong) {
// isPrint = false;
// Log.e(TAG, "時間到了沒回調");
// if (bitmaps.size() > 0) {
// printData(ipAddress, bitmaps.get(0));
// }
// }
//
// @Override
// public void onError(Throwable e) {
//
// }
//
// @Override
// public void onComplete() {
//
// }
// });
// }
private void connectByIp(String ip, PrinterStatusInfo statusInfo) {
if (statusInfo != null) {
Log.e(TAG, "連接狀態1111:" + statusInfo.getConnection());
......@@ -490,14 +356,17 @@ public class EpsonPrint implements ReceiveListener {
return true;
}
private void updatePrintState(int code){
if(resultListener != null){
resultListener.onResult(code,null);
}
}
@Override
public void onPtrReceive(Printer printer, int i, PrinterStatusInfo printerStatusInfo, String s) {
this.mPrinter = printer;
mPrinter.clearCommandBuffer();
resetCount = 5;
if (timerDisposable != null && !timerDisposable.isDisposed()) {
timerDisposable.dispose();
}
if (bitmaps.size() > 0) {
bitmaps.remove(0);
}
......
package com.joe.print.mvp.print;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.util.Log;
import com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils;
import com.gingersoft.gsa.cloud.print.PrintDataMaker;
import com.gingersoft.gsa.cloud.print.PrinterWriter;
import com.gingersoft.gsa.cloud.print.PrinterWriterExecutor;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
......@@ -22,12 +15,10 @@ import java.util.List;
*/
public class IpPrintMaker implements PrintDataMaker {
private Context mContext;
private int width; // 打印的圖片寬度,紙張寬度
private List<Bitmap> bitmaps;
public IpPrintMaker(Context context, int width, List<Bitmap> bitmaps) {
this.mContext = context;
public IpPrintMaker(int width, List<Bitmap> bitmaps) {
this.width = width;
this.bitmaps = bitmaps;
}
......@@ -40,23 +31,17 @@ public class IpPrintMaker implements PrintDataMaker {
printer = new PrinterWriterExecutor(255, width);
printer.setAlignCenter();
data.add(printer.getDataAndReset());
if (bitmaps.size() <= 0) {
ToastUtils.show(mContext, "打印失敗");
return null;
}
Log.e("eee", "個數:" + bitmaps.size());
for (int i = 0; i < bitmaps.size(); i++) {
ArrayList<byte[]> image1 = printer.getImageByte(bitmaps.get(i));//將bitmap縮放到打印機紙張大小再添加到集合中。
data.addAll(image1);//draw2PxPoint2(bitmaps.get(i)
printer.printLineFeed();
printer.printLineFeed();
printer.printLineFeed();
// printer.printLineFeed();
// printer.printLineFeed();
printer.printLineFeed(3);
printer.feedPaperCutPartial();
data.add(printer.getDataAndReset());
}
data.add(printer.getDataAndClose());
for (int i = 0; i < bitmaps.size(); i++){
bitmaps.get(i).recycle();
}
return data;
} catch (Exception e) {
return new ArrayList<>();
......
......@@ -5,5 +5,5 @@ public interface PrintListener {
void printSuccess();
void printFile();
void printFile(String msg);
}
......@@ -160,6 +160,15 @@ public class PrintOtherOrder extends PrinterRoot {
//總金額34sp
layout.addView(getTakeawayLargeAmount(mContext, "總金額:", MONETARY_UNIT + data.getTOTAL_AMOUNT()));
layout.addView(getLine(mContext));
if (data.getPayMultiple() != null) {
for (OrderDetails.DataBean.PayMultiple payMultiple : data.getPayMultiple()) {
if (!TextUtil.isEmptyOrNullOrUndefined(payMultiple.getPayName())) {
layout.addView(getTakeawayLargeAmount(mContext, payMultiple.getPayName(), MONETARY_UNIT + payMultiple.getAmount()));
}
}
layout.addView(getLine(mContext));
}
//支付金額
layout.addView(getTakeawayLargeAmount(mContext, "支付金額:", MONETARY_UNIT + MoneyUtil.sub(Double.parseDouble(data.getTOTAL_AMOUNT()), data.getDiscount_amount()) + ""));
layout.addView(getLine(mContext));
......
......@@ -222,15 +222,16 @@ public class PrintOtherOrderClosing extends PrinterRoot {
//總金額34sp
layout.addView(getTakeawayLargeAmount(mContext, "總金額:", MONETARY_UNIT + data.getTOTAL_AMOUNT()));
layout.addView(getLine(mContext));
//多種支付方式
if(data.getOrderPayInfoVO() != null){
for (OrderDetails.DataBean.OrderPayAmountVo orderPayAmountVo : data.getOrderPayInfoVO()) {
layout.addView(getTakeawayLargeAmount(mContext, orderPayAmountVo.getPayName(), MONETARY_UNIT + orderPayAmountVo.getAmount()));
if (data.getPayMultiple() != null) {
for (OrderDetails.DataBean.PayMultiple payMultiple : data.getPayMultiple()) {
if (!TextUtil.isEmptyOrNullOrUndefined(payMultiple.getPayName())) {
layout.addView(getTakeawayLargeAmount(mContext, payMultiple.getPayName(), MONETARY_UNIT + payMultiple.getAmount()));
}
}
layout.addView(getLine(mContext));
} else {
layout.addView(getTakeawayLargeAmount(mContext, "支付金額:", MONETARY_UNIT + MoneyUtil.sub(Double.parseDouble(data.getTOTAL_AMOUNT()), data.getDiscount_amount()) + ""));
}
// layout.addView(getTakeawayLargeAmount(mContext, "支付金額:", MONETARY_UNIT + MoneyUtil.sub(Double.parseDouble(data.getTOTAL_AMOUNT()), data.getDiscount_amount()) + ""));
layout.addView(getLine(mContext));
//會員信息
layout.addView(getTakeawayMemberIntegerView(mContext, data));
layout.addView(getLine(mContext));
......
package com.joe.print.mvp.print;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
......@@ -30,14 +29,12 @@ import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.common.bean.BillingBean;
import com.gingersoft.gsa.cloud.base.common.bean.OrderDetail;
import com.gingersoft.gsa.cloud.base.common.bean.PayMethod;
import com.gingersoft.gsa.cloud.base.threadPool.ThreadPoolManager;
import com.gingersoft.gsa.cloud.base.utils.AidlUtil;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.base.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils;
import com.gingersoft.gsa.cloud.base.utils.view.ImageUtils;
import com.gingersoft.gsa.cloud.base.utils.view.LayoutToBitmapUtils;
import com.gingersoft.gsa.cloud.base.widget.DialogUtils;
import com.gingersoft.gsa.cloud.constans.PrintConstans;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.gingersoft.gsa.cloud.print.PrintExecutor;
......@@ -47,7 +44,6 @@ import com.gingersoft.gsa.cloud.print.bean.OrderDetails;
import com.hyweb.n5.lib.constant.PrinterConstant;
import com.hyweb.n5.lib.util.PrinterUtil;
import com.hyweb.n5.server.aidl.IOnPrintCallback;
import com.jess.arms.utils.ArmsUtils;
import com.joe.print.R;
import com.joe.print.mvp.model.bean.PrintBillBean;
import com.joe.print.mvp.print.common.PrinterFinderCallback;
......@@ -56,11 +52,8 @@ import com.joe.print.mvp.print.usb.EscCommand;
import com.joe.print.mvp.print.usb.UsbPrint;
import com.joe.print.mvp.print.usb.UsbPrinter;
import com.joe.print.mvp.print.usb.UsbPrinterFinder;
import com.joe.print.mvp.ui.activity.PrintActivity;
import com.joe.print.mvp.ui.adapter.BillItemAdapter;
import com.joe.print.mvp.ui.adapter.DialogPrinterListAdapter;
import com.sunmi.peripheral.printer.InnerResultCallbcak;
import com.yanzhenjie.recyclerview.widget.DefaultItemDecoration;
import java.io.IOException;
import java.util.ArrayList;
......@@ -72,18 +65,13 @@ import java.util.Objects;
public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedListener, PrintExecutor.OnPrintResultListener, ReceiveListener {
protected final String MONETARY_UNIT = "$";
private final static int SUNMI_PAPER_WIDTH = 360;//商米打印機紙張寬度
private final static int N5_PAPER_WIDTH = 500;//N5打印機紙張寬度
final static String DELIMITER = "/";//將打印位置區分開來。。。。,暫時只有廚房單用到
private Context mContext;
private PrintListener printListener;
private Map<String, List<Bitmap>> listMap;
private int printCount = 1;
public static PrinterRoot getPrinterByType(int type) {
//初始化USB打印
......@@ -109,31 +97,11 @@ public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedLis
return null;
}
public PrinterRoot initUsbPrint() {
// usbPrint = UsbPrint.getInstance(mContext, sendCallback);
// printerFinder = new UsbPrinterFinder(mContext, printerFinderCallback);
// printerFinder.startFinder();
return this;
}
public PrinterRoot setmContext(Context mContext) {
this.mContext = mContext;
return this;
}
public PrinterRoot setPrintListener(PrintListener printListener) {
this.printListener = printListener;
return this;
}
public void setText(View parentView, int viewId, String text) {
((TextView) parentView.findViewById(viewId)).setText(text);
}
public void setIsShow(View parentView, int viewId, boolean isShow) {
parentView.findViewById(viewId).setVisibility(isShow ? View.VISIBLE : View.GONE);
}
/**
* 把Map中Key相同,则各个value添加到一起,汇总值
* 把partMap数据合并放到resultMap中。
......@@ -156,6 +124,32 @@ public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedLis
}
/**
* 獲取打印數據,根據打印次數
*
* @param mContext
* @param deviceBean
* @return
*/
public Map<String, List<Bitmap>> getPrintBitmapByCount(Context mContext, PrinterDeviceBean deviceBean) {
int printCount = getPrintCount(mContext);
if (printCount <= 0) {
return null;
}
Map<String, List<Bitmap>> printBitmap = getPrintBitmap(mContext, deviceBean);
List<Bitmap> bitmapList = printBitmap.get("");
if (bitmapList != null) {
int bitmapSize = bitmapList.size();
for (int i = 0; i < printCount - 1; i++) {
for (int j = 0; j < bitmapSize; j++) {
bitmapList.add(bitmapList.get(j));
}
}
printBitmap.put("", bitmapList);
}
return printBitmap;
}
/**
* @param mContext
* @return key為打印位置,值為圖片集合的map
*/
......@@ -169,61 +163,19 @@ public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedLis
*/
public abstract int getPrintCount(Context context);
public void print(List<PrinterDeviceBean> deviceBeans) {
if (this instanceof PrintInstruction) {
//開錢箱
PrintExecutor executor = new PrintExecutor(getDefaultPrintInList(deviceBeans));
executor.doPrinterRequestAsync(new OpenCashBoxMaker());
} else {
// listMap = getPrintBitmap(mContext);
if (listMap == null) {
printListener.printFile();
return;
}
printSize = listMap.size();
printCount = getPrintCount(mContext);
if (printSize <= 0) {
printListener.printFile();
return;
}
// 先不管有沒有默認打印位置
// 第一步先查看map中的key是不是空的"",有key就要獲取打印機列表,找到對應打印機打印。如果沒有找到打印機再去找默認打印機
// 如果沒有key,則是走默認打印機流程
for (Map.Entry<String, List<Bitmap>> entry : listMap.entrySet()) {
if (entry.getKey().equals("") || entry.getKey().equals("null")) {
//沒有打印位置,獲取默認打印位置
defaultPrint(deviceBeans, entry.getValue());
} else {
//有打印位置
hasPrinterSettingPrint(entry.getKey(), entry.getValue(), deviceBeans);
}
}
}
}
/**
* 本機打印
*/
public void locationPrint(List<Bitmap> bitmaps, PrintListener listener) {
//本機打印
if (bitmaps == null || bitmaps.size() <= 0) {
ToastUtils.show(mContext, "未獲取到打印內容");
listener.printFile();
return;
}
String model = Build.MODEL;
for (int i = 0; i < printCount; i++) {
if (GsaCloudApplication.mV2.contains(model)) {
sunmiPrint(bitmaps, listener);
} else if (GsaCloudApplication.mN5.contains(model)) {
//N5打印
n5Print(bitmaps, listener);
} else {
ToastUtils.show(mContext, "暫不支持本機型打印");
listener.printFile();
}
if (GsaCloudApplication.mV2.contains(model)) {
sunmiPrint(bitmaps, listener);
} else if (GsaCloudApplication.mN5.contains(model)) {
//N5打印
n5Print(bitmaps, listener);
} else {
listener.printFile("暫不支持本機型打印");
}
}
......@@ -235,21 +187,16 @@ public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedLis
*/
private void n5Print(List<Bitmap> bitmaps, PrintListener listener) {
try {
try {
for (int i = 0; i < bitmaps.size(); i++) {
PrinterUtil.appendImage(ImageUtils.zoomDrawable(bitmaps.get(i), N5_PAPER_WIDTH), PrinterConstant.ALIGN_CENTER);
PrinterUtil.appendPrnStr("\n", 24, PrinterConstant.ALIGN_CENTER, false);
PrinterUtil.appendPrnStr("\n", 24, PrinterConstant.ALIGN_CENTER, false);
}
startN5Print(listener);
} catch (NullPointerException e) {
ToastUtils.show(mContext, "打印失敗,請重試");
// finish();
listener.printFile();
for (int i = 0; i < bitmaps.size(); i++) {
PrinterUtil.appendImage(ImageUtils.zoomDrawable(bitmaps.get(i), N5_PAPER_WIDTH), PrinterConstant.ALIGN_CENTER);
PrinterUtil.appendPrnStr("\n", 24, PrinterConstant.ALIGN_CENTER, false);
PrinterUtil.appendPrnStr("\n", 24, PrinterConstant.ALIGN_CENTER, false);
}
startN5Print(listener);
} catch (RemoteException e) {
e.printStackTrace();
listener.printFile();
listener.printFile("打印失敗,請重試");
}
}
......@@ -266,11 +213,9 @@ public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedLis
public void onRunResult(boolean isSuccess) {
//返回接⼝执⾏的情况(并⾮真实打印):成功或失败
if (isSuccess) {
ToastUtils.show(mContext, "打印成功");
listener.printSuccess();
} else {
ToastUtils.show(mContext, "打印失敗");
listener.printFile();
listener.printFile("打印失敗");
}
}
......@@ -302,7 +247,7 @@ public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedLis
listener.printSuccess();
} else {
//打印失敗
listener.printFile();
listener.printFile("打印失敗");
}
}
......@@ -314,214 +259,17 @@ public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedLis
} catch (RemoteException e) {
e.printStackTrace();
//打印失敗
listener.printFile();
}
}
//需要打印的次數,根據打印位置來計數,帶*號的之後需要另算。
private int printSize;
private List<PrinterDeviceBean> printerDeviceBeans;
/**
* 有打印位置的打印方式
*
* @param key 打印位置
* @param bitmaps 需要打印的圖片
* @param printerDeviceBeans ip打印機集合
*/
private void hasPrinterSettingPrint(String key, List<Bitmap> bitmaps, List<PrinterDeviceBean> printerDeviceBeans) {
this.printerDeviceBeans = printerDeviceBeans;
//獲取用於打印的圖片
if (printerDeviceBeans.size() == 1) {
//如果只有一台ip打印機設備,直接全部打印在這台設備上
ipDevicePrint(printerDeviceBeans.get(0), bitmaps);
} else {
//通過打印位置生成多張用於打印的bitmap
//在打印機列表中找到當前key,
boolean isPrint = false;//是否已經打印
for (int i = 0; i < printerDeviceBeans.size(); i++) {
int lastIndex = key.lastIndexOf(DELIMITER);
key = key.substring(lastIndex + 1);
if (key.replaceAll("\\*", "").trim().equalsIgnoreCase(printerDeviceBeans.get(i).getName())) {
//如果key(打印位置)去掉*號和打印機名稱相同,則在這台機器上打印
ipDevicePrint(printerDeviceBeans.get(i), bitmaps);
isPrint = true;
break;
}
}
// 循環完也沒找到對應的打印機,則使用默認打印位置,或直接本機打印
if (!isPrint) {
// 獲取默認打印位置
// 獲得用戶默認的打印方式
defaultPrint(printerDeviceBeans, bitmaps);
}
}
}
/**
* 根據打印機位置獲取打印內容
*
* @param key 打印位置
* @return 打印內容
*/
private List<Bitmap> getPrintBitmapByPrintLocation(String key) {
if (listMap != null) {
for (Map.Entry<String, List<Bitmap>> entry : listMap.entrySet()) {
if (!entry.getKey().equals("")) {
//有打印位置
String newKey = entry.getKey();
int lastIndex = newKey.lastIndexOf(DELIMITER);
newKey = newKey.substring(lastIndex + 1);
if (newKey.equals(key)) {
return entry.getValue();
}
}
}
}
return null;
}
private void defaultPrint(List<PrinterDeviceBean> printerDeviceBeans, List<Bitmap> bitmaps) {
//獲取默認打印方式,本機、IP
String deftultPrint = (String) SPUtils.get(mContext, PrintConstans.DEFAULT_PRINT_METHOD, "");
if (deftultPrint != null && deftultPrint.equals("")) {
// 如果沒有默認打印位置,彈出彈窗讓用戶選擇是本機打印還是ip打印
new DialogUtils(mContext, R.layout.print_dialog_select_device) {
@Override
public void initLayout(ViewHepler hepler, Dialog dialog) {
//本地打印
hepler.setViewClick(R.id.local_print, v -> {
locationPrint(bitmaps, new PrintListener() {
@Override
public void printStateChanged(int state) {
}
@Override
public void printSuccess() {
cutPrintSize();
}
@Override
public void printFile() {
cutPrintSize();
}
});
//修改默認打印方式為本地
SPUtils.put(mContext, PrintConstans.DEFAULT_PRINT_METHOD, PrintConstans.LOCAL_PRINT);
dialog.dismiss();
});
//ip打印
hepler.setViewClick(R.id.internet_print, v -> {
//修改默認打印方式為IP打印
SPUtils.put(mContext, PrintConstans.DEFAULT_PRINT_METHOD, PrintConstans.IP_PRINT);
dialog.dismiss();
//彈出彈窗,讓用戶選擇ip打印機
showIpPrintDeviceList(printerDeviceBeans, bitmaps);
});
}
}.show();
} else if (deftultPrint != null && deftultPrint.equals(PrintConstans.LOCAL_PRINT)) {
// 默認打印方式為本地,進行本地打印
locationPrint(bitmaps, new PrintListener() {
@Override
public void printStateChanged(int state) {
}
@Override
public void printSuccess() {
setPrintState(PrintActivity.FINISH);
}
@Override
public void printFile() {
setPrintState(PrintActivity.FINISH);
}
});
} else if (deftultPrint != null && deftultPrint.equals(PrintConstans.IP_PRINT)) {
// 默認打印方式為ip打印,調用ip打印方法
// 獲取默認ip打印機
if (printerDeviceBeans != null && printerDeviceBeans.size() > 0) {
PrinterDeviceBean deviceBean = getDefaultPrintInList(printerDeviceBeans);
if (deviceBean == null) {
//沒有默認打印機,彈出彈窗,讓用戶選擇ip打印機
showIpPrintDeviceList(printerDeviceBeans, bitmaps);
} else {
ipDevicePrint(getDefaultPrintInList(printerDeviceBeans), bitmaps);
}
} else {
//沒有默認打印機,彈出彈窗,讓用戶選擇ip打印機
showIpPrintDeviceList(printerDeviceBeans, bitmaps);
}
} else {
//沒有打印機,讓用戶去添加
setPrintState(PrintActivity.ADD_PRINT_DEVICE);
}
}
private PrinterDeviceBean getDefaultPrintInList(List<PrinterDeviceBean> printerDeviceBeans) {
if (printerDeviceBeans != null) {
for (PrinterDeviceBean printerDeviceBean : printerDeviceBeans) {
if (printerDeviceBean.getPrinterDeviceDefaultId() != null) {
//默認打印機
return printerDeviceBean;
}
}
String printDeviceName = (String) SPUtils.get(mContext, "defaultPrint", "");
for (PrinterDeviceBean printerDeviceBean : printerDeviceBeans) {
if (printDeviceName != null && printDeviceName.equals(printerDeviceBean.getName())) {
return printerDeviceBean;
}
}
}
return null;
}
private void showIpPrintDeviceList
(List<PrinterDeviceBean> printerDeviceBeans, List<Bitmap> bitmaps) {
if (printerDeviceBeans != null && printerDeviceBeans.size() > 0) {
if (printerDeviceBeans.size() == 1) {
//只有一台ip打印機時,直接打印
ipDevicePrint(printerDeviceBeans.get(0), bitmaps);
} else {
new DialogUtils(mContext, R.layout.print_dialog_internet_list) {
@Override
public void initLayout(ViewHepler hepler, Dialog dialog) {
RecyclerView mRvPrintList = hepler.getView(R.id.rv_print_list);
DialogPrinterListAdapter printListAdapter = new DialogPrinterListAdapter(printerDeviceBeans, mContext);
mRvPrintList.setLayoutManager(new LinearLayoutManager(mContext));
//分割线
mRvPrintList.addItemDecoration(new DefaultItemDecoration(ContextCompat.getColor(mContext, R.color.line_color)));
mRvPrintList.setAdapter(printListAdapter);
printListAdapter.setOnItemClickListener((adapter, view, position) -> {
//用戶選擇的ip打印機打印
ipDevicePrint(printerDeviceBeans.get(position), bitmaps);
SPUtils.put(mContext, "defaultPrint", printerDeviceBeans.get(position).getName());
dialog.dismiss();
});
}
}
.setHeight(ArmsUtils.getScreenHeidth(mContext) / 2)
.setWidth((int) (ArmsUtils.getScreenWidth(mContext) * 0.8))
.setOnDismissListener(dialog -> setPrintState(PrintActivity.FINISH))
.show();
}
} else {
//沒有打印機,讓用戶去添加
setPrintState(PrintActivity.ADD_PRINT_DEVICE);
listener.printFile("打印失敗");
}
}
public void ipDevicePrint(PrinterDeviceBean printerDeviceBean, List<Bitmap> bitmaps) {
ipDevicePrint(printerDeviceBean, bitmaps, this, this);
}
private EpsonPrint mPrinter;
private PrintExecutor executor;
/**
* ip設備打印
......@@ -532,41 +280,35 @@ public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedLis
//獲取打印機機型,如果是EPSON的打印機,調用EPSON的打印方法
if ((printerDeviceBean.getPrinterName() != null && printerDeviceBean.getPrinterName().toLowerCase().contains("EPSON".toLowerCase()))
&& (printerDeviceBean.getModel() != null && printerDeviceBean.getModel().toLowerCase().contains("TM-U220B".toLowerCase()))) {
mPrinter = EpsonPrint.getInstance();
mPrinter.initializeObject(GsaCloudApplication.getAppContext(), this);
for (int j = 0; j < bitmaps.size(); j++) {
mPrinter.putPrintData(printerDeviceBean.getIp(), bitmaps.get(j));
}
ThreadPoolManager.getInstence().putExecutableTasks(() -> {
mPrinter = EpsonPrint.getInstance();
mPrinter.initializeObject(GsaCloudApplication.getAppContext(), PrinterRoot.this, PrinterRoot.this);
for (int j = 0; j < bitmaps.size(); j++) {
mPrinter.putPrintData(printerDeviceBean.getIp(), bitmaps.get(j));
}
}
);
} else {
PrintExecutor executor = new PrintExecutor(printerDeviceBean);
executor.setOnStateChangedListener(stateChangedListener);
executor.setOnPrintResultListener(resultListener);
for (int j = 0; j < printCount; j++) {
IpPrintMaker maker = new IpPrintMaker(mContext, 480, bitmaps);
executor.doPrinterRequestAsync(maker);
if (executor == null) {
executor = new PrintExecutor(printerDeviceBean);
executor.setOnStateChangedListener(stateChangedListener);
executor.setOnPrintResultListener(resultListener);
}
IpPrintMaker maker = new IpPrintMaker(480, bitmaps);
executor.doPrinterRequestAsync(maker);
}
}
public void usbPrint(Context context, List<Bitmap> bitmaps) {
UsbPrint usbPrint = new UsbPrint(mContext, (code, printId) -> {
Log.e("ddd", printId + "打印結果:" + code);
UsbPrint usbPrint = new UsbPrint(context, (code, printId) -> {
//打印結果
if (code == SendResultCode.SEND_SUCCESS) {
Log.e("ddd", "打印成功" + (printListener == null));
if (printListener != null) {
Log.e("ddd", "打印成功");
printListener.printSuccess();
}
printSuccess();
} else if (code == SendResultCode.SEND_FAILED) {
Log.e("ddd", "打印失敗" + (printListener == null));
if (printListener != null) {
printListener.printFile();
}
printFile("打印失敗");
}
});
UsbPrinterFinder printerFinder = new UsbPrinterFinder(mContext, new PrinterFinderCallback<UsbPrinter>() {
UsbPrinterFinder printerFinder = new UsbPrinterFinder(context, new PrinterFinderCallback<UsbPrinter>() {
@Override
public void onStart() {
......@@ -580,7 +322,6 @@ public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedLis
@Override
public void onFinished(List<UsbPrinter> usbPrinters) {
if (usbPrinters != null && usbPrinters.size() > 0) {
Log.e("ddd", "找到" + usbPrinters.size() + "台打印機");
for (Bitmap bitmap : bitmaps) {
EscCommand esc = new EscCommand();
ArrayList<byte[]> bytes = new ArrayList<>();
......@@ -597,9 +338,7 @@ public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedLis
}
} else {
boolean hasPermission = new Intent().getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false);
Log.e("ddd", "未找到USB打印機" + hasPermission);
ToastUtils.show(context, "未找到USB打印機");
printListener.printFile();
printListener.printFile("未找到USB打印機");
}
}
});
......@@ -636,42 +375,50 @@ public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedLis
return ImageUtils.zoomDrawable(bitmap, printWidth);
}
//打印失敗設備map
private List<PrinterDeviceBean> printerFileDevices = new ArrayList<>();
@Override
public void onResult(int errorCode, PrinterDeviceBean printerDeviceBean) {
switch (errorCode) {
case PrintSocketHolder.ERROR_0:
Log.e("eee", "打印成功");
// cutPrintSize();
if (printListener != null) {
printListener.printSuccess();
}
printSuccess();
break;
case PrintSocketHolder.ERROR_1:
Log.e("eee", "生成測試頁面數據失敗");
printFile("生成打印數據失敗");
break;
case PrintSocketHolder.ERROR_2:
Log.e("eee", "連接打印機失敗");
printFile("連接打印機失敗");
break;
case PrintSocketHolder.ERROR_3:
Log.e("eee", "獲取輸出流失敗");
printerFileDevices.add(printerDeviceBean);
// cutPrintSize();
if (printListener != null) {
printListener.printFile();
}
printFile("連接打印機失敗");
break;
case PrintSocketHolder.ERROR_4:
Log.e("eee", "寫入測試頁面數據失敗");
printFile("連接打印機失敗");
break;
case PrintSocketHolder.ERROR_5:
Log.e("eee", "必要的參數不能為空");
printFile("連接打印機失敗");
break;
}
setPrintState(errorCode);
}
private void printSuccess() {
if (printListener != null) {
printListener.printSuccess();
}
}
private void printFile(String state) {
if (printListener != null) {
printListener.printFile(state);
}
}
@Override
public void onStateChanged(int state, PrinterDeviceBean printerDeviceBean) {
setPrintState(state);
......@@ -681,109 +428,6 @@ public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedLis
if (printListener != null) {
printListener.printStateChanged(state);
}
switch (state) {
case PrintSocketHolder.STATE_0:
Log.e("eee", "生成測試頁數據");
case PrintSocketHolder.STATE_1:
Log.e("eee", "開始創建連接");
break;
case PrintSocketHolder.STATE_2:
Log.e("eee", "創建連接成功,開始發送數據");
break;
case PrintSocketHolder.STATE_3:
Log.e("eee", "開始寫入數據");
break;
case PrintSocketHolder.STATE_4:
Log.e("eee", "關閉中");
break;
}
}
private void cutPrintSize() {
printSize--;
if (printSize <= 0) {
//全部打印完了
if (printerFileDevices != null && printerFileDevices.size() > 0) {
//有打印失敗的.關閉activity中的加載框
setPrintState(PrintActivity.DIMISS_LOADING);
// //显示彈窗,將失敗的打印機信息和食品組顯示出來。
// new DialogUtils(mContext, R.layout.dialog_print_fail_list) {
// @Override
// public void initLayout(ViewHepler hepler, Dialog dialog) {
// hepler.getView(R.id.iv_close_dialog).setOnClickListener(v -> dialog.dismiss());
// RecyclerView recyclerView = hepler.getView(R.id.rv_print_fail_list);
// recyclerView.setLayoutManager(new LinearLayoutManager(mContext));
// PrintFailListAdapter adapter = new PrintFailListAdapter(printerFileDevices);
// recyclerView.addItemDecoration(new DefaultItemDecoration(ContextCompat.getColor(mContext, R.color.line_color)));
// adapter.setOnItemClickListener((adapter12, view, position) -> {
// //顯示打印失敗的食品。
// if (printerFileDevices.get(position).getName() != null) {
// PrintFileBitmapAdapter bitmapAdapter = new PrintFileBitmapAdapter(getPrintBitmapByPrintLocation(printerFileDevices.get(position).getName()));
// recyclerView.setAdapter(bitmapAdapter);
// }
// });
// adapter.setSwitchPrintListenter(position -> {
// if (printerDeviceBeans != null && printerDeviceBeans.size() > 0) {
// //切換打印機打印。跳轉到選擇打印機列表
// DialogPrinterListAdapter adapter1 = new DialogPrinterListAdapter(printerDeviceBeans, mContext);
// //分割线
// recyclerView.setAdapter(adapter1);
// adapter1.setOnItemClickListener((adapter2, view, position1) -> {
// printerFileDevices.set(position, printerDeviceBeans.get(position1));
// adapter.setData(position, printerDeviceBeans.get(position1));
// recyclerView.setAdapter(adapter);
// });
// } else {
// //沒有打印機,讓用戶去添加
// setPrintState(PrintActivity.ADD_PRINT_DEVICE);
// }
// });
// adapter.setTryAgainPrintListenter(position -> {
// //重試打印。
// ipDevicePrint(printerFileDevices.get(position), getPrintBitmapByPrintLocation(printerFileDevices.get(position).getName()), (state, printerDeviceBean) -> {
// //打印機打印狀態切換回調
// }, (errorCode, printerDeviceBean) -> {
// switch (errorCode) {
// case PrintSocketHolder.ERROR_0:
// //打印成功
// adapter.remove(position);
// Log.e("eee", "打印成功");
// if (adapter.getItemCount() <= 0) {
// //所有都打印成功
// printListener.printSuccess();
// }
// break;
// case PrintSocketHolder.ERROR_2:
// case PrintSocketHolder.ERROR_3:
// //打印失敗
// adapter.setItemStatus(position, 0);
// Log.e("eee", "打印失敗");
// break;
// }
// });
// });
// recyclerView.setAdapter(adapter);
// }
// }
// .setWidth((int) (ArmsUtils.getScreenWidth(mContext) * 0.66))
// .setHeight((int) (ArmsUtils.getScreenHeidth(mContext) * 0.66))
// .createDialogView()
// .setCanceledOnTouchOutside(false)
// .setOnDismissListener(dialog -> setPrintState(PrintActivity.FINISH));
// .show();
printListener.printFile();
// ToastUtils.show(mContext, "打印失敗");
} else {
//都打印成功了
printListener.printSuccess();
}
}
}
public void onDestroy() {
// if (printerFinder != null) {
// printerFinder.unregisterReceiver();
// }
}
@Override
......@@ -791,9 +435,9 @@ public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedLis
Log.e("eee", "EPSON打印結果:" + i);
if (printListener != null) {
if (i == 0) {
printListener.printSuccess();
printSuccess();
} else {
printListener.printFile();
printFile("打印失敗");
}
}
// EpsonPrint.getInstance().disconnectPrinter();
......@@ -869,10 +513,11 @@ public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedLis
}
//支付類型
tvPayType.setText(payType);
//送達時間
tvDeliveryTime.setText(data.getOrder_type() == 2 ? data.getSEND_TIME() : data.getTakeTime());
if (TextUtil.isEmptyOrNullOrUndefined(tvDeliveryTime.getText().toString())) {
tvDeliveryTime.setVisibility(View.GONE);
}
tvBillNumber.setText("單號:" + data.getORDER_NO());
if (TextUtil.isEmptyOrNullOrUndefined(data.getBillNo())) {
......@@ -1025,24 +670,23 @@ public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedLis
}
/**
*
* @param mContext
* @param foodList
* @param deviceBean
* @param type 0 食品清單,1 結賬單
* @param showPrice 是否顯示價格
* @param type 0 食品清單,1 結賬單
* @param showPrice 是否顯示價格
* @return
*/
public View getDiningFoodList(Context mContext, List<OrderDetail> foodList, PrinterDeviceBean deviceBean, int type, boolean showPrice) {
List<OrderDetail> newsFoodList = new ArrayList<>();
for (OrderDetail orderDetail:foodList) {
//如果食品設置了0元不打印並且食品等於0元,或者設置了不打印到單,就不打印
if (!(orderDetail.getPrintToBill() == 0 && orderDetail.getPrice() == 0)
|| OrderDetail.isPrint((int) orderDetail.getPrintTo(), type)) {
newsFoodList.add(orderDetail);
}
}
return getVerticalRecyclerView(mContext, new FoodAdapter(newsFoodList, deviceBean, showPrice));
// List<OrderDetail> newsFoodList = new ArrayList<>();
// for (OrderDetail orderDetail : foodList) {
// //如果食品設置了0元不打印並且食品等於0元,或者設置了不打印到單,就不打印
// if (!(orderDetail.getPrintToBill() == 0 && orderDetail.getPrice() == 0)
// || OrderDetail.isPrint((int) orderDetail.getPrintTo(), type)) {
// newsFoodList.add(orderDetail);
// }
// }
return getVerticalRecyclerView(mContext, new FoodAdapter(foodList, deviceBean, showPrice));
}
......@@ -1076,6 +720,7 @@ public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedLis
textView.setGravity(gravity);
return textView;
}
public TextView getTextView(Context mContext, String text, int gravity, float textSize, int textColor) {
TextView textView = new TextView(mContext);
textView.setWidth(LinearLayout.LayoutParams.MATCH_PARENT);
......@@ -1093,4 +738,13 @@ public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedLis
public int getColor(Context mContext, @ColorRes int colorId) {
return ContextCompat.getColor(mContext, colorId);
}
public void setText(View parentView, int viewId, String text) {
((TextView) parentView.findViewById(viewId)).setText(text);
}
public void setIsShow(View parentView, int viewId, boolean isShow) {
parentView.findViewById(viewId).setVisibility(isShow ? View.VISIBLE : View.GONE);
}
}
......@@ -11,10 +11,12 @@ import android.util.Log;
import androidx.annotation.Nullable;
import com.epson.epos2.Epos2Exception;
import com.epson.epos2.printer.Printer;
import com.epson.epos2.printer.PrinterStatusInfo;
import com.epson.epos2.printer.ReceiveListener;
import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.threadPool.ThreadPoolManager;
import com.gingersoft.gsa.cloud.base.utils.AidlUtil;
import com.gingersoft.gsa.cloud.base.utils.JsonUtils;
import com.gingersoft.gsa.cloud.base.utils.okhttpUtils.OkHttp3Utils;
......@@ -29,9 +31,7 @@ import com.gingersoft.gsa.cloud.print.PrinterWriter58mm;
import com.hyweb.n5.lib.constant.PrinterConstant;
import com.hyweb.n5.lib.util.PrinterUtil;
import com.hyweb.n5.server.aidl.IOnPrintCallback;
import com.joe.print.mvp.model.bean.PrintInfoBean;
import com.joe.print.mvp.model.bean.PrjBean;
import com.joe.print.mvp.print.EpsonPrint;
import com.joe.print.mvp.print.PrintPrjKitchen;
import com.joe.print.mvp.print.PrinterRoot;
import com.joe.print.mvp.print.common.PrinterFinderCallback;
......@@ -81,17 +81,19 @@ public class PrjService extends Service implements ReceiveListener {
public void onCreate() {
super.onCreate();
mContext = this;
initUsbPrint();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mContext = this;
Log.e("eee", "開啟打印服務");
getPrintList();
//開始請求
startGetPrjInfo();
ThreadPoolManager.getInstence().putExecutableTasks(()->{
getPrintList();
//開始請求
startGetPrjInfo();
});
return super.onStartCommand(intent, flags, startId);
}
......@@ -311,7 +313,6 @@ public class PrjService extends Service implements ReceiveListener {
// }
// }
// }
private void newPrint(String json) {
printDatas.clear();
listMap.clear();
......@@ -383,22 +384,73 @@ public class PrjService extends Service implements ReceiveListener {
}
//打印回調了多少次都要記錄下來,所以一次只能傳遞一張prj過去,等到打印回調再打第二張
private String EpsIds = "";
/**
* 生成用於打印的prj的Bitmap
*/
private void generatePrintData(String key, List<PrjBean.DataBean.Bean> beans, PrinterDeviceBean printerDeviceBean) {
if (isPinPrinter(printerDeviceBean) && printerDeviceBean.getPrinterDeviceType() == 1) {
//針式打印機並且打印機類型為IP打印,生成獨特的格式
EpsonPrint mPrinter = EpsonPrint.getInstance();
mPrinter.initializeObject(GsaCloudApplication.getAppContext(), this);
int paperWidth = 42;
if (printerDeviceBean.getPaperSpecification() != null) {
paperWidth = (int) (Double.parseDouble(printerDeviceBean.getPaperSpecification()) / 6);
List<Map<String, Bitmap>> bitmapMaps = generatePrintMaps(key, beans, printerDeviceBean);
EpsIds = getPrintIds(bitmapMaps);
//第一個參數是機型,第二個參數是語言,
Printer mPrinter = null;
try {
mPrinter = new Printer(Printer.TM_U220, Printer.MODEL_KOREAN, this);
mPrinter.setReceiveEventListener(this);
} catch (Epos2Exception e) {
e.printStackTrace();
updatePrjFailure(getPrintIds(bitmapMaps));
}
List<List<PrintInfoBean>> prjBeans = PrintInfoBean.transPrjBean(beans, key, printerDeviceBean);
for (List<PrintInfoBean> prjPrintBean : prjBeans) {
mPrinter.putPrintString(printerDeviceBean.getIp(), paperWidth, prjPrintBean);
if (mPrinter != null) {
try {
mPrinter.clearCommandBuffer();
for (int i = 0; i < bitmapMaps.size(); i++) {
for (Map.Entry<String, Bitmap> mapEntry : bitmapMaps.get(i).entrySet()) {
mPrinter.addImage(mapEntry.getValue(), 0, 0,
mapEntry.getValue().getWidth(),
mapEntry.getValue().getHeight(),
Printer.COLOR_1,
Printer.MODE_MONO_HIGH_DENSITY,//高密度
Printer.HALFTONE_DITHER,//半色調抖動
Printer.PARAM_DEFAULT,
Printer.COMPRESS_NONE);//壓縮
mPrinter.addCut(Printer.CUT_FEED);
}
}
} catch (Epos2Exception e) {
e.printStackTrace();
updatePrjFailure(getPrintIds(bitmapMaps));
mPrinter.clearCommandBuffer();
}
try {
mPrinter.connect("TCP:" + printerDeviceBean.getIp(), Printer.PARAM_DEFAULT);
mPrinter.sendData(Printer.PARAM_DEFAULT);
} catch (Exception e) {
e.printStackTrace();
updatePrjFailure(getPrintIds(bitmapMaps));
while (true) {
try {
mPrinter.disconnect();
break;
} catch (final Exception ex) {
if (ex instanceof Epos2Exception) {
//Note: If printer is processing such as printing and so on, the disconnect API returns ERR_PROCESSING.
if (((Epos2Exception) ex).getErrorStatus() == Epos2Exception.ERR_PROCESSING) {
} else {
break;
}
} else {
break;
}
}
}
mPrinter.clearCommandBuffer();
mPrinter.setReceiveEventListener(null);
}
} else {
updatePrjFailure(EpsIds);
}
} else {
List<Map<String, Bitmap>> bitmapMaps = generatePrintMaps(key, beans, printerDeviceBean);
......@@ -492,18 +544,22 @@ public class PrjService extends Service implements ReceiveListener {
//N5打印
n5Print(bitmapMaps);
} else {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < bitmapMaps.size(); i++) {
for (Map.Entry<String, Bitmap> mapEntry : bitmapMaps.get(i).entrySet()) {
stringBuilder.append(mapEntry.getKey());
if (stringBuilder.toString().lastIndexOf(",") != stringBuilder.length() - 1) {
//如果最後一位不是逗號,才添加
stringBuilder.append(",");
}
updatePrjFailure(getPrintIds(bitmapMaps));
}
}
private String getPrintIds(List<Map<String, Bitmap>> bitmapMaps){
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < bitmapMaps.size(); i++) {
for (Map.Entry<String, Bitmap> mapEntry : bitmapMaps.get(i).entrySet()) {
stringBuilder.append(mapEntry.getKey());
if (stringBuilder.toString().lastIndexOf(",") != stringBuilder.length() - 1) {
//如果最後一位不是逗號,才添加
stringBuilder.append(",");
}
}
updatePrjFailure(stringBuilder.toString());
}
return stringBuilder.toString();
}
private final static int SUNMI_PAPER_WIDTH = 360;//商米打印機紙張寬度
......@@ -651,8 +707,10 @@ public class PrjService extends Service implements ReceiveListener {
}
List<UpdateBean> updateBeans = new ArrayList<>();
updateBeans.add(new UpdateBean(ids, printState, time));
String[] idArrays = ids.split(",");
for (String id : idArrays) {
updateBeans.add(new UpdateBean(id, printState, time));
}
String json = JsonUtils.toJson(updateBeans);
Log.e("eee", "" + json);
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), json);
......@@ -683,6 +741,7 @@ public class PrjService extends Service implements ReceiveListener {
}
});
EpsIds = "";
}
// @Override
......@@ -753,10 +812,10 @@ public class PrjService extends Service implements ReceiveListener {
//針式打印回調
if (i == 0) {
//打印成功
// updatePrjState(3);
updatePrjFailure(EpsIds);
} else {
//打印失敗
// updatePrjState(1);
updatePrjFailure(EpsIds);
}
startGetPrjInfo();
}
......
......@@ -134,6 +134,16 @@ public class MyPrintUtils {
defaultPrint.setNumberIsFlip(printCurrencyBean.getNumberIsFlip());
}
}
if (printCurrencyBean == null) {
// 如果沒有預設,那麼判斷打印機字體大小是不是設置為預設
// 如果是預設,那麼手動給設置食品字體大小,不然打印不出來食品
if (defaultPrint.getFoodFont().equals("0")) {
defaultPrint.setFoodFont("20");
}
if (defaultPrint.getModifierFont().equals("0")) {
defaultPrint.setModifierFont("18");
}
}
return defaultPrint;
}
......
......@@ -26,6 +26,7 @@ import com.billy.cc.core.component.CC;
import com.billy.cc.core.component.CCResult;
import com.billy.cc.core.component.CCUtil;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.base.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils;
import com.gingersoft.gsa.cloud.base.widget.DialogUtils;
import com.gingersoft.gsa.cloud.constans.PrintConstans;
......@@ -50,6 +51,7 @@ import com.yanzhenjie.recyclerview.widget.DefaultItemDecoration;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static com.gingersoft.gsa.cloud.constans.PrintConstans.PRINT_TYPE;
import static com.jess.arms.utils.Preconditions.checkNotNull;
......@@ -119,16 +121,14 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
@Override
public void initData(@Nullable Bundle savedInstanceState) {
Log.e("eee", "打開打印界面");
callId = CCUtil.getNavigateCallId(this);
//獲取打印類型,根據打印類型生成對應的bitmap
type = CCUtil.getNavigateParam(this, PRINT_TYPE, PrintConstans.PRINT_TEST);
isShowDialog = CCUtil.getNavigateParam(this, PrintConstans.PRINT_LOADING, true);
printerInIt = PrinterRoot.getPrinterByType(type);
if (printerInIt != null) {
printerInIt.setmContext(mContext).setPrintListener(this).initUsbPrint();
printerInIt.setPrintListener(this);
}
initPrintConfig();
}
......@@ -190,6 +190,7 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
}
}
//打印邏輯,獲取對應的打印配置--打印機或是通用配置
//根據配置生成配置好的圖片----生成圖片邏輯:把打印的單分為幾個模塊,再由不同的單拼接出對應的單,(如果是針式,生成對應的文字)
//再獲取打印方式(IP、本機、USB、藍牙或其他的),調用打印
......@@ -204,10 +205,10 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
initDialog();
}
//獲得對應的圖片
List<Bitmap> zoomBitmaps = printerInIt.getPrintBitmap(mContext, defaultPrint).get("");
if (zoomBitmaps != null && zoomBitmaps.size() > 0) {
int printCount = printerInIt.getPrintCount(mContext);
for (int i = 0; i < printCount; i++) {
Map<String, List<Bitmap>> listMap = printerInIt.getPrintBitmapByCount(mContext, defaultPrint);
if (listMap != null) {
List<Bitmap> zoomBitmaps = listMap.get("");
if (zoomBitmaps != null && zoomBitmaps.size() > 0) {
if (defaultPrint.getPrinterDeviceType() == 1) {
//IP打印
printerInIt.ipDevicePrint(defaultPrint, zoomBitmaps);
......@@ -218,14 +219,14 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
//USB打印打印
printerInIt.usbPrint(mContext, zoomBitmaps);
} else {
ToastUtils.show(mContext, "未找到對應的打印類型");
printFile();
printFile("未找到對應的打印類型");
}
} else {
//打印失敗
printFile("打印失敗,生成打印數據失敗");
}
} else {
//打印失敗
Log.e("eee", "打印失敗,沒有生成對應的圖片");
printFile();
printFile("打印失敗,打印次數為0");
}
}
}
......@@ -269,9 +270,16 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
* 打印失敗
*/
@Override
public void printFile() {
public void printFile(String msg) {
if (!TextUtil.isEmptyOrNullOrUndefined(msg)) {
ToastUtils.show(mContext, msg);
}
// if (printCount <= 1) {
CC.sendCCResult(callId, CCResult.error("print error"));
finish();
// } else {
// printCount--;
// }
}
@Override
......@@ -331,8 +339,7 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
break;
case LACK_OF_PAPER:
//缺紙
ToastUtils.show(mContext, "打印機缺紙");
printFile();
printFile("打印機缺紙");
break;
}
setLoadingText(tip);
......@@ -343,9 +350,13 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
*/
@Override
public void printSuccess() {
// if (printCount <= 1) {
CC.sendCCResult(callId, CCResult.success());
disLoadingDialog();
finish();
// } else {
// printCount--;
// }
}
@Override
......@@ -407,8 +418,7 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
}
private void addPrintDevice() {
ToastUtils.show(mContext, "沒有打印機,請添加");
printFile();
printFile("沒有打印機,請添加");
// startActivityForResult(new Intent(mContext, PrinterAddActivity.class), ADD_PRINT_CODE);
}
......@@ -440,9 +450,6 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
protected void onDestroy() {
super.onDestroy();
disLoadingDialog();
if (printerInIt != null) {
printerInIt.onDestroy();
}
}
private void disLoadingDialog() {
......
......@@ -162,9 +162,9 @@ public class PrintTestActivity extends AppCompatActivity implements PrintSocketH
// TestPrintMaker maker = new TestPrintMaker(printInfoBeans);
// executor.doPrinterRequestAsync(maker);
EpsonPrint mPrinter = new EpsonPrint();
mPrinter.initializeObject(GsaCloudApplication.getAppContext(), this);
mPrinter.putPrintString(ed_ip.getText().toString(), 42, printInfoBeans, this);
// EpsonPrint mPrinter = new EpsonPrint();
// mPrinter.initializeObject(GsaCloudApplication.getAppContext(), this);
// mPrinter.putPrintString(ed_ip.getText().toString(), 42, printInfoBeans, this);
});
}
......
......@@ -244,7 +244,7 @@
android:background="@null"
android:hint="請輸入端口號,默認9100"
android:inputType="number"
android:maxLength="4"
android:maxLength="6"
android:textColor="@color/normal_color"
android:textColorHint="@color/hint_color"
android:textSize="@dimen/dp_14" />
......
......@@ -34,8 +34,8 @@
<attr name="app_skin_span_pressed_bg_color" format="color"/>
<attr name="app_skin_alpha_test" format="float"/>
<style name="AppTheme" parent="QMUI.Compat.NoActionBar">
<!-- 配置Android提供的theme -->
<item name="android:textAppearanceListItemSmall">@style/QDTextAppearanceListItemSmall</item>
<item name="android:textAppearanceListItem">@style/QDtextAppearanceListItem</item>
......@@ -92,7 +92,8 @@
<style name="AppTheme.Launcher">
<item name="android:windowFullscreen">true</item>
<!-- <item name="android:windowBackground">@drawable/launcher_bg</item>-->
<!-- <item name="android:windowBackground">@drawable/launcher_bg</item>-->
</style>
<!-- blue skin -->
......
......@@ -777,30 +777,19 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod
* @param initTable 是否是開台
*/
private void printSendOrder(boolean initTable) {
CC.obtainBuilder("Component.Print")
.setActionName("printActivity")
.addParam(PrintConstans.PRINT_TYPE, PrintConstans.PRINT_KITCHEN)
.build()
.callAsyncCallbackOnMainThread((cc, result) -> {
// if (result.isSuccess()) {
//打印成功
IActivity.returnBeforeActivity(initTable);
// } else {
// mRootView.showMessage("打印失敗");
// }
});
//打印上菜紙
// CC.obtainBuilder("Component.Print")
// .setActionName("printActivity")
// .addParam("NewFoods", newFoods)
// .addParam("type", 0)
// .addParam(PrintConstans.PRINT_TYPE, PrintConstans.PRINT_KITCHEN)
// .build()
// .callAsyncCallbackOnMainThread((cc, result) -> {
// if (result.isSuccess()) {
// //打印成功
// mRootView.killMyself();
// }
//// if (result.isSuccess()) {
// //打印成功
// IActivity.returnBeforeActivity(initTable);
//// } else {
//// mRootView.showMessage("打印失敗");
//// }
// });
IActivity.returnBeforeActivity(initTable);
}
/**
......@@ -1856,7 +1845,7 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod
}
mCurrentOrderDetailBean = currentOrderBean;
List<Discount> discountList = filterDiscountByType(mModel.queryDB_DiscountList("0"),"0");
List<Discount> discountList = filterDiscountByType(mModel.queryDB_DiscountList("0"), "0");
mDiscountList.clear();
mDiscountList.addAll(discountList);
......
......@@ -346,19 +346,19 @@ public class OrderContentPresenter extends BaseOrderPresenter<OrderContentContra
* 送單
*/
private void printSendOrder(List<OrderDetail> newFoods) {
MyOrderManage.getInstance().setNewFoodList(newFoods);
CC.obtainBuilder("Component.Print")
.setActionName("printActivity")
.addParam(PrintConstans.PRINT_TYPE, PrintConstans.PRINT_KITCHEN)
.build()
.callAsyncCallbackOnMainThread((cc, result) -> {
Log.e("error", "是否成功打印:" + result.isSuccess());
// if (result.isSuccess()) {
// //打印成功
//
// }
mRootView.sendSuccess();
});
// MyOrderManage.getInstance().setNewFoodList(newFoods);
// CC.obtainBuilder("Component.Print")
// .setActionName("printActivity")
// .addParam(PrintConstans.PRINT_TYPE, PrintConstans.PRINT_KITCHEN)
// .build()
// .callAsyncCallbackOnMainThread((cc, result) -> {
// Log.e("error", "是否成功打印:" + result.isSuccess());
//// if (result.isSuccess()) {
//// //打印成功
////
//// }
// mRootView.sendSuccess();
// });
}
public void printOrder(long tableId, boolean isSend) {
......
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