Commit f410baeb by Wyh

1、打印模塊優化 2、餐檯模式印單不打印食品問題 3、打印上菜紙閃退問題處理 4、餐檯模式結賬不打印食品問題

parent bc663d6d
...@@ -212,8 +212,6 @@ public class OrderDetailsPresenter extends BasePresenter<OrderDetailsContract.Mo ...@@ -212,8 +212,6 @@ public class OrderDetailsPresenter extends BasePresenter<OrderDetailsContract.Mo
mRootView.showMessage(OrderDetails.getVerifiAmountTip()); mRootView.showMessage(OrderDetails.getVerifiAmountTip());
return; return;
} }
//添加PRJ
addPrj(dataBean);
RequestBody requestBody = new FormBody.Builder() RequestBody requestBody = new FormBody.Builder()
.add("memberId", UserContext.newInstance().getMemberId() + "") .add("memberId", UserContext.newInstance().getMemberId() + "")
.add("orderId", dataBean.getID() + "") .add("orderId", dataBean.getID() + "")
...@@ -232,6 +230,8 @@ public class OrderDetailsPresenter extends BasePresenter<OrderDetailsContract.Mo ...@@ -232,6 +230,8 @@ public class OrderDetailsPresenter extends BasePresenter<OrderDetailsContract.Mo
@Override @Override
public void onNext(@NonNull UpdateOrderStatusBean info) { public void onNext(@NonNull UpdateOrderStatusBean info) {
if (info != null) { if (info != null) {
//添加PRJ
addPrj(dataBean);
if (TextUtil.isNotEmptyOrNullOrUndefined(info.getErrorMsg())) { if (TextUtil.isNotEmptyOrNullOrUndefined(info.getErrorMsg())) {
mRootView.showMessage(info.getErrorMsg()); mRootView.showMessage(info.getErrorMsg());
} }
......
...@@ -21,6 +21,7 @@ import com.gingersoft.gsa.cloud.common.core.delivery.OrderDetails.Companion.veri ...@@ -21,6 +21,7 @@ import com.gingersoft.gsa.cloud.common.core.delivery.OrderDetails.Companion.veri
import com.gingersoft.gsa.cloud.common.core.delivery.OrderDetails.Companion.verificationAmount import com.gingersoft.gsa.cloud.common.core.delivery.OrderDetails.Companion.verificationAmount
import com.gingersoft.gsa.cloud.common.core.restaurant.RestaurantInfoManager import com.gingersoft.gsa.cloud.common.core.restaurant.RestaurantInfoManager
import com.gingersoft.gsa.cloud.common.core.user.UserContext import com.gingersoft.gsa.cloud.common.core.user.UserContext
import com.gingersoft.gsa.cloud.common.logan.LoganManager
import com.gingersoft.gsa.cloud.common.service.GetInfoUpdateService import com.gingersoft.gsa.cloud.common.service.GetInfoUpdateService
import com.gingersoft.gsa.cloud.common.utils.gson.GsonUtils import com.gingersoft.gsa.cloud.common.utils.gson.GsonUtils
import com.gingersoft.gsa.cloud.common.utils.okhttpUtils.OkHttp3Utils import com.gingersoft.gsa.cloud.common.utils.okhttpUtils.OkHttp3Utils
...@@ -261,6 +262,7 @@ class PageViewModel(private val repository: WeatherRepository) : ViewModel() { ...@@ -261,6 +262,7 @@ class PageViewModel(private val repository: WeatherRepository) : ViewModel() {
} }
}, { }, {
//報錯處理 //報錯處理
LoganManager.w_delivery(LoganManager.EVENT_QUERY, "自動接單" + it.message)
}) })
} }
} }
...@@ -697,7 +699,6 @@ class PageViewModel(private val repository: WeatherRepository) : ViewModel() { ...@@ -697,7 +699,6 @@ class PageViewModel(private val repository: WeatherRepository) : ViewModel() {
// }) // })
CC.obtainBuilder(ComponentName.COMPONENT_PRINT) CC.obtainBuilder(ComponentName.COMPONENT_PRINT)
.addParam(PrintConstans.PRINT_TYPE, PrintConstans.PRINT_INSTRUCTION) .addParam(PrintConstans.PRINT_TYPE, PrintConstans.PRINT_INSTRUCTION)
.addParam(PrintConstans.PRINT_LOADING, false)
.setActionName("printActivity") .setActionName("printActivity")
.build() .build()
.callAsyncCallbackOnMainThread { _, _ -> .callAsyncCallbackOnMainThread { _, _ ->
......
...@@ -211,7 +211,7 @@ public class PrjQueryActivity extends BaseActivity<PrjQueryPresenter> implements ...@@ -211,7 +211,7 @@ public class PrjQueryActivity extends BaseActivity<PrjQueryPresenter> implements
private void organizeData(int position, List<PrjBean.DataBean.Bean> prjData) { private void organizeData(int position, List<PrjBean.DataBean.Bean> prjData) {
if (prjData.get(position).getParentId() == 0) { if (prjData.get(position).getParentId() == 0) {
//是主食品,判斷有沒有子食品,如果沒有子食品,直接打印主食品 //是主食品,判斷有沒有子食品,如果沒有子食品,直接打印主食品
if (position + 1 > prjData.size()) { if (position + 1 >= prjData.size()) {
//沒有子食品 //沒有子食品
//直接打印 //直接打印
List<PrjBean.DataBean.Bean> printDatas = new ArrayList<>(); List<PrjBean.DataBean.Bean> printDatas = new ArrayList<>();
......
...@@ -24,6 +24,7 @@ import com.gingersoft.gsa.cloud.common.core.restaurant.RestaurantInfoManager ...@@ -24,6 +24,7 @@ import com.gingersoft.gsa.cloud.common.core.restaurant.RestaurantInfoManager
import com.gingersoft.gsa.cloud.common.core.user.UserContext import com.gingersoft.gsa.cloud.common.core.user.UserContext
import com.gingersoft.gsa.cloud.common.function.FunctionManager import com.gingersoft.gsa.cloud.common.function.FunctionManager
import com.gingersoft.gsa.cloud.common.ui.utils.BtnBuilder import com.gingersoft.gsa.cloud.common.ui.utils.BtnBuilder
import com.gingersoft.gsa.cloud.common.utils.ClipboardUtils
import com.gingersoft.gsa.cloud.common.utils.MoneyUtil import com.gingersoft.gsa.cloud.common.utils.MoneyUtil
import com.gingersoft.gsa.cloud.common.utils.other.TextUtil import com.gingersoft.gsa.cloud.common.utils.other.TextUtil
import com.gingersoft.gsa.cloud.common.utils.toast.ToastUtils import com.gingersoft.gsa.cloud.common.utils.toast.ToastUtils
...@@ -110,6 +111,11 @@ class OrderDetailsActivity : BaseActivity<IPresenter>() { ...@@ -110,6 +111,11 @@ class OrderDetailsActivity : BaseActivity<IPresenter>() {
getOrderDetails(orderId, binding) getOrderDetails(orderId, binding)
} }
initTopBar(qm_order_details_bar) initTopBar(qm_order_details_bar)
//訂單編號點擊事件
findViewById<TextView>(R.id.tv_order_no).setOnClickListener {
ClipboardUtils.copyText(tv_order_no.text)
showMessage("複製成功")
}
} }
private fun initTopBar(topbar: QMUITopBar) { private fun initTopBar(topbar: QMUITopBar) {
......
...@@ -48,9 +48,6 @@ class HistoryFragment : BaseFragment(R.layout.fragment_other_order) { ...@@ -48,9 +48,6 @@ class HistoryFragment : BaseFragment(R.layout.fragment_other_order) {
//顯示彈窗 //顯示彈窗
context?.let { context -> context?.let { context ->
var reasonDesc = it.reasonDesc var reasonDesc = it.reasonDesc
if (reasonDesc == null) {
reasonDesc = ""
}
OtherOrderUtils.showOrderDetailsDialog(context, it2, it.orderStatus, it.orderType,it.orderPayType,it.payType, it.status, reasonDesc, true) { _, _, _ -> OtherOrderUtils.showOrderDetailsDialog(context, it2, it.orderStatus, it.orderType,it.orderPayType,it.payType, it.status, reasonDesc, true) { _, _, _ ->
//重印 //重印
showLoading() showLoading()
......
...@@ -113,7 +113,7 @@ ...@@ -113,7 +113,7 @@
<include layout="@layout/include_horizontal_color_eee_dividing_line" /> <include layout="@layout/include_horizontal_color_eee_dividing_line" />
<!-- 訂單編號--> <!-- 訂單編號-->
<TextView <com.qmuiteam.qmui.alpha.QMUIAlphaTextView
android:id="@+id/tv_order_no" android:id="@+id/tv_order_no"
style="@style/otherOrder_details_twelve_text_Style" style="@style/otherOrder_details_twelve_text_Style"
android:layout_width="wrap_content" android:layout_width="wrap_content"
......
...@@ -401,7 +401,7 @@ public class NewMainActivity extends BaseFragmentActivity<NewMainPresenter> impl ...@@ -401,7 +401,7 @@ public class NewMainActivity extends BaseFragmentActivity<NewMainPresenter> impl
LoganManager.w_home(TAG, LoganManager.EVENT_CLICK + name); LoganManager.w_home(TAG, LoganManager.EVENT_CLICK + name);
switch (name) { switch (name.trim()) {
case "餐檯模式": case "餐檯模式":
CC.obtainBuilder(ComponentName.COMPONENT_TABLE) CC.obtainBuilder(ComponentName.COMPONENT_TABLE)
.setActionName("showTableActivity") .setActionName("showTableActivity")
......
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:maxLength="4"
android:layout_marginTop="@dimen/dp_8" android:layout_marginTop="@dimen/dp_8"
android:text="餐檯模式" android:text="餐檯模式"
android:singleLine="true" android:singleLine="true"
......
...@@ -377,7 +377,7 @@ public class PayResultActivity extends BaseFragmentActivity<PayResultPresenter> ...@@ -377,7 +377,7 @@ public class PayResultActivity extends BaseFragmentActivity<PayResultPresenter>
.setActionName("printActivity") .setActionName("printActivity")
.addParam(PrintConstans.PRINT_TYPE, PrintConstans.PRINT_BILL) .addParam(PrintConstans.PRINT_TYPE, PrintConstans.PRINT_BILL)
.addParam(PrintConstans.PRINT_CONTENT, printContent) .addParam(PrintConstans.PRINT_CONTENT, printContent)
.addParam(PrintConstans.PRINT_ORDER_NO, mMealPayResultParam.getMealOrderPayRequest().getOrderId()) .addParam(PrintConstans.PRINT_ORDER_NO, String.valueOf(mMealPayResultParam.getMealOrderPayRequest().getOrderId()))
.build() .build()
.callAsyncCallbackOnMainThread((cc, result) -> { .callAsyncCallbackOnMainThread((cc, result) -> {
Log.e("error", "是否成功打印:" + result.isSuccess()); Log.e("error", "是否成功打印:" + result.isSuccess());
......
...@@ -46,8 +46,8 @@ public class EpsonPrint implements ReceiveListener { ...@@ -46,8 +46,8 @@ public class EpsonPrint implements ReceiveListener {
try { try {
this.resultListener = resultListener; this.resultListener = resultListener;
this.receiveListener = receiveListener; this.receiveListener = receiveListener;
//第一個參數是機型,第二個參數是語言, //第一個參數是機型,第二個參數是語言,因為是打印圖片,語言沒有影響
mPrinter = new Printer(Printer.TM_U220, Printer.MODEL_KOREAN, context); mPrinter = new Printer(Printer.TM_U220, Printer.MODEL_TAIWAN, context);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return false; return false;
...@@ -166,12 +166,12 @@ public class EpsonPrint implements ReceiveListener { ...@@ -166,12 +166,12 @@ public class EpsonPrint implements ReceiveListener {
public void putPrintString(String ip, int paperWidth, List<PrintInfoBean> printInfoBeans, PrintExecutor.OnPrintResultListener printResultListener) { public void putPrintString(String ip, int paperWidth, List<PrintInfoBean> printInfoBeans, PrintExecutor.OnPrintResultListener printResultListener) {
if (mPrinter == null) { if (mPrinter == null) {
printResultListener.onResult(0, null); printResultListener.onResult(0);
return; return;
} }
connectByIp(ip, mPrinter.getStatus()); connectByIp(ip, mPrinter.getStatus());
if (mPrinter == null) { if (mPrinter == null) {
printResultListener.onResult(0, null); printResultListener.onResult(0);
return; return;
} }
mPrinter.clearCommandBuffer(); mPrinter.clearCommandBuffer();
...@@ -196,7 +196,7 @@ public class EpsonPrint implements ReceiveListener { ...@@ -196,7 +196,7 @@ public class EpsonPrint implements ReceiveListener {
mPrinter.sendData(Printer.PARAM_DEFAULT); mPrinter.sendData(Printer.PARAM_DEFAULT);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
printResultListener.onResult(0, null); printResultListener.onResult(0);
mPrinter.clearCommandBuffer(); mPrinter.clearCommandBuffer();
} }
} }
...@@ -290,7 +290,6 @@ public class EpsonPrint implements ReceiveListener { ...@@ -290,7 +290,6 @@ public class EpsonPrint implements ReceiveListener {
mPrinter.sendData(Printer.PARAM_DEFAULT); mPrinter.sendData(Printer.PARAM_DEFAULT);
} catch (Exception e) { } catch (Exception e) {
updatePrintState(PrintSocketHolder.ERROR_4); updatePrintState(PrintSocketHolder.ERROR_4);
mPrinter.clearCommandBuffer(); mPrinter.clearCommandBuffer();
disconnectPrinter(); disconnectPrinter();
isPrint = false; isPrint = false;
...@@ -358,7 +357,7 @@ public class EpsonPrint implements ReceiveListener { ...@@ -358,7 +357,7 @@ public class EpsonPrint implements ReceiveListener {
private void updatePrintState(int code){ private void updatePrintState(int code){
if(resultListener != null){ if(resultListener != null){
resultListener.onResult(code,null); resultListener.onResult(code);
} }
} }
......
...@@ -17,10 +17,14 @@ public class IpPrintMaker implements PrintDataMaker { ...@@ -17,10 +17,14 @@ public class IpPrintMaker implements PrintDataMaker {
private int width; // 打印的圖片寬度,紙張寬度 private int width; // 打印的圖片寬度,紙張寬度
private List<Bitmap> bitmaps; private List<Bitmap> bitmaps;
private String ip;
private int port;
public IpPrintMaker(int width, List<Bitmap> bitmaps) { public IpPrintMaker(int width, List<Bitmap> bitmaps, String ip, int port) {
this.width = width; this.width = width;
this.bitmaps = bitmaps; this.bitmaps = bitmaps;
this.ip = ip;
this.port = port;
} }
@Override @Override
...@@ -39,11 +43,12 @@ public class IpPrintMaker implements PrintDataMaker { ...@@ -39,11 +43,12 @@ public class IpPrintMaker implements PrintDataMaker {
data.add(printer.getDataAndReset()); data.add(printer.getDataAndReset());
} }
data.add(printer.getDataAndClose()); data.add(printer.getDataAndClose());
for (int i = 0; i < bitmaps.size(); i++){ for (int i = 0; i < bitmaps.size(); i++) {
bitmaps.get(i).recycle(); bitmaps.get(i).recycle();
} }
return data; return data;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace();
return new ArrayList<>(); return new ArrayList<>();
} }
} }
...@@ -52,4 +57,15 @@ public class IpPrintMaker implements PrintDataMaker { ...@@ -52,4 +57,15 @@ public class IpPrintMaker implements PrintDataMaker {
public String getPrjIds() { public String getPrjIds() {
return null; return null;
} }
@Override
public String getIp() {
return ip;
}
@Override
public int getPort() {
return port;
}
} }
...@@ -13,6 +13,14 @@ import java.util.List; ...@@ -13,6 +13,14 @@ import java.util.List;
*/ */
public class OpenCashBoxMaker implements PrintDataMaker { public class OpenCashBoxMaker implements PrintDataMaker {
private String ip;
private int port;
public OpenCashBoxMaker(String ip, int port) {
this.ip = ip;
this.port = port;
}
@Override @Override
public List<byte[]> getPrintData() { public List<byte[]> getPrintData() {
ArrayList<byte[]> data = new ArrayList<>(); ArrayList<byte[]> data = new ArrayList<>();
...@@ -31,4 +39,14 @@ public class OpenCashBoxMaker implements PrintDataMaker { ...@@ -31,4 +39,14 @@ public class OpenCashBoxMaker implements PrintDataMaker {
public String getPrjIds() { public String getPrjIds() {
return null; return null;
} }
@Override
public String getIp() {
return ip;
}
@Override
public int getPort() {
return port;
}
} }
...@@ -4,6 +4,7 @@ import android.content.Context; ...@@ -4,6 +4,7 @@ import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.text.TextUtils; import android.text.TextUtils;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import com.gingersoft.gsa.cloud.common.constans.AppConstans; import com.gingersoft.gsa.cloud.common.constans.AppConstans;
import com.gingersoft.gsa.cloud.common.constans.ExpandConstant; import com.gingersoft.gsa.cloud.common.constans.ExpandConstant;
import com.gingersoft.gsa.cloud.common.core.delivery.OrderDetails; import com.gingersoft.gsa.cloud.common.core.delivery.OrderDetails;
...@@ -12,6 +13,7 @@ import com.gingersoft.gsa.cloud.common.core.restaurant.utils.RestaurantExpandInf ...@@ -12,6 +13,7 @@ import com.gingersoft.gsa.cloud.common.core.restaurant.utils.RestaurantExpandInf
import com.gingersoft.gsa.cloud.common.core.table.TableBean; import com.gingersoft.gsa.cloud.common.core.table.TableBean;
import com.gingersoft.gsa.cloud.common.utils.other.TextUtil; import com.gingersoft.gsa.cloud.common.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.common.utils.time.TimeUtils; import com.gingersoft.gsa.cloud.common.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.common.utils.toast.ToastUtils;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean; import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.gingersoft.gsa.cloud.order.billItem.BillItem; import com.gingersoft.gsa.cloud.order.billItem.BillItem;
import com.gingersoft.gsa.cloud.order.cart.ShoppingCart; import com.gingersoft.gsa.cloud.order.cart.ShoppingCart;
...@@ -51,7 +53,8 @@ public class PrintBill extends PrinterRoot<PrintBillContent> { ...@@ -51,7 +53,8 @@ public class PrintBill extends PrinterRoot<PrintBillContent> {
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext, PrinterDeviceBean deviceBean) { public Map<String, List<Bitmap>> getPrintBitmap(Context mContext, PrinterDeviceBean deviceBean) {
Map<String, List<Bitmap>> bitmapMaps = new HashMap<>(); Map<String, List<Bitmap>> bitmapMaps = new HashMap<>();
List<Bitmap> bitmaps = new ArrayList<>(); List<Bitmap> bitmaps = new ArrayList<>();
bitmaps.add(getBitmap(mContext, deviceBean)); Bitmap bitmap = getBitmap(mContext, deviceBean);
bitmaps.add(bitmap);
bitmapMaps.put("", bitmaps); bitmapMaps.put("", bitmaps);
return bitmapMaps; return bitmapMaps;
} }
...@@ -235,7 +238,7 @@ public class PrintBill extends PrinterRoot<PrintBillContent> { ...@@ -235,7 +238,7 @@ public class PrintBill extends PrinterRoot<PrintBillContent> {
layout.addView(getTableMealMemberIntegerView(mContext, getOrderMemberInfo(), mPrintBillContent.getIntegralQrCode())); layout.addView(getTableMealMemberIntegerView(mContext, getOrderMemberInfo(), mPrintBillContent.getIntegralQrCode()));
return zoomBitmap(deviceBean, viewToBitmap(mContext, layout)); return viewToZoomBitmap(mContext, layout, deviceBean);
} }
......
...@@ -6,8 +6,10 @@ import android.view.Gravity; ...@@ -6,8 +6,10 @@ import android.view.Gravity;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import com.gingersoft.gsa.cloud.common.core.table.TableBean; import com.gingersoft.gsa.cloud.common.core.table.TableBean;
import com.gingersoft.gsa.cloud.common.logan.LoganManager;
import com.gingersoft.gsa.cloud.common.utils.other.TextUtil; import com.gingersoft.gsa.cloud.common.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.common.utils.time.TimeUtils; import com.gingersoft.gsa.cloud.common.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.common.utils.toast.ToastUtils;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean; import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.gingersoft.gsa.cloud.order.commodity.OrderDetail; import com.gingersoft.gsa.cloud.order.commodity.OrderDetail;
import com.gingersoft.gsa.cloud.order.order.DoshokuOrder; import com.gingersoft.gsa.cloud.order.order.DoshokuOrder;
...@@ -31,6 +33,7 @@ import static com.joe.print.mvp.print.common.HtmlContract.LABLE_DIV; ...@@ -31,6 +33,7 @@ import static com.joe.print.mvp.print.common.HtmlContract.LABLE_DIV;
public class PrintServe extends PrinterRoot<PrintServingPaperContent> { public class PrintServe extends PrinterRoot<PrintServingPaperContent> {
private PrintServingPaperContent mPrintServingPaperContent; private PrintServingPaperContent mPrintServingPaperContent;
private final String TAG = getClass().getSimpleName();
@Override @Override
protected void setPrintContent(PrintServingPaperContent printContent) { protected void setPrintContent(PrintServingPaperContent printContent) {
...@@ -41,7 +44,11 @@ public class PrintServe extends PrinterRoot<PrintServingPaperContent> { ...@@ -41,7 +44,11 @@ public class PrintServe extends PrinterRoot<PrintServingPaperContent> {
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext, PrinterDeviceBean printerDeviceBean) { public Map<String, List<Bitmap>> getPrintBitmap(Context mContext, PrinterDeviceBean printerDeviceBean) {
Map<String, List<Bitmap>> bitmapMaps = new HashMap<>(); Map<String, List<Bitmap>> bitmapMaps = new HashMap<>();
List<Bitmap> bitmaps = new ArrayList<>(); List<Bitmap> bitmaps = new ArrayList<>();
bitmaps.add(getBitmap(mContext, printerDeviceBean)); Bitmap bitmap = getBitmap(mContext, printerDeviceBean);
if (bitmap == null) {
return null;
}
bitmaps.add(bitmap);
bitmapMaps.put("", bitmaps); bitmapMaps.put("", bitmaps);
return bitmapMaps; return bitmapMaps;
} }
...@@ -135,6 +142,7 @@ public class PrintServe extends PrinterRoot<PrintServingPaperContent> { ...@@ -135,6 +142,7 @@ public class PrintServe extends PrinterRoot<PrintServingPaperContent> {
List<PrintFoodItem> foodItemList = mPrintServingPaperContent.getFoodItemList(); List<PrintFoodItem> foodItemList = mPrintServingPaperContent.getFoodItemList();
if (foodItemList == null || foodItemList.size() <= 0) { if (foodItemList == null || foodItemList.size() <= 0) {
LoganManager.w_printer(TAG, "生成打印數據失敗,上菜紙沒有食品");
return null; return null;
} }
......
...@@ -4,12 +4,15 @@ import android.content.Context; ...@@ -4,12 +4,15 @@ import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.view.Gravity; import android.view.Gravity;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import com.gingersoft.gsa.cloud.common.constans.AppConstans; import com.gingersoft.gsa.cloud.common.constans.AppConstans;
import com.gingersoft.gsa.cloud.common.constans.ExpandConstant; import com.gingersoft.gsa.cloud.common.constans.ExpandConstant;
import com.gingersoft.gsa.cloud.common.core.restaurant.utils.RestaurantExpandInfoUtils; import com.gingersoft.gsa.cloud.common.core.restaurant.utils.RestaurantExpandInfoUtils;
import com.gingersoft.gsa.cloud.common.core.table.TableBean; import com.gingersoft.gsa.cloud.common.core.table.TableBean;
import com.gingersoft.gsa.cloud.common.logan.LoganManager;
import com.gingersoft.gsa.cloud.common.utils.other.TextUtil; import com.gingersoft.gsa.cloud.common.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.common.utils.time.TimeUtils; import com.gingersoft.gsa.cloud.common.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.common.utils.toast.ToastUtils;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean; import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.gingersoft.gsa.cloud.order.billItem.BillItem; import com.gingersoft.gsa.cloud.order.billItem.BillItem;
import com.gingersoft.gsa.cloud.order.cart.ShoppingCart; import com.gingersoft.gsa.cloud.order.cart.ShoppingCart;
...@@ -22,6 +25,7 @@ import com.joe.print.R; ...@@ -22,6 +25,7 @@ import com.joe.print.R;
import com.joe.print.mvp.model.bean.BillingBean; import com.joe.print.mvp.model.bean.BillingBean;
import com.joe.print.mvp.model.bean.HtmlLable; import com.joe.print.mvp.model.bean.HtmlLable;
import com.joe.print.mvp.print.common.HtmlContract; import com.joe.print.mvp.print.common.HtmlContract;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
...@@ -37,6 +41,7 @@ import static com.joe.print.mvp.print.common.HtmlContract.LABLE_P; ...@@ -37,6 +41,7 @@ import static com.joe.print.mvp.print.common.HtmlContract.LABLE_P;
public class PrintSlip extends PrinterRoot<PrintSlipContent> { public class PrintSlip extends PrinterRoot<PrintSlipContent> {
private PrintSlipContent mPrintSlipContent; private PrintSlipContent mPrintSlipContent;
private final String TAG = getClass().getSimpleName();
@Override @Override
protected void setPrintContent(PrintSlipContent printContent) { protected void setPrintContent(PrintSlipContent printContent) {
...@@ -47,8 +52,13 @@ public class PrintSlip extends PrinterRoot<PrintSlipContent> { ...@@ -47,8 +52,13 @@ public class PrintSlip extends PrinterRoot<PrintSlipContent> {
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext, PrinterDeviceBean deviceBean) { public Map<String, List<Bitmap>> getPrintBitmap(Context mContext, PrinterDeviceBean deviceBean) {
Map<String, List<Bitmap>> bitmapMaps = new HashMap<>(); Map<String, List<Bitmap>> bitmapMaps = new HashMap<>();
List<Bitmap> bitmaps = new ArrayList<>(); List<Bitmap> bitmaps = new ArrayList<>();
Bitmap bitmap = getBitmap(mContext, deviceBean);
if (bitmap != null) {
bitmaps.add(getBitmap(mContext, deviceBean)); bitmaps.add(getBitmap(mContext, deviceBean));
bitmapMaps.put("", bitmaps); bitmapMaps.put("", bitmaps);
} else {
return null;
}
//這裡可能還需要加上廚房單的內容,有未送單的食品時。 //這裡可能還需要加上廚房單的內容,有未送單的食品時。
// PrintKitchen kitchen = new PrintKitchen(); // PrintKitchen kitchen = new PrintKitchen();
// Map<String, List<Bitmap>> bitmapMaps = new HashMap<>(kitchen.getPrintBitmap(mContext, deviceBean)); // Map<String, List<Bitmap>> bitmapMaps = new HashMap<>(kitchen.getPrintBitmap(mContext, deviceBean));
...@@ -69,7 +79,7 @@ public class PrintSlip extends PrinterRoot<PrintSlipContent> { ...@@ -69,7 +79,7 @@ public class PrintSlip extends PrinterRoot<PrintSlipContent> {
List<PrintFoodItem> foodList = mPrintSlipContent.getFoodItemList(); List<PrintFoodItem> foodList = mPrintSlipContent.getFoodItemList();
if (foodList.size() == 0 ) { if (foodList.size() == 0) {
return new String[]{"<html><body></body></html>"}; return new String[]{"<html><body></body></html>"};
} }
...@@ -175,6 +185,7 @@ public class PrintSlip extends PrinterRoot<PrintSlipContent> { ...@@ -175,6 +185,7 @@ public class PrintSlip extends PrinterRoot<PrintSlipContent> {
List<PrintFoodItem> foodList = mPrintSlipContent.getFoodItemList(); List<PrintFoodItem> foodList = mPrintSlipContent.getFoodItemList();
if (foodList == null || foodList.size() <= 0) { if (foodList == null || foodList.size() <= 0) {
LoganManager.w_printer(TAG, "生成打印數據失敗,印單沒有食品");
return null; return null;
} }
......
...@@ -275,7 +275,7 @@ public abstract class PrinterRoot<T extends PrintContent> implements PrintSocket ...@@ -275,7 +275,7 @@ public abstract class PrinterRoot<T extends PrintContent> implements PrintSocket
if (isSuccess) { if (isSuccess) {
listener.printSuccess(); listener.printSuccess();
} else { } else {
listener.printFailure("打印失敗"); listener.printFailure("sunmi打印失敗");
} }
} }
...@@ -323,24 +323,19 @@ public abstract class PrinterRoot<T extends PrintContent> implements PrintSocket ...@@ -323,24 +323,19 @@ public abstract class PrinterRoot<T extends PrintContent> implements PrintSocket
} }
} }
public void ipDevicePrint(PrinterDeviceBean printerDeviceBean, List<Bitmap> bitmaps) {
ipDevicePrint(printerDeviceBean, bitmaps, this, this);
}
private EpsonPrint mPrinter;
private PrintExecutor executor; private PrintExecutor executor;
/** /**
* ip設備打印 * ip設備打印
*/ */
private void ipDevicePrint(PrinterDeviceBean public void ipDevicePrint(PrinterDeviceBean
printerDeviceBean, List<Bitmap> bitmaps, PrintSocketHolder.OnStateChangedListener printerDeviceBean, List<Bitmap> bitmaps) {
stateChangedListener, PrintExecutor.OnPrintResultListener resultListener) {
//獲取打印機機型,如果是EPSON的打印機,調用EPSON的打印方法 //獲取打印機機型,如果是EPSON的打印機,調用EPSON的打印方法
if ((printerDeviceBean.getPrinterName() != null && printerDeviceBean.getPrinterName().toLowerCase().contains("EPSON".toLowerCase())) if ((printerDeviceBean.getPrinterName() != null && printerDeviceBean.getPrinterName().toLowerCase().contains("EPSON".toLowerCase()))) {
&& (printerDeviceBean.getModel() != null && printerDeviceBean.getModel().toLowerCase().contains("TM-U220B".toLowerCase()))) { if (printerDeviceBean.getModel() != null) {
if (printerDeviceBean.getModel().toLowerCase().contains("TM-U220B".toLowerCase())) {
ThreadPoolManager.getInstence().putExecutableTasks(() -> { ThreadPoolManager.getInstence().putExecutableTasks(() -> {
mPrinter = EpsonPrint.getInstance(); EpsonPrint mPrinter = EpsonPrint.getInstance();
mPrinter.setPrint(false); mPrinter.setPrint(false);
mPrinter.initializeObject(GsaCloudApplication.getAppContext(), PrinterRoot.this, PrinterRoot.this); mPrinter.initializeObject(GsaCloudApplication.getAppContext(), PrinterRoot.this, PrinterRoot.this);
for (int j = 0; j < bitmaps.size(); j++) { for (int j = 0; j < bitmaps.size(); j++) {
...@@ -348,18 +343,22 @@ public abstract class PrinterRoot<T extends PrintContent> implements PrintSocket ...@@ -348,18 +343,22 @@ public abstract class PrinterRoot<T extends PrintContent> implements PrintSocket
} }
} }
); );
} else { return;
}
}
}
ipPrint(printerDeviceBean, bitmaps, this, this);
}
private void ipPrint(PrinterDeviceBean printerDeviceBean, List<Bitmap> bitmaps, PrintSocketHolder.OnStateChangedListener stateChangedListener, PrintExecutor.OnPrintResultListener resultListener) {
if (executor == null) { if (executor == null) {
executor = new PrintExecutor(printerDeviceBean); executor = new PrintExecutor()
executor.setOnStateChangedListener(stateChangedListener); .setOnStateChangedListener(stateChangedListener)
executor.setOnPrintResultListener(resultListener); .setOnPrintResultListener(resultListener);
} else {
executor.setPrinterDeviceBean(printerDeviceBean);
} }
IpPrintMaker maker = new IpPrintMaker(480, bitmaps); IpPrintMaker maker = new IpPrintMaker(480, bitmaps, printerDeviceBean.getIp(), printerDeviceBean.getPort());
executor.doPrinterRequestAsync(maker); executor.doPrinterRequestAsync(maker);
} }
}
public void usbPrint(Context context, List<Bitmap> bitmaps) { public void usbPrint(Context context, List<Bitmap> bitmaps) {
UsbPrint usbPrint = new UsbPrint(context, (code, printId) -> { UsbPrint usbPrint = new UsbPrint(context, (code, printId) -> {
...@@ -408,31 +407,23 @@ public abstract class PrinterRoot<T extends PrintContent> implements PrintSocket ...@@ -408,31 +407,23 @@ public abstract class PrinterRoot<T extends PrintContent> implements PrintSocket
printerFinder.startFinder(); printerFinder.startFinder();
} }
public void transmitPrjToPc(PrinterDeviceBean defaultPrint) {
}
/** /**
* view轉bitmap * view轉為縮放後的bitmap
*
* @param context
* @param view
* @return
*/ */
final Bitmap viewToBitmap(Context context, View view) {
LayoutToBitmapUtils.layoutView(context, view);//先测量view
//轉為bitmap
return LayoutToBitmapUtils.loadBitmapFromView(view);
}
final Bitmap viewToZoomBitmap(Context context, View view, PrinterDeviceBean printerDeviceBean) { final Bitmap viewToZoomBitmap(Context context, View view, PrinterDeviceBean printerDeviceBean) {
LayoutToBitmapUtils.layoutView(context, view);//先测量view LayoutToBitmapUtils.layoutView(context, view);//先测量view
//轉為bitmap //轉為bitmap
return zoomBitmap(printerDeviceBean, LayoutToBitmapUtils.loadBitmapFromView(view)); return zoomBitmap(printerDeviceBean, LayoutToBitmapUtils.loadBitmapFromView(view));
} }
public Bitmap zoomBitmap(PrinterDeviceBean printerDeviceBean, Bitmap bitmap) { /**
* 縮放bitmap
*
* @param printerDeviceBean
* @param bitmap
* @return
*/
private Bitmap zoomBitmap(PrinterDeviceBean printerDeviceBean, Bitmap bitmap) {
int printWidth; int printWidth;
if (printerDeviceBean != null && printerDeviceBean.getPaperSpecification() != null) { if (printerDeviceBean != null && printerDeviceBean.getPaperSpecification() != null) {
printWidth = Double.valueOf(printerDeviceBean.getPaperSpecification()).intValue(); printWidth = Double.valueOf(printerDeviceBean.getPaperSpecification()).intValue();
...@@ -444,10 +435,10 @@ public abstract class PrinterRoot<T extends PrintContent> implements PrintSocket ...@@ -444,10 +435,10 @@ public abstract class PrinterRoot<T extends PrintContent> implements PrintSocket
} }
@Override @Override
public void onResult(int errorCode, PrinterDeviceBean printerDeviceBean) { public void onResult(int errorCode) {
switch (errorCode) { switch (errorCode) {
case PrintSocketHolder.ERROR_0: case PrintSocketHolder.ERROR_0:
PrinterPlugins.getOnPrinterFlowHandler().onPrintSuccess(printerDeviceBean); PrinterPlugins.getOnPrinterFlowHandler().onPrintSuccess();
printSuccess(); printSuccess();
return; return;
case PrintSocketHolder.ERROR_1: case PrintSocketHolder.ERROR_1:
...@@ -477,7 +468,7 @@ public abstract class PrinterRoot<T extends PrintContent> implements PrintSocket ...@@ -477,7 +468,7 @@ public abstract class PrinterRoot<T extends PrintContent> implements PrintSocket
LoganManager.w_printer(TAG, "打印失败"); LoganManager.w_printer(TAG, "打印失败");
break; break;
} }
PrinterPlugins.getOnPrinterFlowHandler().onPrintError(errorCode, printerDeviceBean); PrinterPlugins.getOnPrinterFlowHandler().onPrintError(errorCode);
setPrintState(errorCode); setPrintState(errorCode);
} }
...@@ -494,7 +485,7 @@ public abstract class PrinterRoot<T extends PrintContent> implements PrintSocket ...@@ -494,7 +485,7 @@ public abstract class PrinterRoot<T extends PrintContent> implements PrintSocket
} }
@Override @Override
public void onStateChanged(int state, PrinterDeviceBean printerDeviceBean) { public void onStateChanged(int state) {
setPrintState(state); setPrintState(state);
} }
...@@ -832,6 +823,7 @@ public abstract class PrinterRoot<T extends PrintContent> implements PrintSocket ...@@ -832,6 +823,7 @@ public abstract class PrinterRoot<T extends PrintContent> implements PrintSocket
/** /**
* 獲取食品列表 * 獲取食品列表
* 結賬單、印單。外送都用這個 * 結賬單、印單。外送都用這個
*
* @param mContext * @param mContext
* @param foodList 食品信息 * @param foodList 食品信息
* @param deviceBean 打印設備 * @param deviceBean 打印設備
...@@ -854,6 +846,7 @@ public abstract class PrinterRoot<T extends PrintContent> implements PrintSocket ...@@ -854,6 +846,7 @@ public abstract class PrinterRoot<T extends PrintContent> implements PrintSocket
/** /**
* 結賬單和印單 * 結賬單和印單
*
* @param mContext * @param mContext
* @param billingBeans * @param billingBeans
* @return * @return
...@@ -865,6 +858,7 @@ public abstract class PrinterRoot<T extends PrintContent> implements PrintSocket ...@@ -865,6 +858,7 @@ public abstract class PrinterRoot<T extends PrintContent> implements PrintSocket
/** /**
* 結賬單,支付方式 * 結賬單,支付方式
*
* @param mContext * @param mContext
* @param payBillMoneys 支付方式數據 * @param payBillMoneys 支付方式數據
* @return * @return
......
...@@ -22,19 +22,14 @@ public class TestPrintMaker implements PrintDataMaker { ...@@ -22,19 +22,14 @@ public class TestPrintMaker implements PrintDataMaker {
private List<PrintInfoBean> printInfoBeans; private List<PrintInfoBean> printInfoBeans;
private Bitmap bitmap; private Bitmap bitmap;
public TestPrintMaker(PrinterWriter printer, List<PrintInfoBean> printInfoBeans) { private String ip;
private int port;
public TestPrintMaker(PrinterWriter printer, List<PrintInfoBean> printInfoBeans, String ip, int port) {
this.printer = printer; this.printer = printer;
this.printInfoBeans = printInfoBeans; this.printInfoBeans = printInfoBeans;
} this.ip = ip;
public TestPrintMaker( List<PrintInfoBean> printInfoBeans) { this.port = port;
this.printInfoBeans = printInfoBeans;
}
public TestPrintMaker(PrinterWriter printer) {
this.printer = printer;
}
public TestPrintMaker(Bitmap bitmap) {
this.bitmap = bitmap;
} }
@Override @Override
...@@ -71,6 +66,16 @@ public class TestPrintMaker implements PrintDataMaker { ...@@ -71,6 +66,16 @@ public class TestPrintMaker implements PrintDataMaker {
return null; return null;
} }
@Override
public String getIp() {
return ip;
}
@Override
public int getPort() {
return port;
}
private void print(PrintInfoBean printInfoBean, int i) throws IOException { private void print(PrintInfoBean printInfoBean, int i) throws IOException {
// if (i == 0) { // if (i == 0) {
// location = 0; // location = 0;
......
...@@ -17,11 +17,16 @@ import java.util.Map; ...@@ -17,11 +17,16 @@ import java.util.Map;
public class PrjPrintMaker implements PrintDataMaker { public class PrjPrintMaker implements PrintDataMaker {
private Map<String, Bitmap> bitmapMap; private Map<String, Bitmap> bitmapMap;
private String ip;
private int port;
public PrjPrintMaker(Map<String, Bitmap> bitmapMap) { public PrjPrintMaker(Map<String, Bitmap> bitmapMap, String ip, int port) {
this.bitmapMap = bitmapMap; this.bitmapMap = bitmapMap;
this.ip = ip;
this.port = port;
} }
@Override @Override
public List<byte[]> getPrintData() { public List<byte[]> getPrintData() {
ArrayList<byte[]> data = new ArrayList<>(); ArrayList<byte[]> data = new ArrayList<>();
...@@ -48,4 +53,14 @@ public class PrjPrintMaker implements PrintDataMaker { ...@@ -48,4 +53,14 @@ public class PrjPrintMaker implements PrintDataMaker {
} }
return ""; return "";
} }
@Override
public String getIp() {
return ip;
}
@Override
public int getPort() {
return port;
}
} }
...@@ -16,6 +16,7 @@ import com.epson.epos2.Epos2Exception; ...@@ -16,6 +16,7 @@ import com.epson.epos2.Epos2Exception;
import com.epson.epos2.printer.Printer; import com.epson.epos2.printer.Printer;
import com.epson.epos2.printer.PrinterStatusInfo; import com.epson.epos2.printer.PrinterStatusInfo;
import com.epson.epos2.printer.ReceiveListener; import com.epson.epos2.printer.ReceiveListener;
import com.gingersoft.gsa.cloud.app.GsaCloudApplication;
import com.gingersoft.gsa.cloud.common.constans.HttpsConstans; import com.gingersoft.gsa.cloud.common.constans.HttpsConstans;
import com.gingersoft.gsa.cloud.common.constans.PrintConstans; import com.gingersoft.gsa.cloud.common.constans.PrintConstans;
import com.gingersoft.gsa.cloud.common.core.restaurant.RestaurantInfoManager; import com.gingersoft.gsa.cloud.common.core.restaurant.RestaurantInfoManager;
...@@ -41,7 +42,10 @@ import com.gingersoft.gsa.cloud.print.bean.UpdateBean; ...@@ -41,7 +42,10 @@ import com.gingersoft.gsa.cloud.print.bean.UpdateBean;
import com.hyweb.n5.lib.constant.PrinterConstant; import com.hyweb.n5.lib.constant.PrinterConstant;
import com.hyweb.n5.lib.util.PrinterUtil; import com.hyweb.n5.lib.util.PrinterUtil;
import com.hyweb.n5.server.aidl.IOnPrintCallback; import com.hyweb.n5.server.aidl.IOnPrintCallback;
import com.joe.print.mvp.print.EpsonPrint;
import com.joe.print.mvp.print.IpPrintMaker;
import com.joe.print.mvp.print.PrintPrjKitchen; import com.joe.print.mvp.print.PrintPrjKitchen;
import com.joe.print.mvp.print.PrinterRoot;
import com.joe.print.mvp.print.common.PrinterFinderCallback; import com.joe.print.mvp.print.common.PrinterFinderCallback;
import com.joe.print.mvp.print.common.SendResultCode; import com.joe.print.mvp.print.common.SendResultCode;
import com.joe.print.mvp.print.maker.PrjPrintMaker; import com.joe.print.mvp.print.maker.PrjPrintMaker;
...@@ -114,6 +118,11 @@ public class PrjService extends Service implements ReceiveListener { ...@@ -114,6 +118,11 @@ public class PrjService extends Service implements ReceiveListener {
@Override @Override
public void onDestroy() { public void onDestroy() {
super.onDestroy(); super.onDestroy();
printerFinder.unregisterReceiver();
PrintSocketHolder.getInstance().closeSocket();
//關閉針式連接
EpsonPrint.getInstance().disconnectPrinter();
EpsonPrint.getInstance().finalizeObject();
LoganManager.w_printer(TAG, "onDestroy"); LoganManager.w_printer(TAG, "onDestroy");
} }
...@@ -160,6 +169,10 @@ public class PrjService extends Service implements ReceiveListener { ...@@ -160,6 +169,10 @@ public class PrjService extends Service implements ReceiveListener {
pollDisposable = RxJavaUtils.polling(10, 30, TimeUnit.SECONDS) pollDisposable = RxJavaUtils.polling(10, 30, TimeUnit.SECONDS)
.subscribe(aLong -> { .subscribe(aLong -> {
LoganManager.w_printer(TAG, "獲取Prj數據-->"); LoganManager.w_printer(TAG, "獲取Prj數據-->");
//輪詢時,關閉打印機連接,避免一直佔用打印機socket連接
EpsonPrint.getInstance().disconnectPrinter();
EpsonPrint.getInstance().finalizeObject();
//獲取prj數據
getPrjInfo(); getPrjInfo();
}); });
} }
...@@ -215,8 +228,9 @@ public class PrjService extends Service implements ReceiveListener { ...@@ -215,8 +228,9 @@ public class PrjService extends Service implements ReceiveListener {
private int totalPrj; private int totalPrj;
private int currentIndex; private int currentIndex;
private String prjJson = "";
private void newPrint(String json) { private void newPrint(String json) {
// json = prjJson;
Map<String, List<PrjBean.DataBean.Bean>> listMap = new HashMap<>(); Map<String, List<PrjBean.DataBean.Bean>> listMap = new HashMap<>();
currentIndex = 0; currentIndex = 0;
totalPrj = 0; totalPrj = 0;
...@@ -503,77 +517,49 @@ public class PrjService extends Service implements ReceiveListener { ...@@ -503,77 +517,49 @@ public class PrjService extends Service implements ReceiveListener {
hookPrinterBitmap(bitmapMaps, beans); hookPrinterBitmap(bitmapMaps, beans);
EpsIds = getPrintIds(bitmapMaps); 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));
}
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 {
PrinterPlugins.getOnPrinterFlowHandler().connectionBefore("針式打印機", printerDeviceBean.getIp(), printerDeviceBean.getPort(), 0, 0);
mPrinter.connect("TCP:" + printerDeviceBean.getIp(), Printer.PARAM_DEFAULT);
mPrinter.sendData(Printer.PARAM_DEFAULT);
} catch (Exception e) {
e.printStackTrace();
updatePrjFailure(getPrintIds(bitmapMaps));
PrinterPlugins.getOnPrinterFlowHandler().connectionError(e);
while (true) {
try {
PrinterPlugins.getOnPrinterFlowHandler().disconnect();
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 { EpsonPrint mPrinter = EpsonPrint.getInstance();
mPrinter.setPrint(false);
boolean initResult = EpsonPrint.getInstance().initializeObject(this, this, new PrintExecutor.OnPrintResultListener() {
@Override
public void onResult(int errorCode) {
switch (errorCode) {
case PrintSocketHolder.ERROR_1:
LoganManager.w_printer(TAG, "針式創建打印數據失敗");
break; break;
} case PrintSocketHolder.ERROR_2:
} else { LoganManager.w_printer(TAG, "針式沒紙或未連接");
break;
case PrintSocketHolder.ERROR_4:
LoganManager.w_printer(TAG, "針式發送打印數據失敗");
break;
default:
break; break;
} }
updatePrjFailure(EpsIds);
} }
});
if (!initResult) {
updatePrjFailure(EpsIds);
return;
} }
mPrinter.clearCommandBuffer(); PrinterPlugins.getOnPrinterFlowHandler().connectionBefore("針式打印機", printerDeviceBean.getIp(), printerDeviceBean.getPort(), 0, 0);
mPrinter.setReceiveEventListener(null); for (int i = 0; i < bitmapMaps.size(); i++) {
for (Map.Entry<String, Bitmap> mapEntry : bitmapMaps.get(i).entrySet()) {
mPrinter.putPrintData(printerDeviceBean.getIp(), mapEntry.getValue());
} }
} else {
updatePrjFailure(EpsIds);
} }
} }
PrintExecutor executor;
/** /**
* ip設備打印 * ip設備打印
*/ */
public void ipPrint(PrinterDeviceBean printerDeviceBean, List<Map<String, Bitmap>> bitmapMaps) { public void ipPrint(PrinterDeviceBean printerDeviceBean, List<Map<String, Bitmap>> bitmapMaps) {
for (int i = 0; i < bitmapMaps.size(); i++) { for (int i = 0; i < bitmapMaps.size(); i++) {
PrintExecutor executor = new PrintExecutor(printerDeviceBean); if (executor == null) {
executor.setOnPrjPrintResultListener((errorCode, ids) -> { executor = new PrintExecutor().setOnPrjPrintResultListener((errorCode, ids) -> {
switch (errorCode) { switch (errorCode) {
case PrintSocketHolder.ERROR_0: case PrintSocketHolder.ERROR_0:
//更新狀態 //更新狀態
...@@ -584,7 +570,8 @@ public class PrjService extends Service implements ReceiveListener { ...@@ -584,7 +570,8 @@ public class PrjService extends Service implements ReceiveListener {
break; break;
} }
}); });
PrjPrintMaker maker = new PrjPrintMaker(bitmapMaps.get(i)); }
PrjPrintMaker maker = new PrjPrintMaker(bitmapMaps.get(i), printerDeviceBean.getIp(), printerDeviceBean.getPort());
executor.doPrinterRequestAsync(maker); executor.doPrinterRequestAsync(maker);
} }
} }
...@@ -599,10 +586,10 @@ public class PrjService extends Service implements ReceiveListener { ...@@ -599,10 +586,10 @@ public class PrjService extends Service implements ReceiveListener {
UsbPrint usbPrint = new UsbPrint(mContext, (code, printId) -> { UsbPrint usbPrint = new UsbPrint(mContext, (code, printId) -> {
//打印結果 //打印結果
if (code == SendResultCode.SEND_SUCCESS) { if (code == SendResultCode.SEND_SUCCESS) {
PrinterPlugins.getOnPrinterFlowHandler().onPrintSuccess(null); PrinterPlugins.getOnPrinterFlowHandler().onPrintSuccess();
updatePrjSuccess(key); updatePrjSuccess(key);
} else if (code == SendResultCode.SEND_FAILED) { } else if (code == SendResultCode.SEND_FAILED) {
PrinterPlugins.getOnPrinterFlowHandler().onPrintError(code, null); PrinterPlugins.getOnPrinterFlowHandler().onPrintError(code);
updatePrjFailure(key); updatePrjFailure(key);
} }
}); });
...@@ -647,6 +634,12 @@ public class PrjService extends Service implements ReceiveListener { ...@@ -647,6 +634,12 @@ public class PrjService extends Service implements ReceiveListener {
} }
} }
/**
* 獲取本次打印的prj id
*
* @param bitmapMaps
* @return
*/
private String getPrintIds(List<Map<String, Bitmap>> bitmapMaps) { private String getPrintIds(List<Map<String, Bitmap>> bitmapMaps) {
StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < bitmapMaps.size(); i++) { for (int i = 0; i < bitmapMaps.size(); i++) {
...@@ -880,11 +873,11 @@ public class PrjService extends Service implements ReceiveListener { ...@@ -880,11 +873,11 @@ public class PrjService extends Service implements ReceiveListener {
public void onPtrReceive(Printer printer, int i, PrinterStatusInfo printerStatusInfo, String s) { public void onPtrReceive(Printer printer, int i, PrinterStatusInfo printerStatusInfo, String s) {
//針式打印回調 //針式打印回調
if (i == 0) { if (i == 0) {
PrinterPlugins.getOnPrinterFlowHandler().onPrintSuccess(null); PrinterPlugins.getOnPrinterFlowHandler().onPrintSuccess();
//打印成功 //打印成功
updatePrjSuccess(EpsIds); updatePrjSuccess(EpsIds);
} else { } else {
PrinterPlugins.getOnPrinterFlowHandler().onPrintError(i, null); PrinterPlugins.getOnPrinterFlowHandler().onPrintError(i);
//打印失敗 //打印失敗
updatePrjFailure(EpsIds); updatePrjFailure(EpsIds);
} }
......
...@@ -14,6 +14,7 @@ import android.view.View; ...@@ -14,6 +14,7 @@ import android.view.View;
import android.view.Window; import android.view.Window;
import android.view.WindowManager; import android.view.WindowManager;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
...@@ -25,11 +26,14 @@ import androidx.recyclerview.widget.RecyclerView; ...@@ -25,11 +26,14 @@ import androidx.recyclerview.widget.RecyclerView;
import com.billy.cc.core.component.CC; import com.billy.cc.core.component.CC;
import com.billy.cc.core.component.CCResult; import com.billy.cc.core.component.CCResult;
import com.billy.cc.core.component.CCUtil; import com.billy.cc.core.component.CCUtil;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.listener.OnItemClickListener;
import com.gingersoft.gsa.cloud.app.GsaCloudApplication; import com.gingersoft.gsa.cloud.app.GsaCloudApplication;
import com.gingersoft.gsa.cloud.common.constans.PrintConstans; import com.gingersoft.gsa.cloud.common.constans.PrintConstans;
import com.gingersoft.gsa.cloud.common.logan.LoganManager; import com.gingersoft.gsa.cloud.common.logan.LoganManager;
import com.gingersoft.gsa.cloud.common.printer.plugins.PrinterPlugins; import com.gingersoft.gsa.cloud.common.printer.plugins.PrinterPlugins;
import com.gingersoft.gsa.cloud.common.utils.gson.GsonUtils; import com.gingersoft.gsa.cloud.common.utils.gson.GsonUtils;
import com.gingersoft.gsa.cloud.print.NewPrintExecutor;
import com.gingersoft.gsa.cloud.print.PrintExecutor; import com.gingersoft.gsa.cloud.print.PrintExecutor;
import com.gingersoft.gsa.cloud.print.PrintSocketHolder; import com.gingersoft.gsa.cloud.print.PrintSocketHolder;
import com.gingersoft.gsa.cloud.print.bean.PrintContent; import com.gingersoft.gsa.cloud.print.bean.PrintContent;
...@@ -47,6 +51,7 @@ import com.joe.print.R; ...@@ -47,6 +51,7 @@ import com.joe.print.R;
import com.joe.print.di.component.DaggerPrintComponent; import com.joe.print.di.component.DaggerPrintComponent;
import com.joe.print.mvp.contract.PrintContract; import com.joe.print.mvp.contract.PrintContract;
import com.joe.print.mvp.presenter.PrintPresenter; import com.joe.print.mvp.presenter.PrintPresenter;
import com.joe.print.mvp.print.EpsonPrint;
import com.joe.print.mvp.print.OpenCashBoxMaker; import com.joe.print.mvp.print.OpenCashBoxMaker;
import com.joe.print.mvp.print.PrintInstruction; import com.joe.print.mvp.print.PrintInstruction;
import com.joe.print.mvp.print.PrintListener; import com.joe.print.mvp.print.PrintListener;
...@@ -55,8 +60,17 @@ import com.joe.print.mvp.print.PrinterRoot; ...@@ -55,8 +60,17 @@ import com.joe.print.mvp.print.PrinterRoot;
import com.joe.print.mvp.print.utils.MyPrintUtils; import com.joe.print.mvp.print.utils.MyPrintUtils;
import com.joe.print.mvp.ui.adapter.DialogPrinterListAdapter; import com.joe.print.mvp.ui.adapter.DialogPrinterListAdapter;
import com.joe.print.mvp.ui.adapter.PrintProgressAdapter; import com.joe.print.mvp.ui.adapter.PrintProgressAdapter;
import com.joe.print.mvp.ui.view.SelectPrintDevicePopup;
import com.lxj.xpopup.XPopup;
import com.lxj.xpopup.core.CenterPopupView;
import com.lxj.xpopup.enums.PopupAnimation;
import com.lxj.xpopup.impl.LoadingPopupView;
import com.xuexiang.rxutil2.rxjava.RxJavaUtils;
import com.xuexiang.rxutil2.rxjava.task.RxAsyncTask;
import com.xuexiang.rxutil2.rxjava.task.RxUITask;
import com.yanzhenjie.recyclerview.widget.DefaultItemDecoration; import com.yanzhenjie.recyclerview.widget.DefaultItemDecoration;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
...@@ -93,7 +107,6 @@ import static com.jess.arms.utils.Preconditions.checkNotNull; ...@@ -93,7 +107,6 @@ import static com.jess.arms.utils.Preconditions.checkNotNull;
public class PrintActivity extends BaseActivity<PrintPresenter> implements PrintContract.View, DialogInterface.OnDismissListener, PrintListener, PrintSocketHolder.OnStateChangedListener, PrintExecutor.OnPrintResultListener { public class PrintActivity extends BaseActivity<PrintPresenter> implements PrintContract.View, DialogInterface.OnDismissListener, PrintListener, PrintSocketHolder.OnStateChangedListener, PrintExecutor.OnPrintResultListener {
public final static int ADD_PRINT_CODE = 1001;//添加打印機回調 public final static int ADD_PRINT_CODE = 1001;//添加打印機回調
public final static int DIMISS_LOADING = 1002;//關閉加載窗
public final static int FINISH = 1003;//關閉頁面 public final static int FINISH = 1003;//關閉頁面
public final static int ADD_PRINT_DEVICE = 1004;//添加打印機 public final static int ADD_PRINT_DEVICE = 1004;//添加打印機
public final static int LACK_OF_PAPER = 1005;//缺紙 public final static int LACK_OF_PAPER = 1005;//缺紙
...@@ -103,9 +116,6 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print ...@@ -103,9 +116,6 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
private String callId; private String callId;
private PrinterRoot printerInIt; private PrinterRoot printerInIt;
private Dialog mLoadingDialog;
private TextView mTvLoadingTip;
/** /**
* 0:上菜紙 * 0:上菜紙
* 1:印單 * 1:印單
...@@ -117,8 +127,10 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print ...@@ -117,8 +127,10 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
*/ */
private int type; private int type;
private String mOrderNo; private String mOrderNo;
//是否顯示打印等待彈窗 /**
private boolean isShowDialog; * 打印進度
*/
private LoadingPopupView loadingPopup;
@Override @Override
public void setupActivityComponent(@NonNull AppComponent appComponent) { public void setupActivityComponent(@NonNull AppComponent appComponent) {
...@@ -134,59 +146,97 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print ...@@ -134,59 +146,97 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
public int initView(@Nullable Bundle savedInstanceState) { public int initView(@Nullable Bundle savedInstanceState) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH); | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
return 0; //R.layout.print_bitmap如果你不需要框架帮你设置 setContentView(id) 需要 自行设置,请返回 0 return 0;//R.layout.print_bitmap;如果你不需要框架帮你设置 setContentView(id) 需要 自行设置,请返回 0
} }
@Override @Override
public void initData(@Nullable Bundle savedInstanceState) { public void initData(@Nullable Bundle savedInstanceState) {
loadingPopup = new XPopup.Builder(mContext)
.popupAnimation(PopupAnimation.ScaleAlphaFromCenter)
.asLoading("加载中...");
loadingPopup.show();
callId = CCUtil.getNavigateCallId(this); callId = CCUtil.getNavigateCallId(this);
//獲取打印類型,根據打印類型生成對應的bitmap //獲取打印類型,根據打印類型生成對應的bitmap
type = CCUtil.getNavigateParam(this, PrintConstans.PRINT_TYPE, PrintConstans.PRINT_TEST); type = CCUtil.getNavigateParam(this, PrintConstans.PRINT_TYPE, PrintConstans.PRINT_TEST);
//獲取打印內容
PrintContent printContent = CCUtil.getNavigateParam(this, PrintConstans.PRINT_CONTENT, null); PrintContent printContent = CCUtil.getNavigateParam(this, PrintConstans.PRINT_CONTENT, null);
//訂單編號
mOrderNo = CCUtil.getNavigateParam(this, PrintConstans.PRINT_ORDER_NO, ""); mOrderNo = CCUtil.getNavigateParam(this, PrintConstans.PRINT_ORDER_NO, "");
isShowDialog = CCUtil.getNavigateParam(this, PrintConstans.PRINT_LOADING, true); //根據打印類型獲取對應的執行類
printerInIt = PrinterRoot.getPrinterByType(type, printContent); printerInIt = PrinterRoot.getPrinterByType(type, printContent);
if (printerInIt != null) { if (printerInIt != null) {
printerInIt.setPrintListener(this); printerInIt.setPrintListener(this);
} }
//初始化打印配置
initPrintConfig(printContent); initPrintConfig(printContent);
} }
private int selectPrint = -1; /**
* 如果沒有默認打印機,彈窗彈出讓用戶選擇打印機
*/
private PrinterDeviceBean defaultPrint;
private void initPrintConfig(PrintContent printContent) { private void initPrintConfig(PrintContent printContent) {
PrintCurrencyBean printCurrencyBean; //獲取通用打印配置
PrinterDeviceBean defaultPrint; PrintCurrencyBean printCurrencyBean = getCurrencyConfig();
//獲取通用打印配置,不同的打印
if (type == PRINT_OTHER_ORDER || type == PRINT_OTHER_CLOSING) {
//外賣的通用打印配置
printCurrencyBean = mPresenter.getPrintCurrencyBeanByType(this, PRINT_BILL);
}
// else if (type == 0 || type == 1 || type == 2) {
// //堂食的通用打印配置
// printCurrencyBean = mPresenter.getPrintCurrencyBeanByType(this, 1);
// }
else {
printCurrencyBean = mPresenter.getPrintCurrencyBeanByType(this, PRINT_SLIP);
}
//獲取打印機列表 //獲取打印機列表
printerDeviceBeans = mPresenter.getAllPrintList(this); printerDeviceBeans = mPresenter.getAllPrintList(this);
if (type == PrintConstans.PRINT_TEST) { if (type == PrintConstans.PRINT_TEST) {
//如果是打印測試 //如果是打印測試,就取由頁面傳遞過來的打印機信息
defaultPrint = CCUtil.getNavigateParam(this, "deviceBean", null); defaultPrint = CCUtil.getNavigateParam(this, "deviceBean", null);
} else { } else {
// 獲取默認打印機,如果用戶沒有配置默認打印機,就取最近使用的一個. // 獲取默認打印機,如果用戶沒有配置默認打印機,就取最近使用的一個.
// 如果沒有最近使用的打印機,並且當前餐廳只有一台打印機,就用這一台打印機打印 // 如果沒有最近使用的打印機,並且當前餐廳只有一台打印機,就用這一台打印機打印
defaultPrint = mPresenter.getDefaultPrintInList(printerDeviceBeans, (String) SPUtils.get("defaultPrint", "")); defaultPrint = mPresenter.getDefaultPrintInList(printerDeviceBeans, (String) SPUtils.get("defaultPrint", ""));
} }
//生成餐檯打印的一些信息
PrinterPlugins.getOnPrinterFlowHandler().onPrinterDataBefore(type, type, GsonUtils.GsonString(printContent), GsonUtils.GsonString(defaultPrint)); PrinterPlugins.getOnPrinterFlowHandler().onPrinterDataBefore(type, type, GsonUtils.GsonString(printContent), GsonUtils.GsonString(defaultPrint));
//廚房單 //如果是打印廚房單
if (type == PrintConstans.PRINT_KITCHEN) { if (type == PrintConstans.PRINT_KITCHEN) {
//設置廚房單的信息,並且獲取到這個廚房單的打印位置
defaultPrint = setKitChenPrj(defaultPrint);
}
//如果沒有打印機
if (defaultPrint == null) {
//沒有默認打印機,查看當前餐廳有沒有打印機
//如果當前餐廳有打印機,彈出彈窗讓用戶選擇一個打印機打印
if (printerDeviceBeans != null && printerDeviceBeans.size() > 0) {
SelectPrintDevicePopup selectPrintDevicePopup = new SelectPrintDevicePopup(mContext, printerDeviceBeans);
selectPrintDevicePopup.setOnItemClickListener((adapter, view, position) -> {
//用戶選擇的ip打印機打印
//將打印機和通用配置合併
selectPrintDevicePopup.dismiss();
this.defaultPrint = MyPrintUtils.configPrinterProperties(printCurrencyBean, printerDeviceBeans.get(position));
printByDevice(this.defaultPrint);
SPUtils.put("defaultPrint", printerDeviceBeans.get(position).getName());
}).setOnDismissListener(() -> {
//如果彈窗已經關閉,打印機還是為空,說明用戶沒有選擇打印機
if (this.defaultPrint == null) {
printFailure("沒有找到打印機,無法打印");
finish();
}
});
new XPopup.Builder(mContext).asCustom(selectPrintDevicePopup).show();
} else {
//沒有打印機
ToastUtils.show(mContext, "沒有打印機,請先添加打印機");
}
} else {
//將打印機和通用配置合併
defaultPrint = MyPrintUtils.configPrinterProperties(printCurrencyBean, defaultPrint);
printByDevice(defaultPrint);
}
}
/**
* 設置廚房單打印數據
*
* @param defaultPrint 默認打印機
* @return 如果prj有指定打印機,並且找到了,就返回
*/
private PrinterDeviceBean setKitChenPrj(PrinterDeviceBean defaultPrint) {
List<PrjBean.DataBean.Bean> printDatas = CCUtil.getNavigateParam(this, "prjBeans", null); List<PrjBean.DataBean.Bean> printDatas = CCUtil.getNavigateParam(this, "prjBeans", null);
Map<String, List<PrjBean.DataBean.Bean>> prjMap = PrintPrjKitchen.getPrjMap(); Map<String, List<PrjBean.DataBean.Bean>> prjMap = PrintPrjKitchen.getPrjMap();
String printLocation = null; String printLocation = null;
...@@ -194,11 +244,7 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print ...@@ -194,11 +244,7 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
if (printLocation == null) { if (printLocation == null) {
if (TextUtil.isNotEmptyOrNullOrUndefined(prjBean.getPrintPosition())) { if (TextUtil.isNotEmptyOrNullOrUndefined(prjBean.getPrintPosition())) {
printLocation = prjBean.getPrintPosition(); printLocation = prjBean.getPrintPosition();
defaultPrint = mPresenter.getPrinterDeviceBeanByName(printerDeviceBeans, printLocation); return mPresenter.getPrinterDeviceBeanByName(printerDeviceBeans, printLocation);
if (defaultPrint == null) {
printFailure("未找到對應的打印機");
return;
}
} else { } else {
if (defaultPrint == null) { if (defaultPrint == null) {
printLocation = ""; printLocation = "";
...@@ -211,92 +257,71 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print ...@@ -211,92 +257,71 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
prjBean.setCurrentIndex(1); prjBean.setCurrentIndex(1);
} }
prjMap.put("", printDatas); prjMap.put("", printDatas);
return null;
} }
if (defaultPrint == null) { /**
//沒有默認打印機,查看當前餐廳有沒有打印機 * 獲取通用打印配置
//如果當前餐廳有打印機,彈出彈窗讓用戶選擇一個打印機打印 */
if (printerDeviceBeans != null && printerDeviceBeans.size() > 0) { private PrintCurrencyBean getCurrencyConfig() {
PrintCurrencyBean finalPrintCurrencyBean = printCurrencyBean; PrintCurrencyBean printCurrencyBean;
new DialogUtils(mContext, R.layout.print_dialog_internet_list) { if (type == PRINT_OTHER_ORDER || type == PRINT_OTHER_CLOSING) {
@Override //外賣的通用打印配置
public void initLayout(ViewHepler hepler, Dialog dialog) { printCurrencyBean = mPresenter.getPrintCurrencyBeanByType(this, PRINT_BILL);
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打印機打印
PrinterDeviceBean defaultPrint = MyPrintUtils.configPrinterProperties(finalPrintCurrencyBean, printerDeviceBeans.get(position));
printByDevice(defaultPrint);
selectPrint = position;
SPUtils.put("defaultPrint", printerDeviceBeans.get(position).getName());
dialog.dismiss();
});
}
}
.setHeight(ArmsUtils.getScreenHeidth(mContext) / 2)
.setWidth((int) (ArmsUtils.getScreenWidth(mContext) * 0.8))
.setOnDismissListener(dialog -> {
if (selectPrint == -1) {
printFailure("未選擇打印機");
}
})
.show();
} else {
//沒有打印機
ToastUtils.show(mContext, "沒有打印機,請先添加打印機");
} }
} else { // else if (type == 0 || type == 1 || type == 2) {
defaultPrint = MyPrintUtils.configPrinterProperties(printCurrencyBean, defaultPrint); // //堂食的通用打印配置
printByDevice(defaultPrint); // printCurrencyBean = mPresenter.getPrintCurrencyBeanByType(this, 1);
// }
else {
printCurrencyBean = mPresenter.getPrintCurrencyBeanByType(this, PRINT_SLIP);
} }
return printCurrencyBean;
} }
/**
//打印邏輯,獲取對應的打印配置--打印機或是通用配置 * 打印邏輯,獲取對應的打印配置--打印機或是通用配置
//根據配置生成配置好的圖片----生成圖片邏輯:把打印的單分為幾個模塊,再由不同的單拼接出對應的單,(如果是針式,生成對應的文字) * 根據配置生成配置好的圖片----生成圖片邏輯:把打印的單分為幾個模塊,再由不同的單拼接出對應的單,(如果是針式,生成對應的文字)
//再獲取打印方式(IP、本機、USB、藍牙或其他的),調用打印 * 再獲取打印方式(IP、本機、USB、藍牙或其他的),調用打印
*
* @param defaultPrint 打印機
*/
private void printByDevice(PrinterDeviceBean defaultPrint) { private void printByDevice(PrinterDeviceBean defaultPrint) {
//獲取對應的打印類 //獲取對應的打印類
if (printerInIt instanceof PrintInstruction) { if (printerInIt instanceof PrintInstruction) {
//開錢箱 //開錢箱
PrintExecutor executor = new PrintExecutor(defaultPrint); PrintExecutor executor = new PrintExecutor();
executor.doPrinterRequestAsync(new OpenCashBoxMaker()); executor.doPrinterRequestAsync(new OpenCashBoxMaker(defaultPrint.getIp(), defaultPrint.getPort()));
CC.sendCCResult(callId, CCResult.success()); CC.sendCCResult(callId, CCResult.success());
} else { } else {
if (isShowDialog) {
initDialog();
}
Map<String, List<Bitmap>> listMap; Map<String, List<Bitmap>> listMap;
List<Bitmap> zoomBitmaps = null; List<Bitmap> zoomBitmaps = null;
String[] BBPosPrintDatas = null; String[] BBPosPrintDatas = null;
if (defaultPrint.getPrinterDeviceType() == PrinterDeviceBean.PRINT_LOCAL && PrintConstans.PRINT_MODEL_WISEPOS.contains(Build.MODEL)) { if (defaultPrint.getPrinterDeviceType() == PrinterDeviceBean.PRINT_LOCAL && PrintConstans.PRINT_MODEL_WISEPOS.contains(Build.MODEL)) {
//本機打印並且是BBPOS //本機打印並且是BBPOS
//獲取打印數據
BBPosPrintDatas = printerInIt.getPrintDatas(mContext, defaultPrint); BBPosPrintDatas = printerInIt.getPrintDatas(mContext, defaultPrint);
if (BBPosPrintDatas == null) { if (BBPosPrintDatas == null) {
printFailure("暫不支持打印此單"); printFailure("暫不支持打印此單");
return; return;
} }
} else { } else {
//獲取打印圖片
listMap = printerInIt.getPrintBitmapByCount(mContext, defaultPrint); listMap = printerInIt.getPrintBitmapByCount(mContext, defaultPrint);
if (listMap != null) { if (listMap != null) {
zoomBitmaps = listMap.get(""); zoomBitmaps = listMap.get("");
} else { } else {
printFailure("暫不支持打印此單"); printFailure("打印失敗,生成打印數據失敗");
return; return;
} }
if (zoomBitmaps != null && zoomBitmaps.size() > 0) { if (zoomBitmaps == null) {
} else {
//打印失敗 //打印失敗
printFailure("打印失敗,生成打印數據失敗"); printFailure("打印失敗,生成打印數據失敗");
} } else {
//保存打印圖片到本地
setPrinterBitmapToLocation(type, type, mOrderNo, listMap); setPrinterBitmapToLocation(type, type, mOrderNo, listMap);
} }
//獲得對應的圖片 }
if (defaultPrint.getPrinterDeviceType() == PrinterDeviceBean.PRINT_IP) { if (defaultPrint.getPrinterDeviceType() == PrinterDeviceBean.PRINT_IP) {
//IP打印 //IP打印
printerInIt.ipDevicePrint(defaultPrint, zoomBitmaps); printerInIt.ipDevicePrint(defaultPrint, zoomBitmaps);
...@@ -306,11 +331,7 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print ...@@ -306,11 +331,7 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
} else if (defaultPrint.getPrinterDeviceType() == PrinterDeviceBean.PRINT_USB) { } else if (defaultPrint.getPrinterDeviceType() == PrinterDeviceBean.PRINT_USB) {
//USB打印打印 //USB打印打印
printerInIt.usbPrint(mContext, zoomBitmaps); printerInIt.usbPrint(mContext, zoomBitmaps);
} } else {
// else if (defaultPrint.getPrinterDeviceType() == 4) {
// printerInIt.transmitPrjToPc(defaultPrint);
// }
else {
printFailure("未找到對應的打印類型"); printFailure("未找到對應的打印類型");
} }
} }
...@@ -326,105 +347,8 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print ...@@ -326,105 +347,8 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
} }
} }
private Map<String, List<PrjBean.DataBean.Bean>> setPrjIndex(Map<String, List<PrjBean.DataBean.Bean>> listMap, int totalPrj) { private void addPrintProgress(String printState) {
int currentIndex = 0; loadingPopup.setTitle(printState);
for (Map.Entry<String, List<PrjBean.DataBean.Bean>> prjMap : listMap.entrySet()) {
for (PrjBean.DataBean.Bean bean : prjMap.getValue()) {
bean.setTotalPrj(totalPrj);
if (bean.getStatus() == 2) {
currentIndex++;
} else {
if (currentIndex == 0) {
currentIndex = 1;
}
}
bean.setCurrentIndex(currentIndex);
}
currentIndex++;
}
return listMap;
}
private Map<String, List<PrjBean.DataBean.Bean>> printDataToMap(List<PrjBean.DataBean.Bean> printData) {
Map<String, List<PrjBean.DataBean.Bean>> map = new HashMap<>();
PrinterDeviceBean defaultPainter = null;
//獲得默認的打印機
for (PrinterDeviceBean printerDeviceBean : printerDeviceBeans) {
if (printerDeviceBean.getType() == 2) {
defaultPainter = printerDeviceBean;
break;
}
}
//將prj集合通過打印位置轉成map
for (PrjBean.DataBean.Bean bean : printData) {
if (TextUtil.isNotEmptyOrNullOrUndefined(bean.getPrintPosition())) {
List<PrjBean.DataBean.Bean> mapByKey = map.get(bean.getPrintPosition());
if (mapByKey != null) {
mapByKey.add(bean);
} else {
map.put(bean.getPrintPosition(), Collections.singletonList(bean));
}
} else if (defaultPainter != null) {
//沒有打印位置的,由默認的位置去打印
bean.setPrintPosition(defaultPainter.getName());
List<PrjBean.DataBean.Bean> mapByKey = map.get(bean.getPrintPosition());
if (mapByKey != null) {
mapByKey.add(bean);
} else {
map.put(bean.getPrintPosition(), Collections.singletonList(bean));
}
} else {
ToastUtils.show(this, "未配置打印機");
}
}
return map;
}
private PrintProgressAdapter adapter;
private void setPrintProgress(int state) {
if (adapter != null) {
adapter.setProgress(state);
}
}
private void initDialog() {
try {
// new DialogUtils(this, R.layout.print_layout_print_progress) {
// @Override
// public void initLayout(ViewHepler hepler, Dialog dialog) {
// List<String> stauts = Arrays.asList("生成數據中", "連接打印機", "開始寫入數據", "打印成功");
// adapter = new PrintProgressAdapter(stauts);
// hepler.setAdapter(R.id.rv_print_progress, new LinearLayoutManager(mContext), adapter);
// }
// }.setWidth((int) (DeviceUtils.getScreenWidth(mContext) * 0.8))
// .show();
View view = LayoutInflater.from(mContext).inflate(R.layout.ui_dialog_loading, null);
mTvLoadingTip = view.findViewById(R.id.tv_loading_dialog_text);
mLoadingDialog = new Dialog(this, R.style.ui_loading_dialog);
mLoadingDialog.setCancelable(true);
mLoadingDialog.setCanceledOnTouchOutside(false);
Window window = mLoadingDialog.getWindow();
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
mLoadingDialog.setContentView(view, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
if (!this.isFinishing()) {
mLoadingDialog.show();
setLoadingText("加載中...");
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void setLoadingText(String tip) {
Observable.just(1)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(integer -> {
if (mLoadingDialog != null && mLoadingDialog.isShowing()) {
mTvLoadingTip.setText(tip);
}
});
} }
@Override @Override
...@@ -440,7 +364,6 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print ...@@ -440,7 +364,6 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
switch (state) { switch (state) {
case PrintSocketHolder.ERROR_0: case PrintSocketHolder.ERROR_0:
tip = "打印成功"; tip = "打印成功";
setPrintProgress(3);
break; break;
case PrintSocketHolder.ERROR_1: case PrintSocketHolder.ERROR_1:
tip = "生成打印數據失敗"; tip = "生成打印數據失敗";
...@@ -456,26 +379,20 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print ...@@ -456,26 +379,20 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
tip = "必要的參數不能為空"; tip = "必要的參數不能為空";
break; break;
case PrintSocketHolder.STATE_0: case PrintSocketHolder.STATE_0:
setPrintProgress(0);
break; break;
case PrintSocketHolder.STATE_1: case PrintSocketHolder.STATE_1:
tip = "開始創建連接"; tip = "開始創建連接";
break; break;
case PrintSocketHolder.STATE_2: case PrintSocketHolder.STATE_2:
tip = "創建連接成功,開始發送數據"; tip = "創建連接成功,開始發送數據";
setPrintProgress(1);
break; break;
case PrintSocketHolder.STATE_3: case PrintSocketHolder.STATE_3:
tip = "開始寫入數據"; tip = "開始寫入數據";
setPrintProgress(2);
break; break;
case PrintSocketHolder.STATE_4: case PrintSocketHolder.STATE_4:
tip = "關閉中"; tip = "關閉中";
finish(); finish();
break; break;
case DIMISS_LOADING:
disLoadingDialog();
break;
case FINISH: case FINISH:
finish(); finish();
break; break;
...@@ -485,10 +402,13 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print ...@@ -485,10 +402,13 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
case LACK_OF_PAPER: case LACK_OF_PAPER:
//缺紙 //缺紙
printFailure("打印機缺紙"); printFailure("打印機缺紙");
tip = "打印機缺紙";
break;
default:
break; break;
} }
LoganManager.w_printer(TAG, "printStateChanged state--->" + tip); LoganManager.w_printer(TAG, "printStateChanged state--->" + tip);
setLoadingText(tip); addPrintProgress(tip);
} }
/** /**
...@@ -497,14 +417,8 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print ...@@ -497,14 +417,8 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
@Override @Override
public void printSuccess() { public void printSuccess() {
LoganManager.w_printer(TAG, "printFailure 打印成功"); LoganManager.w_printer(TAG, "printFailure 打印成功");
// if (printCount <= 1) {
CC.sendCCResult(callId, CCResult.success()); CC.sendCCResult(callId, CCResult.success());
disLoadingDialog();
finish(); finish();
// finish();
// } else {
// printCount--;
// }
} }
@Override @Override
...@@ -515,11 +429,7 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print ...@@ -515,11 +429,7 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
} else { } else {
CC.sendCCResult(callId, CCResult.error("print error")); CC.sendCCResult(callId, CCResult.error("print error"));
} }
// if (printCount <= 1) {
finish(); finish();
// } else {
// printCount--;
// }
} }
@Override @Override
...@@ -612,28 +522,23 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print ...@@ -612,28 +522,23 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
disLoadingDialog(); loadingPopup.dismiss();
} //關閉打印頁面時,關閉所有打印連接
//關閉ip打印連接
private void disLoadingDialog() { PrintSocketHolder.getInstance().closeSocket();
Observable.just(1) //關閉針式打印連接
.observeOn(AndroidSchedulers.mainThread()) EpsonPrint.getInstance().disconnectPrinter();
.subscribe(integer -> { EpsonPrint.getInstance().finalizeObject();
if (mLoadingDialog != null) {
mLoadingDialog.dismiss();
mLoadingDialog = null;
}
});
} }
@Override @Override
public void onStateChanged(int state, PrinterDeviceBean printerDeviceBean) { public void onStateChanged(int state) {
//ip打印狀態修改回調 //ip打印狀態修改回調
} }
@Override @Override
public void onResult(int errorCode, PrinterDeviceBean printerDeviceBean) { public void onResult(int errorCode) {
//ip打印結果回調 //ip打印結果回調
} }
......
...@@ -259,14 +259,14 @@ public class PrintTestActivity extends AppCompatActivity implements PrintSocketH ...@@ -259,14 +259,14 @@ public class PrintTestActivity extends AppCompatActivity implements PrintSocketH
} }
@Override @Override
public void onResult(int errorCode, PrinterDeviceBean printerDeviceBean) { public void onResult(int errorCode) {
if (errorCode == 0) { if (errorCode == 0) {
ToastUtils.show(PrintTestActivity.this, "打印失败"); ToastUtils.show(PrintTestActivity.this, "打印失败");
} }
} }
@Override @Override
public void onStateChanged(int state, PrinterDeviceBean printerDeviceBean) { public void onStateChanged(int state) {
} }
......
package com.joe.print.mvp.ui.adapter; package com.joe.print.mvp.ui.adapter;
import android.content.Context;
import androidx.core.content.ContextCompat;
import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder; import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.joe.print.R; import com.joe.print.R;
...@@ -9,36 +13,31 @@ import org.jetbrains.annotations.Nullable; ...@@ -9,36 +13,31 @@ import org.jetbrains.annotations.Nullable;
import java.util.List; import java.util.List;
/**
* 打印進度
*/
public class PrintProgressAdapter extends BaseQuickAdapter<String, BaseViewHolder> { public class PrintProgressAdapter extends BaseQuickAdapter<String, BaseViewHolder> {
private int progress = 0; private int completeColor;
private int inProgressColor;
public PrintProgressAdapter(@Nullable List<String> data) { public PrintProgressAdapter(Context context, @Nullable List<String> data) {
super(R.layout.print_progress_item, data); super(R.layout.print_progress_item, data);
completeColor = ContextCompat.getColor(context, R.color.order_state0_color);
} inProgressColor = ContextCompat.getColor(context, R.color.theme_333_color);
public void setProgress(int progress) {
this.progress = progress;
super.notifyDataSetChanged();
} }
@Override @Override
protected void convert(@NotNull BaseViewHolder baseViewHolder, String s) { protected void convert(@NotNull BaseViewHolder baseViewHolder, String s) {
baseViewHolder.setText(R.id.tv_print_progressbar, s); baseViewHolder.setText(R.id.tv_print_progressbar, s);
if (progress > baseViewHolder.getAdapterPosition()) { if (baseViewHolder.getAdapterPosition() == getItemCount() - 1) {
baseViewHolder.setGone(R.id.pb_print_progressbar, true); baseViewHolder.setGone(R.id.pb_print_progressbar, true);
baseViewHolder.setTextColor(R.id.tv_print_progressbar, R.color.order_state0_color); baseViewHolder.setTextColor(R.id.tv_print_progressbar, completeColor);
baseViewHolder.setGone(R.id.iv_checked, false); baseViewHolder.setGone(R.id.iv_checked, false);
} else if (progress == baseViewHolder.getAdapterPosition()) {
baseViewHolder.setGone(R.id.pb_print_progressbar, false);
baseViewHolder.setTextColor(R.id.tv_print_progressbar, R.color.theme_333_color);
baseViewHolder.setGone(R.id.iv_checked, true);
} else { } else {
baseViewHolder.setGone(R.id.pb_print_progressbar, true); baseViewHolder.setGone(R.id.pb_print_progressbar, false);
baseViewHolder.setTextColor(R.id.tv_print_progressbar, R.color.color_ccc); baseViewHolder.setTextColor(R.id.tv_print_progressbar, inProgressColor);
baseViewHolder.setGone(R.id.iv_checked, true); baseViewHolder.setGone(R.id.iv_checked, true);
} }
} }
} }
package com.joe.print.mvp.ui.view;
import android.content.Context;
import androidx.annotation.NonNull;
import com.lxj.xpopup.impl.LoadingPopupView;
/**
* @author 宇航.
* User: admin
* Date: 2021/2/5
* Time: 18:31
* Use:
*/
public class PrintProgressPopup extends LoadingPopupView {
/**
* @param context
* @param bindLayoutId layoutId 如果要显示标题,则要求必须有id为tv_title的TextView,否则无任何要求
*/
public PrintProgressPopup(@NonNull Context context, int bindLayoutId) {
super(context, bindLayoutId);
}
}
package com.joe.print.mvp.ui.view;
import android.content.Context;
import android.widget.PopupMenu;
import android.widget.PopupWindow;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;
import com.chad.library.adapter.base.listener.OnItemClickListener;
import com.gingersoft.gsa.cloud.common.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.joe.print.R;
import com.joe.print.mvp.print.utils.MyPrintUtils;
import com.joe.print.mvp.ui.adapter.DialogPrinterListAdapter;
import com.lxj.xpopup.core.CenterPopupView;
import com.lxj.xpopup.impl.CenterListPopupView;
import com.yanzhenjie.recyclerview.widget.DefaultItemDecoration;
import java.util.List;
/**
* @author 宇航.
* User: admin
* Date: 2021/2/5
* Time: 16:59
* Use:選擇打印彈窗
*/
public class SelectPrintDevicePopup extends CenterPopupView {
private List<PrinterDeviceBean> printerDeviceBeans;
private OnItemClickListener mOnItemClickListener;
private PopupWindow.OnDismissListener onDismissListener;
public SelectPrintDevicePopup(@NonNull Context context, List<PrinterDeviceBean> printerDeviceBeans) {
super(context);
this.printerDeviceBeans = printerDeviceBeans;
}
@Override
protected int getPopupLayoutId() {
return R.layout.print_dialog_internet_list;
}
@Override
protected void initPopupContent() {
RecyclerView mRvPrintList = findViewById(R.id.rv_print_list);
DialogPrinterListAdapter printListAdapter = new DialogPrinterListAdapter(printerDeviceBeans, getContext());
mRvPrintList.addItemDecoration(new DefaultItemDecoration(ContextCompat.getColor(getContext(), R.color.line_color)));
mRvPrintList.setAdapter(printListAdapter);
printListAdapter.setOnItemClickListener(mOnItemClickListener);
}
public SelectPrintDevicePopup setOnItemClickListener(OnItemClickListener mOnItemClickListener) {
this.mOnItemClickListener = mOnItemClickListener;
return this;
}
public SelectPrintDevicePopup setOnDismissListener(PopupWindow.OnDismissListener onDismissListener) {
this.onDismissListener = onDismissListener;
return this;
}
@Override
protected void onDismiss() {
super.onDismiss();
if (onDismissListener != null)
onDismissListener.onDismiss();
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout 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_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/alpha_70_black"
android:orientation="vertical"> android:orientation="vertical">
<ImageView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/iv_bitmap" android:id="@+id/rv_print_progress"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:scrollbars="vertical" android:layout_gravity="center"
android:scaleType="fitXY" /> android:orientation="vertical"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
</FrameLayout>
</androidx.core.widget.NestedScrollView> \ No newline at end of file
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout 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">
<FrameLayout
android:layout_gravity="center"
android:id="@+id/centerPopupContainer"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_30"
android:layout_marginRight="@dimen/dp_30"
android:background="@drawable/shape_white_eight_corners_bg" android:background="@drawable/shape_white_eight_corners_bg"
android:gravity="center" android:orientation="vertical">
android:orientation="vertical"
android:padding="@dimen/dp_10">
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_print_list" android:id="@+id/rv_print_list"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent"
android:layout_gravity="center"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
</LinearLayout> </FrameLayout>
\ No newline at end of file </FrameLayout>
...@@ -3,15 +3,16 @@ ...@@ -3,15 +3,16 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_20" android:orientation="horizontal"
android:layout_marginBottom="@dimen/dp_20" android:paddingLeft="@dimen/dp_10"
android:orientation="horizontal"> android:paddingTop="@dimen/dp_10"
android:paddingRight="@dimen/dp_10">
<TextView <TextView
android:id="@+id/tv_print_progressbar" android:id="@+id/tv_print_progressbar"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginRight="@dimen/dp_10" android:layout_marginRight="@dimen/dp_5"
android:textColor="@color/theme_333_color" android:textColor="@color/theme_333_color"
android:textSize="@dimen/dp_16" android:textSize="@dimen/dp_16"
tools:text="狀態:" /> tools:text="狀態:" />
......
...@@ -3,6 +3,9 @@ ...@@ -3,6 +3,9 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true"
android:foreground="?attr/selectableItemBackground"
android:orientation="vertical" android:orientation="vertical"
android:paddingTop="@dimen/dp_10" android:paddingTop="@dimen/dp_10"
android:paddingBottom="@dimen/dp_10"> android:paddingBottom="@dimen/dp_10">
...@@ -36,13 +39,13 @@ ...@@ -36,13 +39,13 @@
<TextView <TextView
android:id="@+id/tv_printer_port" android:id="@+id/tv_printer_port"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:visibility="gone"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_10" android:layout_marginLeft="@dimen/dp_10"
android:singleLine="true" android:singleLine="true"
android:text="端口號:" android:text="端口號:"
android:textColor="@color/normal_color" android:textColor="@color/normal_color"
android:textSize="@dimen/dp_14" android:textSize="@dimen/dp_14"
android:visibility="gone"
app:layout_constraintHorizontal_weight="0.5" app:layout_constraintHorizontal_weight="0.5"
app:layout_constraintLeft_toRightOf="@id/tv_printer_ip" app:layout_constraintLeft_toRightOf="@id/tv_printer_ip"
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
......
...@@ -295,6 +295,8 @@ public class NewSupplierPresenter extends BasePresenter<NewSupplierContract.Mode ...@@ -295,6 +295,8 @@ public class NewSupplierPresenter extends BasePresenter<NewSupplierContract.Mode
public void onNext(@NonNull BaseResult info) { public void onNext(@NonNull BaseResult info) {
if (info != null) { if (info != null) {
if (info.isSuccess()) { if (info.isSuccess()) {
//供應商信息修改後,將購物車食品信息刪除掉,不然食品信息中的採購金額和地址不對
SupplyShoppingCart.getInstance().removeFoodsBySupplier(supplierBean.getId());
mRootView.saveSuccess(); mRootView.saveSuccess();
} else if (TextUtil.isNotEmptyOrNullOrUndefined(info.getErrMsg())) { } else if (TextUtil.isNotEmptyOrNullOrUndefined(info.getErrMsg())) {
mRootView.showMessage(info.getErrMsg()); mRootView.showMessage(info.getErrMsg());
......
...@@ -102,10 +102,9 @@ public class WarehousingInventoryPresenter extends BasePresenter<WarehousingInve ...@@ -102,10 +102,9 @@ public class WarehousingInventoryPresenter extends BasePresenter<WarehousingInve
/** /**
* 查詢庫存盤點記錄 * 查詢庫存盤點記錄
*/ */
public void getWarehousingRecord(int pageIndex) { public void getWarehousingRecord(String foodNo, int pageIndex) {
Map<String, Object> map = new HashMap<>(4); Map<String, Object> map = new HashMap<>(3);
Constant.addRestaurantId(map); map.put("foodNo", foodNo);
Constant.addBrandId(map);
Constant.addPageSize(map); Constant.addPageSize(map);
map.put("pageIndex", pageIndex * Constant.PAGE_SIZE); map.put("pageIndex", pageIndex * Constant.PAGE_SIZE);
mModel.getWarehousingRecord(map) mModel.getWarehousingRecord(map)
...@@ -119,8 +118,7 @@ public class WarehousingInventoryPresenter extends BasePresenter<WarehousingInve ...@@ -119,8 +118,7 @@ public class WarehousingInventoryPresenter extends BasePresenter<WarehousingInve
@Override @Override
public void onNext(BaseResult baseResult) { public void onNext(BaseResult baseResult) {
if (baseResult != null && baseResult.isSuccess()) { if (baseResult != null && baseResult.isSuccess()) {
//消耗完之後,關閉頁面
mRootView.loadRecord();
} else if (baseResult != null && TextUtil.isNotEmptyOrNullOrUndefined(baseResult.getErrMsg())) { } else if (baseResult != null && TextUtil.isNotEmptyOrNullOrUndefined(baseResult.getErrMsg())) {
mRootView.showMessage(baseResult.getErrMsg()); mRootView.showMessage(baseResult.getErrMsg());
} else { } else {
......
package com.gingersoft.supply_chain.mvp.ui.activity; package com.gingersoft.supply_chain.mvp.ui.activity;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.Rect;
import android.os.Bundle; import android.os.Bundle;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText; import android.widget.EditText;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
...@@ -17,9 +20,11 @@ import com.gingersoft.supply_chain.mvp.contract.SupplyChainMainContract; ...@@ -17,9 +20,11 @@ import com.gingersoft.supply_chain.mvp.contract.SupplyChainMainContract;
import com.gingersoft.supply_chain.mvp.presenter.SupplyChainMainPresenter; import com.gingersoft.supply_chain.mvp.presenter.SupplyChainMainPresenter;
import com.gingersoft.supply_chain.mvp.ui.fragment.FunctionListFragment; import com.gingersoft.supply_chain.mvp.ui.fragment.FunctionListFragment;
import com.gingersoft.supply_chain.mvp.utils.HideUtil; import com.gingersoft.supply_chain.mvp.utils.HideUtil;
import com.gingersoft.supply_chain.mvp.utils.NotDispatchListener;
import com.jess.arms.base.BaseFragmentActivity; import com.jess.arms.base.BaseFragmentActivity;
import com.jess.arms.di.component.AppComponent; import com.jess.arms.di.component.AppComponent;
import com.jess.arms.utils.ArmsUtils; import com.jess.arms.utils.ArmsUtils;
import static com.jess.arms.utils.Preconditions.checkNotNull; import static com.jess.arms.utils.Preconditions.checkNotNull;
...@@ -49,6 +54,25 @@ public class SupplyChainMainActivity extends BaseFragmentActivity<SupplyChainMai ...@@ -49,6 +54,25 @@ public class SupplyChainMainActivity extends BaseFragmentActivity<SupplyChainMai
loadRootFragment(R.id.layout_supply_chain_content, FunctionListFragment.newInstance()); loadRootFragment(R.id.layout_supply_chain_content, FunctionListFragment.newInstance());
} }
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (getTopFragment() instanceof NotDispatchListener) {
return super.dispatchTouchEvent(event);
}
if (event.getAction() == MotionEvent.ACTION_DOWN) {
View v = getCurrentFocus();
if (v instanceof EditText) {
Rect outRect = new Rect();
v.getGlobalVisibleRect(outRect);
if (!outRect.contains((int) event.getRawX(), (int) event.getRawY())) {
v.clearFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
}
return super.dispatchTouchEvent(event);
}
// @Override // @Override
// public boolean dispatchTouchEvent(MotionEvent ev) { // public boolean dispatchTouchEvent(MotionEvent ev) {
// if (getTopFragment() instanceof NotDispatchListener) { // if (getTopFragment() instanceof NotDispatchListener) {
......
...@@ -13,6 +13,7 @@ import com.chad.library.adapter.base.viewholder.BaseViewHolder; ...@@ -13,6 +13,7 @@ import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.gingersoft.supply_chain.R; import com.gingersoft.supply_chain.R;
import com.gingersoft.supply_chain.mvp.bean.SendSupplierMsgBean; import com.gingersoft.supply_chain.mvp.bean.SendSupplierMsgBean;
import com.gingersoft.supply_chain.mvp.bean.SupplierInfoBean; import com.gingersoft.supply_chain.mvp.bean.SupplierInfoBean;
import com.gingersoft.supply_chain.mvp.utils.DoubleClickUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
...@@ -81,6 +82,9 @@ public class SendSupplierMsgAdapter extends BaseQuickAdapter<SendSupplierMsgBean ...@@ -81,6 +82,9 @@ public class SendSupplierMsgAdapter extends BaseQuickAdapter<SendSupplierMsgBean
viewHolder.setText(R.id.tv_item_pic_radio_title, SupplierInfoBean.SupplierContacts.getContractTitleByType(item.getType())); viewHolder.setText(R.id.tv_item_pic_radio_title, SupplierInfoBean.SupplierContacts.getContractTitleByType(item.getType()));
viewHolder.setImageResource(R.id.iv_item_pic_radio_pic, getContractPicByType(item.getType())); viewHolder.setImageResource(R.id.iv_item_pic_radio_pic, getContractPicByType(item.getType()));
radioButton.setOnCheckedChangeListener((buttonView, isChecked) -> { radioButton.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (DoubleClickUtils.isFastDoubleClick()) {
return;
}
if (isChecked) { if (isChecked) {
setSelectIndex(viewHolder.getAdapterPosition()); setSelectIndex(viewHolder.getAdapterPosition());
notifyDataSetChanged(); notifyDataSetChanged();
......
...@@ -332,7 +332,12 @@ public class FoodIngredientsFragment extends BaseSupplyChainFragment<FoodIngredi ...@@ -332,7 +332,12 @@ public class FoodIngredientsFragment extends BaseSupplyChainFragment<FoodIngredi
if (foodListAdapter != null) { if (foodListAdapter != null) {
mPresenter.getSelectFood(foodListAdapter.getIntegerMap()); mPresenter.getSelectFood(foodListAdapter.getIntegerMap());
} }
//需要先判斷是否有食品
if (SupplyShoppingCart.getInstance().getCartFoods().size() > 0) {
start(ShoppingCatFragment.newInstance()); start(ShoppingCatFragment.newInstance());
} else {
showMessage("請選擇食品");
}
} else if (viewId == R.id.btn_food_ingredients_cancel) { } else if (viewId == R.id.btn_food_ingredients_cancel) {
//取消 //取消
killMyself(); killMyself();
......
...@@ -81,7 +81,7 @@ public class PurchaseListFragment extends BaseSupplyChainFragment<PurchaseListPr ...@@ -81,7 +81,7 @@ public class PurchaseListFragment extends BaseSupplyChainFragment<PurchaseListPr
ScreenView screenView; ScreenView screenView;
@BindView(R2.id.view_load_bg) @BindView(R2.id.view_load_bg)
View loadBg; View loadBg;
// @BindView(R2.id.ed_food_ingredients_search) // @BindView(R2.id.ed_food_ingredients_search)
// EditText edSearch; // EditText edSearch;
@BindView(R2.id.srl_purchase_list) @BindView(R2.id.srl_purchase_list)
SmartRefreshLayout refreshPurchaseList; SmartRefreshLayout refreshPurchaseList;
...@@ -166,7 +166,16 @@ public class PurchaseListFragment extends BaseSupplyChainFragment<PurchaseListPr ...@@ -166,7 +166,16 @@ public class PurchaseListFragment extends BaseSupplyChainFragment<PurchaseListPr
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
mTopBar.addRightView(view, R.id.qmui_shopping_cart, layoutParams); mTopBar.addRightView(view, R.id.qmui_shopping_cart, layoutParams);
view.setOnClickListener(v -> start(ShoppingCatFragment.newInstance())); view.setOnClickListener(v -> {
//需要先判斷是否有食品
if (SupplyShoppingCart.getInstance().getCartFoods().size() > 0) {
start(ShoppingCatFragment.newInstance());
} else {
//跳轉到下單頁面
showMessage("請先選擇食品");
startForResult(FoodIngredientsFragment.newInstance(ADD_ORDER), REQUEST_ORDER_DETAILS_CODE);
}
});
} }
private void initTabAndData() { private void initTabAndData() {
......
...@@ -91,13 +91,13 @@ public class WarehousingInventoryFragment extends BaseSupplyChainFragment<Wareho ...@@ -91,13 +91,13 @@ public class WarehousingInventoryFragment extends BaseSupplyChainFragment<Wareho
public void initData(@Nullable Bundle savedInstanceState) { public void initData(@Nullable Bundle savedInstanceState) {
Bundle arguments = getArguments(); Bundle arguments = getArguments();
if (arguments != null) { if (arguments != null) {
//獲取庫存盤點記錄
getWarehousingRecord();
int foodId = arguments.getInt(WarehouseDetailsFragment.FOOD_ID_KEY); int foodId = arguments.getInt(WarehouseDetailsFragment.FOOD_ID_KEY);
//食品編號 //食品編號
foodNo = arguments.getString(WarehouseDetailsFragment.FOOD_NO_KEY); foodNo = arguments.getString(WarehouseDetailsFragment.FOOD_NO_KEY);
//食品庫存總數 //食品庫存總數
foodNum = arguments.getInt(WarehouseDetailsFragment.FOOD_NUM_KEY); foodNum = arguments.getInt(WarehouseDetailsFragment.FOOD_NUM_KEY);
//獲取庫存盤點記錄
getWarehousingRecord();
//加載食品圖片 //加載食品圖片
loadFoodImage(arguments); loadFoodImage(arguments);
//初始化標題 //初始化標題
...@@ -111,7 +111,7 @@ public class WarehousingInventoryFragment extends BaseSupplyChainFragment<Wareho ...@@ -111,7 +111,7 @@ public class WarehousingInventoryFragment extends BaseSupplyChainFragment<Wareho
} }
private void getWarehousingRecord() { private void getWarehousingRecord() {
mPresenter.getWarehousingRecord(pageIndex); mPresenter.getWarehousingRecord(foodNo, pageIndex);
} }
private void initEdit() { private void initEdit() {
......
package com.gingersoft.supply_chain.mvp.utils;
/**
* @author 宇航.
* User: admin
* Date: 2021/2/6
* Time: 17:21
* Use:
*/
public class DoubleClickUtils {
private static long lastClickTime = 0;
public static boolean isFastDoubleClick() {
long nowTime = System.currentTimeMillis();
if (nowTime - lastClickTime < 500) {//500ms
return true;
}
lastClickTime = nowTime;
return false;
}
}
/*
* Copyright 2016 yinglan
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.gingersoft.supply_chain.mvp.utils;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Rect;
import android.os.IBinder;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.AbsListView;
import android.widget.EditText;
import android.widget.ScrollView;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
/**
* Created by yinglan
*/
public class HideUtil {
/**
* Initialization method
*
* @param activity
*/
public static void init(Activity activity) {
new HideUtil(activity, null);
}
/**
* Can pass the outer layout
*
* @param activity
* @param content
*/
public static void init(Activity activity, ViewGroup content) {
new HideUtil(activity, content);
}
/**
* Forced hidden keyboard
*
* @param activity
*/
public static void hideSoftKeyboard(Activity activity) {
if (null == activity) {
throw new RuntimeException("参数错误");
}
View view = activity.getCurrentFocus();
if (null != view) {
InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
/**
* Forced hidden keyboard
*
* @param view
*/
public static void hideSoftKeyboard(View view) {
if (null != view) {
InputMethodManager inputMethodManager = (InputMethodManager) view.getContext().getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
} else {
throw new RuntimeException("参数错误");
}
}
/**
* Forced hidden keyboard
*
* @param dialog
*/
public static void hideDialogSoftKeyboard(Dialog dialog) {
if (null == dialog) {
throw new RuntimeException("参数错误");
}
View view = dialog.getCurrentFocus();
if (null != view) {
InputMethodManager inputMethodManager = (InputMethodManager) dialog.getContext().getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
/**
* @param activity
*/
private HideUtil(final Activity activity, ViewGroup content) {
if (content == null) {
content = (ViewGroup) activity.findViewById(android.R.id.content);
}
getScrollView(content, activity);
content.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
Log.e("eee", "出賣人");
dispatchTouchEvent(activity, motionEvent);
return false;
}
});
}
private void getScrollView(ViewGroup viewGroup, final Activity activity) {
if (null == viewGroup) {
return;
}
int count = viewGroup.getChildCount();
for (int i = 0; i < count; i++) {
View view = viewGroup.getChildAt(i);
if (view instanceof ScrollView) {
ScrollView newDtv = (ScrollView) view;
newDtv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
dispatchTouchEvent(activity, motionEvent);
return false;
}
});
} else if (view instanceof AbsListView) {
AbsListView newDtv = (AbsListView) view;
newDtv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
dispatchTouchEvent(activity, motionEvent);
return false;
}
});
} else if (view instanceof RecyclerView) {
RecyclerView newDtv = (RecyclerView) view;
newDtv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
dispatchTouchEvent(activity, motionEvent);
return false;
}
});
} else if (view instanceof ViewGroup) {
this.getScrollView((ViewGroup) view, activity);
}
if (view.isClickable() && view instanceof TextView && !(view instanceof EditText)) {
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
dispatchTouchEvent(activity, motionEvent);
return false;
}
});
}
}
}
/**
* @param mActivity
* @param ev
* @return
*/
public boolean dispatchTouchEvent(Activity mActivity, MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
View v = mActivity.getCurrentFocus();
if (null != v && isShouldHideInput(v, ev)) {
hideSoftInput(mActivity, v.getWindowToken());
}
}
return false;
}
/**
* @param v
* @param event
* @return
*/
private boolean isShouldHideInput(View v, MotionEvent event) {
if (v instanceof EditText) {
Rect rect = new Rect();
v.getHitRect(rect);
if (rect.contains((int) event.getX(), (int) event.getY())) {
return false;
}
}
return true;
}
/**
* @param mActivity
* @param token
*/
private void hideSoftInput(Activity mActivity, IBinder token) {
if (token != null) {
InputMethodManager im = (InputMethodManager) mActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
}
}
}
...@@ -135,12 +135,12 @@ public class PrintServingPaperAction extends TableAction { ...@@ -135,12 +135,12 @@ public class PrintServingPaperAction extends TableAction {
* 打印上菜紙 * 打印上菜紙
*/ */
private void printParper(TableBean.DataBean tableBean) { private void printParper(TableBean.DataBean tableBean) {
PrintContent printContent = new PrintContentAdapter().adaptationServingPaperContent(DoshokuOrder.getInstance(),tableBean); PrintContent printContent = new PrintContentAdapter().adaptationServingPaperContent(DoshokuOrder.getInstance(), tableBean);
CC.obtainBuilder(ComponentName.COMPONENT_PRINT) CC.obtainBuilder(ComponentName.COMPONENT_PRINT)
.setActionName("printActivity") .setActionName("printActivity")
.addParam(PrintConstans.PRINT_TYPE, PrintConstans.PRINT_SERVE) .addParam(PrintConstans.PRINT_TYPE, PrintConstans.PRINT_SERVE)
.addParam(PrintConstans.PRINT_CONTENT,printContent) .addParam(PrintConstans.PRINT_CONTENT, printContent)
.addParam(PrintConstans.PRINT_ORDER_NO,tableBean.getOrderId()) .addParam(PrintConstans.PRINT_ORDER_NO, String.valueOf(tableBean.getOrderId()))
.build() .build()
.callAsyncCallbackOnMainThread((cc, result) -> { .callAsyncCallbackOnMainThread((cc, result) -> {
//清空賬單數據 //清空賬單數據
......
...@@ -848,6 +848,12 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod ...@@ -848,6 +848,12 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod
}); });
} }
/**
* 點餐送單
*
* @param isPrint
* @param afterToActivity
*/
@Override @Override
public void addOrderFood(boolean isPrint, Class<?> afterToActivity) { public void addOrderFood(boolean isPrint, Class<?> afterToActivity) {
List<OrderDetail> foodLists = getOrderFoodLists(); List<OrderDetail> foodLists = getOrderFoodLists();
...@@ -894,8 +900,13 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod ...@@ -894,8 +900,13 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod
//合并主食品 //合并主食品
mergeMainFoodNumber(mOrderMealList); mergeMainFoodNumber(mOrderMealList);
} }
//餐檯送單
PrintContent printContent = new PrintContentAdapter().adaptationServingPaperContent(DoshokuOrder.getInstance(), mTableInfo); if (DoshokuOrder.getInstance().getNewFoodList() == null || DoshokuOrder.getInstance().getNewFoodList().size() <= 0) {
//沒有新的食品時,不打印送單
IActivity.returnBeforeActivity(initTable);
return;
}
PrintContent printContent = new PrintContentAdapter().adaptationSendOrderPaperContent(DoshokuOrder.getInstance(), mTableInfo);
CC.obtainBuilder(ComponentName.COMPONENT_PRINT) CC.obtainBuilder(ComponentName.COMPONENT_PRINT)
.setActionName("printActivity") .setActionName("printActivity")
......
...@@ -388,8 +388,17 @@ public class OrderContentPresenter extends BaseOrderPresenter<OrderContentContra ...@@ -388,8 +388,17 @@ public class OrderContentPresenter extends BaseOrderPresenter<OrderContentContra
//合并主食品 //合并主食品
mergeMainFoodNumber(mOrderMealList); mergeMainFoodNumber(mOrderMealList);
} }
//賬單內容送單
PrintContent printContent = new PrintContentAdapter().adaptationServingPaperContent(DoshokuOrder.getInstance(), mTableInfo); if (DoshokuOrder.getInstance().getNewFoodList() == null || DoshokuOrder.getInstance().getNewFoodList().size() <= 0) {
//沒有新的食品時,不打印送單
if (afterToActivity == null) {
mRootView.sendSuccess();
mAppManager.killActivity(MealStandActivity.class);
}
return;
}
//賬單內容送單
PrintContent printContent = new PrintContentAdapter().adaptationSendOrderPaperContent(DoshokuOrder.getInstance(), mTableInfo);
CC.obtainBuilder(ComponentName.COMPONENT_PRINT) CC.obtainBuilder(ComponentName.COMPONENT_PRINT)
.setActionName("printActivity") .setActionName("printActivity")
......
...@@ -7,8 +7,8 @@ ext { ...@@ -7,8 +7,8 @@ ext {
targetSdkVersion : 29, targetSdkVersion : 29,
//正式版: 1.0.3 3 //正式版: 1.0.3 3
//內部測試版:1.2.0 20 //內部測試版:1.2.0 20
versionCode : 23, versionCode : 24,
versionName : "1.2.3" versionName : "1.2.4"
] ]
version = [ version = [
......
...@@ -358,12 +358,12 @@ public class GsaCloudApplication extends BaseApplication { ...@@ -358,12 +358,12 @@ public class GsaCloudApplication extends BaseApplication {
} }
@Override @Override
public void onPrintSuccess(PrinterDeviceBean printerDeviceBean) { public void onPrintSuccess() {
LoganManager.w_printer(TAG, "打印成功"); LoganManager.w_printer(TAG, "打印成功");
} }
@Override @Override
public void onPrintError(int errorCode, PrinterDeviceBean printerDeviceBean) { public void onPrintError(int errorCode) {
LoganManager.w_printer(TAG, "打印失敗:" + errorCode); LoganManager.w_printer(TAG, "打印失敗:" + errorCode);
} }
......
...@@ -23,7 +23,6 @@ public class PrintConstans { ...@@ -23,7 +23,6 @@ public class PrintConstans {
public static final String PRINT_TYPE = "print_type";//打印類型 public static final String PRINT_TYPE = "print_type";//打印類型
public static final String PRINT_CONTENT = "print_content";//打印內容 public static final String PRINT_CONTENT = "print_content";//打印內容
public static final String PRINT_ORDER_NO = "print_order_no";//打印ID(唯一标识即可) public static final String PRINT_ORDER_NO = "print_order_no";//打印ID(唯一标识即可)
public static final String PRINT_LOADING = "is_show_loading";//是否顯示加載框
public final static int PRINT_TEST = -1;//測試頁 public final static int PRINT_TEST = -1;//測試頁
public final static int PRINT_SERVE = 0;//上菜紙 public final static int PRINT_SERVE = 0;//上菜紙
......
...@@ -69,6 +69,8 @@ public class LoganManager { ...@@ -69,6 +69,8 @@ public class LoganManager {
private static final String TABLEMODE_BUSINESS_TAG = "tableMode-> "; private static final String TABLEMODE_BUSINESS_TAG = "tableMode-> ";
private static final String ORDER_BUSINESS_TAG = "order-> "; private static final String ORDER_BUSINESS_TAG = "order-> ";
private static final String PAY_BUSINESS_TAG = "pay-> "; private static final String PAY_BUSINESS_TAG = "pay-> ";
private static final String DELIVERY_PICK_TAG = "delivery-> ";
/*******************************交互事件類型**************************************/ /*******************************交互事件類型**************************************/
public static final String EVENT_CLICK = "點擊->"; public static final String EVENT_CLICK = "點擊->";
...@@ -115,6 +117,9 @@ public class LoganManager { ...@@ -115,6 +117,9 @@ public class LoganManager {
w_business(PAY_BUSINESS_TAG, TAG, eventAndLog); w_business(PAY_BUSINESS_TAG, TAG, eventAndLog);
} }
public static void w_delivery(String TAG, String... eventAndLog) {
w_business(DELIVERY_PICK_TAG, TAG, eventAndLog);
}
private static void w_business(String BUSINESS_TAG, String TAG, String... eventAndLog) { private static void w_business(String BUSINESS_TAG, String TAG, String... eventAndLog) {
if (eventAndLog != null) { if (eventAndLog != null) {
if (eventAndLog.length > 1) { if (eventAndLog.length > 1) {
......
...@@ -19,7 +19,7 @@ public interface PrinterFlowListener extends ExternalPrinterConnection { ...@@ -19,7 +19,7 @@ public interface PrinterFlowListener extends ExternalPrinterConnection {
void onPrinterBitmapBefore(int orderType, int printType, String directoryName, List<Bitmap> bitmaps); void onPrinterBitmapBefore(int orderType, int printType, String directoryName, List<Bitmap> bitmaps);
void onPrintSuccess(PrinterDeviceBean printerDeviceBean); void onPrintSuccess();
void onPrintError(int errorCode, PrinterDeviceBean printerDeviceBean); void onPrintError(int errorCode);
} }
...@@ -22,4 +22,8 @@ public interface PrintDataMaker { ...@@ -22,4 +22,8 @@ public interface PrintDataMaker {
List<byte[]> getPrintData(); List<byte[]> getPrintData();
String getPrjIds(); String getPrjIds();
String getIp();
int getPort();
} }
/*
* Copyright (C) 2015 AlexMofer
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.gingersoft.gsa.cloud.print; package com.gingersoft.gsa.cloud.print;
import android.bluetooth.BluetoothDevice;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.util.Log;
import com.elvishew.xlog.XLog;
import com.gingersoft.gsa.cloud.common.logan.LoganManager; import com.gingersoft.gsa.cloud.common.logan.LoganManager;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean; import com.xuexiang.rxutil2.rxjava.RxJavaUtils;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import io.reactivex.disposables.Disposable;
/** /**
* 打印执行者 * 打印执行者
* Created by Alex on 2016/11/10. *
* @author admin
*/ */
public class PrintExecutor { public class PrintExecutor {
protected final String TAG = this.getClass().getSimpleName(); protected final String TAG = this.getClass().getSimpleName();
private PrintSocketHolder holder; private PrintSocketHolder holder;
private int mReconnectTimes = 0; /**
private int time = 0; * 存儲所有prj的id集合
*/
private String prjIds; private String prjIds;
private PrintSocketHolder.OnStateChangedListener listener; private PrintSocketHolder.OnStateChangedListener listener;
private OnPrintResultListener mListener; private OnPrintResultListener mListener;
private OnPrjPrintResultListener onPrjPrintResultListener; private OnPrjPrintResultListener onPrjPrintResultListener;
public PrintExecutor(BluetoothDevice device) { public PrintExecutor() {
holder = new PrintSocketHolder(device); holder = PrintSocketHolder.getInstance();
} holder.closeSocket();
printDataMakers = new ArrayList<>();
public PrintExecutor(PrinterDeviceBean printerDeviceBean) {
holder = new PrintSocketHolder(printerDeviceBean);
}
public void setPrinterDeviceBean(PrinterDeviceBean printerDeviceBean) {
if (holder != null) {
holder.setPrinterDeviceBean(printerDeviceBean);
}
} }
/** /**
* 执行打印请求 * 需要執行的任務隊列
*
* @return 错误代码
*/ */
private int doRequest(PrintDataMaker maker) { List<PrintDataMaker> printDataMakers;
if (mReconnectTimes == 0) {
holder.onPrinterStateChanged(PrintSocketHolder.STATE_0);
List<byte[]> data = maker.getPrintData();
prjIds = maker.getPrjIds();
if (!holder.isSocketPrepared()) {
int prepare = holder.prepareSocket();
if (prepare != PrintSocketHolder.ERROR_0) {
return prepare;
}
}
return holder.sendData(data);
} else {
holder.onPrinterStateChanged(PrintSocketHolder.STATE_0);
List<byte[]> data = maker.getPrintData();
prjIds = maker.getPrjIds();
if (holder.isSocketPrepared()) {
if (sendData(data)) {
return PrintSocketHolder.ERROR_0;
} else {
return PrintSocketHolder.ERROR_100;
}
} else {
if (prepareSocket() && sendData(data)) {
return PrintSocketHolder.ERROR_0;
} else {
return PrintSocketHolder.ERROR_100;
}
}
}
}
/** /**
* 执行打印请求 * 重啟打印的服務
*
* @return 错误代码
*/ */
public int doPrinterRequest(PrintDataMaker maker) { private Disposable resetPrintDis;
holder.setOnStateChangedListener(listener);
return doRequest(maker);
}
private boolean prepareSocket() {
time++;
boolean prepareSocket = time < mReconnectTimes &&
(holder.prepareSocket() == PrintSocketHolder.ERROR_0 || prepareSocket());
return prepareSocket;
}
private boolean sendData(List<byte[]> data) {
if (holder.sendData(data) == PrintSocketHolder.ERROR_0) {
time = 0;
return true;
} else {
return prepareSocket() && sendData(data);
}
}
/** /**
* 异步执行打印请求 * 异步执行打印请求
*/ */
public void doPrinterRequestAsync(PrintDataMaker maker) { public void doPrinterRequestAsync(PrintDataMaker maker) {
if (printDataMakers.size() <= 0) {
printDataMakers.add(maker);
new PrintTask().execute(maker); new PrintTask().execute(maker);
} else {
//如果隊列裡有任務在執行,只添加進去,等待執行完成之後,再來執行這個
printDataMakers.add(maker);
startReset();
} }
/**
* 销毁
*/
public int closeSocket() {
return holder.closeSocket();
}
/**
* 设置IP及端口
*/
public void setIp(PrinterDeviceBean printerDeviceBean) {
holder.setIp(printerDeviceBean);
}
/**
* 设置蓝牙
*
* @param device 设备
*/
public void setDevice(BluetoothDevice device) {
holder.setDevice(device);
} }
/** private void startReset() {
* 设置状态监听 resetPrintDis = RxJavaUtils.delay(10, aLong -> {
* //如果十秒之後,任務還沒在打印完成方法中取消,可能打印程序卡住了,在這裡執行下一個任務
* @param listener 监听 if (printDataMakers.size() > 0) {
*/ new PrintTask().execute(printDataMakers.get(0));
public void setOnStateChangedListener(PrintSocketHolder.OnStateChangedListener listener) {
this.listener = listener;
} }
});
/**
* 设置重连次数
*
* @param times 次数
*/
public void setReconnectTimes(int times) {
mReconnectTimes = times;
} }
/** /**
* 设置结果回调 * 执行打印请求
* *
* @param listener 回调 * @return 错误代码
*/ */
public void setOnPrintResultListener(OnPrintResultListener listener) { private int doRequest(PrintDataMaker maker) {
this.mListener = listener; //通知狀態
holder.onPrinterStateChanged(PrintSocketHolder.STATE_0);
//獲取打印數據
List<byte[]> data = maker.getPrintData();
//如果是打印prj,需要獲取prj的id
prjIds = maker.getPrjIds();
//判斷是否連接,如果未連接就先連接
int prepare = holder.prepareSocket(maker.getIp(), maker.getPort());
if (prepare != PrintSocketHolder.ERROR_0) {
return prepare;
} }
return holder.sendData(data);
public interface OnPrintResultListener {
void onResult(int errorCode, PrinterDeviceBean printerDeviceBean);
} }
/** /**
* PRJ打印結果回調 * 打印任務
*/ */
public interface OnPrjPrintResultListener {
void onResult(int errorCode, String ids);
}
public void setOnPrjPrintResultListener(OnPrjPrintResultListener onPrjPrintResultListener) {
this.onPrjPrintResultListener = onPrjPrintResultListener;
}
private class PrintTask extends AsyncTask<PrintDataMaker, Integer, Integer> implements private class PrintTask extends AsyncTask<PrintDataMaker, Integer, Integer> implements
PrintSocketHolder.OnStateChangedListener { PrintSocketHolder.OnStateChangedListener {
@Override @Override
protected void onPreExecute() { protected void onPreExecute() {
super.onPreExecute(); super.onPreExecute();
Log.e("eee", "任務數量:" + printDataMakers.size());
holder.setOnStateChangedListener(this); holder.setOnStateChangedListener(this);
} }
@Override @Override
protected Integer doInBackground(PrintDataMaker... makers) { protected Integer doInBackground(PrintDataMaker... makers) {
holder.closeSocket();
if (makers == null || makers.length < 1) { if (makers == null || makers.length < 1) {
return PrintSocketHolder.ERROR_0; return PrintSocketHolder.ERROR_0;
} }
...@@ -212,13 +114,27 @@ public class PrintExecutor { ...@@ -212,13 +114,27 @@ public class PrintExecutor {
return; return;
} }
if (listener != null) { if (listener != null) {
listener.onStateChanged(values[0], holder.getPrinterDeviceBean()); listener.onStateChanged(values[0]);
} }
} }
@Override @Override
protected void onPostExecute(Integer integer) { protected void onPostExecute(Integer integer) {
super.onPostExecute(integer); super.onPostExecute(integer);
if (resetPrintDis != null) {
resetPrintDis.dispose();
}
//移除掉當前任務
if (printDataMakers.size() > 0) {
printDataMakers.remove(0);
}
//執行下一個任務
if (printDataMakers.size() > 0) {
new PrintTask().execute(printDataMakers.get(0));
startReset();
}
Log.e("eee", "完成後任務數量:" + printDataMakers.size());
//返回結果
if (integer != null) { if (integer != null) {
onResult(integer); onResult(integer);
} }
...@@ -232,7 +148,7 @@ public class PrintExecutor { ...@@ -232,7 +148,7 @@ public class PrintExecutor {
private void onResult(int errorCode) { private void onResult(int errorCode) {
try { try {
if (mListener != null) { if (mListener != null) {
mListener.onResult(errorCode, holder.getPrinterDeviceBean()); mListener.onResult(errorCode);
} }
if (onPrjPrintResultListener != null) { if (onPrjPrintResultListener != null) {
onPrjPrintResultListener.onResult(errorCode, prjIds); onPrjPrintResultListener.onResult(errorCode, prjIds);
...@@ -243,26 +159,66 @@ public class PrintExecutor { ...@@ -243,26 +159,66 @@ public class PrintExecutor {
} }
@Override @Override
public void onStateChanged(int state, PrinterDeviceBean printerDeviceBean) { public void onStateChanged(int state) {
switch (state) { switch (state) {
case PrintSocketHolder.STATE_0: case PrintSocketHolder.STATE_0:
LoganManager.w_printer(TAG, "打印機狀態 --> 生成页面数据" ); LoganManager.w_printer(TAG, "打印機狀態 --> 生成页面数据");
break; break;
case PrintSocketHolder.STATE_1: case PrintSocketHolder.STATE_1:
LoganManager.w_printer(TAG, "打印機狀態 --> 创建Socket连接" ); LoganManager.w_printer(TAG, "打印機狀態 --> 创建Socket连接");
break; break;
case PrintSocketHolder.STATE_2: case PrintSocketHolder.STATE_2:
LoganManager.w_printer(TAG, "打印機狀態 --> 获取输出流" ); LoganManager.w_printer(TAG, "打印機狀態 --> 获取输出流");
break; break;
case PrintSocketHolder.STATE_3: case PrintSocketHolder.STATE_3:
LoganManager.w_printer(TAG, "打印機狀態 --> 写入页面数据" ); LoganManager.w_printer(TAG, "打印機狀態 --> 写入页面数据");
break; break;
case PrintSocketHolder.STATE_4: case PrintSocketHolder.STATE_4:
LoganManager.w_printer(TAG, "打印機狀態 --> 关闭输出流" ); LoganManager.w_printer(TAG, "打印機狀態 --> 关闭输出流");
break;
default:
break; break;
} }
publishProgress(state); publishProgress(state);
} }
} }
/**
* 设置状态监听
*
* @param listener 监听
*/
public PrintExecutor setOnStateChangedListener(PrintSocketHolder.OnStateChangedListener listener) {
this.listener = listener;
return this;
}
/**
* 设置结果回调
*
* @param listener 回调
*/
public PrintExecutor setOnPrintResultListener(OnPrintResultListener listener) {
this.mListener = listener;
return this;
}
/**
* 打印結果回調
*/
public interface OnPrintResultListener {
void onResult(int errorCode);
}
public interface OnPrjPrintResultListener {
/**
* PRJ打印結果回調,prj service用
*/
void onResult(int errorCode, String ids);
}
public PrintExecutor setOnPrjPrintResultListener(OnPrjPrintResultListener onPrjPrintResultListener) {
this.onPrjPrintResultListener = onPrjPrintResultListener;
return this;
}
} }
/*
* Copyright (C) 2015 AlexMofer
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.gingersoft.gsa.cloud.print; package com.gingersoft.gsa.cloud.print;
import android.bluetooth.BluetoothDevice; import android.util.Log;
import android.bluetooth.BluetoothSocket;
import com.gingersoft.gsa.cloud.common.constans.PrintConstans; import com.gingersoft.gsa.cloud.common.constans.PrintConstans;
import com.gingersoft.gsa.cloud.common.logan.LoganManager; import com.gingersoft.gsa.cloud.common.logan.LoganManager;
import com.gingersoft.gsa.cloud.common.printer.plugins.PrinterPlugins; import com.gingersoft.gsa.cloud.common.printer.plugins.PrinterPlugins;
import com.gingersoft.gsa.cloud.common.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean; import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.scwang.smartrefresh.layout.listener.OnStateChangedListener;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.Socket; import java.net.Socket;
import java.util.List; import java.util.List;
import java.util.UUID;
/** /**
* 打印Socket * 打印Socket
* Created by Alex on 2016/11/10.
*/ */
@SuppressWarnings({"WeakerAccess", "unused"})
public class PrintSocketHolder { public class PrintSocketHolder {
private final static PrintSocketHolder printSocketHolder = new PrintSocketHolder();
public static PrintSocketHolder getInstance() {
synchronized (printSocketHolder) {
return printSocketHolder;
}
}
protected final String TAG = this.getClass().getSimpleName(); protected final String TAG = this.getClass().getSimpleName();
public static final int STATE_0 = 10;// 生成测试页面数据 public static final int STATE_0 = 10;// 生成测试页面数据
...@@ -53,41 +45,25 @@ public class PrintSocketHolder { ...@@ -53,41 +45,25 @@ public class PrintSocketHolder {
public static final int ERROR_6 = -6;// 关闭Socket出错 public static final int ERROR_6 = -6;// 关闭Socket出错
public static final int ERROR_100 = -100;// 失败 public static final int ERROR_100 = -100;// 失败
private static final UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");//蓝牙打印UUID
// private String ip;
// private int port = 9100;
private PrinterDeviceBean printerDeviceBean;
private BluetoothDevice mDevice;
private Socket socket; private Socket socket;
private BluetoothSocket bluetoothSocket;
private OutputStream out; private OutputStream out;
private WeakReference<OnStateChangedListener> mListener; private WeakReference<OnStateChangedListener> mListener;
private PrintSocketHolder() {
public PrintSocketHolder(BluetoothDevice device) {
setDevice(device);
}
public PrintSocketHolder(PrinterDeviceBean printerDeviceBean) {
setIp(printerDeviceBean);
} }
public int createSocket() { public int createSocket(String ip, int port) {
onPrinterStateChanged(STATE_1); onPrinterStateChanged(STATE_1);
if (mDevice == null && (printerDeviceBean == null || printerDeviceBean.getIp() == null)) if (TextUtil.isEmptyOrNullOrUndefined(ip)) {
return ERROR_5; return ERROR_5;
}
try { try {
if (mDevice != null) { PrinterPlugins.getOnPrinterFlowHandler().connectionBefore("網絡打印機", ip, port, PrintConstans.SO_TIMEOUT, PrintConstans.PRINT_TIMEOUT);
PrinterPlugins.getOnPrinterFlowHandler().connectionBefore("藍牙打印機", printerDeviceBean.getIp(), printerDeviceBean.getPort(), 0, 0);
bluetoothSocket = mDevice.createRfcommSocketToServiceRecord(uuid);
bluetoothSocket.connect();
} else {
PrinterPlugins.getOnPrinterFlowHandler().connectionBefore("網絡打印機", printerDeviceBean.getIp(), printerDeviceBean.getPort(), PrintConstans.SO_TIMEOUT, PrintConstans.PRINT_TIMEOUT);
socket = new Socket(); socket = new Socket();
InetSocketAddress socketAddress = new InetSocketAddress(printerDeviceBean.getIp(), printerDeviceBean.getPort()); //建立連接
InetSocketAddress socketAddress = new InetSocketAddress(ip, port);
//设置超时时间 //设置超时时间
socket.setSoTimeout(PrintConstans.SO_TIMEOUT); socket.setSoTimeout(PrintConstans.SO_TIMEOUT);
socket.connect(socketAddress, PrintConstans.PRINT_TIMEOUT);//开始连接ip socket.connect(socketAddress, PrintConstans.PRINT_TIMEOUT);//开始连接ip
}
} catch (Exception e) { } catch (Exception e) {
closeSocket(); closeSocket();
e.printStackTrace(); e.printStackTrace();
...@@ -99,11 +75,7 @@ public class PrintSocketHolder { ...@@ -99,11 +75,7 @@ public class PrintSocketHolder {
public int getOutputStream() { public int getOutputStream() {
onPrinterStateChanged(STATE_2); onPrinterStateChanged(STATE_2);
try { try {
if (mDevice != null) {
out = bluetoothSocket.getOutputStream();
} else {
out = socket.getOutputStream(); out = socket.getOutputStream();
}
} catch (IOException e) { } catch (IOException e) {
closeSocket(); closeSocket();
return ERROR_3; return ERROR_3;
...@@ -111,11 +83,19 @@ public class PrintSocketHolder { ...@@ -111,11 +83,19 @@ public class PrintSocketHolder {
return ERROR_0; return ERROR_0;
} }
/**
* 是否連接
*/
public boolean isSocketPrepared() { public boolean isSocketPrepared() {
boolean isPrepared = (bluetoothSocket != null || socket != null) && out != null; return socket != null && out != null;
return isPrepared;
} }
/**
* 發送數據
*
* @param data 需要發送的數據
* @return 發送狀態:是否成功
*/
public int sendData(List<byte[]> data) { public int sendData(List<byte[]> data) {
onPrinterStateChanged(STATE_3); onPrinterStateChanged(STATE_3);
if (data == null || data.size() <= 0) { if (data == null || data.size() <= 0) {
...@@ -125,7 +105,7 @@ public class PrintSocketHolder { ...@@ -125,7 +105,7 @@ public class PrintSocketHolder {
try { try {
out.write(item); out.write(item);
out.flush(); out.flush();
} catch (IOException e) { } catch (IOException | NullPointerException e) {
LoganManager.w_printer(TAG, "打印异常: " + e.getMessage()); LoganManager.w_printer(TAG, "打印异常: " + e.getMessage());
closeSocket(); closeSocket();
return ERROR_4; return ERROR_4;
...@@ -135,38 +115,15 @@ public class PrintSocketHolder { ...@@ -135,38 +115,15 @@ public class PrintSocketHolder {
return ERROR_0; return ERROR_0;
} }
public int sendData(byte[] data) { public int prepareSocket(String ip, int port) {
onPrinterStateChanged(STATE_3); LoganManager.w_printer(TAG, "准备尝试连接打印机" + ip + ":" + port);
try { //創建連接
out.write(data); int create = createSocket(ip, port);
out.flush(); //判斷連接狀態
} catch (IOException e) {
closeSocket();
return ERROR_4;
}
return ERROR_0;
}
public int sendData(byte[]... data) {
onPrinterStateChanged(STATE_3);
for (byte[] item : data) {
try {
out.write(item);
out.flush();
} catch (IOException e) {
closeSocket();
return ERROR_4;
}
}
return ERROR_0;
}
public int prepareSocket() {
LoganManager.w_printer(TAG, "准备尝试连接打印机");
int create = createSocket();
if (create != PrintSocketHolder.ERROR_0) { if (create != PrintSocketHolder.ERROR_0) {
return create; return create;
} }
//獲取打印機寫入
int result = getOutputStream(); int result = getOutputStream();
if (result == ERROR_0) { if (result == ERROR_0) {
PrinterPlugins.getOnPrinterFlowHandler().connectionSuccess(); PrinterPlugins.getOnPrinterFlowHandler().connectionSuccess();
...@@ -180,13 +137,13 @@ public class PrintSocketHolder { ...@@ -180,13 +137,13 @@ public class PrintSocketHolder {
* 销毁 * 销毁
*/ */
public int closeSocket() { public int closeSocket() {
LoganManager.w_printer(TAG, "準備关闭打印机连接");
onPrinterStateChanged(STATE_4); onPrinterStateChanged(STATE_4);
boolean error = false; boolean error = false;
try { try {
if (out != null) { if (out != null) {
out.close(); out.close();
out = null; out = null;
LoganManager.w_printer(TAG, "关闭打印机輸出连接");
} }
} catch (IOException e) { } catch (IOException e) {
LoganManager.w_printer(TAG, "关闭打印机连接异常"); LoganManager.w_printer(TAG, "关闭打印机连接异常");
...@@ -197,22 +154,13 @@ public class PrintSocketHolder { ...@@ -197,22 +154,13 @@ public class PrintSocketHolder {
if (socket != null) { if (socket != null) {
socket.close(); socket.close();
socket = null; socket = null;
LoganManager.w_printer(TAG, "关闭打印机socket连接");
} }
} catch (IOException e) { } catch (IOException e) {
LoganManager.w_printer(TAG, "关闭打印机连接异常"); LoganManager.w_printer(TAG, "关闭打印机连接异常");
socket = null; socket = null;
error = true; error = true;
} }
try {
if (bluetoothSocket != null) {
bluetoothSocket.close();
bluetoothSocket = null;
}
} catch (IOException e) {
LoganManager.w_printer(TAG, "关闭打印机连接异常");
bluetoothSocket = null;
error = true;
}
PrinterPlugins.getOnPrinterFlowHandler().disconnect(); PrinterPlugins.getOnPrinterFlowHandler().disconnect();
return error ? ERROR_6 : ERROR_0; return error ? ERROR_6 : ERROR_0;
} }
...@@ -224,46 +172,15 @@ public class PrintSocketHolder { ...@@ -224,46 +172,15 @@ public class PrintSocketHolder {
*/ */
public void onPrinterStateChanged(int state) { public void onPrinterStateChanged(int state) {
try { try {
if (mListener != null && mListener.get() != null) if (mListener != null && mListener.get() != null) {
mListener.get().onStateChanged(state, printerDeviceBean); mListener.get().onStateChanged(state);
}
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
/** /**
* 设置IP及端口
*/
public void setIp(PrinterDeviceBean printerDeviceBean) {
this.printerDeviceBean = printerDeviceBean;
}
// public String getIp() {
// return ip;
// }
//
// public int getPort() {
// return port;
// }
public PrinterDeviceBean getPrinterDeviceBean() {
return printerDeviceBean;
}
public void setPrinterDeviceBean(PrinterDeviceBean printerDeviceBean) {
this.printerDeviceBean = printerDeviceBean;
}
/**
* 设置蓝牙
*
* @param device 设备
*/
public void setDevice(BluetoothDevice device) {
this.mDevice = device;
}
/**
* 设置状态监听 * 设置状态监听
* *
* @param listener 监听 * @param listener 监听
...@@ -273,6 +190,6 @@ public class PrintSocketHolder { ...@@ -273,6 +190,6 @@ public class PrintSocketHolder {
} }
public interface OnStateChangedListener { public interface OnStateChangedListener {
void onStateChanged(int state, PrinterDeviceBean printerDeviceBean); void onStateChanged(int state);
} }
} }
...@@ -24,6 +24,8 @@ public interface AdaptationContent { ...@@ -24,6 +24,8 @@ public interface AdaptationContent {
PrintContent adaptationPrintSlipContent(DoshokuOrder doshokuOrder, TableBean.DataBean tableBean); PrintContent adaptationPrintSlipContent(DoshokuOrder doshokuOrder, TableBean.DataBean tableBean);
PrintContent adaptationSendOrderPaperContent(DoshokuOrder doshokuOrder, TableBean.DataBean tableBean);
PrintContent adaptationServingPaperContent(DoshokuOrder doshokuOrder, TableBean.DataBean tableBean); PrintContent adaptationServingPaperContent(DoshokuOrder doshokuOrder, TableBean.DataBean tableBean);
PrintContent adaptationBillContent(DoshokuOrder doshokuOrder, TableBean.DataBean tableBean); PrintContent adaptationBillContent(DoshokuOrder doshokuOrder, TableBean.DataBean tableBean);
......
...@@ -55,6 +55,11 @@ public class PrintContentAdapter implements AdaptationContent { ...@@ -55,6 +55,11 @@ public class PrintContentAdapter implements AdaptationContent {
return getPrintTakeawayFormContent(data, 2); return getPrintTakeawayFormContent(data, 2);
} }
/**
* 清機打印
* @param settlementReport
* @return
*/
@Override @Override
public PrintContent adaptationPrintCleanMachineContent(SettlementReport settlementReport) { public PrintContent adaptationPrintCleanMachineContent(SettlementReport settlementReport) {
PrintCleanMachineContent cleanMachineContent = new PrintCleanMachineContent(); PrintCleanMachineContent cleanMachineContent = new PrintCleanMachineContent();
...@@ -68,6 +73,12 @@ public class PrintContentAdapter implements AdaptationContent { ...@@ -68,6 +73,12 @@ public class PrintContentAdapter implements AdaptationContent {
return cleanMachineContent; return cleanMachineContent;
} }
/**
* 印單
* @param doshokuOrder
* @param tableBean
* @return
*/
@Override @Override
public PrintContent adaptationPrintSlipContent(DoshokuOrder doshokuOrder, TableBean.DataBean tableBean) { public PrintContent adaptationPrintSlipContent(DoshokuOrder doshokuOrder, TableBean.DataBean tableBean) {
PrintSlipContent slipContent = new PrintSlipContent(); PrintSlipContent slipContent = new PrintSlipContent();
...@@ -77,15 +88,23 @@ public class PrintContentAdapter implements AdaptationContent { ...@@ -77,15 +88,23 @@ public class PrintContentAdapter implements AdaptationContent {
slipContent.setPerson(tableBean.getPerson()); slipContent.setPerson(tableBean.getPerson());
slipContent.setCreateTime(tableBean.getCreateTime()); slipContent.setCreateTime(tableBean.getCreateTime());
slipContent.setOrderNo(doshokuOrder.getOrderNo()); slipContent.setOrderNo(doshokuOrder.getOrderNo());
slipContent.setFoodItemList(orderDetailItemCastPrintFoodItemList(doshokuOrder.getNewFoodList())); // slipContent.setFoodItemList(orderDetailItemCastPrintFoodItemList(doshokuOrder.getNewFoodList()));
slipContent.setFoodItemList(orderDetailItemCastPrintFoodItemList(doshokuOrder.getShoppingCart().getOrderCommodityList()));
slipContent.setBillItemList(billItemCastPrintBillItemList(doshokuOrder.getShoppingCart().getBillItemList())); slipContent.setBillItemList(billItemCastPrintBillItemList(doshokuOrder.getShoppingCart().getBillItemList()));
slipContent.setWholeAmount(doshokuOrder.getShoppingCart().getWholeAmount()); slipContent.setWholeAmount(doshokuOrder.getShoppingCart().getWholeAmount());
slipContent.setTotalAmount(doshokuOrder.getShoppingCart().getTotalAmount());
slipContent.setPoliteLanguage("歡迎光臨!"); slipContent.setPoliteLanguage("歡迎光臨!");
return slipContent; return slipContent;
} }
/**
* 送單
* @param doshokuOrder
* @param tableBean
* @return
*/
@Override @Override
public PrintContent adaptationServingPaperContent(DoshokuOrder doshokuOrder, TableBean.DataBean tableBean) { public PrintContent adaptationSendOrderPaperContent(DoshokuOrder doshokuOrder, TableBean.DataBean tableBean) {
PrintServingPaperContent servingPaperContent = new PrintServingPaperContent(); PrintServingPaperContent servingPaperContent = new PrintServingPaperContent();
servingPaperContent.setBrand(RestaurantInfoManager.newInstance().getBrandName()); servingPaperContent.setBrand(RestaurantInfoManager.newInstance().getBrandName());
servingPaperContent.setResturantName(RestaurantInfoManager.newInstance().getRestaurantName()); servingPaperContent.setResturantName(RestaurantInfoManager.newInstance().getRestaurantName());
...@@ -93,11 +112,39 @@ public class PrintContentAdapter implements AdaptationContent { ...@@ -93,11 +112,39 @@ public class PrintContentAdapter implements AdaptationContent {
servingPaperContent.setPerson(tableBean.getPerson()); servingPaperContent.setPerson(tableBean.getPerson());
servingPaperContent.setCreateTime(tableBean.getCreateTime()); servingPaperContent.setCreateTime(tableBean.getCreateTime());
servingPaperContent.setOrderNo(doshokuOrder.getOrderNo()); servingPaperContent.setOrderNo(doshokuOrder.getOrderNo());
//送單
servingPaperContent.setFoodItemList(orderDetailItemCastPrintFoodItemList(doshokuOrder.getNewFoodList())); servingPaperContent.setFoodItemList(orderDetailItemCastPrintFoodItemList(doshokuOrder.getNewFoodList()));
servingPaperContent.setPoliteLanguage("歡迎光臨!"); servingPaperContent.setPoliteLanguage("歡迎光臨!");
return servingPaperContent; return servingPaperContent;
} }
/**
* 上菜紙
* @param doshokuOrder
* @param tableBean
* @return
*/
@Override
public PrintContent adaptationServingPaperContent(DoshokuOrder doshokuOrder, TableBean.DataBean tableBean) {
PrintServingPaperContent servingPaperContent = new PrintServingPaperContent();
servingPaperContent.setBrand(RestaurantInfoManager.newInstance().getBrandName());
servingPaperContent.setResturantName(RestaurantInfoManager.newInstance().getRestaurantName());
servingPaperContent.setTableName(tableBean.getTableName());
servingPaperContent.setPerson(tableBean.getPerson());
servingPaperContent.setCreateTime(tableBean.getCreateTime());
servingPaperContent.setOrderNo(doshokuOrder.getOrderNo());
// servingPaperContent.setFoodItemList(orderDetailItemCastPrintFoodItemList(doshokuOrder.getNewFoodList()));
servingPaperContent.setFoodItemList(orderDetailItemCastPrintFoodItemList(doshokuOrder.getShoppingCart().getOrderCommodityList()));
servingPaperContent.setPoliteLanguage("歡迎光臨!");
return servingPaperContent;
}
/**
* 打印結賬單
* @param doshokuOrder
* @param tableBean
* @return
*/
@Override @Override
public PrintContent adaptationBillContent(DoshokuOrder doshokuOrder, TableBean.DataBean tableBean) { public PrintContent adaptationBillContent(DoshokuOrder doshokuOrder, TableBean.DataBean tableBean) {
PrintBillContent billContent = new PrintBillContent(); PrintBillContent billContent = new PrintBillContent();
...@@ -107,7 +154,7 @@ public class PrintContentAdapter implements AdaptationContent { ...@@ -107,7 +154,7 @@ public class PrintContentAdapter implements AdaptationContent {
billContent.setPerson(tableBean.getPerson()); billContent.setPerson(tableBean.getPerson());
billContent.setCreateTime(tableBean.getCreateTime()); billContent.setCreateTime(tableBean.getCreateTime());
billContent.setOrderNo(doshokuOrder.getOrderNo()); billContent.setOrderNo(doshokuOrder.getOrderNo());
billContent.setFoodItemList(orderDetailItemCastPrintFoodItemList(doshokuOrder.getNewFoodList())); billContent.setFoodItemList(orderDetailItemCastPrintFoodItemList(doshokuOrder.getShoppingCart().getOrderCommodityList()));
billContent.setBillItemList(billItemCastPrintBillItemList(doshokuOrder.getShoppingCart().getBillItemList())); billContent.setBillItemList(billItemCastPrintBillItemList(doshokuOrder.getShoppingCart().getBillItemList()));
billContent.setPayMethodItemList(payMethodItemCastPrintBillItemList(doshokuOrder.getBillMoney())); billContent.setPayMethodItemList(payMethodItemCastPrintBillItemList(doshokuOrder.getBillMoney()));
billContent.setWholeAmount(doshokuOrder.getShoppingCart().getWholeAmount()); billContent.setWholeAmount(doshokuOrder.getShoppingCart().getWholeAmount());
......
...@@ -60,7 +60,7 @@ public class ConnectPrintUtil { ...@@ -60,7 +60,7 @@ public class ConnectPrintUtil {
socketMap.put(ip, socket); socketMap.put(ip, socket);
} catch (IOException e) { } catch (IOException e) {
socketMap.remove(ip); socketMap.remove(ip);
setState(PrintSocketHolder.ERROR_1, "連接失敗" + e.getMessage()); setState(PrintSocketHolder.ERROR_2, "連接失敗" + e.getMessage());
e.printStackTrace(); e.printStackTrace();
} }
} }
......
package com.gingersoft.gsa.cloud.print.newprint; //package com.gingersoft.gsa.cloud.print.newprint;
//
import android.bluetooth.BluetoothDevice; //import android.bluetooth.BluetoothDevice;
import android.os.AsyncTask; //import android.os.AsyncTask;
//
import com.gingersoft.gsa.cloud.common.logan.LoganManager; //import com.gingersoft.gsa.cloud.common.logan.LoganManager;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean; //import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.gingersoft.gsa.cloud.print.PrintDataMaker; //import com.gingersoft.gsa.cloud.print.PrintDataMaker;
import com.gingersoft.gsa.cloud.print.PrintExecutor; //import com.gingersoft.gsa.cloud.print.PrintExecutor;
import com.gingersoft.gsa.cloud.print.PrintSocketHolder; //import com.gingersoft.gsa.cloud.print.PrintSocketHolder;
//
import java.util.List; //import java.util.List;
//
public class PrintUtil { //public class PrintUtil {
//
protected final String TAG = this.getClass().getSimpleName(); // protected final String TAG = this.getClass().getSimpleName();
//
private PrintSocketHolder holder; // private PrintSocketHolder holder;
private int mReconnectTimes = 0; // private int mReconnectTimes = 0;
private int time = 0; // private int time = 0;
private String prjIds; // private String prjIds;
private PrintSocketHolder.OnStateChangedListener listener; // private PrintSocketHolder.OnStateChangedListener listener;
private PrintExecutor.OnPrintResultListener mListener; // private PrintExecutor.OnPrintResultListener mListener;
private PrintExecutor.OnPrjPrintResultListener onPrjPrintResultListener; // private PrintExecutor.OnPrjPrintResultListener onPrjPrintResultListener;
//
public PrintUtil() { // public PrintUtil() {
// holder = new PrintSocketHolder(printerDeviceBean); //// holder = new PrintSocketHolder(printerDeviceBean);
} // }
//
/** // /**
* 执行打印请求 // * 执行打印请求
* // *
* @return 错误代码 // * @return 错误代码
*/ // */
private int doRequest(PrintDataMaker maker) { // private int doRequest(PrintDataMaker maker) {
LoganManager.w_printer(TAG,"PrintTask doRequest"); // LoganManager.w_printer(TAG,"PrintTask doRequest");
if (mReconnectTimes == 0) { // if (mReconnectTimes == 0) {
holder.onPrinterStateChanged(PrintSocketHolder.STATE_0); // holder.onPrinterStateChanged(PrintSocketHolder.STATE_0);
List<byte[]> data = maker.getPrintData(); // List<byte[]> data = maker.getPrintData();
prjIds = maker.getPrjIds(); // prjIds = maker.getPrjIds();
if (!holder.isSocketPrepared()) { // if (!holder.isSocketPrepared()) {
int prepare = holder.prepareSocket(); // int prepare = holder.prepareSocket();
if (prepare != PrintSocketHolder.ERROR_0) // if (prepare != PrintSocketHolder.ERROR_0)
return prepare; // return prepare;
} // }
return holder.sendData(data); // return holder.sendData(data);
} else { // } else {
holder.onPrinterStateChanged(PrintSocketHolder.STATE_0); // holder.onPrinterStateChanged(PrintSocketHolder.STATE_0);
List<byte[]> data = maker.getPrintData(); // List<byte[]> data = maker.getPrintData();
prjIds = maker.getPrjIds(); // prjIds = maker.getPrjIds();
if (holder.isSocketPrepared()) { // if (holder.isSocketPrepared()) {
if (sendData(data)) // if (sendData(data))
return PrintSocketHolder.ERROR_0; // return PrintSocketHolder.ERROR_0;
else // else
return PrintSocketHolder.ERROR_100; // return PrintSocketHolder.ERROR_100;
} else { // } else {
if (prepareSocket() && sendData(data)) { // if (prepareSocket() && sendData(data)) {
return PrintSocketHolder.ERROR_0; // return PrintSocketHolder.ERROR_0;
} else { // } else {
return PrintSocketHolder.ERROR_100; // return PrintSocketHolder.ERROR_100;
} // }
} // }
} // }
} // }
//
/** // /**
* 执行打印请求 // * 执行打印请求
* // *
* @return 错误代码 // * @return 错误代码
*/ // */
public int doPrinterRequest(PrintDataMaker maker) { // public int doPrinterRequest(PrintDataMaker maker) {
holder.setOnStateChangedListener(listener); // holder.setOnStateChangedListener(listener);
return doRequest(maker); // return doRequest(maker);
} // }
//
private boolean prepareSocket() { // private boolean prepareSocket() {
time++; // time++;
return time < mReconnectTimes && // return time < mReconnectTimes &&
(holder.prepareSocket() == PrintSocketHolder.ERROR_0 || prepareSocket()); // (holder.prepareSocket() == PrintSocketHolder.ERROR_0 || prepareSocket());
} // }
//
private boolean sendData(List<byte[]> data) { // private boolean sendData(List<byte[]> data) {
if (holder.sendData(data) == PrintSocketHolder.ERROR_0) { // if (holder.sendData(data) == PrintSocketHolder.ERROR_0) {
time = 0; // time = 0;
return true; // return true;
} else { // } else {
return prepareSocket() && sendData(data); // return prepareSocket() && sendData(data);
} // }
} // }
//
/** // /**
* 异步执行打印请求 // * 异步执行打印请求
*/ // */
public void doPrinterRequestAsync(PrintDataMaker maker) { // public void doPrinterRequestAsync(PrintDataMaker maker) {
// new PrintExecutor.PrintTask().execute(maker); //// new PrintExecutor.PrintTask().execute(maker);
} // }
//
/** // /**
* 销毁 // * 销毁
*/ // */
public int closeSocket() { // public int closeSocket() {
return holder.closeSocket(); // return holder.closeSocket();
} // }
//
/** // /**
* 设置IP及端口 // * 设置IP及端口
*/ // */
public void setIp(PrinterDeviceBean printerDeviceBean) { // public void setIp(PrinterDeviceBean printerDeviceBean) {
holder.setIp(printerDeviceBean); // holder.setIp(printerDeviceBean);
} // }
//
/** // /**
* 设置蓝牙 // * 设置蓝牙
* // *
* @param device 设备 // * @param device 设备
*/ // */
public void setDevice(BluetoothDevice device) { // public void setDevice(BluetoothDevice device) {
holder.setDevice(device); // holder.setDevice(device);
} // }
//
/** // /**
* 设置状态监听 // * 设置状态监听
* // *
* @param listener 监听 // * @param listener 监听
*/ // */
public void setOnStateChangedListener(PrintSocketHolder.OnStateChangedListener listener) { // public void setOnStateChangedListener(PrintSocketHolder.OnStateChangedListener listener) {
this.listener = listener; // this.listener = listener;
} // }
//
/** // /**
* 设置重连次数 // * 设置重连次数
* // *
* @param times 次数 // * @param times 次数
*/ // */
public void setReconnectTimes(int times) { // public void setReconnectTimes(int times) {
mReconnectTimes = times; // mReconnectTimes = times;
} // }
//
/** // /**
* 设置结果回调 // * 设置结果回调
* // *
* @param listener 回调 // * @param listener 回调
*/ // */
public void setOnPrintResultListener(PrintExecutor.OnPrintResultListener listener) { // public void setOnPrintResultListener(PrintExecutor.OnPrintResultListener listener) {
this.mListener = listener; // this.mListener = listener;
} // }
//
public interface OnPrintResultListener { // public interface OnPrintResultListener {
void onResult(int errorCode, PrinterDeviceBean printerDeviceBean); // void onResult(int errorCode, PrinterDeviceBean printerDeviceBean);
} // }
//
/** // /**
* PRJ打印結果回調 // * PRJ打印結果回調
*/ // */
public interface OnPrjPrintResultListener { // public interface OnPrjPrintResultListener {
void onResult(int errorCode, String ids); // void onResult(int errorCode, String ids);
} // }
//
public void setOnPrjPrintResultListener(PrintExecutor.OnPrjPrintResultListener onPrjPrintResultListener) { // public void setOnPrjPrintResultListener(PrintExecutor.OnPrjPrintResultListener onPrjPrintResultListener) {
this.onPrjPrintResultListener = onPrjPrintResultListener; // this.onPrjPrintResultListener = onPrjPrintResultListener;
} // }
//
private class PrintTask extends AsyncTask<PrintDataMaker, Integer, Integer> implements // private class PrintTask extends AsyncTask<PrintDataMaker, Integer, Integer> implements
PrintSocketHolder.OnStateChangedListener { // PrintSocketHolder.OnStateChangedListener {
//
@Override // @Override
protected void onPreExecute() { // protected void onPreExecute() {
super.onPreExecute(); // super.onPreExecute();
holder.setOnStateChangedListener(this); // holder.setOnStateChangedListener(this);
} // }
//
@Override // @Override
protected Integer doInBackground(PrintDataMaker... makers) { // protected Integer doInBackground(PrintDataMaker... makers) {
if (makers == null || makers.length < 1) // if (makers == null || makers.length < 1)
return PrintSocketHolder.ERROR_0; // return PrintSocketHolder.ERROR_0;
return doRequest(makers[0]); // return doRequest(makers[0]);
} // }
//
@Override // @Override
protected void onProgressUpdate(Integer... values) { // protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values); // super.onProgressUpdate(values);
if (values == null || values.length < 1) // if (values == null || values.length < 1)
return; // return;
if (listener != null) // if (listener != null)
listener.onStateChanged(values[0], holder.getPrinterDeviceBean()); // listener.onStateChanged(values[0], holder.getPrinterDeviceBean());
} // }
//
@Override // @Override
protected void onPostExecute(Integer integer) { // protected void onPostExecute(Integer integer) {
super.onPostExecute(integer); // super.onPostExecute(integer);
if (integer != null) { // if (integer != null) {
onResult(integer); // onResult(integer);
} // }
} // }
//
/** // /**
* 打印结果 // * 打印结果
* // *
* @param errorCode 错误代码 // * @param errorCode 错误代码
*/ // */
private void onResult(int errorCode) { // private void onResult(int errorCode) {
try { // try {
if (mListener != null) // if (mListener != null)
mListener.onResult(errorCode, holder.getPrinterDeviceBean()); // mListener.onResult(errorCode, holder.getPrinterDeviceBean());
if (onPrjPrintResultListener != null) { // if (onPrjPrintResultListener != null) {
onPrjPrintResultListener.onResult(errorCode, prjIds); // onPrjPrintResultListener.onResult(errorCode, prjIds);
} // }
} catch (Exception e) { // } catch (Exception e) {
e.printStackTrace(); // e.printStackTrace();
} // }
} // }
//
@Override // @Override
public void onStateChanged(int state, PrinterDeviceBean printerDeviceBean) { // public void onStateChanged(int state, PrinterDeviceBean printerDeviceBean) {
publishProgress(state); // publishProgress(state);
} // }
} // }
} //}
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_marginLeft="@dimen/dp_10"
android:layout_marginRight="@dimen/dp_10"
android:orientation="horizontal"> android:orientation="horizontal">
<TextView <TextView
......
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