【产品名称】: 多门店系统
【产品版本】:v4.0.0
【部署方式】: linux宝塔面板
【部署环境】: 线上环境
【php版本】:8.0
【Mysql版本】:5.7
【使用终端】:商米收银台-D3-APP
遇到了很多坑,给大家参考一下。觉得有用的关注,不会弄的可以找我打包,请我喝杯蜜雪冰城就可以,但是需要在有空的时间。
1、收款界面布局问题导致键盘被遮挡
https://www.crmeb.com/ask/thread/75997
2、顾客屏幕不显示或者不同步数据
https://www.crmeb.com/ask/thread/75998
3、收钱后,收钱箱不弹开
原因:商米D3用的是新的PrinterX SDK,不是旧的 SunmiPrinterService,所以使用旧的驱动是无法打开的。
3.1
添加依赖
在 app/build.gradle 中:
dependencies {
implementation 'com.sunmi:printerx:1.0.20'
}
3.2
修改 CrmebCollectActicity.java
package com.crmeb.crmebcollect;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Presentation;
import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaRouter;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageView;
import android.widget.Toast;
import com.crmeb.jsbridge.IJsCallBack;
import com.crmeb.jsbridge.JsBridgeApi;
import com.crmeb.jsbridge.JsMessageBean;
import com.crmeb.jsbridge.JsonUtil;
import com.sunmi.printerx.Printer;
import com.sunmi.printerx.PrinterListen;
import com.sunmi.printerx.PrinterSdk;
import com.sunmi.printerx.style.ResultCallback;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class CrmebCollectActicity extends AppCompatActivity {
// 主屏网页容器
private WebView webView;
// 副屏WebView和Presentation
private WebView customerWebView;
private Presentation customerPresentation;
// js 和 Java 交互
private JsBridgeApi mJsBridgeApi;
// 商米打印机(新SDK)
private Printer printer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AssetManager assetManager = this.getAssets();
// web view
webView = new WebView(this);
setContentView(webView);
// 初始化商米打印机(新SDK)
initPrinter();
WebSettings webSettings = webView.getSettings();
webSettings.setAllowUniversalAccessFromFileURLs(true);
webSettings.setJavaScriptEnabled(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setAppCacheEnabled(true);
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
webSettings.setSupportZoom(true);
webSettings.setUseWideViewPort(true);
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
webSettings.setDisplayZoomControls(true);
webSettings.setDefaultFontSize(12);
webSettings.setDomStorageEnabled(Boolean.TRUE);
webSettings.setDatabaseEnabled(Boolean.TRUE);
webView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Toast.makeText(getApplicationContext(), "url:" + url + "| message:" + message, Toast.LENGTH_SHORT).show();
return super.onJsAlert(view, url, message, result);
}
});
webView.setWebViewClient(new WebViewClient());
webView.loadUrl("file:///android_asset/pro_collect/cashier.html#/cashier/cashier/index");
// 顾显声明 第一次显示Welcome图片
MediaRouter mediaRouter = (MediaRouter) CrmebCollectActicity.this.getSystemService(Context.MEDIA_ROUTER_SERVICE);
MediaRouter.RouteInfo route = mediaRouter.getDefaultRoute();
if (route != null) {
Display presentationDisplay = route.getPresentationDisplay();
if (presentationDisplay != null) {
customerPresentation = new MyPresentation(CrmebCollectActicity.this, presentationDisplay);
ImageView iv = new ImageView(CrmebCollectActicity.this);
try {
InputStream inputStream = assetManager.open("gx.jpeg");
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
iv.setImageBitmap(bitmap);
customerPresentation.setContentView(iv);
customerPresentation.show();
} catch (IOException e) {
e.printStackTrace();
}
}
}
mJsBridgeApi = new JsBridgeApi(webView, new IJsCallBack() {
@Override
public void onJsCall(JsMessageBean jsMessageBean) {
Log.v("onJsCall", JsonUtil.toJsonString(jsMessageBean));
// 打开钱箱
if (jsMessageBean.method.equals("openCacheBox")) {
Toast.makeText(getApplicationContext(), "收到打开钱箱指令", Toast.LENGTH_SHORT).show();
openCashBox();
}
// 收银员登录成功后打开顾显
if (jsMessageBean.method.equals("collectLoginSuccess")) {
Display presentationDisplay = route.getPresentationDisplay();
dismissCustomerPresentation();
customerPresentation = new MyPresentation(CrmebCollectActicity.this, presentationDisplay);
customerWebView = new WebView(CrmebCollectActicity.this);
WebSettings webSettingsCus = customerWebView.getSettings();
webSettingsCus.setJavaScriptEnabled(true);
customerPresentation.setContentView(customerWebView);
webSettingsCus.setSupportZoom(true);
webSettingsCus.setUseWideViewPort(true);
webSettingsCus.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
webSettingsCus.setDisplayZoomControls(true);
webSettingsCus.setDomStorageEnabled(Boolean.TRUE);
webSettingsCus.setDatabaseEnabled(Boolean.TRUE);
customerWebView.setWebChromeClient(new WebChromeClient());
customerWebView.setWebViewClient(new WebViewClient());
customerWebView.loadUrl("file:///android_asset/pro_collect/cashier.html#/cashier/auxScreen/index");
customerPresentation.show();
}
// 收银员注销后关闭顾显
if (jsMessageBean.method.equals("collectLogout")) {
Display presentationDisplay = route.getPresentationDisplay();
dismissCustomerPresentation();
customerPresentation = new MyPresentation(CrmebCollectActicity.this, presentationDisplay);
ImageView iv = new ImageView(CrmebCollectActicity.this);
try {
InputStream inputStream = assetManager.open("gx.jpeg");
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
iv.setImageBitmap(bitmap);
customerPresentation.setContentView(iv);
customerPresentation.show();
customerWebView = null;
} catch (IOException e) {
e.printStackTrace();
}
}
// 同步购物车数据到副屏
if (jsMessageBean.method.equals("syncCartToCustomer")) {
syncDataToCustomer(jsMessageBean.params);
}
mJsBridgeApi.notifyNativeTaskFinished("sf", jsMessageBean.id);
}
});
mJsBridgeApi.openJsBridgeChannel(webView);
WebView.setWebContentsDebuggingEnabled(true);
webView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View view, int i, KeyEvent keyEvent) {
if (webView.canGoBack()) {
webView.goBack();
return true;
} else {
return false;
}
}
});
}
// ========== 打印机初始化(新SDK) ==========
private void initPrinter() {
PrinterSdk.getInstance().getPrinter(this, new PrinterListen() {
@Override
public void onDefPrinter(Printer defPrinter) {
printer = defPrinter;
Log.d("Printer", "默认打印机已连接");
}
@Override
public void onPrinters(List<Printer> printers) {
if (printers != null && !printers.isEmpty()) {
printer = printers.get(0);
}
}
});
}
// ========== 打开钱箱(新SDK) ==========
public void openCashBox() {
if (printer == null) {
Toast.makeText(CrmebCollectActicity.this, "打印机未连接", Toast.LENGTH_SHORT).show();
return;
}
printer.cashDrawerApi().open(new ResultCallback() {
@Override
public void onResult(int code, String message) {
if (code == 0) {
Toast.makeText(CrmebCollectActicity.this, "钱箱已打开", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(CrmebCollectActicity.this, "钱箱失败: " + message, Toast.LENGTH_SHORT).show();
}
}
});
}
// ========== 副屏数据同步 ==========
private void syncDataToCustomer(String data) {
if (customerWebView != null) {
customerWebView.post(new Runnable() {
@Override
public void run() {
String escapedData = data.replace("\\", "\\\\").replace("'", "\\'");
String js = "javascript:if(window.updateFromMain){" +
"window.updateFromMain('" + escapedData + "');" +
"}";
customerWebView.evaluateJavascript(js, null);
}
});
}
}
private void dismissCustomerPresentation() {
if (customerPresentation != null && customerPresentation.isShowing()) {
customerPresentation.dismiss();
customerPresentation = null;
}
customerWebView = null;
}
@Override
protected void onDestroy() {
super.onDestroy();
dismissCustomerPresentation();
}
}

