Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
supplier
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
王宇航
supplier
Commits
414e7e7d
Commit
414e7e7d
authored
Apr 11, 2020
by
Wyh
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
04-11 多台打印,長按印單切換打印機
parent
3bebf347
Hide whitespace changes
Inline
Side-by-side
Showing
53 changed files
with
2180 additions
and
542 deletions
+2180
-542
arms/src/main/java/com/jess/arms/base/BaseHolder.java
+14
-3
arms/src/main/java/com/jess/arms/base/DefaultAdapter.java
+16
-8
other_order_mode/build.gradle
+0
-1
other_order_mode/src/main/java/com/gingersoft/gsa/other_order_mode/OtherOrderActivity.kt
+0
-1
print-module/src/main/java/com/joe/print/mvp/contract/PrintContract.java
+4
-1
print-module/src/main/java/com/joe/print/mvp/presenter/PrintPresenter.java
+15
-16
print-module/src/main/java/com/joe/print/mvp/presenter/PrinterAddPresenter.java
+4
-29
print-module/src/main/java/com/joe/print/mvp/print/IpPrintMaker.java
+326
-0
print-module/src/main/java/com/joe/print/mvp/print/LocationPrintStatus.java
+2
-2
print-module/src/main/java/com/joe/print/mvp/print/Print.java
+0
-91
print-module/src/main/java/com/joe/print/mvp/print/PrintBill.java
+116
-0
print-module/src/main/java/com/joe/print/mvp/print/PrintCleanMachine.java
+42
-0
print-module/src/main/java/com/joe/print/mvp/print/PrintKitchen.java
+186
-0
print-module/src/main/java/com/joe/print/mvp/print/PrintListener.java
+9
-0
print-module/src/main/java/com/joe/print/mvp/print/PrintServe.java
+107
-0
print-module/src/main/java/com/joe/print/mvp/print/PrintSlip.java
+109
-0
print-module/src/main/java/com/joe/print/mvp/print/PrintTest.java
+42
-0
print-module/src/main/java/com/joe/print/mvp/print/PrintUtils.java
+6
-0
print-module/src/main/java/com/joe/print/mvp/print/PrinterInIt.java
+563
-0
print-module/src/main/java/com/joe/print/mvp/print/SendPrint.java
+1
-1
print-module/src/main/java/com/joe/print/mvp/print/TestPrintDataMaker.java
+1
-1
print-module/src/main/java/com/joe/print/mvp/ui/activity/IpPrintActivity.java
+6
-4
print-module/src/main/java/com/joe/print/mvp/ui/activity/PrintActivity.java
+152
-267
print-module/src/main/java/com/joe/print/mvp/ui/activity/PrinterAddActivity.java
+25
-8
print-module/src/main/java/com/joe/print/mvp/ui/activity/PrinterListActivity.java
+1
-2
print-module/src/main/java/com/joe/print/mvp/ui/adapter/DialogPrinterListAdapter.java
+2
-7
print-module/src/main/java/com/joe/print/mvp/ui/adapter/PrintFailListAdapter.java
+93
-0
print-module/src/main/java/com/joe/print/mvp/ui/adapter/PrintFileBitmapAdapter.java
+25
-0
print-module/src/main/java/com/joe/print/mvp/ui/adapter/PrinterListAdapter.java
+1
-1
print-module/src/main/res/drawable/shape_error_color_bg.xml
+7
-0
print-module/src/main/res/drawable/shape_theme_color_bg.xml
+7
-0
print-module/src/main/res/layout/dialog_print_fail_list.xml
+23
-0
print-module/src/main/res/layout/item_print_fail_layout.xml
+58
-0
print-module/src/main/res/layout/print_fail_img_item.xml
+14
-0
print-module/src/main/res/layout/printer_activity_add.xml
+35
-4
public-base/build.gradle
+0
-1
public-base/src/main/java/com/gingersoft/gsa/cloud/aspectj/SingleClickAspect.java
+2
-0
public-base/src/main/java/com/gingersoft/gsa/cloud/aspectj/SwitchPrintAspect.java
+1
-0
public-base/src/main/java/com/gingersoft/gsa/cloud/base/utils/AidlUtil.java
+3
-2
public-base/src/main/java/com/gingersoft/gsa/cloud/base/widget/DialogUtils.java
+5
-0
public-base/src/main/java/com/gingersoft/gsa/cloud/database/bean/PrinterDeviceBean.java
+16
-4
public-base/src/main/java/com/gingersoft/gsa/cloud/database/greendao/PrinterDeviceBeanDao.java
+38
-24
public-base/src/main/java/com/gingersoft/gsa/cloud/print/PrintExecutor.java
+12
-14
public-base/src/main/java/com/gingersoft/gsa/cloud/print/PrintSocketHolder.java
+31
-16
public-base/src/main/java/com/gingersoft/gsa/cloud/print/PrinterUtils.java
+28
-0
public-base/src/main/res/drawable-xhdpi/dialog_close.png
+0
-0
table-mode/build.gradle
+0
-1
table-mode/src/main/java/com/gingersoft/gsa/cloud/table/mvp/presenter/OrderContentPresenter.java
+9
-4
table-mode/src/main/java/com/gingersoft/gsa/cloud/table/mvp/ui/activity/MealStandActivity.java
+3
-22
table-mode/src/main/java/com/gingersoft/gsa/cloud/table/mvp/ui/activity/OrderPayActivity.java
+19
-1
table-mode/src/main/java/com/gingersoft/gsa/cloud/table/mvp/ui/adapter/OrderTopFunctionAdapter.java
+0
-3
user-login/build.gradle
+0
-2
user-login/src/main/java/com/gingersoft/gsa/cloud/user/login/mvp/ui/activity/WelcomeActivity.java
+1
-1
No files found.
arms/src/main/java/com/jess/arms/base/BaseHolder.java
View file @
414e7e7d
...
...
@@ -17,11 +17,11 @@ package com.jess.arms.base;
import
android.view.View
;
import
androidx.recyclerview.widget.RecyclerView
;
import
com.jess.arms.utils.ThirdViewUtil
;
import
com.zhy.autolayout.utils.AutoUtils
;
import
androidx.recyclerview.widget.RecyclerView
;
/**
* ================================================
* 基类 {@link RecyclerView.ViewHolder}
...
...
@@ -33,11 +33,18 @@ import androidx.recyclerview.widget.RecyclerView;
*/
public
abstract
class
BaseHolder
<
T
>
extends
RecyclerView
.
ViewHolder
implements
View
.
OnClickListener
{
protected
OnViewClickListener
mOnViewClickListener
=
null
;
protected
DefaultAdapter
.
OnLongClickListener
mOnLongClickListener
=
null
;
protected
final
String
TAG
=
this
.
getClass
().
getSimpleName
();
public
BaseHolder
(
View
itemView
)
{
super
(
itemView
);
itemView
.
setOnClickListener
(
this
);
//点击事件
itemView
.
setOnLongClickListener
(
v
->
{
if
(
mOnLongClickListener
!=
null
)
{
mOnLongClickListener
.
onLongClick
(
v
,
getAdapterPosition
());
}
return
false
;
});
if
(
ThirdViewUtil
.
USE_AUTOLAYOUT
==
1
)
AutoUtils
.
autoSize
(
itemView
);
//适配z
ThirdViewUtil
.
bindTarget
(
this
,
itemView
);
//绑定
}
...
...
@@ -62,7 +69,7 @@ public abstract class BaseHolder<T> extends RecyclerView.ViewHolder implements V
@Override
public
void
onClick
(
View
view
)
{
if
(
mOnViewClickListener
!=
null
)
{
mOnViewClickListener
.
onViewClick
(
view
,
this
.
getPosition
());
mOnViewClickListener
.
onViewClick
(
view
,
this
.
get
Adapter
Position
());
}
}
...
...
@@ -73,4 +80,8 @@ public abstract class BaseHolder<T> extends RecyclerView.ViewHolder implements V
public
void
setOnItemClickListener
(
OnViewClickListener
listener
)
{
this
.
mOnViewClickListener
=
listener
;
}
public
void
setmOnLongClickListener
(
DefaultAdapter
.
OnLongClickListener
mOnLongClickListener
)
{
this
.
mOnLongClickListener
=
mOnLongClickListener
;
}
}
arms/src/main/java/com/jess/arms/base/DefaultAdapter.java
View file @
414e7e7d
...
...
@@ -19,10 +19,10 @@ import android.view.LayoutInflater;
import
android.view.View
;
import
android.view.ViewGroup
;
import
java.util.List
;
import
androidx.recyclerview.widget.RecyclerView
;
import
java.util.List
;
/**
* ================================================
* 基类 {@link RecyclerView.Adapter} ,如果需要实现非常复杂的 {@link RecyclerView} ,请尽量使用其他优秀的三方库
...
...
@@ -35,6 +35,7 @@ import androidx.recyclerview.widget.RecyclerView;
public
abstract
class
DefaultAdapter
<
T
>
extends
RecyclerView
.
Adapter
<
BaseHolder
<
T
>>
{
protected
List
<
T
>
mInfos
;
protected
OnRecyclerViewItemClickListener
mOnItemClickListener
=
null
;
protected
OnLongClickListener
mOnLongClickListener
=
null
;
private
BaseHolder
<
T
>
mHolder
;
public
DefaultAdapter
(
List
<
T
>
infos
)
{
...
...
@@ -53,14 +54,13 @@ public abstract class DefaultAdapter<T> extends RecyclerView.Adapter<BaseHolder<
public
BaseHolder
<
T
>
onCreateViewHolder
(
ViewGroup
parent
,
final
int
viewType
)
{
View
view
=
LayoutInflater
.
from
(
parent
.
getContext
()).
inflate
(
getLayoutId
(
viewType
),
parent
,
false
);
mHolder
=
getHolder
(
view
,
viewType
);
mHolder
.
setOnItemClickListener
(
new
BaseHolder
.
OnViewClickListener
()
{
//设置Item点击事件
@Override
public
void
onViewClick
(
View
view
,
int
position
)
{
if
(
mOnItemClickListener
!=
null
&&
mInfos
!=
null
&&
mInfos
.
size
()
>
0
)
{
mOnItemClickListener
.
onItemClick
(
view
,
viewType
,
mInfos
.
get
(
position
),
position
);
}
//设置Item点击事件
mHolder
.
setOnItemClickListener
((
view1
,
position
)
->
{
if
(
mOnItemClickListener
!=
null
&&
mInfos
!=
null
&&
mInfos
.
size
()
>
0
)
{
mOnItemClickListener
.
onItemClick
(
view1
,
viewType
,
mInfos
.
get
(
position
),
position
);
}
});
mHolder
.
setmOnLongClickListener
(
mOnLongClickListener
);
return
mHolder
;
}
...
...
@@ -151,7 +151,15 @@ public abstract class DefaultAdapter<T> extends RecyclerView.Adapter<BaseHolder<
void
onItemClick
(
View
view
,
int
viewType
,
T
data
,
int
position
);
}
public
interface
OnLongClickListener
{
boolean
onLongClick
(
View
v
,
int
position
);
}
public
void
setOnItemClickListener
(
OnRecyclerViewItemClickListener
listener
)
{
this
.
mOnItemClickListener
=
listener
;
}
public
void
setmOnLongClickListener
(
OnLongClickListener
mOnLongClickListener
)
{
this
.
mOnLongClickListener
=
mOnLongClickListener
;
}
}
other_order_mode/build.gradle
View file @
414e7e7d
...
...
@@ -7,7 +7,6 @@ apply plugin: 'kotlin-android-extensions'
apply
plugin:
'kotlin-kapt'
android
{
compileSdkVersion
rootProject
.
ext
.
android
[
"compileSdkVersion"
]
// compileSdkVersion 28
defaultConfig
{
if
(
project
.
ext
.
runAsApp
)
{
applicationId
"com.gingersoft.gsa.other_order_mode"
...
...
other_order_mode/src/main/java/com/gingersoft/gsa/other_order_mode/OtherOrderActivity.kt
View file @
414e7e7d
...
...
@@ -87,7 +87,6 @@ class OtherOrderActivity : AppCompatActivity() {
ToastUtils
.
show
(
this
@OtherOrderActivity
,
"請輸入手機號或訂單號"
)
}
}
tabs
.
setupWithViewPager
(
viewPager
)
for
(
i
in
0
until
ints
.
size
)
{
...
...
print-module/src/main/java/com/joe/print/mvp/contract/PrintContract.java
View file @
414e7e7d
package
com
.
joe
.
print
.
mvp
.
contract
;
import
com.gingersoft.gsa.cloud.base.common.bean.BaseResult
;
import
com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean
;
import
com.jess.arms.mvp.IView
;
import
com.jess.arms.mvp.IModel
;
import
java.util.List
;
import
io.reactivex.Observable
;
...
...
@@ -25,7 +28,7 @@ public interface PrintContract {
/**
* 顯示打印機列表彈窗
*/
void
showPrinterList
();
void
showPrinterList
(
List
<
PrinterDeviceBean
>
deviceBeans
);
}
//Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存
...
...
print-module/src/main/java/com/joe/print/mvp/presenter/PrintPresenter.java
View file @
414e7e7d
...
...
@@ -3,26 +3,25 @@ package com.joe.print.mvp.presenter;
import
android.app.Application
;
import
com.gingersoft.gsa.cloud.base.common.bean.BaseResult
;
import
com.gingersoft.gsa.cloud.base.common.bean.PrinterManger.PrinterManager
;
import
com.gingersoft.gsa.cloud.base.utils.JsonUtils
;
import
com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean
;
import
com.jess.arms.integration.AppManager
;
import
com.jess.arms.di.scope.ActivityScope
;
import
com.jess.arms.mvp.BasePresenter
;
import
com.jess.arms.http.imageloader.ImageLoader
;
import
com.jess.arms.integration.AppManager
;
import
com.jess.arms.mvp.BasePresenter
;
import
com.jess.arms.utils.RxLifecycleUtils
;
import
com.joe.print.mvp.contract.PrintContract
;
import
java.util.List
;
import
javax.inject.Inject
;
import
io.reactivex.android.schedulers.AndroidSchedulers
;
import
io.reactivex.schedulers.Schedulers
;
import
me.jessyan.rxerrorhandler.core.RxErrorHandler
;
import
me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber
;
import
javax.inject.Inject
;
import
com.jess.arms.utils.RxLifecycleUtils
;
import
com.joe.print.mvp.contract.PrintContract
;
import
com.gingersoft.gsa.cloud.base.common.bean.PrinterManger.PrinterManager
;
import
java.util.List
;
/**
* ================================================
...
...
@@ -77,13 +76,13 @@ public class PrintPresenter extends BasePresenter<PrintContract.Model, PrintCont
.
subscribe
(
new
ErrorHandleSubscriber
<
BaseResult
>(
mErrorHandler
)
{
@Override
public
void
onNext
(
BaseResult
baseResult
)
{
if
(
baseResult
.
isSuccess
())
{
if
(
baseResult
.
isSuccess
())
{
List
<
PrinterDeviceBean
>
deviceBeans
=
JsonUtils
.
parseArray
(
baseResult
.
getData
(),
PrinterDeviceBean
.
class
);
if
(
deviceBeans
!=
null
&&
deviceBeans
.
size
()
>
0
){
//有打印機,返回true
PrinterManager
.
getPrinterManager
().
setDeviceBeans
(
deviceBeans
);
mRootView
.
showPrinterList
();
}
//有打印機,返回true
PrinterManager
.
getPrinterManager
().
setDeviceBeans
(
deviceBeans
);
mRootView
.
showPrinterList
(
deviceBeans
);
}
else
{
mRootView
.
showPrinterList
(
null
);
}
}
});
...
...
print-module/src/main/java/com/joe/print/mvp/presenter/PrinterAddPresenter.java
View file @
414e7e7d
...
...
@@ -4,7 +4,6 @@ import android.app.Application;
import
com.gingersoft.gsa.cloud.base.common.bean.BaseResult
;
import
com.gingersoft.gsa.cloud.base.utils.JsonUtils
;
import
com.gingersoft.gsa.cloud.base.utils.other.TextUtil
;
import
com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean
;
import
com.jess.arms.di.scope.ActivityScope
;
import
com.jess.arms.http.imageloader.ImageLoader
;
...
...
@@ -62,21 +61,9 @@ public class PrinterAddPresenter extends BasePresenter<PrinterAddContract.Model,
/**
* 添加打印機
*
* @param restaurantId 餐廳id
* @param ip 打印機ip
* @param port 打印機端口號
* @param type 類型1 :55mm, 2:88mm
*/
public
void
addPrinter
(
int
restaurantId
,
String
ip
,
String
port
,
int
type
)
{
PrinterDeviceBean
printerDeviceBean
;
if
(
TextUtil
.
isEmptyOrNullOrUndefined
(
port
))
{
printerDeviceBean
=
new
PrinterDeviceBean
(
restaurantId
,
ip
,
null
,
type
);
}
else
{
printerDeviceBean
=
new
PrinterDeviceBean
(
restaurantId
,
ip
,
Integer
.
parseInt
(
port
),
type
);
}
public
void
addPrinter
(
PrinterDeviceBean
printerDeviceBean
)
{
RequestBody
requestBody
=
RequestBody
.
create
(
MediaType
.
parse
(
"application/json"
),
JsonUtils
.
toJson
(
printerDeviceBean
));
mModel
.
addPrinter
(
requestBody
)
.
subscribeOn
(
Schedulers
.
io
())
.
doOnSubscribe
(
disposable
->
mRootView
.
showLoading
(
""
))
...
...
@@ -98,21 +85,9 @@ public class PrinterAddPresenter extends BasePresenter<PrinterAddContract.Model,
/**
* 更新打印機信息
*
* @param id 打印機id
* @param restaurantId 餐廳id
* @param ip 打印機ip地址
* @param port 打印機端口號
* @param type 打印機類型 1 :55mm, 2:88mm
*/
public
void
updatePrinterInfo
(
int
id
,
int
restaurantId
,
String
ip
,
String
port
,
int
type
)
{
PrinterDeviceBean
printerDeviceBean
;
if
(
TextUtil
.
isEmptyOrNullOrUndefined
(
port
))
{
printerDeviceBean
=
new
PrinterDeviceBean
(
id
,
null
,
ip
,
null
,
type
);
}
else
{
printerDeviceBean
=
new
PrinterDeviceBean
(
id
,
null
,
ip
,
Integer
.
parseInt
(
port
),
type
);
}
RequestBody
requestBody
=
RequestBody
.
create
(
MediaType
.
parse
(
"application/json"
),
JsonUtils
.
toJson
(
printerDeviceBean
));
public
void
updatePrinterInfo
(
PrinterDeviceBean
deviceBean
)
{
RequestBody
requestBody
=
RequestBody
.
create
(
MediaType
.
parse
(
"application/json"
),
JsonUtils
.
toJson
(
deviceBean
));
mModel
.
updatePrinter
(
requestBody
)
.
subscribeOn
(
Schedulers
.
io
())
.
doOnSubscribe
(
disposable
->
mRootView
.
showLoading
(
""
))
...
...
@@ -125,7 +100,7 @@ public class PrinterAddPresenter extends BasePresenter<PrinterAddContract.Model,
public
void
onNext
(
BaseResult
baseResult
)
{
if
(
baseResult
.
isSuccess
())
{
mRootView
.
showMessage
(
"保存成功"
);
mRootView
.
updatePrinterSuccess
(
printerD
eviceBean
);
mRootView
.
updatePrinterSuccess
(
d
eviceBean
);
mRootView
.
killMyself
();
}
}
...
...
print-module/src/main/java/com/joe/print/mvp/print/IpPrintMaker.java
0 → 100644
View file @
414e7e7d
package
com
.
joe
.
print
.
mvp
.
print
;
import
android.content.Context
;
import
android.graphics.Bitmap
;
import
android.graphics.Canvas
;
import
android.graphics.Matrix
;
import
android.graphics.Rect
;
import
com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils
;
import
com.gingersoft.gsa.cloud.base.utils.view.ImageUtils
;
import
com.gingersoft.gsa.cloud.print.PrintDataMaker
;
import
com.gingersoft.gsa.cloud.print.PrinterWriter
;
import
com.gingersoft.gsa.cloud.print.PrinterWriter58mm
;
import
com.gingersoft.gsa.cloud.print.PrinterWriter80mm
;
import
java.io.IOException
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* Created by Wyh on 2020/1/9.
* ip打印類
*/
public
class
IpPrintMaker
implements
PrintDataMaker
{
private
Context
mContext
;
private
int
width
;
// 打印的圖片寬度,紙張寬度
private
List
<
Bitmap
>
bitmaps
;
public
IpPrintMaker
(
Context
context
,
int
width
,
List
<
Bitmap
>
bitmaps
)
{
this
.
mContext
=
context
;
this
.
width
=
width
;
this
.
bitmaps
=
bitmaps
;
}
@Override
public
List
<
byte
[]>
getPrintData
(
int
type
)
{
ArrayList
<
byte
[]>
data
=
new
ArrayList
<>();
try
{
PrinterWriter
printer
;
printer
=
type
==
PrinterWriter58mm
.
TYPE_58
?
new
PrinterWriter58mm
(
255
,
width
)
:
new
PrinterWriter80mm
(
255
,
width
);
printer
.
setAlignCenter
();
data
.
add
(
printer
.
getDataAndReset
());
if
(
bitmaps
.
size
()
<=
0
)
{
ToastUtils
.
show
(
mContext
,
"打印失敗"
);
return
null
;
}
for
(
int
i
=
0
;
i
<
bitmaps
.
size
();
i
++)
{
ArrayList
<
byte
[]>
image1
=
printer
.
getImageByte
(
bitmaps
.
get
(
i
));
//將bitmap縮放到打印機紙張大小再添加到集合中。
data
.
addAll
(
image1
);
//draw2PxPoint2(bitmaps.get(i)
printer
.
printLineFeed
();
printer
.
printLineFeed
();
printer
.
printLineFeed
();
printer
.
printLineFeed
();
printer
.
printLineFeed
();
printer
.
feedPaperCutPartial
();
data
.
add
(
printer
.
getDataAndReset
());
}
data
.
add
(
printer
.
getDataAndClose
());
return
data
;
}
catch
(
Exception
e
)
{
return
new
ArrayList
<>();
}
}
/*************************************************************************
* 假设一个240*240的图片,分辨率设为24, 共分10行打印
* 每一行,是一个 240*24 的点阵, 每一列有24个点,存储在3个byte里面。
* 每个byte存储8个像素点信息。因为只有黑白两色,所以对应为1的位是黑色,对应为0的位是白色
**************************************************************************/
/**
* 把一张Bitmap图片转化为打印机可以打印的字节流
*
* @param bmp
* @return
*/
public
void
draw2PxPoint
(
Bitmap
bmp
)
throws
IOException
{
//用来存储转换后的 bitmap 数据。为什么要再加1000,这是为了应对当图片高度无法
//整除24时的情况。比如bitmap 分辨率为 240 * 250,占用 7500 byte,
//但是实际上要存储11行数据,每一行需要 24 * 240 / 8 =720byte 的空间。再加上一些指令存储的开销,
//所以多申请 1000byte 的空间是稳妥的,不然运行时会抛出数组访问越界的异常。
int
size
=
bmp
.
getWidth
()
*
bmp
.
getHeight
()
/
8
+
1000
;
byte
[]
data
=
new
byte
[
size
];
int
k
=
0
;
//设置行距为0的指令
data
[
k
++]
=
0x1B
;
data
[
k
++]
=
0x33
;
data
[
k
++]
=
0x00
;
// 逐行打印
for
(
int
j
=
0
;
j
<
bmp
.
getHeight
()
/
24
f
;
j
++)
{
//打印图片的指令
data
[
k
++]
=
0x1B
;
data
[
k
++]
=
0x2A
;
data
[
k
++]
=
33
;
data
[
k
++]
=
(
byte
)
(
bmp
.
getWidth
()
%
256
);
//nL
data
[
k
++]
=
(
byte
)
(
bmp
.
getWidth
()
/
256
);
//nH
//对于每一行,逐列打印
for
(
int
i
=
0
;
i
<
bmp
.
getWidth
();
i
++)
{
//每一列24个像素点,分为3个字节存储
for
(
int
m
=
0
;
m
<
3
;
m
++)
{
//每个字节表示8个像素点,0表示白色,1表示黑色
for
(
int
n
=
0
;
n
<
8
;
n
++)
{
byte
b
=
px2Byte
(
i
,
j
*
24
+
m
*
8
+
n
,
bmp
);
data
[
k
]
+=
data
[
k
]
+
b
;
}
k
++;
}
}
data
[
k
++]
=
10
;
//换行
}
// socketOut.write(data);
// socketOut.flush();
}
/*************************************************************************
* 我们的热敏打印机是RP-POS80S或RP-POS80P或RP-POS80CS或RP-POS80CP打印机
* 360*360的图片,8个字节(8个像素点)是一个二进制,将二进制转化为十进制数值
* y轴:24个像素点为一组,即360就是15组(0-14)
* x轴:360个像素点(0-359)
* 里面的每一组(24*360),每8个像素点为一个二进制,(每组有3个,3*8=24)
**************************************************************************/
/**
* 把一张Bitmap图片转化为打印机可以打印的bit(将图片压缩为360*360)
* 效率很高(相对于下面)
*
* @param bit
* @return
*/
public
static
byte
[]
draw2PxPoint2
(
Bitmap
bit
)
{
byte
[]
data
=
new
byte
[
16290
];
int
height
=
bit
.
getHeight
()
+
(
24
-
bit
.
getHeight
()
%
24
);
int
y
=
height
/
24
;
int
k
=
0
;
for
(
int
j
=
0
;
j
<
y
;
j
++)
{
data
[
k
++]
=
0x1B
;
data
[
k
++]
=
0x2A
;
data
[
k
++]
=
33
;
// m=33时,选择24点双密度打印,分辨率达到200DPI。
data
[
k
++]
=
0x68
;
data
[
k
++]
=
0x01
;
for
(
int
i
=
0
;
i
<
bit
.
getWidth
();
i
++)
{
for
(
int
m
=
0
;
m
<
3
;
m
++)
{
for
(
int
n
=
0
;
n
<
8
;
n
++)
{
byte
b
=
px2Byte
(
i
,
j
*
24
+
m
*
8
+
n
,
bit
);
data
[
k
]
+=
data
[
k
]
+
b
;
}
k
++;
}
}
data
[
k
++]
=
10
;
}
return
data
;
}
/**
* 把一张Bitmap图片转化为打印机可以打印的bit
*
* @param bit
* @return
*/
public
static
byte
[]
pic2PxPoint
(
Bitmap
bit
)
{
long
start
=
System
.
currentTimeMillis
();
byte
[]
data
=
new
byte
[
16290
];
int
k
=
0
;
for
(
int
i
=
0
;
i
<
15
;
i
++)
{
data
[
k
++]
=
0x1B
;
data
[
k
++]
=
0x2A
;
data
[
k
++]
=
33
;
// m=33时,选择24点双密度打印,分辨率达到200DPI。
data
[
k
++]
=
0x68
;
data
[
k
++]
=
0x01
;
for
(
int
x
=
0
;
x
<
360
;
x
++)
{
for
(
int
m
=
0
;
m
<
3
;
m
++)
{
byte
[]
by
=
new
byte
[
8
];
for
(
int
n
=
0
;
n
<
8
;
n
++)
{
byte
b
=
px2Byte
(
x
,
i
*
24
+
m
*
8
+
7
-
n
,
bit
);
by
[
n
]
=
b
;
}
data
[
k
]
=
(
byte
)
changePointPx1
(
by
);
k
++;
}
}
data
[
k
++]
=
10
;
}
long
end
=
System
.
currentTimeMillis
();
long
str
=
end
-
start
;
return
data
;
}
/**
* 图片二值化,黑色是1,白色是0
*
* @param x 横坐标
* @param y 纵坐标
* @param bit 位图
* @return
*/
public
static
byte
px2Byte
(
int
x
,
int
y
,
Bitmap
bit
)
{
byte
b
;
if
(
y
>=
bit
.
getHeight
())
{
return
0
;
}
int
pixel
=
bit
.
getPixel
(
x
,
y
);
int
red
=
(
pixel
&
0x00ff0000
)
>>
16
;
// 取高两位
int
green
=
(
pixel
&
0x0000ff00
)
>>
8
;
// 取中两位
int
blue
=
pixel
&
0x000000ff
;
// 取低两位
int
gray
=
RGB2Gray
(
red
,
green
,
blue
);
if
(
gray
<
128
)
{
b
=
1
;
}
else
{
b
=
0
;
}
return
b
;
}
/**
* 图片灰度的转化
*
* @param r
* @param g
* @param b
* @return
*/
private
static
int
RGB2Gray
(
int
r
,
int
g
,
int
b
)
{
int
gray
=
(
int
)
(
0.29900
*
r
+
0.58700
*
g
+
0.11400
*
b
);
//灰度转化公式
return
gray
;
}
/**
* 对图片进行压缩(去除透明度)
*
* @param bitmapOrg
*/
public
static
Bitmap
compressPic
(
Bitmap
bitmapOrg
)
{
// 获取这个图片的宽和高
int
width
=
bitmapOrg
.
getWidth
();
int
height
=
bitmapOrg
.
getHeight
();
// 定义预转换成的图片的宽度和高度
int
newWidth
=
360
;
int
newHeight
=
360
;
Bitmap
targetBmp
=
Bitmap
.
createBitmap
(
newWidth
,
newHeight
,
Bitmap
.
Config
.
ARGB_8888
);
Canvas
targetCanvas
=
new
Canvas
(
targetBmp
);
targetCanvas
.
drawColor
(
0xffffffff
);
targetCanvas
.
drawBitmap
(
bitmapOrg
,
new
Rect
(
0
,
0
,
width
,
height
),
new
Rect
(
0
,
0
,
newWidth
,
newHeight
),
null
);
return
targetBmp
;
}
/**
* 对图片进行压缩(不去除透明度)
*
* @param bitmapOrg
*/
public
static
Bitmap
compressBitmap
(
Bitmap
bitmapOrg
)
{
// 加载需要操作的图片,这里是一张图片
// Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(),R.drawable.alipay);
// 获取这个图片的宽和高
int
width
=
bitmapOrg
.
getWidth
();
int
height
=
bitmapOrg
.
getHeight
();
// 定义预转换成的图片的宽度和高度
int
newWidth
=
360
;
int
newHeight
=
360
;
// 计算缩放率,新尺寸除原始尺寸
float
scaleWidth
=
((
float
)
newWidth
)
/
width
;
float
scaleHeight
=
((
float
)
newHeight
)
/
height
;
// 创建操作图片用的matrix对象
Matrix
matrix
=
new
Matrix
();
// 缩放图片动作
matrix
.
postScale
(
scaleWidth
,
scaleHeight
);
// 创建新的图片
Bitmap
resizedBitmap
=
Bitmap
.
createBitmap
(
bitmapOrg
,
0
,
0
,
width
,
height
,
matrix
,
true
);
// 将上面创建的Bitmap转换成Drawable对象,使得其可以使用在ImageView, ImageButton中
// BitmapDrawable bmd = new BitmapDrawable(resizedBitmap);
return
resizedBitmap
;
}
/**
* 将[1,0,0,1,0,0,0,1]这样的二进制转为化十进制的数值(效率更高)
*
* @param arry
* @return
*/
public
static
int
changePointPx1
(
byte
[]
arry
)
{
int
v
=
0
;
for
(
int
j
=
0
;
j
<
arry
.
length
;
j
++)
{
if
(
arry
[
j
]
==
1
)
{
v
=
v
|
1
<<
j
;
}
}
return
v
;
}
/**
* 将[1,0,0,1,0,0,0,1]这样的二进制转为化十进制的数值
*
* @param arry
* @return
*/
public
byte
changePointPx
(
byte
[]
arry
)
{
byte
v
=
0
;
for
(
int
i
=
0
;
i
<
8
;
i
++)
{
v
+=
v
+
arry
[
i
];
}
return
v
;
}
/**
* 得到位图的某个点的像素值
*
* @param bitmap
* @return
*/
public
byte
[]
getPicPx
(
Bitmap
bitmap
)
{
int
[]
pixels
=
new
int
[
bitmap
.
getWidth
()
*
bitmap
.
getHeight
()];
// 保存所有的像素的数组,图片宽×高
bitmap
.
getPixels
(
pixels
,
0
,
bitmap
.
getWidth
(),
0
,
0
,
bitmap
.
getWidth
(),
bitmap
.
getHeight
());
for
(
int
i
=
0
;
i
<
pixels
.
length
;
i
++)
{
int
clr
=
pixels
[
i
];
int
red
=
(
clr
&
0x00ff0000
)
>>
16
;
// 取高两位
int
green
=
(
clr
&
0x0000ff00
)
>>
8
;
// 取中两位
int
blue
=
clr
&
0x000000ff
;
// 取低两位
System
.
out
.
println
(
"r="
+
red
+
",g="
+
green
+
",b="
+
blue
);
}
return
null
;
}
}
print-module/src/main/java/com/joe/print/mvp/print/PrintStatus.java
→
print-module/src/main/java/com/joe/print/mvp/print/
Location
PrintStatus.java
View file @
414e7e7d
...
...
@@ -13,9 +13,9 @@ import com.sunmi.peripheral.printer.SunmiPrinterService;
* 版本:1.6.0
* 创建日期:2019/6/27
* 修订历史:2019/6/27
* 描述:
* 描述:
獲取本地商米、N5打印機狀態
*/
public
class
PrintStatus
{
public
class
Location
PrintStatus
{
public
static
boolean
initV2PrintStatus
(
Context
context
,
SunmiPrinterService
service
)
{
int
printerState
=
0
;
...
...
print-module/src/main/java/com/joe/print/mvp/print/Print.java
deleted
100644 → 0
View file @
3bebf347
//package com.joe.print.mvp.print;
//
//import android.content.Context;
//
//import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication;
//import com.gingersoft.gsa.cloud.ui.widget.dialog.LoadingDialog;
//
//import am.util.printer.PrintExecutor;
//import am.util.printer.PrintSocketHolder;
//import am.util.printer.PrinterWriter58mm;
//
///**
// * Created by Wyh on 2020/1/15.
// */
//public class Print implements PrintSocketHolder.OnStateChangedListener, PrintExecutor.OnPrintResultListener {
// private PrintExecutor executor;
// private SendPrint maker;
// private static Print print;
// private Context mContext;
// public static Print getInstance() {
// synchronized (Print.class) {
// if (print == null) {
// print = new Print();
// }
// }
// return print;
// }
//
// public void printOrder(Context context) {
// this.mContext = context;
// LoadingDialog.showNewDialogForLoading(GsaCloudApplication.getAppContext(),"初始化...",false);
// if (executor == null) {
// executor = new PrintExecutor("192.168.1.217", 9100, PrinterWriter58mm.TYPE_58);
// executor.setOnStateChangedListener(this);
// executor.setOnPrintResultListener(this);
// }
// if (maker == null) {
// maker = new SendPrint(context, 255, 580);
// }
// executor.setIp("192.168.1.218", 9100);
// executor.doPrinterRequestAsync(maker);
// }
//
//
// @Override
// public void onResult(int errorCode) {
// String msg;
// switch (errorCode) {
// case PrintSocketHolder.ERROR_0:
// //打印成功
// msg = "打印成功";
// break;
// case PrintSocketHolder.ERROR_2:
// //创建Socket失败
// msg = "連接打印機失敗";
// break;
// case PrintSocketHolder.ERROR_1:
// case PrintSocketHolder.ERROR_3:
// case PrintSocketHolder.ERROR_4:
// case PrintSocketHolder.ERROR_5:
// default:
// //打印失敗
// msg = "打印失敗";
//// LoadingDialog.cancelDialogForLoading();
// break;
// }
// LoadingDialog.setText(msg);
// }
//
// @Override
// public void onStateChanged(int state) {
// String msg = "";
// switch (state) {
// case PrintSocketHolder.STATE_0:
// case PrintSocketHolder.STATE_1:
// //创建Socket连接
// msg = "連接打印機...";
// break;
// case PrintSocketHolder.STATE_2:
// case PrintSocketHolder.STATE_3:
// //写入测试页面数据
// msg = "正在打印...";
// break;
// case PrintSocketHolder.STATE_4:
// msg = "正在關閉...";
//// LoadingDialog.cancelDialogForLoading();
// break;
// }
// LoadingDialog.setText(msg);
// }
//}
print-module/src/main/java/com/joe/print/mvp/print/PrintBill.java
0 → 100644
View file @
414e7e7d
package
com
.
joe
.
print
.
mvp
.
print
;
import
android.content.Context
;
import
android.graphics.Bitmap
;
import
android.view.View
;
import
android.widget.LinearLayout
;
import
android.widget.TextView
;
import
androidx.recyclerview.widget.LinearLayoutManager
;
import
androidx.recyclerview.widget.RecyclerView
;
import
com.gingersoft.gsa.cloud.base.adapter.print.BillAdapter
;
import
com.gingersoft.gsa.cloud.base.adapter.print.BillTypeAdapter
;
import
com.gingersoft.gsa.cloud.base.adapter.print.FoodAdapter
;
import
com.gingersoft.gsa.cloud.base.common.bean.BillingBean
;
import
com.gingersoft.gsa.cloud.base.common.bean.OrderDetail
;
import
com.gingersoft.gsa.cloud.base.common.bean.PayMethod
;
import
com.gingersoft.gsa.cloud.base.common.bean.TableBean
;
import
com.gingersoft.gsa.cloud.base.common.bean.mealManage.MyOrderManage
;
import
com.gingersoft.gsa.cloud.base.common.bean.mealManage.OpenTableManage
;
import
com.gingersoft.gsa.cloud.base.utils.MoneyUtil
;
import
com.gingersoft.gsa.cloud.base.utils.time.TimeUtils
;
import
com.joe.print.R
;
import
java.math.BigDecimal
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
/**
* 結賬單
*/
public
class
PrintBill
extends
PrinterInIt
{
@Override
public
Map
<
String
,
List
<
Bitmap
>>
getPrintBitmap
(
Context
mContext
)
{
Map
<
String
,
List
<
Bitmap
>>
bitmapMaps
=
new
HashMap
<>();
List
<
Bitmap
>
bitmaps
=
new
ArrayList
<>();
bitmaps
.
add
(
getServeBitmap
(
mContext
));
bitmapMaps
.
put
(
""
,
bitmaps
);
return
bitmapMaps
;
}
/**
* 獲取"結賬單"圖片
*
* @param context
* @return
*/
private
Bitmap
getServeBitmap
(
Context
context
)
{
List
<
OrderDetail
>
foodList
=
MyOrderManage
.
getInstance
().
getOrderFoodList
();
TableBean
.
DataBean
tableBean
=
OpenTableManage
.
getDefault
().
getTableBean
();
if
(
foodList
==
null
||
foodList
.
size
()
<=
0
||
tableBean
==
null
)
{
return
null
;
}
View
view
=
LinearLayout
.
inflate
(
context
,
R
.
layout
.
print_layout_print_bill
,
null
);
TextView
brandName
=
view
.
findViewById
(
R
.
id
.
tv_brand_name
);
TextView
restaurantName
=
view
.
findViewById
(
R
.
id
.
tv_restaurant_name
);
TextView
topOrderNum
=
view
.
findViewById
(
R
.
id
.
tv_print_bill_order_num
);
//頂部的訂單號
TextView
tableNum
=
view
.
findViewById
(
R
.
id
.
tv_dining_table_number
);
TextView
people
=
view
.
findViewById
(
R
.
id
.
tv_people
);
TextView
orderNum
=
view
.
findViewById
(
R
.
id
.
tv_order_num
);
TextView
orderData
=
view
.
findViewById
(
R
.
id
.
tv_date
);
RecyclerView
rvFood
=
view
.
findViewById
(
R
.
id
.
rv_food
);
RecyclerView
rvBillAmount
=
view
.
findViewById
(
R
.
id
.
rv_bill_amount
);
TextView
mTvTotalAmount
=
view
.
findViewById
(
R
.
id
.
tv_total_amount
);
TextView
checkOutTime
=
view
.
findViewById
(
R
.
id
.
tv_checkout_time
);
TextView
line_food_info
=
view
.
findViewById
(
R
.
id
.
line_food_info
);
RecyclerView
rvPayType
=
view
.
findViewById
(
R
.
id
.
rv_print_pay_type
);
//顯示支付方式
tableNum
.
setText
(
tableBean
.
getTableName
());
people
.
setText
(
OpenTableManage
.
getDefault
().
getPeopleNumber
()
+
""
);
orderData
.
setText
(
TimeUtils
.
parseTimeRepeat
(
tableBean
.
getCreateTime
(),
TimeUtils
.
DEFAULT_DATE_FORMAT
));
checkOutTime
.
setText
(
TimeUtils
.
getCurrentTimeInString
(
TimeUtils
.
DEFAULT_DATE_FORMAT
));
FoodAdapter
foodAdapter
=
new
FoodAdapter
(
foodList
);
rvFood
.
setLayoutManager
(
new
LinearLayoutManager
(
context
));
rvFood
.
setAdapter
(
foodAdapter
);
List
<
BillingBean
>
billingBeans
=
new
ArrayList
<>();
if
(
billingBeans
.
size
()
<=
0
)
{
line_food_info
.
setVisibility
(
View
.
GONE
);
}
else
{
BillAdapter
billAdapter
=
new
BillAdapter
(
billingBeans
);
rvBillAmount
.
setLayoutManager
(
new
LinearLayoutManager
(
context
));
rvBillAmount
.
setAdapter
(
billAdapter
);
}
if
(
OpenTableManage
.
getDefault
().
getTableBean
()
!=
null
)
{
tableNum
.
setText
(
OpenTableManage
.
getDefault
().
getTableBean
().
getTableName
());
people
.
setText
(
OpenTableManage
.
getDefault
().
getPeopleNumber
()
+
""
);
}
if
(
MyOrderManage
.
getInstance
().
getOrderId
()
!=
-
1
)
{
orderNum
.
setText
(
MyOrderManage
.
getInstance
().
getOrderId
()
+
""
);
}
BigDecimal
totalAmount
=
new
BigDecimal
(
0
);
for
(
OrderDetail
OrderDetail
:
MyOrderManage
.
getInstance
().
getOrderFoodList
())
{
totalAmount
=
MoneyUtil
.
sum
(
totalAmount
,
OrderDetail
.
getPrice
());
}
//總金額
mTvTotalAmount
.
setText
(
totalAmount
+
""
);
List
<
PayMethod
>
payBillMoneys
=
MyOrderManage
.
getInstance
().
getBillMoney
();
rvPayType
.
setLayoutManager
(
new
LinearLayoutManager
(
context
));
rvPayType
.
setAdapter
(
new
BillTypeAdapter
(
payBillMoneys
));
//加载条形码
// ImageView ivBarCode = view.findViewById(R.id.iv_bar_code);
// ivBarCode.setImageBitmap(BitmapUtil.generateBitmap("12312112131", 2, 450, 150));
return
viewToBitmap
(
context
,
view
);
}
}
print-module/src/main/java/com/joe/print/mvp/print/PrintCleanMachine.java
0 → 100644
View file @
414e7e7d
package
com
.
joe
.
print
.
mvp
.
print
;
import
android.content.Context
;
import
android.graphics.Bitmap
;
import
android.view.View
;
import
com.gingersoft.gsa.cloud.base.utils.PrintTransitUtils
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
/**
* 清機報表
*/
public
class
PrintCleanMachine
extends
PrinterInIt
{
@Override
public
Map
<
String
,
List
<
Bitmap
>>
getPrintBitmap
(
Context
mContext
)
{
Map
<
String
,
List
<
Bitmap
>>
bitmapMaps
=
new
HashMap
<>();
List
<
Bitmap
>
bitmaps
=
new
ArrayList
<>();
bitmaps
.
add
(
getServeBitmap
(
mContext
));
bitmapMaps
.
put
(
""
,
bitmaps
);
return
bitmapMaps
;
}
/**
* 獲取"清機報表"圖片
*
* @param mContext
* @return
*/
private
Bitmap
getServeBitmap
(
Context
mContext
)
{
View
view
=
PrintTransitUtils
.
getInstance
().
getPrintView
();
if
(
view
!=
null
)
{
return
viewToBitmap
(
mContext
,
view
);
}
return
null
;
}
}
print-module/src/main/java/com/joe/print/mvp/print/PrintKitchen.java
0 → 100644
View file @
414e7e7d
package
com
.
joe
.
print
.
mvp
.
print
;
import
android.content.Context
;
import
android.graphics.Bitmap
;
import
android.view.View
;
import
android.widget.LinearLayout
;
import
android.widget.TextView
;
import
androidx.recyclerview.widget.LinearLayoutManager
;
import
androidx.recyclerview.widget.RecyclerView
;
import
com.gingersoft.gsa.cloud.base.adapter.print.KitChenPrintFoodAdapter
;
import
com.gingersoft.gsa.cloud.base.application.GsaCloudApplication
;
import
com.gingersoft.gsa.cloud.base.common.bean.OrderDetail
;
import
com.gingersoft.gsa.cloud.base.common.bean.mealManage.MyOrderManage
;
import
com.gingersoft.gsa.cloud.base.common.bean.mealManage.OpenTableManage
;
import
com.gingersoft.gsa.cloud.base.utils.other.TextUtil
;
import
com.gingersoft.gsa.cloud.base.utils.time.TimeUtils
;
import
com.joe.print.R
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Objects
;
/**
* 廚房單打印
*/
public
class
PrintKitchen
extends
PrinterInIt
{
@Override
public
Map
<
String
,
List
<
Bitmap
>>
getPrintBitmap
(
Context
mContext
)
{
Map
<
String
,
List
<
Bitmap
>>
bitmapMaps
=
new
HashMap
<>();
List
<
OrderDetail
>
orderDetails
=
MyOrderManage
.
getInstance
().
getNewFoodList
();
if
(
orderDetails
!=
null
)
{
//廚房單,可能會有多個IP打印
//獲得ip打印列表,
//再將食品數據根據打印位置分組。
//打印一組之後,關閉連接,切換第二台打印機ip,如此循環
//打印完成之後,返回所有打印結果。
Map
<
String
,
List
<
OrderDetail
>>
foodMaps
=
new
HashMap
<>();
String
emptyPrintLocation
=
"null"
;
//部分食品沒有打印位置時設置為此key,比如這是第一個食品,沒有打印位置時
int
lastEmptyPrintLocationIndex
=
0
;
//上一次遍歷到第一個食品時都沒有打印位置時,開始的食品位置
//將所有食品進行遍歷,分組
for
(
int
i
=
0
;
i
<
orderDetails
.
size
();
i
++)
{
OrderDetail
food
=
orderDetails
.
get
(
i
);
if
(
TextUtil
.
isEmptyOrNullOrUndefined
(
food
.
getPrintseting
()))
{
//如果沒有打印位置,向上尋找
if
(
i
==
0
)
{
food
.
setPrintseting
(
emptyPrintLocation
);
addToMap
(
foodMaps
,
food
);
}
else
{
for
(
int
j
=
i
-
1
;
j
>=
lastEmptyPrintLocationIndex
;
j
--)
{
//一直遍歷,直到找到有打印位置的食品
// 如果所有食品都沒有打印位置的情況,為了避免多次遍歷
// 如果本次遍歷到第一個食品,都沒有打印位置,記錄下這一次開始遍歷的下標,下一次遍歷到這個位置就停止
if
(!
TextUtil
.
isEmptyOrNullOrUndefined
(
orderDetails
.
get
(
j
).
getPrintseting
()))
{
//一直遍歷,直到找到有打印位置的食品
//判斷是否帶*號
if
(
orderDetails
.
get
(
j
).
getPrintseting
().
contains
(
"*"
))
{
//帶*號,則需要取得通過下標加去掉*號的標識來取得map中的集合,將i食品裝進去,這樣就能打印在一張紙上
//如果沒取得集合,則通過打印位置去map取得集合,將j食品從map中移除,將這個j食品的和i食品裝一起
// 生成新的key。為當前下標+"標識符"+去掉*的打印位置,不帶*的key取得的食品集合才能打印在一張紙上。
String
newKey
=
j
+
DELIMITER
+
orderDetails
.
get
(
j
).
getPrintseting
().
replaceAll
(
"\\*"
,
""
);
//通過newKey取得map中的集合
List
<
OrderDetail
>
newKeyfoods
=
foodMaps
.
get
(
newKey
);
if
(
newKeyfoods
!=
null
)
{
newKeyfoods
.
add
(
food
);
}
else
{
List
<
OrderDetail
>
printsetingFoods
=
foodMaps
.
get
(
orderDetails
.
get
(
j
).
getPrintseting
());
if
(
printsetingFoods
!=
null
)
{
//理論上不會為空
printsetingFoods
.
remove
(
printsetingFoods
.
lastIndexOf
(
orderDetails
.
get
(
j
)));
//移除掉之後,put到newkey中
List
<
OrderDetail
>
newFoods
=
new
ArrayList
<>();
newFoods
.
add
(
orderDetails
.
get
(
j
));
newFoods
.
add
(
food
);
foodMaps
.
put
(
newKey
,
newFoods
);
}
}
break
;
}
else
{
//沒有*號,不需要做多餘的操作
food
.
setPrintseting
(
orderDetails
.
get
(
j
).
getPrintseting
());
addToMap
(
foodMaps
,
food
);
}
}
else
if
(
j
==
lastEmptyPrintLocationIndex
)
{
//從i到0的打印位置都沒有,記錄下i,下次只遍歷到i就停下來
lastEmptyPrintLocationIndex
=
i
;
//如果找到最初的那個食品,也沒有打印位置,設置打印位置為"null"
food
.
setPrintseting
(
emptyPrintLocation
);
addToMap
(
foodMaps
,
food
);
}
}
}
}
else
{
//有打印位置,
//已經保存過這個位置的,
addToMap
(
foodMaps
,
food
);
}
}
//通過打印位置生成多張用於打印的bitmap
for
(
Map
.
Entry
<
String
,
List
<
OrderDetail
>>
entry
:
foodMaps
.
entrySet
())
{
String
key
=
entry
.
getKey
();
List
<
Bitmap
>
bitmaps
=
new
ArrayList
<>();
if
(
key
.
contains
(
"*"
))
{
//如果帶*號,這個集合就需要切紙,每個食品都需要單獨在一張廚房單上
for
(
OrderDetail
orderDetail
:
entry
.
getValue
())
{
List
<
OrderDetail
>
orders
=
new
ArrayList
<>();
//這裡new集合是因為下面的方法需要的參數是list集合
orders
.
add
(
orderDetail
);
Bitmap
bitmap
=
getKitChenPrintBitmap
(
mContext
,
orders
);
bitmaps
.
add
(
bitmap
);
}
}
else
{
Bitmap
bitmap
=
getKitChenPrintBitmap
(
mContext
,
entry
.
getValue
());
//不帶*號,所有同樣廚房位置的食品都在一張紙上
bitmaps
.
add
(
bitmap
);
}
bitmapMaps
.
put
(
key
,
bitmaps
);
}
}
return
bitmapMaps
;
}
private
void
addToMap
(
Map
<
String
,
List
<
OrderDetail
>>
foodMaps
,
OrderDetail
food
)
{
if
(
foodMaps
.
get
(
food
.
getPrintseting
())
!=
null
)
{
Objects
.
requireNonNull
(
foodMaps
.
get
(
food
.
getPrintseting
())).
add
(
food
);
}
else
{
List
<
OrderDetail
>
newFoods
=
new
ArrayList
<>();
newFoods
.
add
(
food
);
foodMaps
.
put
(
food
.
getPrintseting
(),
newFoods
);
}
}
/**
* 獲取"廚房單"圖片
*
* @param context
* @return
*/
private
Bitmap
getKitChenPrintBitmap
(
Context
context
,
List
<
OrderDetail
>
foodList
)
{
if
(
foodList
==
null
||
foodList
.
size
()
<=
0
)
{
return
null
;
}
View
view
=
LinearLayout
.
inflate
(
context
,
R
.
layout
.
print_kitchen
,
null
);
TextView
tvTableNumber
=
view
.
findViewById
(
R
.
id
.
tv_kitchen_print_table_number
);
TextView
tvOrderNumber
=
view
.
findViewById
(
R
.
id
.
tv_order_num
);
TextView
tvOpeningTime
=
view
.
findViewById
(
R
.
id
.
tv_opening_time
);
TextView
tvOrderTime
=
view
.
findViewById
(
R
.
id
.
tv_order_time
);
TextView
tvKitChenLocation
=
view
.
findViewById
(
R
.
id
.
tv_kitchen_location
);
TextView
tvPeople
=
view
.
findViewById
(
R
.
id
.
tv_people
);
TextView
tvOperator
=
view
.
findViewById
(
R
.
id
.
tv_operator
);
RecyclerView
rvFood
=
view
.
findViewById
(
R
.
id
.
rv_kitchen_food
);
TextView
tvTableNumber2
=
view
.
findViewById
(
R
.
id
.
tv_kitchen_print_table_number2
);
if
(
foodList
.
size
()
>
0
&&
foodList
.
get
(
0
)
!=
null
)
{
KitChenPrintFoodAdapter
foodAdapter
=
new
KitChenPrintFoodAdapter
(
foodList
);
rvFood
.
setLayoutManager
(
new
LinearLayoutManager
(
context
));
rvFood
.
setAdapter
(
foodAdapter
);
//廚房位置
if
(!
TextUtil
.
isEmptyOrNullOrUndefined
(
foodList
.
get
(
0
).
getPrintseting
()))
{
tvKitChenLocation
.
setText
(
foodList
.
get
(
0
).
getPrintseting
());
//.replace("*", "")
tvKitChenLocation
.
setVisibility
(
View
.
VISIBLE
);
}
else
{
tvKitChenLocation
.
setVisibility
(
View
.
GONE
);
}
}
if
(
OpenTableManage
.
getDefault
().
getTableBean
()
!=
null
)
{
// 台號
tvTableNumber
.
setText
(
OpenTableManage
.
getDefault
().
getTableBean
().
getTableName
()
+
""
);
tvTableNumber2
.
setText
(
OpenTableManage
.
getDefault
().
getTableBean
().
getTableName
()
+
""
);
//人數
tvPeople
.
setText
(
OpenTableManage
.
getDefault
().
getPeopleNumber
()
+
""
);
//訂單號
tvOrderNumber
.
setText
(
""
+
MyOrderManage
.
getInstance
().
getOrderId
());
//開台時間
tvOpeningTime
.
setText
(
TimeUtils
.
parseTimeRepeat
(
OpenTableManage
.
getDefault
().
getTableBean
().
getCreateTime
(),
TimeUtils
.
DEFAULT_DATE_FORMAT
));
}
//落單時間,為當前時間
tvOrderTime
.
setText
(
TimeUtils
.
getCurrentTimeInString
(
TimeUtils
.
DEFAULT_DATE_FORMAT
));
//操作人員
tvOperator
.
setText
(
GsaCloudApplication
.
userName
);
return
viewToBitmap
(
context
,
view
);
}
}
print-module/src/main/java/com/joe/print/mvp/print/PrintListener.java
0 → 100644
View file @
414e7e7d
package
com
.
joe
.
print
.
mvp
.
print
;
public
interface
PrintListener
{
void
printStateChanged
(
int
state
);
void
printSuccess
();
void
printFile
();
}
print-module/src/main/java/com/joe/print/mvp/print/PrintServe.java
0 → 100644
View file @
414e7e7d
package
com
.
joe
.
print
.
mvp
.
print
;
import
android.content.Context
;
import
android.graphics.Bitmap
;
import
android.view.View
;
import
android.widget.LinearLayout
;
import
android.widget.TextView
;
import
androidx.recyclerview.widget.LinearLayoutManager
;
import
androidx.recyclerview.widget.RecyclerView
;
import
com.gingersoft.gsa.cloud.base.adapter.print.BillAdapter
;
import
com.gingersoft.gsa.cloud.base.adapter.print.FoodAdapter
;
import
com.gingersoft.gsa.cloud.base.common.bean.BillingBean
;
import
com.gingersoft.gsa.cloud.base.common.bean.OrderDetail
;
import
com.gingersoft.gsa.cloud.base.common.bean.TableBean
;
import
com.gingersoft.gsa.cloud.base.common.bean.mealManage.MyOrderManage
;
import
com.gingersoft.gsa.cloud.base.common.bean.mealManage.OpenTableManage
;
import
com.gingersoft.gsa.cloud.base.utils.MoneyUtil
;
import
com.gingersoft.gsa.cloud.base.utils.time.TimeUtils
;
import
com.joe.print.R
;
import
java.math.BigDecimal
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
/**
* 上菜紙打印
*/
public
class
PrintServe
extends
PrinterInIt
{
@Override
public
Map
<
String
,
List
<
Bitmap
>>
getPrintBitmap
(
Context
mContext
)
{
Map
<
String
,
List
<
Bitmap
>>
bitmapMaps
=
new
HashMap
<>();
List
<
Bitmap
>
bitmaps
=
new
ArrayList
<>();
bitmaps
.
add
(
getServeBitmap
(
mContext
));
bitmapMaps
.
put
(
""
,
bitmaps
);
return
bitmapMaps
;
}
/**
* 獲取"印單"圖片
*
* @param context
* @return
*/
private
Bitmap
getServeBitmap
(
Context
context
)
{
List
<
OrderDetail
>
foodList
=
MyOrderManage
.
getInstance
().
getNewFoodList
();
if
(
foodList
==
null
||
foodList
.
size
()
<=
0
)
{
return
null
;
}
View
view
=
LinearLayout
.
inflate
(
context
,
R
.
layout
.
print_layout_print
,
null
);
TextView
brandName
=
view
.
findViewById
(
R
.
id
.
tv_brand_name
);
TextView
restaurantName
=
view
.
findViewById
(
R
.
id
.
tv_restaurant_name
);
TextView
tableNum
=
view
.
findViewById
(
R
.
id
.
tv_dining_table_number
);
TextView
people
=
view
.
findViewById
(
R
.
id
.
tv_people
);
TextView
orderNum
=
view
.
findViewById
(
R
.
id
.
tv_order_num
);
TextView
orderData
=
view
.
findViewById
(
R
.
id
.
tv_date
);
RecyclerView
rvFood
=
view
.
findViewById
(
R
.
id
.
rv_food
);
RecyclerView
rvBillAmount
=
view
.
findViewById
(
R
.
id
.
rv_bill_amount
);
TextView
mTvTotalAmount
=
view
.
findViewById
(
R
.
id
.
tv_total_amount
);
TextView
checkOutTime
=
view
.
findViewById
(
R
.
id
.
tv_checkout_time
);
TextView
line_food_info
=
view
.
findViewById
(
R
.
id
.
line_food_info
);
TableBean
.
DataBean
tableBean
=
OpenTableManage
.
getDefault
().
getTableBean
();
tableNum
.
setText
(
tableBean
.
getTableName
());
people
.
setText
(
OpenTableManage
.
getDefault
().
getPeopleNumber
()
+
""
);
orderData
.
setText
(
TimeUtils
.
getCurrentTimeInString
(
TimeUtils
.
DEFAULT_DATE_FORMAT
));
checkOutTime
.
setText
(
TimeUtils
.
getCurrentTimeInString
(
TimeUtils
.
DEFAULT_DATE_FORMAT
));
FoodAdapter
foodAdapter
=
new
FoodAdapter
(
foodList
);
rvFood
.
setLayoutManager
(
new
LinearLayoutManager
(
context
));
rvFood
.
setAdapter
(
foodAdapter
);
List
<
BillingBean
>
billingBeans
=
new
ArrayList
<>();
if
(
billingBeans
.
size
()
<=
0
)
{
line_food_info
.
setVisibility
(
View
.
GONE
);
}
else
{
BillAdapter
billAdapter
=
new
BillAdapter
(
billingBeans
);
rvBillAmount
.
setLayoutManager
(
new
LinearLayoutManager
(
context
));
rvBillAmount
.
setAdapter
(
billAdapter
);
}
if
(
OpenTableManage
.
getDefault
().
getTableBean
()
!=
null
)
{
tableNum
.
setText
(
OpenTableManage
.
getDefault
().
getTableBean
().
getTableName
());
people
.
setText
(
OpenTableManage
.
getDefault
().
getPeopleNumber
()
+
""
);
}
if
(
MyOrderManage
.
getInstance
().
getOrderId
()
!=
-
1
)
{
orderNum
.
setText
(
MyOrderManage
.
getInstance
().
getOrderId
()
+
""
);
}
BigDecimal
totalAmount
=
new
BigDecimal
(
0
);
for
(
OrderDetail
OrderDetail
:
foodList
)
{
totalAmount
=
MoneyUtil
.
sum
(
totalAmount
,
MoneyUtil
.
priceCalculation
(
OrderDetail
.
getPrice
(),
OrderDetail
.
getNumber
()));
}
//總金額
mTvTotalAmount
.
setText
(
totalAmount
+
""
);
//加载条形码
// ImageView ivBarCode = view.findViewById(R.id.iv_bar_code);
// ivBarCode.setImageBitmap(BitmapUtil.generateBitmap("12312112131", 2, 450, 150));
return
viewToBitmap
(
context
,
view
);
}
}
print-module/src/main/java/com/joe/print/mvp/print/PrintSlip.java
0 → 100644
View file @
414e7e7d
package
com
.
joe
.
print
.
mvp
.
print
;
import
android.content.Context
;
import
android.graphics.Bitmap
;
import
android.view.View
;
import
android.widget.LinearLayout
;
import
android.widget.TextView
;
import
androidx.recyclerview.widget.LinearLayoutManager
;
import
androidx.recyclerview.widget.RecyclerView
;
import
com.gingersoft.gsa.cloud.base.adapter.print.BillAdapter
;
import
com.gingersoft.gsa.cloud.base.adapter.print.FoodAdapter
;
import
com.gingersoft.gsa.cloud.base.common.bean.BillingBean
;
import
com.gingersoft.gsa.cloud.base.common.bean.OrderDetail
;
import
com.gingersoft.gsa.cloud.base.common.bean.TableBean
;
import
com.gingersoft.gsa.cloud.base.common.bean.mealManage.MyOrderManage
;
import
com.gingersoft.gsa.cloud.base.common.bean.mealManage.OpenTableManage
;
import
com.gingersoft.gsa.cloud.base.utils.MoneyUtil
;
import
com.gingersoft.gsa.cloud.base.utils.time.TimeUtils
;
import
com.joe.print.R
;
import
java.math.BigDecimal
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
/**
* 印單打印
*/
public
class
PrintSlip
extends
PrinterInIt
{
@Override
public
Map
<
String
,
List
<
Bitmap
>>
getPrintBitmap
(
Context
mContext
)
{
List
<
Bitmap
>
bitmaps
=
new
ArrayList
<>();
bitmaps
.
add
(
getServeBitmap
(
mContext
));
//這裡可能還需要加上廚房單的內容,有未送單的食品時。
PrintKitchen
kitchen
=
new
PrintKitchen
();
Map
<
String
,
List
<
Bitmap
>>
bitmapMaps
=
new
HashMap
<>(
kitchen
.
getPrintBitmap
(
mContext
));
bitmapMaps
.
put
(
""
,
bitmaps
);
return
bitmapMaps
;
}
/**
* 獲取"印單"圖片
*
* @param context
* @return
*/
private
Bitmap
getServeBitmap
(
Context
context
)
{
List
<
OrderDetail
>
foodList
=
MyOrderManage
.
getInstance
().
getNewFoodList
();
if
(
foodList
==
null
||
foodList
.
size
()
<=
0
)
{
return
null
;
}
View
view
=
LinearLayout
.
inflate
(
context
,
R
.
layout
.
print_layout_print
,
null
);
TextView
brandName
=
view
.
findViewById
(
R
.
id
.
tv_brand_name
);
TextView
restaurantName
=
view
.
findViewById
(
R
.
id
.
tv_restaurant_name
);
TextView
tableNum
=
view
.
findViewById
(
R
.
id
.
tv_dining_table_number
);
TextView
people
=
view
.
findViewById
(
R
.
id
.
tv_people
);
TextView
orderNum
=
view
.
findViewById
(
R
.
id
.
tv_order_num
);
TextView
orderData
=
view
.
findViewById
(
R
.
id
.
tv_date
);
RecyclerView
rvFood
=
view
.
findViewById
(
R
.
id
.
rv_food
);
RecyclerView
rvBillAmount
=
view
.
findViewById
(
R
.
id
.
rv_bill_amount
);
TextView
mTvTotalAmount
=
view
.
findViewById
(
R
.
id
.
tv_total_amount
);
TextView
checkOutTime
=
view
.
findViewById
(
R
.
id
.
tv_checkout_time
);
TextView
line_food_info
=
view
.
findViewById
(
R
.
id
.
line_food_info
);
TableBean
.
DataBean
tableBean
=
OpenTableManage
.
getDefault
().
getTableBean
();
tableNum
.
setText
(
tableBean
.
getTableName
());
people
.
setText
(
OpenTableManage
.
getDefault
().
getPeopleNumber
()
+
""
);
orderData
.
setText
(
TimeUtils
.
getCurrentTimeInString
(
TimeUtils
.
DEFAULT_DATE_FORMAT
));
checkOutTime
.
setText
(
TimeUtils
.
getCurrentTimeInString
(
TimeUtils
.
DEFAULT_DATE_FORMAT
));
FoodAdapter
foodAdapter
=
new
FoodAdapter
(
foodList
);
rvFood
.
setLayoutManager
(
new
LinearLayoutManager
(
context
));
rvFood
.
setAdapter
(
foodAdapter
);
List
<
BillingBean
>
billingBeans
=
new
ArrayList
<>();
if
(
billingBeans
.
size
()
<=
0
)
{
line_food_info
.
setVisibility
(
View
.
GONE
);
}
else
{
BillAdapter
billAdapter
=
new
BillAdapter
(
billingBeans
);
rvBillAmount
.
setLayoutManager
(
new
LinearLayoutManager
(
context
));
rvBillAmount
.
setAdapter
(
billAdapter
);
}
if
(
OpenTableManage
.
getDefault
().
getTableBean
()
!=
null
)
{
tableNum
.
setText
(
OpenTableManage
.
getDefault
().
getTableBean
().
getTableName
());
people
.
setText
(
OpenTableManage
.
getDefault
().
getPeopleNumber
()
+
""
);
}
if
(
MyOrderManage
.
getInstance
().
getOrderId
()
!=
-
1
)
{
orderNum
.
setText
(
MyOrderManage
.
getInstance
().
getOrderId
()
+
""
);
}
BigDecimal
totalAmount
=
new
BigDecimal
(
0
);
for
(
OrderDetail
OrderDetail
:
foodList
)
{
totalAmount
=
MoneyUtil
.
sum
(
totalAmount
,
MoneyUtil
.
priceCalculation
(
OrderDetail
.
getPrice
(),
OrderDetail
.
getNumber
()));
}
//總金額
mTvTotalAmount
.
setText
(
totalAmount
+
""
);
//加载条形码
// ImageView ivBarCode = view.findViewById(R.id.iv_bar_code);
// ivBarCode.setImageBitmap(BitmapUtil.generateBitmap("12312112131", 2, 450, 150));
return
viewToBitmap
(
context
,
view
);
}
}
print-module/src/main/java/com/joe/print/mvp/print/PrintTest.java
0 → 100644
View file @
414e7e7d
package
com
.
joe
.
print
.
mvp
.
print
;
import
android.content.Context
;
import
android.graphics.Bitmap
;
import
android.view.View
;
import
android.widget.LinearLayout
;
import
com.joe.print.R
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
/**
* 測試頁打印
*/
public
class
PrintTest
extends
PrinterInIt
{
@Override
public
Map
<
String
,
List
<
Bitmap
>>
getPrintBitmap
(
Context
mContext
)
{
Map
<
String
,
List
<
Bitmap
>>
bitmapMaps
=
new
HashMap
<>();
List
<
Bitmap
>
bitmaps
=
new
ArrayList
<>();
bitmaps
.
add
(
getTestPrintBitmap
(
mContext
));
bitmapMaps
.
put
(
""
,
bitmaps
);
return
bitmapMaps
;
}
/**
* 獲取測試打印bitmap
*
* @param context
* @return
*/
private
Bitmap
getTestPrintBitmap
(
Context
context
)
{
View
view
=
LinearLayout
.
inflate
(
context
,
R
.
layout
.
print_test
,
null
);
return
viewToBitmap
(
context
,
view
);
}
}
print-module/src/main/java/com/joe/print/mvp/print/PrintUtils.java
View file @
414e7e7d
...
...
@@ -82,6 +82,8 @@ public class PrintUtils {
private
static
List
<
Bitmap
>
getKitchenBitmap
(
Context
mContext
)
{
List
<
Bitmap
>
bitmaps
=
new
ArrayList
<>();
// Map<String, List<Bitmap>> bitmapMaps = new HashMap<>();
List
<
OrderDetail
>
orderDetails
=
MyOrderManage
.
getInstance
().
getNewFoodList
();
if
(
orderDetails
!=
null
)
{
//廚房單,可能會有多個IP打印
...
...
@@ -152,17 +154,21 @@ public class PrintUtils {
//通過打印位置生成多張用於打印的bitmap
for
(
Map
.
Entry
<
String
,
List
<
OrderDetail
>>
entry
:
foodMaps
.
entrySet
())
{
String
key
=
entry
.
getKey
();
// List<Bitmap> bitmaps1 = new ArrayList<>();
if
(
key
.
contains
(
"*"
))
{
//如果帶*號,這個集合就需要切紙,每個食品都需要單獨在一張廚房單上
for
(
OrderDetail
orderDetail
:
entry
.
getValue
())
{
List
<
OrderDetail
>
orders
=
new
ArrayList
<>();
//這裡new集合是因為下面的方法需要的參數是list集合
orders
.
add
(
orderDetail
);
bitmaps
.
add
(
PrintUtils
.
getKitChenPrintBitmap
(
mContext
,
orders
));
// bitmaps1.add(PrintUtils.getKitChenPrintBitmap(mContext, orders));
}
}
else
{
//不帶*號,所有同樣廚房位置的食品都在一張紙上
bitmaps
.
add
(
PrintUtils
.
getKitChenPrintBitmap
(
mContext
,
entry
.
getValue
()));
// bitmaps1.add(PrintUtils.getKitChenPrintBitmap(mContext, entry.getValue()));
}
// bitmapMaps.put(key, bitmaps1);
}
}
//通過遍歷map進行打印
...
...
print-module/src/main/java/com/joe/print/mvp/print/PrinterInIt.java
0 → 100644
View file @
414e7e7d
package
com
.
joe
.
print
.
mvp
.
print
;
import
android.app.Dialog
;
import
android.content.Context
;
import
android.graphics.Bitmap
;
import
android.os.Build
;
import
android.os.IBinder
;
import
android.os.RemoteException
;
import
android.util.Log
;
import
android.view.View
;
import
androidx.core.content.ContextCompat
;
import
androidx.recyclerview.widget.LinearLayoutManager
;
import
androidx.recyclerview.widget.RecyclerView
;
import
com.gingersoft.gsa.cloud.base.application.GsaCloudApplication
;
import
com.gingersoft.gsa.cloud.base.utils.AidlUtil
;
import
com.gingersoft.gsa.cloud.base.utils.constans.Constans
;
import
com.gingersoft.gsa.cloud.base.utils.other.SPUtils
;
import
com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils
;
import
com.gingersoft.gsa.cloud.base.utils.view.ImageUtils
;
import
com.gingersoft.gsa.cloud.base.utils.view.LayoutToBitmapUtils
;
import
com.gingersoft.gsa.cloud.base.widget.DialogUtils
;
import
com.gingersoft.gsa.cloud.constans.PrintConstans
;
import
com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean
;
import
com.gingersoft.gsa.cloud.print.PrintExecutor
;
import
com.gingersoft.gsa.cloud.print.PrintSocketHolder
;
import
com.gingersoft.gsa.cloud.print.PrinterWriter58mm
;
import
com.gingersoft.gsa.cloud.print.PrinterWriter80mm
;
import
com.hyweb.n5.lib.constant.PrinterConstant
;
import
com.hyweb.n5.lib.util.PrinterUtil
;
import
com.hyweb.n5.server.aidl.IOnPrintCallback
;
import
com.jess.arms.utils.ArmsUtils
;
import
com.joe.print.R
;
import
com.joe.print.mvp.ui.activity.PrintActivity
;
import
com.joe.print.mvp.ui.adapter.DialogPrinterListAdapter
;
import
com.joe.print.mvp.ui.adapter.PrintFailListAdapter
;
import
com.joe.print.mvp.ui.adapter.PrintFileBitmapAdapter
;
import
com.sunmi.peripheral.printer.InnerResultCallbcak
;
import
com.yanzhenjie.recyclerview.widget.DefaultItemDecoration
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Objects
;
public
abstract
class
PrinterInIt
implements
PrintSocketHolder
.
OnStateChangedListener
,
PrintExecutor
.
OnPrintResultListener
{
public
final
static
int
PRINT_TEST
=
-
1
;
//測試頁
public
final
static
int
PRINT_SERVE
=
0
;
//上菜紙
public
final
static
int
PRINT_SLIP
=
1
;
//印單
public
final
static
int
PRINT_BILL
=
2
;
//結賬單
public
final
static
int
PRINT_KITCHEN
=
3
;
//送單,廚房單
public
final
static
int
PRINT_CLEAN_MACHINE
=
4
;
//清機報表
private
final
static
int
SUNMI_PAPER_WIDTH
=
360
;
//商米打印機紙張寬度
private
final
static
int
N5_PAPER_WIDTH
=
500
;
//N5打印機紙張寬度
final
static
String
DELIMITER
=
"/"
;
//將打印位置區分開來。。。。,暫時只有廚房單用到
private
Context
mContext
;
private
PrintListener
printListener
;
private
Map
<
String
,
List
<
Bitmap
>>
listMap
;
public
static
PrinterInIt
getPrinterByType
(
int
type
)
{
if
(
type
==
PRINT_TEST
)
{
return
new
PrintTest
();
}
else
if
(
type
==
PRINT_SERVE
)
{
return
new
PrintServe
();
}
else
if
(
type
==
PRINT_SLIP
)
{
return
new
PrintSlip
();
}
else
if
(
type
==
PRINT_BILL
)
{
return
new
PrintBill
();
}
else
if
(
type
==
PRINT_KITCHEN
)
{
return
new
PrintKitchen
();
}
else
if
(
type
==
PRINT_CLEAN_MACHINE
)
{
return
new
PrintCleanMachine
();
}
return
null
;
}
public
PrinterInIt
setmContext
(
Context
mContext
)
{
this
.
mContext
=
mContext
;
return
this
;
}
public
PrinterInIt
setPrintListener
(
PrintListener
printListener
)
{
this
.
printListener
=
printListener
;
return
this
;
}
/**
* @param mContext
* @return key為打印位置,值為圖片集合的map
*/
public
abstract
Map
<
String
,
List
<
Bitmap
>>
getPrintBitmap
(
Context
mContext
);
public
void
print
(
List
<
PrinterDeviceBean
>
deviceBeans
)
{
listMap
=
getPrintBitmap
(
mContext
);
printSize
=
listMap
.
size
();
if
(
printSize
<=
0
)
{
printListener
.
printFile
();
return
;
}
// 先不管有沒有默認打印位置
// 第一步先查看map中的key是不是空的"",有key就要獲取打印機列表,找到對應打印機打印。如果沒有找到打印機再去找默認打印機
// 如果沒有key,則是走默認打印機流程
for
(
Map
.
Entry
<
String
,
List
<
Bitmap
>>
entry
:
listMap
.
entrySet
())
{
if
(
entry
.
getKey
().
equals
(
""
))
{
//沒有打印位置,獲取默認打印位置
defaultPrint
(
deviceBeans
,
entry
.
getValue
());
}
else
{
//有打印位置
hasPrinterSettingPrint
(
entry
.
getKey
(),
entry
.
getValue
(),
deviceBeans
);
}
}
}
/**
* 本機打印
*/
public
void
locationPrint
(
List
<
Bitmap
>
bitmaps
,
PrintListener
listener
)
{
//本機打印
if
(
bitmaps
==
null
||
bitmaps
.
size
()
<=
0
)
{
ToastUtils
.
show
(
mContext
,
"未獲取到打印內容"
);
listener
.
printFile
();
return
;
}
String
model
=
Build
.
MODEL
;
if
(
GsaCloudApplication
.
mV2
.
contains
(
model
))
{
sunmiPrint
(
bitmaps
,
listener
);
}
else
if
(
GsaCloudApplication
.
mN5
.
contains
(
model
))
{
//N5打印
n5Print
(
bitmaps
,
listener
);
}
else
{
ToastUtils
.
show
(
mContext
,
"暫不支持本機型打印"
);
listener
.
printFile
();
}
}
/**
* n5打印
*
* @param bitmaps
* @param listener
*/
private
void
n5Print
(
List
<
Bitmap
>
bitmaps
,
PrintListener
listener
)
{
try
{
try
{
for
(
int
i
=
0
;
i
<
bitmaps
.
size
();
i
++)
{
PrinterUtil
.
appendImage
(
ImageUtils
.
zoomDrawable
(
bitmaps
.
get
(
i
),
N5_PAPER_WIDTH
),
PrinterConstant
.
ALIGN_CENTER
);
PrinterUtil
.
appendPrnStr
(
"\n"
,
24
,
PrinterConstant
.
ALIGN_CENTER
,
false
);
PrinterUtil
.
appendPrnStr
(
"\n"
,
24
,
PrinterConstant
.
ALIGN_CENTER
,
false
);
}
startN5Print
(
listener
);
}
catch
(
NullPointerException
e
)
{
ToastUtils
.
show
(
mContext
,
"打印失敗,請重試"
);
// finish();
listener
.
printFile
();
}
}
catch
(
RemoteException
e
)
{
e
.
printStackTrace
();
listener
.
printFile
();
}
}
/**
* 商米打印
*
* @param bitmaps
* @param listener
*/
private
void
sunmiPrint
(
List
<
Bitmap
>
bitmaps
,
PrintListener
listener
)
{
//商米打印
AidlUtil
.
getInstance
().
printBitmaps
(
bitmaps
,
SUNMI_PAPER_WIDTH
,
new
InnerResultCallbcak
()
{
@Override
public
void
onRunResult
(
boolean
isSuccess
)
{
//返回接⼝执⾏的情况(并⾮真实打印):成功或失败
if
(
isSuccess
)
{
ToastUtils
.
show
(
mContext
,
"打印成功"
);
listener
.
printSuccess
();
}
else
{
ToastUtils
.
show
(
mContext
,
"打印失敗"
);
listener
.
printFile
();
}
}
@Override
public
void
onReturnString
(
String
result
)
{
//部分接⼝会异步返回查询数据
Log
.
e
(
"eee"
,
"onReturnString:"
+
result
);
}
@Override
public
void
onRaiseException
(
int
code
,
String
msg
)
{
//接⼝执⾏失败时,返回的异常状态
Log
.
e
(
"eee"
,
"打印異常狀態碼:"
+
code
+
"---MSG:"
+
msg
);
}
@Override
public
void
onPrintResult
(
int
code
,
String
msg
)
{
//事务模式下真实的打印结果返回
Log
.
e
(
"eee"
,
"打印結果:"
+
code
+
"---MSG:"
+
msg
);
}
});
}
private
void
startN5Print
(
PrintListener
listener
)
{
try
{
PrinterUtil
.
startPrint
(
true
,
new
IOnPrintCallback
.
Stub
()
{
@Override
public
void
onPrintResult
(
int
i
)
{
if
(
i
==
0
)
{
//打印成功
listener
.
printSuccess
();
}
else
{
//打印失敗
listener
.
printFile
();
}
}
@Override
public
IBinder
asBinder
()
{
return
this
;
}
});
}
catch
(
RemoteException
e
)
{
e
.
printStackTrace
();
//打印失敗
listener
.
printFile
();
}
}
//需要打印的次數,根據打印位置來計數,帶*號的之後需要另算。
private
int
printSize
;
private
List
<
PrinterDeviceBean
>
printerDeviceBeans
;
/**
* 有打印位置的打印方式
*
* @param key 打印位置
* @param bitmaps 需要打印的圖片
* @param printerDeviceBeans ip打印機集合
*/
private
void
hasPrinterSettingPrint
(
String
key
,
List
<
Bitmap
>
bitmaps
,
List
<
PrinterDeviceBean
>
printerDeviceBeans
)
{
this
.
printerDeviceBeans
=
printerDeviceBeans
;
//獲取用於打印的圖片
if
(
printerDeviceBeans
.
size
()
==
1
)
{
//如果只有一台ip打印機設備,直接全部打印在這台設備上
ipDevicePrint
(
printerDeviceBeans
.
get
(
0
),
bitmaps
);
}
else
{
//通過打印位置生成多張用於打印的bitmap
//在打印機列表中找到當前key,
boolean
isPrint
=
false
;
//是否已經打印
for
(
int
i
=
0
;
i
<
printerDeviceBeans
.
size
();
i
++)
{
int
lastIndex
=
key
.
lastIndexOf
(
DELIMITER
);
key
=
key
.
substring
(
lastIndex
+
1
);
if
(
key
.
replaceAll
(
"\\*"
,
""
).
trim
().
equals
(
printerDeviceBeans
.
get
(
i
).
getName
().
trim
()))
{
//如果key(打印位置)去掉*號和打印機名稱相同,則在這台機器上打印
ipDevicePrint
(
printerDeviceBeans
.
get
(
i
),
bitmaps
);
isPrint
=
true
;
break
;
}
}
// 循環完也沒找到對應的打印機,則使用默認打印位置,或直接本機打印
if
(!
isPrint
)
{
// 獲取默認打印位置
// 獲得用戶默認的打印方式
defaultPrint
(
printerDeviceBeans
,
bitmaps
);
}
}
}
/**
* 根據打印機位置獲取打印內容
*
* @param key 打印位置
* @return 打印內容
*/
private
List
<
Bitmap
>
getPrintBitmapByPrintLocation
(
String
key
)
{
for
(
Map
.
Entry
<
String
,
List
<
Bitmap
>>
entry
:
listMap
.
entrySet
())
{
if
(!
entry
.
getKey
().
equals
(
""
))
{
//有打印位置
String
newKey
=
entry
.
getKey
();
int
lastIndex
=
newKey
.
lastIndexOf
(
DELIMITER
);
newKey
=
newKey
.
substring
(
lastIndex
+
1
);
if
(
newKey
.
equals
(
key
))
{
return
entry
.
getValue
();
}
}
}
return
null
;
}
private
void
defaultPrint
(
List
<
PrinterDeviceBean
>
printerDeviceBeans
,
List
<
Bitmap
>
bitmaps
)
{
if
(
Objects
.
equals
(
SPUtils
.
get
(
mContext
,
Constans
.
DEFAULT_PRINT_METHOD
,
""
),
""
))
{
// 如果沒有默認打印位置,彈出彈窗讓用戶選擇是本機打印還是ip打印
new
DialogUtils
(
mContext
,
R
.
layout
.
print_dialog_select_device
)
{
@Override
public
void
initLayout
(
ViewHepler
hepler
,
Dialog
dialog
)
{
//本地打印
hepler
.
setViewClick
(
R
.
id
.
local_print
,
v
->
{
locationPrint
(
bitmaps
,
new
PrintListener
()
{
@Override
public
void
printStateChanged
(
int
state
)
{
}
@Override
public
void
printSuccess
()
{
cutPrintSize
();
}
@Override
public
void
printFile
()
{
cutPrintSize
();
}
});
//修改默認打印方式為本地
SPUtils
.
put
(
mContext
,
Constans
.
DEFAULT_PRINT_METHOD
,
Constans
.
LOCAL_PRINT
);
dialog
.
dismiss
();
});
//ip打印
hepler
.
setViewClick
(
R
.
id
.
internet_print
,
v
->
{
//修改默認打印方式為IP打印
SPUtils
.
put
(
mContext
,
Constans
.
DEFAULT_PRINT_METHOD
,
Constans
.
IP_PRINT
);
//彈出彈窗,讓用戶選擇ip打印機
showIpPrintDeviceList
(
printerDeviceBeans
,
bitmaps
);
});
}
}.
createDialogView
().
show
();
}
else
if
(
Objects
.
equals
(
SPUtils
.
get
(
mContext
,
Constans
.
DEFAULT_PRINT_METHOD
,
""
),
Constans
.
LOCAL_PRINT
))
{
// 默認打印方式為本地,進行本地打印
locationPrint
(
bitmaps
,
new
PrintListener
()
{
@Override
public
void
printStateChanged
(
int
state
)
{
}
@Override
public
void
printSuccess
()
{
setPrintState
(
PrintActivity
.
FINISH
);
}
@Override
public
void
printFile
()
{
setPrintState
(
PrintActivity
.
FINISH
);
}
});
}
else
if
(
Objects
.
equals
(
SPUtils
.
get
(
mContext
,
Constans
.
DEFAULT_PRINT_METHOD
,
""
),
Constans
.
IP_PRINT
))
{
// 默認打印方式為ip打印,調用ip打印方法
// 獲取默認ip打印機,
if
(!
Objects
.
equals
(
SPUtils
.
get
(
mContext
,
PrintConstans
.
DEFAULT_PRINT_IP
,
""
),
""
))
{
//有默認打印機
PrinterDeviceBean
printerDeviceBean
=
new
PrinterDeviceBean
();
printerDeviceBean
.
setIp
((
String
)
SPUtils
.
get
(
mContext
,
PrintConstans
.
DEFAULT_PRINT_IP
,
""
));
printerDeviceBean
.
setPort
((
Integer
)
SPUtils
.
get
(
mContext
,
PrintConstans
.
DEFAULT_PRINT_PORT
,
0
));
printerDeviceBean
.
setType
((
Integer
)
SPUtils
.
get
(
mContext
,
PrintConstans
.
DEFAULT_PRINT_PAPER
,
0
));
ipDevicePrint
(
printerDeviceBean
,
bitmaps
);
}
else
{
//沒有默認打印機,彈出彈窗,讓用戶選擇ip打印機
showIpPrintDeviceList
(
printerDeviceBeans
,
bitmaps
);
}
}
}
private
void
showIpPrintDeviceList
(
List
<
PrinterDeviceBean
>
printerDeviceBeans
,
List
<
Bitmap
>
bitmaps
)
{
if
(
printerDeviceBeans
!=
null
&&
printerDeviceBeans
.
size
()
>
0
)
{
new
DialogUtils
(
mContext
,
R
.
layout
.
print_dialog_internet_list
)
{
@Override
public
void
initLayout
(
ViewHepler
hepler
,
Dialog
dialog
)
{
RecyclerView
mRvPrintList
=
hepler
.
getView
(
R
.
id
.
rv_print_list
);
DialogPrinterListAdapter
printListAdapter
=
new
DialogPrinterListAdapter
(
printerDeviceBeans
,
mContext
);
mRvPrintList
.
setLayoutManager
(
new
LinearLayoutManager
(
mContext
));
//分割线
mRvPrintList
.
addItemDecoration
(
new
DefaultItemDecoration
(
ContextCompat
.
getColor
(
mContext
,
R
.
color
.
line_color
)));
mRvPrintList
.
setAdapter
(
printListAdapter
);
printListAdapter
.
setOnItemClickListener
((
adapter
,
view
,
position
)
->
{
//用戶選擇的ip打印機打印
ipDevicePrint
(
printerDeviceBeans
.
get
(
position
),
bitmaps
);
dialog
.
dismiss
();
});
}
}
.
setHeight
(
ArmsUtils
.
getScreenHeidth
(
mContext
)
/
2
)
.
createDialogView
()
.
show
();
}
else
{
//沒有打印機,讓用戶去添加
setPrintState
(
PrintActivity
.
ADD_PRINT_DEVICE
);
}
}
public
void
ipDevicePrint
(
PrinterDeviceBean
printerDeviceBean
,
List
<
Bitmap
>
bitmaps
)
{
ipDevicePrint
(
printerDeviceBean
,
bitmaps
,
this
,
this
);
}
/**
* ip設備打印
*/
public
void
ipDevicePrint
(
PrinterDeviceBean
printerDeviceBean
,
List
<
Bitmap
>
bitmaps
,
PrintSocketHolder
.
OnStateChangedListener
stateChangedListener
,
PrintExecutor
.
OnPrintResultListener
resultListener
)
{
int
paperType
=
printerDeviceBean
.
getType
();
//打印紙類型 1:58mm,2::80mm
int
printWidth
;
//打印出來的內容寬度
if
(
paperType
==
1
)
{
paperType
=
PrinterWriter58mm
.
TYPE_58
;
printWidth
=
580
-
20
;
//兩邊留20的空隙
}
else
{
paperType
=
PrinterWriter80mm
.
TYPE_80
;
printWidth
=
800
-
20
;
//兩邊留20的空隙
}
PrintExecutor
executor
=
new
PrintExecutor
(
printerDeviceBean
,
paperType
);
executor
.
setOnStateChangedListener
(
stateChangedListener
);
executor
.
setOnPrintResultListener
(
resultListener
);
List
<
Bitmap
>
zoomBitmaps
=
new
ArrayList
<>();
if
(
bitmaps
!=
null
)
{
for
(
int
i
=
0
;
i
<
bitmaps
.
size
();
i
++)
{
zoomBitmaps
.
add
(
ImageUtils
.
zoomDrawable
(
bitmaps
.
get
(
i
),
printWidth
));
}
}
IpPrintMaker
maker
=
new
IpPrintMaker
(
mContext
,
printWidth
,
zoomBitmaps
);
executor
.
doPrinterRequestAsync
(
maker
);
}
/**
* view轉bitmap
*
* @param context
* @param view
* @return
*/
final
Bitmap
viewToBitmap
(
Context
context
,
View
view
)
{
LayoutToBitmapUtils
.
layoutView
(
context
,
view
);
//先测量view
//轉為bitmap
return
LayoutToBitmapUtils
.
loadBitmapFromView
(
view
);
}
//打印失敗設備map
private
List
<
PrinterDeviceBean
>
printerFileDevices
=
new
ArrayList
<>();
@Override
public
void
onResult
(
int
errorCode
,
PrinterDeviceBean
printerDeviceBean
)
{
switch
(
errorCode
)
{
case
PrintSocketHolder
.
ERROR_0
:
Log
.
e
(
"eee"
,
"打印成功"
);
cutPrintSize
();
break
;
case
PrintSocketHolder
.
ERROR_1
:
Log
.
e
(
"eee"
,
"生成測試頁面數據失敗"
);
break
;
case
PrintSocketHolder
.
ERROR_2
:
Log
.
e
(
"eee"
,
"連接打印機失敗"
+
System
.
currentTimeMillis
());
case
PrintSocketHolder
.
ERROR_3
:
Log
.
e
(
"eee"
,
"獲取輸出流失敗"
);
printerFileDevices
.
add
(
printerDeviceBean
);
cutPrintSize
();
break
;
case
PrintSocketHolder
.
ERROR_4
:
Log
.
e
(
"eee"
,
"寫入測試頁面數據失敗"
);
break
;
case
PrintSocketHolder
.
ERROR_5
:
Log
.
e
(
"eee"
,
"必要的參數不能為空"
);
break
;
}
setPrintState
(
errorCode
);
}
@Override
public
void
onStateChanged
(
int
state
,
PrinterDeviceBean
printerDeviceBean
)
{
setPrintState
(
state
);
}
private
void
setPrintState
(
int
state
)
{
if
(
printListener
!=
null
)
{
printListener
.
printStateChanged
(
state
);
}
}
private
void
cutPrintSize
()
{
Log
.
e
(
"eee"
,
"個數:"
+
printSize
);
printSize
--;
if
(
printSize
<=
0
)
{
Log
.
e
(
"eee"
,
"打印完了"
);
//全部打印完了
if
(
printerFileDevices
!=
null
&&
printerFileDevices
.
size
()
>
0
)
{
//有打印失敗的.關閉activity中的加載框
setPrintState
(
PrintActivity
.
DIMISS_LOADING
);
//显示彈窗,將失敗的打印機信息和食品組顯示出來。
new
DialogUtils
(
mContext
,
R
.
layout
.
dialog_print_fail_list
)
{
@Override
public
void
initLayout
(
ViewHepler
hepler
,
Dialog
dialog
)
{
hepler
.
getView
(
R
.
id
.
iv_close_dialog
).
setOnClickListener
(
v
->
dialog
.
dismiss
());
RecyclerView
recyclerView
=
hepler
.
getView
(
R
.
id
.
rv_print_fail_list
);
recyclerView
.
setLayoutManager
(
new
LinearLayoutManager
(
mContext
));
PrintFailListAdapter
adapter
=
new
PrintFailListAdapter
(
printerFileDevices
);
recyclerView
.
addItemDecoration
(
new
DefaultItemDecoration
(
ContextCompat
.
getColor
(
mContext
,
R
.
color
.
line_color
)));
adapter
.
setOnItemClickListener
((
adapter12
,
view
,
position
)
->
{
//顯示打印失敗的食品。
PrintFileBitmapAdapter
bitmapAdapter
=
new
PrintFileBitmapAdapter
(
getPrintBitmapByPrintLocation
(
printerFileDevices
.
get
(
position
).
getName
().
trim
()));
recyclerView
.
setAdapter
(
bitmapAdapter
);
});
adapter
.
setSwitchPrintListenter
(
position
->
{
if
(
printerDeviceBeans
!=
null
&&
printerDeviceBeans
.
size
()
>
0
)
{
//切換打印機打印。跳轉到選擇打印機列表
DialogPrinterListAdapter
adapter1
=
new
DialogPrinterListAdapter
(
printerDeviceBeans
,
mContext
);
//分割线
recyclerView
.
setAdapter
(
adapter1
);
adapter1
.
setOnItemClickListener
((
adapter2
,
view
,
position1
)
->
{
printerFileDevices
.
set
(
position
,
printerDeviceBeans
.
get
(
position1
));
adapter
.
setData
(
position
,
printerDeviceBeans
.
get
(
position1
));
recyclerView
.
setAdapter
(
adapter
);
});
}
else
{
//沒有打印機,讓用戶去添加
setPrintState
(
PrintActivity
.
ADD_PRINT_DEVICE
);
}
});
adapter
.
setTryAgainPrintListenter
(
position
->
{
//重試打印。
ipDevicePrint
(
printerFileDevices
.
get
(
position
),
getPrintBitmapByPrintLocation
(
printerFileDevices
.
get
(
position
).
getName
().
trim
()),
(
state
,
printerDeviceBean
)
->
{
//打印機打印狀態切換回調
},
(
errorCode
,
printerDeviceBean
)
->
{
switch
(
errorCode
)
{
case
PrintSocketHolder
.
ERROR_0
:
//打印成功
adapter
.
remove
(
position
);
Log
.
e
(
"eee"
,
"打印成功"
);
if
(
adapter
.
getItemCount
()
<=
0
)
{
//所有都打印成功
printListener
.
printSuccess
();
}
break
;
case
PrintSocketHolder
.
ERROR_2
:
case
PrintSocketHolder
.
ERROR_3
:
//打印失敗
adapter
.
setItemStatus
(
position
,
0
);
Log
.
e
(
"eee"
,
"打印失敗"
);
break
;
}
});
});
recyclerView
.
setAdapter
(
adapter
);
}
}
.
setWidth
((
int
)
(
ArmsUtils
.
getScreenWidth
(
mContext
)
*
0.66
))
.
setHeight
((
int
)
(
ArmsUtils
.
getScreenHeidth
(
mContext
)
*
0.66
))
.
createDialogView
()
.
setCanceledOnTouchOutside
(
false
)
.
setOnDismissListener
(
dialog
->
setPrintState
(
PrintActivity
.
FINISH
))
.
show
();
}
else
{
//都打印成功了
Log
.
e
(
"eee"
,
"打印成功"
);
printListener
.
printSuccess
();
}
}
}
}
print-module/src/main/java/com/joe/print/mvp/print/SendPrint.java
View file @
414e7e7d
...
...
@@ -18,7 +18,7 @@ import java.util.List;
/**
* Created by Wyh on 2020/1/9.
*
送單打印
*
ip打印類
*/
public
class
SendPrint
implements
PrintDataMaker
{
...
...
print-module/src/main/java/com/joe/print/mvp/print/TestPrintDataMaker.java
View file @
414e7e7d
...
...
@@ -14,9 +14,9 @@ import java.util.ArrayList;
import
java.util.List
;
/**
* 打印測試
* 测试数据生成
*/
public
class
TestPrintDataMaker
implements
PrintDataMaker
{
private
Context
context
;
...
...
print-module/src/main/java/com/joe/print/mvp/ui/activity/IpPrintActivity.java
View file @
414e7e7d
...
...
@@ -22,6 +22,7 @@ import androidx.annotation.Nullable;
import
com.billy.cc.core.component.CC
;
import
com.billy.cc.core.component.CCResult
;
import
com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean
;
import
com.gingersoft.gsa.cloud.print.PrintExecutor
;
import
com.gingersoft.gsa.cloud.print.PrintSocketHolder
;
import
com.gingersoft.gsa.cloud.print.PrinterWriter58mm
;
...
...
@@ -132,15 +133,16 @@ public class IpPrintActivity extends Activity implements PrintSocketHolder.OnSta
}
public
void
printOrder
(
Context
context
)
{
PrinterDeviceBean
printerDeviceBean
=
new
PrinterDeviceBean
(
""
,
null
,
ip
,
port
,
type
);
if
(
executor
==
null
)
{
executor
=
new
PrintExecutor
(
ip
,
port
,
paperType
);
executor
=
new
PrintExecutor
(
printerDeviceBean
,
paperType
);
executor
.
setOnStateChangedListener
(
this
);
executor
.
setOnPrintResultListener
(
this
);
}
if
(
maker
==
null
)
{
maker
=
new
SendPrint
(
context
,
255
,
printWidth
,
type
);
}
executor
.
setIp
(
ip
,
port
);
executor
.
setIp
(
printerDeviceBean
);
if
(
type
==
-
1
)
{
executor
.
doPrinterRequestAsync
(
new
TestPrintDataMaker
(
context
,
380
,
255
));
}
else
{
...
...
@@ -149,7 +151,7 @@ public class IpPrintActivity extends Activity implements PrintSocketHolder.OnSta
}
@Override
public
void
onResult
(
int
errorCode
)
{
public
void
onResult
(
int
errorCode
,
PrinterDeviceBean
printerDeviceBean
)
{
String
tip
;
switch
(
errorCode
)
{
case
PrintSocketHolder
.
ERROR_0
:
...
...
@@ -189,7 +191,7 @@ public class IpPrintActivity extends Activity implements PrintSocketHolder.OnSta
}
@Override
public
void
onStateChanged
(
int
state
)
{
public
void
onStateChanged
(
int
state
,
PrinterDeviceBean
printerDeviceBean
)
{
String
tip
=
"打印中..."
;
switch
(
state
)
{
case
PrintSocketHolder
.
STATE_0
:
...
...
print-module/src/main/java/com/joe/print/mvp/ui/activity/PrintActivity.java
View file @
414e7e7d
...
...
@@ -3,37 +3,28 @@ package com.joe.print.mvp.ui.activity;
import
android.app.Dialog
;
import
android.content.DialogInterface
;
import
android.content.Intent
;
import
android.graphics.
Bitmap
;
import
android.
os.Build
;
import
android.graphics.
Color
;
import
android.
graphics.drawable.ColorDrawable
;
import
android.os.Bundle
;
import
android.os.IBinder
;
import
android.os.RemoteException
;
import
android.util.Log
;
import
android.view.LayoutInflater
;
import
android.view.MotionEvent
;
import
android.view.View
;
import
android.view.Window
;
import
android.view.WindowManager
;
import
android.widget.LinearLayout
;
import
android.widget.TextView
;
import
androidx.annotation.NonNull
;
import
androidx.annotation.Nullable
;
import
androidx.core.content.ContextCompat
;
import
androidx.recyclerview.widget.LinearLayoutManager
;
import
androidx.recyclerview.widget.RecyclerView
;
import
com.billy.cc.core.component.CC
;
import
com.billy.cc.core.component.CCResult
;
import
com.billy.cc.core.component.CCUtil
;
import
com.gingersoft.gsa.cloud.base.application.GsaCloudApplication
;
import
com.gingersoft.gsa.cloud.base.common.bean.PrinterManger.PrinterManager
;
import
com.gingersoft.gsa.cloud.base.utils.AidlUtil
;
import
com.gingersoft.gsa.cloud.base.utils.constans.Constans
;
import
com.gingersoft.gsa.cloud.base.utils.other.SPUtils
;
import
com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils
;
import
com.gingersoft.gsa.cloud.base.widget.DialogUtils
;
import
com.gingersoft.gsa.cloud.constans.PrintConstans
;
import
com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean
;
import
com.hyweb.n5.lib.constant.PrinterConstant
;
import
com.hyweb.n5.lib.exception.NoInitPrinterException
;
import
com.hyweb.n5.lib.util.PrinterUtil
;
import
com.hyweb.n5.server.aidl.IOnPrintCallback
;
import
com.gingersoft.gsa.cloud.print.PrintSocketHolder
;
import
com.jess.arms.base.BaseActivity
;
import
com.jess.arms.di.component.AppComponent
;
import
com.jess.arms.utils.ArmsUtils
;
...
...
@@ -41,16 +32,12 @@ import com.joe.print.R;
import
com.joe.print.di.component.DaggerPrintComponent
;
import
com.joe.print.mvp.contract.PrintContract
;
import
com.joe.print.mvp.presenter.PrintPresenter
;
import
com.joe.print.mvp.print.PrintStatus
;
import
com.joe.print.mvp.print.PrintUtils
;
import
com.joe.print.mvp.ui.adapter.DialogPrinterListAdapter
;
import
com.sunmi.peripheral.printer.InnerResultCallbcak
;
import
com.yanzhenjie.recyclerview.widget.DefaultItemDecoration
;
import
com.joe.print.mvp.print.PrintListener
;
import
com.joe.print.mvp.print.PrinterInIt
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Objects
;
import
static
com
.
billy
.
cc
.
core
.
component
.
CCUtil
.
EXTRA_KEY_CALL_ID
;
import
static
com
.
jess
.
arms
.
utils
.
Preconditions
.
checkNotNull
;
...
...
@@ -73,21 +60,18 @@ import static com.jess.arms.utils.Preconditions.checkNotNull;
* ----網絡打印
* ----获取網絡打印機列表
*/
public
class
PrintActivity
extends
BaseActivity
<
PrintPresenter
>
implements
PrintContract
.
View
,
DialogInterface
.
OnDismissListener
{
private
int
dialogCount
=
0
;
private
DialogUtils
selectDialog
;
/**
* 0:上菜紙
* 1:印單
* 2:結賬單
* 3:廚房單
* 4:清機報表
*/
private
int
type
=
-
1
;
public
class
PrintActivity
extends
BaseActivity
<
PrintPresenter
>
implements
PrintContract
.
View
,
DialogInterface
.
OnDismissListener
,
PrintListener
{
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
ADD_PRINT_DEVICE
=
1004
;
//添加打印機
private
String
callId
;
private
PrinterInIt
printerInIt
;
private
Dialog
mLoadingDialog
;
private
TextView
mTvLoadingTip
;
@Override
public
void
setupActivityComponent
(
@NonNull
AppComponent
appComponent
)
{
...
...
@@ -106,218 +90,152 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
return
0
;
//如果你不需要框架帮你设置 setContentView(id) 需要自行设置,请返回 0
}
int
paperWidth
=
500
;
@Override
public
void
initData
(
@Nullable
Bundle
savedInstanceState
)
{
callId
=
CCUtil
.
getNavigateCallId
(
this
);
initPrint
();
//獲取打印類型,根據打印類型生成對應的bitmap
type
=
CCUtil
.
getNavigateParam
(
this
,
"type"
,
1001
);
//380 540
List
<
Bitmap
>
bitmaps
=
PrintUtils
.
getPrintBitmap
(
mContext
,
type
,
paperWidth
);
if
(
bitmaps
.
size
()
<=
0
)
{
printFile
();
finish
();
return
;
}
// 獲得用戶默認的打印方式
if
(
Objects
.
equals
(
SPUtils
.
get
(
mContext
,
Constans
.
DEFAULT_PRINT_METHOD
,
""
),
""
))
{
// 如果沒有默認打印位置
noDefaultPrintMethod
(
bitmaps
);
}
else
if
(
Objects
.
equals
(
SPUtils
.
get
(
mContext
,
Constans
.
DEFAULT_PRINT_METHOD
,
""
),
Constans
.
LOCAL_PRINT
))
{
// 默認打印方式為本地,進行本地打印
locationPrint
(
bitmaps
);
}
else
if
(
Objects
.
equals
(
SPUtils
.
get
(
mContext
,
Constans
.
DEFAULT_PRINT_METHOD
,
""
),
Constans
.
IP_PRINT
))
{
// 默認打印方式為ip打印,調用ip打印方法
ipPrint
();
/**
* 0:上菜紙
* 1:印單
* 2:結賬單
* 3:廚房單
* 4:清機報表
*/
int
type
=
CCUtil
.
getNavigateParam
(
this
,
"type"
,
-
1
);
initDialog
();
PrinterDeviceBean
deviceBean
=
(
PrinterDeviceBean
)
getIntent
().
getSerializableExtra
(
"deviceBean"
);
if
(
type
!=
PrinterInIt
.
PRINT_TEST
)
{
//不是测试才去获取打印机列表,获取到打印机列表之后就进行打印
mPresenter
.
getPrinterList
(
GsaCloudApplication
.
getRestaurantId
(
mContext
));
}
}
@Override
public
boolean
dispatchTouchEvent
(
MotionEvent
ev
)
{
//doSomeTing,點擊當前頁面任意地方自動關閉
finish
();
return
true
;
}
private
void
initPrint
()
{
if
(
GsaCloudApplication
.
mV2
.
contains
(
Build
.
MODEL
))
{
paperWidth
=
360
;
}
else
if
(
GsaCloudApplication
.
mN5
.
contains
(
Build
.
MODEL
))
{
paperWidth
=
500
;
try
{
//初始化N5打印
boolean
state
=
PrintStatus
.
initN5PrintStatus
(
mContext
);
if
(!
state
)
{
//不能打印
printFile
();
}
}
catch
(
NullPointerException
e
)
{
e
.
printStackTrace
();
//如果是空指針,那麼需要初始化
try
{
PrinterUtil
.
initPrinter
(
this
);
}
catch
(
NoInitPrinterException
|
RemoteException
ex
)
{
ex
.
printStackTrace
();
}
}
printerInIt
=
PrinterInIt
.
getPrinterByType
(
type
);
if
(
printerInIt
!=
null
)
{
printerInIt
.
setmContext
(
mContext
).
setPrintListener
(
this
);
}
}
private
void
noDefaultPrintMethod
(
List
<
Bitmap
>
bitmaps
)
{
selectDialog
=
new
DialogUtils
(
mContext
,
R
.
layout
.
print_dialog_select_device
)
{
@Override
public
void
initLayout
(
ViewHepler
hepler
,
Dialog
dialog
)
{
dialogCount
++;
hepler
.
setViewClick
(
R
.
id
.
local_print
,
v
->
{
locationPrint
(
bitmaps
);
//修改默認打印方式為本地
SPUtils
.
put
(
mContext
,
Constans
.
DEFAULT_PRINT_METHOD
,
Constans
.
LOCAL_PRINT
);
dialog
.
dismiss
();
});
hepler
.
setViewClick
(
R
.
id
.
internet_print
,
v
->
{
//修改默認打印方式為IP打印
SPUtils
.
put
(
mContext
,
Constans
.
DEFAULT_PRINT_METHOD
,
Constans
.
IP_PRINT
);
ipPrint
();
});
}
}.
createDialogView
().
show
().
setOnDismissListener
(
this
);
}
/**
* IP打印
*/
private
void
ipPrint
()
{
//獲取默認選中的IP打印機
if
(
Objects
.
equals
(
SPUtils
.
get
(
mContext
,
PrintConstans
.
DEFAULT_PRINT_IP
,
""
),
""
))
{
//如果沒有獲取到默認打印機IP
if
(
PrinterManager
.
getPrinterManager
().
getDeviceBeans
()
!=
null
&&
PrinterManager
.
getPrinterManager
().
getDeviceBeans
().
size
()
>
0
)
{
//如果本地保存有打印設備
showPrinterList
();
}
else
{
//網絡獲取打印設備
mPresenter
.
getPrinterList
(
GsaCloudApplication
.
getRestaurantId
(
mContext
));
}
if
(
type
==
PrinterInIt
.
PRINT_TEST
&&
deviceBean
!=
null
)
{
printerInIt
.
ipDevicePrint
(
deviceBean
,
printerInIt
.
getPrintBitmap
(
mContext
).
get
(
""
));
}
else
{
//如果有默認選中打印機
PrinterDeviceBean
printerDeviceBean
=
new
PrinterDeviceBean
();
printerDeviceBean
.
setIp
((
String
)
SPUtils
.
get
(
mContext
,
PrintConstans
.
DEFAULT_PRINT_IP
,
""
));
printerDeviceBean
.
setPort
((
Integer
)
SPUtils
.
get
(
mContext
,
PrintConstans
.
DEFAULT_PRINT_PORT
,
0
));
printerDeviceBean
.
setType
((
Integer
)
SPUtils
.
get
(
mContext
,
PrintConstans
.
DEFAULT_PRINT_PAPER
,
0
));
startToIpPrint
(
printerDeviceBean
);
ToastUtils
.
show
(
mContext
,
"测试失败"
);
}
}
/**
* 本地打印
*/
private
void
locationPrint
(
List
<
Bitmap
>
bitmaps
)
{
//本機打印
if
(
bitmaps
==
null
||
bitmaps
.
size
()
<=
0
)
{
ToastUtils
.
show
(
mContext
,
"未獲取到打印內容"
);
printFile
();
return
;
private
void
initDialog
()
{
try
{
View
view
=
LayoutInflater
.
from
(
mContext
).
inflate
(
R
.
layout
.
ui_dialog_loading
,
null
);
mTvLoadingTip
=
view
.
findViewById
(
R
.
id
.
tv_loading_dialog_text
);
mLoadingDialog
=
new
Dialog
(
mContext
,
R
.
style
.
ui_loading_dialog
);
mLoadingDialog
.
setCancelable
(
true
);
mLoadingDialog
.
setCanceledOnTouchOutside
(
false
);
Window
window
=
mLoadingDialog
.
getWindow
();
window
.
setBackgroundDrawable
(
new
ColorDrawable
(
Color
.
TRANSPARENT
));
// window.getDecorView().setBackgroundResource(android.R.color.transparent);
mLoadingDialog
.
setContentView
(
view
,
new
LinearLayout
.
LayoutParams
(
LinearLayout
.
LayoutParams
.
MATCH_PARENT
,
LinearLayout
.
LayoutParams
.
MATCH_PARENT
));
mLoadingDialog
.
show
();
// mLoadingDialog.setOnDismissListener(dialog -> dismiss());
setLoadingText
(
"加載中..."
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
String
model
=
Build
.
MODEL
;
if
(
GsaCloudApplication
.
mV2
.
contains
(
model
))
{
//商米打印
AidlUtil
.
getInstance
().
printBitmaps
(
bitmaps
,
new
InnerResultCallbcak
()
{
@Override
public
void
onRunResult
(
boolean
isSuccess
)
{
//返回接⼝执⾏的情况(并⾮真实打印):成功或失败
if
(
isSuccess
)
{
ToastUtils
.
show
(
mContext
,
"打印成功"
);
printSuccess
();
}
else
{
ToastUtils
.
show
(
mContext
,
"打印失敗"
);
printFile
();
}
}
@Override
public
void
onReturnString
(
String
result
)
{
//部分接⼝会异步返回查询数据
Log
.
e
(
"eee"
,
"onReturnString:"
+
result
);
}
@Override
public
void
onRaiseException
(
int
code
,
String
msg
)
{
//接⼝执⾏失败时,返回的异常状态
Log
.
e
(
"eee"
,
"打印異常狀態碼:"
+
code
+
"---MSG:"
+
msg
);
}
}
@Override
public
void
onPrintResult
(
int
code
,
String
msg
)
{
//事务模式下真实的打印结果返回
Log
.
e
(
"eee"
,
"打印結果:"
+
code
+
"---MSG:"
+
msg
);
}
});
}
else
if
(
GsaCloudApplication
.
mN5
.
contains
(
model
))
{
//N5打印
try
{
try
{
for
(
int
i
=
0
;
i
<
bitmaps
.
size
();
i
++)
{
PrinterUtil
.
appendImage
(
bitmaps
.
get
(
i
),
PrinterConstant
.
ALIGN_CENTER
);
PrinterUtil
.
appendPrnStr
(
"\n"
,
24
,
PrinterConstant
.
ALIGN_CENTER
,
false
);
PrinterUtil
.
appendPrnStr
(
"\n"
,
24
,
PrinterConstant
.
ALIGN_CENTER
,
false
);
}
startN5Print
();
}
catch
(
NullPointerException
e
)
{
ToastUtils
.
show
(
mContext
,
"打印失敗,請重試"
);
finish
();
}
}
catch
(
RemoteException
e
)
{
e
.
printStackTrace
();
printFile
();
}
}
else
{
ToastUtils
.
show
(
mContext
,
"暫不支持本機型打印"
);
printFile
();
private
void
setLoadingText
(
String
tip
)
{
if
(
mLoadingDialog
!=
null
&&
mLoadingDialog
.
isShowing
())
{
mTvLoadingTip
.
setText
(
tip
);
}
}
private
void
startN5Print
()
{
try
{
PrinterUtil
.
startPrint
(
true
,
new
IOnPrintCallback
.
Stub
()
{
@Override
public
void
onPrintResult
(
int
i
)
{
if
(
i
==
0
)
{
//打印成功
printSuccess
();
}
else
{
//打印失敗
printFile
();
}
}
@Override
public
IBinder
asBinder
()
{
return
this
;
}
});
}
catch
(
RemoteException
e
)
{
e
.
printStackTrace
();
//打印失敗
printFile
();
}
@Override
public
boolean
dispatchTouchEvent
(
MotionEvent
ev
)
{
//doSomeTing,點擊當前頁面任意地方自動關閉
finish
();
return
true
;
}
/**
* 打印失敗
*/
private
void
printFile
()
{
@Override
public
void
printFile
()
{
CC
.
sendCCResult
(
callId
,
CCResult
.
error
(
"print error"
));
finish
();
Log
.
e
(
"eee"
,
"打印失敗,關閉頁面"
);
}
@Override
public
void
printStateChanged
(
int
state
)
{
String
tip
=
"加載中..."
;
switch
(
state
)
{
case
PrintSocketHolder
.
ERROR_0
:
Log
.
e
(
"eee"
,
"打印成功"
);
tip
=
"打印成功"
;
break
;
case
PrintSocketHolder
.
ERROR_1
:
Log
.
e
(
"eee"
,
"生成測試頁面數據失敗"
);
tip
=
"生成打印數據失敗"
;
break
;
case
PrintSocketHolder
.
ERROR_2
:
Log
.
e
(
"eee"
,
"連接打印機失敗"
+
System
.
currentTimeMillis
());
case
PrintSocketHolder
.
ERROR_3
:
Log
.
e
(
"eee"
,
"獲取輸出流失敗"
);
tip
=
"連接打印機失敗"
;
break
;
case
PrintSocketHolder
.
ERROR_4
:
Log
.
e
(
"eee"
,
"寫入測試頁面數據失敗"
);
tip
=
"寫入測試頁面數據失敗"
;
break
;
case
PrintSocketHolder
.
ERROR_5
:
Log
.
e
(
"eee"
,
"必要的參數不能為空"
);
tip
=
"必要的參數不能為空"
;
break
;
case
PrintSocketHolder
.
STATE_0
:
Log
.
e
(
"eee"
,
"生成測試頁數據"
);
case
PrintSocketHolder
.
STATE_1
:
Log
.
e
(
"eee"
,
"開始創建連接"
);
tip
=
"開始創建連接"
;
break
;
case
PrintSocketHolder
.
STATE_2
:
Log
.
e
(
"eee"
,
"創建連接成功,開始發送數據"
);
tip
=
"創建連接成功,開始發送數據"
;
break
;
case
PrintSocketHolder
.
STATE_3
:
Log
.
e
(
"eee"
,
"開始寫入數據"
);
tip
=
"開始寫入數據"
;
break
;
case
PrintSocketHolder
.
STATE_4
:
Log
.
e
(
"eee"
,
"關閉中"
);
tip
=
"關閉中"
;
break
;
case
DIMISS_LOADING:
if
(
mLoadingDialog
!=
null
)
{
mLoadingDialog
.
dismiss
();
}
break
;
case
FINISH:
finish
();
printSuccess
();
break
;
case
ADD_PRINT_DEVICE:
addPrintDevice
();
break
;
}
setLoadingText
(
tip
);
}
/**
* 打印成功
*/
private
void
printSuccess
()
{
@Override
public
void
printSuccess
()
{
CC
.
sendCCResult
(
callId
,
CCResult
.
success
());
finish
();
Log
.
e
(
"eee"
,
"打印成功,關閉頁面"
);
}
@Override
...
...
@@ -373,55 +291,18 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
}
@Override
public
void
showPrinterList
()
{
if
(
selectDialog
!=
null
&&
selectDialog
.
isShowing
())
{
selectDialog
.
dismiss
();
}
List
<
PrinterDeviceBean
>
deviceBeans
=
PrinterManager
.
getPrinterManager
().
getDeviceBeans
();
if
(
deviceBeans
!=
null
)
{
if
(
deviceBeans
.
size
()
==
1
)
{
//如果只配置了一個打印機,直接使用這個打印機進行打印
startToIpPrint
(
deviceBeans
.
get
(
0
));
}
else
{
//有打印機,彈出彈窗,選擇打印機
new
DialogUtils
(
mContext
,
R
.
layout
.
print_dialog_internet_list
)
{
@Override
public
void
initLayout
(
ViewHepler
hepler
,
Dialog
dialog
)
{
dialogCount
++;
RecyclerView
mRvPrintList
=
hepler
.
getView
(
R
.
id
.
rv_print_list
);
DialogPrinterListAdapter
printListAdapter
=
new
DialogPrinterListAdapter
(
deviceBeans
,
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
)
->
{
startToIpPrint
(
deviceBeans
.
get
(
position
));
dialog
.
dismiss
();
});
dialog
.
setOnDismissListener
(
PrintActivity
.
this
);
}
}
.
setHeight
(
ArmsUtils
.
getScreenHeidth
(
mContext
)
/
2
)
.
createDialogView
()
.
show
();
}
public
void
showPrinterList
(
List
<
PrinterDeviceBean
>
deviceBeans
)
{
if
(
deviceBeans
!=
null
&&
deviceBeans
.
size
()
>
0
)
{
printerInIt
.
print
(
deviceBeans
);
}
else
{
//沒有配置打印機
startActivityForResult
(
new
Intent
(
mContext
,
PrinterAddActivity
.
class
),
ADD_PRINT_CODE
);
addPrintDevice
(
);
}
}
private
void
startToIpPrint
(
PrinterDeviceBean
deviceBean
)
{
dialogCount
=
2
;
//設置為2為了不讓回調打印失敗,因為這裡是跳轉ip打印,會關閉選擇ip的dialog,dialog關閉時會調用onDismiss方法,如果dialogCount小於2就會回調打印失敗
Intent
intent
=
new
Intent
(
mContext
,
IpPrintActivity
.
class
);
intent
.
putExtra
(
"ip"
,
deviceBean
.
getIp
());
intent
.
putExtra
(
"port"
,
deviceBean
.
getPort
());
intent
.
putExtra
(
"paperType"
,
deviceBean
.
getType
());
intent
.
putExtra
(
"type"
,
type
);
intent
.
putExtra
(
EXTRA_KEY_CALL_ID
,
callId
);
startActivity
(
intent
);
finish
();
private
void
addPrintDevice
()
{
ToastUtils
.
show
(
mContext
,
"沒有打印機,請添加"
);
startActivityForResult
(
new
Intent
(
mContext
,
PrinterAddActivity
.
class
),
ADD_PRINT_CODE
);
}
@Override
...
...
@@ -430,18 +311,22 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
if
(
requestCode
==
ADD_PRINT_CODE
&&
resultCode
==
PrintActivity
.
ADD_PRINT_CODE
)
{
//添加打印機成功,
if
(
data
!=
null
&&
data
.
getSerializableExtra
(
"printDevice"
)
!=
null
)
{
startToIpPrint
((
PrinterDeviceBean
)
data
.
getSerializableExtra
(
"printDevice"
));
List
<
PrinterDeviceBean
>
printerDeviceBeans
=
new
ArrayList
<>();
printerDeviceBeans
.
add
((
PrinterDeviceBean
)
data
.
getSerializableExtra
(
"printDevice"
));
printerInIt
.
print
(
printerDeviceBeans
);
}
else
{
ToastUtils
.
show
(
mContext
,
"未獲取到打印機"
);
printFile
();
}
}
else
{
ToastUtils
.
show
(
mContext
,
"未獲取到打印機"
);
printFile
();
}
}
@Override
public
void
onDismiss
(
DialogInterface
dialog
)
{
dialogCount
--;
if
(
dialogCount
<=
0
)
{
printFile
();
finish
();
}
}
}
print-module/src/main/java/com/joe/print/mvp/ui/activity/PrinterAddActivity.java
View file @
414e7e7d
...
...
@@ -16,6 +16,7 @@ import androidx.annotation.Nullable;
import
com.gingersoft.gsa.cloud.base.application.GsaCloudApplication
;
import
com.gingersoft.gsa.cloud.base.utils.other.SPUtils
;
import
com.gingersoft.gsa.cloud.base.utils.other.TextUtil
;
import
com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils
;
import
com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean
;
import
com.jess.arms.base.BaseActivity
;
...
...
@@ -42,6 +43,8 @@ import static com.jess.arms.utils.Preconditions.checkNotNull;
public
class
PrinterAddActivity
extends
BaseActivity
<
PrinterAddPresenter
>
implements
PrinterAddContract
.
View
,
View
.
OnClickListener
{
// EditText ipEdit1, ipEdit2, ipEdit3, ipEdit4;
@BindView
(
R2
.
id
.
add_printer_ed_name
)
EditText
mEdPrintName
;
@BindViews
({
R2
.
id
.
ip_edit_1
,
R2
.
id
.
ip_edit_2
,
R2
.
id
.
ip_edit_3
,
R2
.
id
.
ip_edit_4
})
EditText
[]
ipEdits
=
new
EditText
[
4
];
@BindView
(
R2
.
id
.
add_printer_topbar
)
...
...
@@ -53,9 +56,11 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem
@BindView
(
R2
.
id
.
printer_type
)
RadioGroup
rgPaperType
;
private
PrinterDeviceBean
printerDeviceBean
;
private
boolean
isEditPrinter
=
false
;
//是否是編輯打印機
private
boolean
isDefault
=
false
;
//是否是默認打印機
@Override
public
void
setupActivityComponent
(
@NonNull
AppComponent
appComponent
)
{
DaggerPrinterAddComponent
//如找不到该类,请编译一下项目
...
...
@@ -85,6 +90,7 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem
// }
//如果不為空,則是編輯打印機,初始化信息
if
(
printerDeviceBean
!=
null
)
{
mEdPrintName
.
setText
(
String
.
valueOf
(
printerDeviceBean
.
getName
()));
ips
=
printerDeviceBean
.
getIp
().
split
(
"[.]"
);
etPort
.
setText
(
printerDeviceBean
.
getPort
()
+
""
);
if
(
printerDeviceBean
.
getType
()
==
1
)
{
...
...
@@ -168,7 +174,10 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem
@Override
public
void
onClick
(
View
v
)
{
if
(
v
.
getId
()
==
R
.
id
.
printer_add
||
v
.
getId
()
==
R
.
id
.
print_test
)
{
if
(
mEdPrintName
.
getText
().
toString
().
contains
(
"/"
))
{
ToastUtils
.
show
(
mContext
,
"打印機名稱禁止帶/字符"
);
return
;
}
//保存打印機信息
StringBuilder
ipAddress
=
new
StringBuilder
();
for
(
EditText
editText
:
ipEdits
)
{
...
...
@@ -189,19 +198,27 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem
if
(
rgPaperType
.
getCheckedRadioButtonId
()
!=
R
.
id
.
print_paper_size_58
)
{
paperType
=
2
;
}
String
port
=
etPort
.
getText
().
toString
();
PrinterDeviceBean
deviceBean
;
if
(
TextUtil
.
isEmptyOrNullOrUndefined
(
port
))
{
deviceBean
=
new
PrinterDeviceBean
(
mEdPrintName
.
getText
().
toString
().
trim
(),
printerDeviceBean
.
getId
(),
GsaCloudApplication
.
getRestaurantId
(
mContext
),
ipAddress
.
substring
(
0
,
ipAddress
.
lastIndexOf
(
"."
)),
null
,
paperType
);
}
else
{
deviceBean
=
new
PrinterDeviceBean
(
mEdPrintName
.
getText
().
toString
().
trim
(),
printerDeviceBean
.
getId
(),
GsaCloudApplication
.
getRestaurantId
(
mContext
),
ipAddress
.
substring
(
0
,
ipAddress
.
lastIndexOf
(
"."
)),
Integer
.
parseInt
(
port
),
paperType
);
}
//添加打印機
if
(
v
.
getId
()
==
R
.
id
.
printer_add
)
{
if
(
isEditPrinter
&&
printerDeviceBean
!=
null
)
{
mPresenter
.
updatePrinterInfo
(
printerDeviceBean
.
getId
(),
GsaCloudApplication
.
getRestaurantId
(
mContext
),
ipAddress
.
substring
(
0
,
ipAddress
.
lastIndexOf
(
"."
)),
etPort
.
getText
().
toString
(),
paperType
);
deviceBean
.
setRestaurantId
(
null
);
mPresenter
.
updatePrinterInfo
(
deviceBean
);
}
else
{
mPresenter
.
addPrinter
(
GsaCloudApplication
.
getRestaurantId
(
mContext
),
ipAddress
.
substring
(
0
,
ipAddress
.
lastIndexOf
(
"."
)),
etPort
.
getText
().
toString
(),
paperType
);
mPresenter
.
addPrinter
(
deviceBean
);
}
}
else
if
(
v
.
getId
()
==
R
.
id
.
print_test
)
{
//打印測試
Intent
intent
=
new
Intent
(
mContext
,
IpPrintActivity
.
class
);
intent
.
putExtra
(
"ip"
,
ipAddress
.
substring
(
0
,
ipAddress
.
lastIndexOf
(
"."
)));
intent
.
putExtra
(
"port"
,
Integer
.
parseInt
(
etPort
.
getText
().
toString
()));
intent
.
putExtra
(
"paperType"
,
paperType
);
Intent
intent
=
new
Intent
(
mContext
,
PrintActivity
.
class
);
intent
.
putExtra
(
"deviceBean"
,
deviceBean
);
startActivity
(
intent
);
}
}
...
...
@@ -227,7 +244,7 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem
@Override
public
void
updatePrinterSuccess
(
PrinterDeviceBean
item
)
{
//修改打印機成功,如果這個打印機是用戶設置的默認打印機,則需要更新信息
if
(
isDefault
)
{
if
(
isDefault
)
{
SPUtils
.
put
(
mContext
,
PrintConstans
.
DEFAULT_PRINT_IP
,
item
.
getIp
());
SPUtils
.
put
(
mContext
,
PrintConstans
.
DEFAULT_PRINT_PORT
,
item
.
getPort
());
SPUtils
.
put
(
mContext
,
PrintConstans
.
DEFAULT_PRINT_PAPER
,
item
.
getType
());
...
...
print-module/src/main/java/com/joe/print/mvp/ui/activity/PrinterListActivity.java
View file @
414e7e7d
...
...
@@ -81,13 +81,12 @@ public class PrinterListActivity extends BaseActivity<PrintListPresenter> implem
private
void
initViewPager
()
{
List
<
String
>
titles
=
new
ArrayList
<>();
List
<
Fragment
>
mFragments
=
new
ArrayList
<>();
mFragments
.
add
(
IpPrintListActivityFragment
.
newInstance
());
if
(
PrintUtils
.
isPrintDevice
())
{
titles
.
add
(
"本機打印"
);
mFragments
.
add
(
LocalPrintFragment
.
newInstance
());
}
titles
.
add
(
"網絡打印"
);
mFragments
.
add
(
IpPrintListActivityFragment
.
newInstance
());
//实例化适配器
mTabFragmentAdapter
=
new
TabFragmentAdapter
(
getSupportFragmentManager
(),
1
);
...
...
print-module/src/main/java/com/joe/print/mvp/ui/adapter/DialogPrinterListAdapter.java
View file @
414e7e7d
...
...
@@ -2,6 +2,8 @@ package com.joe.print.mvp.ui.adapter;
import
android.content.Context
;
import
androidx.annotation.Nullable
;
import
com.chad.library.adapter.base.BaseQuickAdapter
;
import
com.chad.library.adapter.base.BaseViewHolder
;
import
com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean
;
...
...
@@ -9,8 +11,6 @@ import com.joe.print.R;
import
java.util.List
;
import
androidx.annotation.Nullable
;
/**
* Created by Wyh on 2020/1/16.
*/
...
...
@@ -28,9 +28,4 @@ public class DialogPrinterListAdapter extends BaseQuickAdapter<PrinterDeviceBean
helper
.
setText
(
R
.
id
.
tv_printer_ip
,
String
.
format
(
mContext
.
getString
(
R
.
string
.
print_ip
),
item
.
getIp
()));
helper
.
setText
(
R
.
id
.
tv_printer_port
,
String
.
format
(
mContext
.
getString
(
R
.
string
.
print_port
),
item
.
getPort
()
+
""
));
}
public
void
notifyData
(
List
<
PrinterDeviceBean
>
data
)
{
this
.
mData
=
data
;
super
.
notifyDataSetChanged
();
}
}
print-module/src/main/java/com/joe/print/mvp/ui/adapter/PrintFailListAdapter.java
0 → 100644
View file @
414e7e7d
package
com
.
joe
.
print
.
mvp
.
ui
.
adapter
;
import
android.view.View
;
import
androidx.annotation.Nullable
;
import
com.chad.library.adapter.base.BaseQuickAdapter
;
import
com.chad.library.adapter.base.BaseViewHolder
;
import
com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean
;
import
com.joe.print.R
;
import
java.util.ArrayList
;
import
java.util.List
;
public
class
PrintFailListAdapter
extends
BaseQuickAdapter
<
PrinterDeviceBean
,
BaseViewHolder
>
{
/**
* 0:打印失敗
* 1:打印中,這時候重試按鈕和切換打印機按鈕都不顯示,顯示progress
* 2:打印完成,刪除這條數據
*/
private
List
<
Integer
>
printStatus
=
new
ArrayList
<>();
private
onTryAgainPrintListenter
tryAgainPrintListenter
;
private
onSwitchPrintListenter
switchPrintListenter
;
public
PrintFailListAdapter
(
@Nullable
List
<
PrinterDeviceBean
>
data
)
{
super
(
R
.
layout
.
item_print_fail_layout
,
data
);
assert
data
!=
null
;
for
(
int
i
=
0
;
i
<
data
.
size
();
i
++)
{
printStatus
.
add
(
0
);
}
}
@Override
public
void
remove
(
int
position
)
{
printStatus
.
remove
(
position
);
super
.
remove
(
position
);
}
public
void
setTryAgainPrintListenter
(
onTryAgainPrintListenter
tryAgainPrintListenter
)
{
this
.
tryAgainPrintListenter
=
tryAgainPrintListenter
;
}
public
void
setSwitchPrintListenter
(
onSwitchPrintListenter
switchPrintListenter
)
{
this
.
switchPrintListenter
=
switchPrintListenter
;
}
public
void
setItemStatus
(
int
position
,
int
stauts
)
{
if
(
position
<
printStatus
.
size
())
{
printStatus
.
set
(
position
,
stauts
);
}
super
.
notifyItemChanged
(
position
);
}
@Override
protected
void
convert
(
BaseViewHolder
helper
,
PrinterDeviceBean
item
)
{
helper
.
setText
(
R
.
id
.
tv_print_device_name
,
item
.
getName
());
if
(
tryAgainPrintListenter
!=
null
)
helper
.
getView
(
R
.
id
.
tv_try_again_btn
).
setOnClickListener
(
v
->
{
tryAgainPrintListenter
.
onClick
(
helper
.
getAdapterPosition
());
setItemStatus
(
helper
.
getAdapterPosition
(),
1
);
});
if
(
switchPrintListenter
!=
null
)
helper
.
getView
(
R
.
id
.
tv_switch_print_btn
).
setOnClickListener
(
v
->
switchPrintListenter
.
onClick
(
helper
.
getAdapterPosition
()));
if
(
printStatus
.
get
(
helper
.
getAdapterPosition
())
==
1
)
{
helper
.
getView
(
R
.
id
.
loading_progress
).
setVisibility
(
View
.
VISIBLE
);
helper
.
getView
(
R
.
id
.
tv_print_status
).
setVisibility
(
View
.
VISIBLE
);
helper
.
getView
(
R
.
id
.
tv_try_again_btn
).
setVisibility
(
View
.
GONE
);
helper
.
getView
(
R
.
id
.
tv_switch_print_btn
).
setVisibility
(
View
.
GONE
);
}
else
{
helper
.
getView
(
R
.
id
.
loading_progress
).
setVisibility
(
View
.
GONE
);
helper
.
getView
(
R
.
id
.
tv_print_status
).
setVisibility
(
View
.
GONE
);
helper
.
getView
(
R
.
id
.
tv_try_again_btn
).
setVisibility
(
View
.
VISIBLE
);
helper
.
getView
(
R
.
id
.
tv_switch_print_btn
).
setVisibility
(
View
.
VISIBLE
);
}
}
public
interface
onTryAgainPrintListenter
{
void
onClick
(
int
position
);
}
public
interface
onSwitchPrintListenter
{
void
onClick
(
int
position
);
}
}
print-module/src/main/java/com/joe/print/mvp/ui/adapter/PrintFileBitmapAdapter.java
0 → 100644
View file @
414e7e7d
package
com
.
joe
.
print
.
mvp
.
ui
.
adapter
;
import
android.graphics.Bitmap
;
import
android.widget.ImageView
;
import
androidx.annotation.Nullable
;
import
com.chad.library.adapter.base.BaseQuickAdapter
;
import
com.chad.library.adapter.base.BaseViewHolder
;
import
com.joe.print.R
;
import
java.util.List
;
public
class
PrintFileBitmapAdapter
extends
BaseQuickAdapter
<
Bitmap
,
BaseViewHolder
>
{
public
PrintFileBitmapAdapter
(
@Nullable
List
<
Bitmap
>
data
)
{
super
(
R
.
layout
.
print_fail_img_item
,
data
);
}
@Override
protected
void
convert
(
BaseViewHolder
helper
,
Bitmap
item
)
{
((
ImageView
)
helper
.
getView
(
R
.
id
.
iv_print_fail
)).
setImageBitmap
(
item
);
}
}
print-module/src/main/java/com/joe/print/mvp/ui/adapter/PrinterListAdapter.java
View file @
414e7e7d
...
...
@@ -59,7 +59,7 @@ public class PrinterListAdapter extends BaseQuickAdapter<PrinterDeviceBean, Base
((
RadioButton
)
helper
.
getView
(
R
.
id
.
cb_printer_item
)).
setChecked
(
false
);
}
helper
.
setText
(
R
.
id
.
tv_printer_name
,
item
.
get
Ip
()
+
""
);
helper
.
setText
(
R
.
id
.
tv_printer_name
,
item
.
get
Name
()
+
""
);
helper
.
setText
(
R
.
id
.
tv_printer_ip
,
String
.
format
(
mContext
.
getString
(
R
.
string
.
print_ip
),
item
.
getIp
()));
if
(
item
.
getPort
()
==
null
)
{
helper
.
setText
(
R
.
id
.
tv_printer_port
,
String
.
format
(
mContext
.
getString
(
R
.
string
.
print_port
),
""
));
...
...
print-module/src/main/res/drawable/shape_error_color_bg.xml
0 → 100644
View file @
414e7e7d
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<corners
android:radius=
"@dimen/dp_4"
/>
<solid
android:color=
"@color/theme_red_color"
/>
</shape>
\ No newline at end of file
print-module/src/main/res/drawable/shape_theme_color_bg.xml
0 → 100644
View file @
414e7e7d
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<corners
android:radius=
"@dimen/dp_4"
/>
<solid
android:color=
"@color/theme_color"
/>
</shape>
\ No newline at end of file
print-module/src/main/res/layout/dialog_print_fail_list.xml
0 → 100644
View file @
414e7e7d
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:gravity=
"center"
android:orientation=
"vertical"
>
<androidx.recyclerview.widget.RecyclerView
android:id=
"@+id/rv_print_fail_list"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"@drawable/shape_white_eight_corners_bg"
/>
<ImageView
android:id=
"@+id/iv_close_dialog"
android:layout_width=
"@dimen/dp_50"
android:layout_height=
"@dimen/dp_50"
android:layout_gravity=
"center_horizontal"
android:layout_marginTop=
"@dimen/dp_20"
android:padding=
"@dimen/dp_10"
android:src=
"@drawable/dialog_close"
/>
</LinearLayout>
print-module/src/main/res/layout/item_print_fail_layout.xml
0 → 100644
View file @
414e7e7d
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"horizontal"
android:padding=
"@dimen/dp_10"
>
<TextView
android:id=
"@+id/tv_print_device_name"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_weight=
"1"
android:text=
"K1"
android:textColor=
"@color/theme_333_color"
android:textSize=
"@dimen/dp_16"
/>
<ProgressBar
android:id=
"@+id/loading_progress"
android:layout_width=
"@dimen/dp_15"
android:layout_height=
"@dimen/dp_15"
android:layout_gravity=
"center_vertical"
/>
<TextView
android:id=
"@+id/tv_print_status"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"打印中..."
android:textColor=
"@color/theme_333_color"
android:textSize=
"@dimen/dp_16"
/>
<TextView
android:id=
"@+id/tv_try_again_btn"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:background=
"@drawable/shape_error_color_bg"
android:paddingLeft=
"@dimen/dp_10"
android:paddingTop=
"@dimen/dp_5"
android:paddingRight=
"@dimen/dp_10"
android:paddingBottom=
"@dimen/dp_5"
android:text=
"重試"
android:textColor=
"@color/white"
android:textSize=
"@dimen/dp_16"
/>
<TextView
android:id=
"@+id/tv_switch_print_btn"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginLeft=
"@dimen/dp_10"
android:background=
"@drawable/shape_theme_color_bg"
android:paddingLeft=
"@dimen/dp_10"
android:paddingTop=
"@dimen/dp_5"
android:paddingRight=
"@dimen/dp_10"
android:paddingBottom=
"@dimen/dp_5"
android:text=
"切換打印機"
android:textColor=
"@color/white"
android:textSize=
"@dimen/dp_16"
/>
</LinearLayout>
\ No newline at end of file
print-module/src/main/res/layout/print_fail_img_item.xml
0 → 100644
View file @
414e7e7d
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"vertical"
android:padding=
"@dimen/dp_10"
>
<ImageView
android:id=
"@+id/iv_print_fail"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
/>
</LinearLayout>
\ No newline at end of file
print-module/src/main/res/layout/printer_activity_add.xml
View file @
414e7e7d
...
...
@@ -22,6 +22,40 @@
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_weight=
"0.3"
android:text=
"名稱"
android:textColor=
"@color/normal_color"
android:textSize=
"@dimen/dp_14"
android:textStyle=
"bold"
/>
<EditText
android:id=
"@+id/add_printer_ed_name"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_alignParentRight=
"true"
android:layout_weight=
"0.7"
android:background=
"@null"
android:hint=
"請輸入打印機名稱"
android:maxLines=
"1"
android:textColor=
"@color/normal_color"
android:textColorHint=
"@color/hint_color"
android:textSize=
"@dimen/dp_14"
>
<requestFocus
/>
</EditText>
</LinearLayout>
<include
layout=
"@layout/include_horizontal_color_ccc_dividing_line"
/>
<LinearLayout
style=
"@style/print_add_printer_input_style"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"horizontal"
>
<TextView
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_weight=
"0.3"
android:text=
"打印機IP"
android:textColor=
"@color/normal_color"
android:textSize=
"@dimen/dp_14"
...
...
@@ -46,10 +80,7 @@
android:text=
"192"
android:textColor=
"@color/normal_color"
android:textCursorDrawable=
"@null"
android:textSize=
"@dimen/dp_15"
>
<requestFocus
/>
</EditText>
android:textSize=
"@dimen/dp_15"
/>
<TextView
android:id=
"@+id/dot_1"
...
...
public-base/build.gradle
View file @
414e7e7d
...
...
@@ -4,7 +4,6 @@ apply plugin: 'kotlin-android-extensions'
apply
plugin:
'kotlin-android'
apply
plugin:
'com.jakewharton.butterknife'
apply
plugin:
'org.greenrobot.greendao'
apply
plugin:
'android-aspectjx'
android
{
compileSdkVersion
rootProject
.
ext
.
android
[
"compileSdkVersion"
]
...
...
public-base/src/main/java/com/gingersoft/gsa/cloud/aspectj/SingleClickAspect.java
View file @
414e7e7d
package
com
.
gingersoft
.
gsa
.
cloud
.
aspectj
;
import
android.util.Log
;
import
android.view.View
;
import
org.aspectj.lang.ProceedingJoinPoint
;
...
...
@@ -32,6 +33,7 @@ public class SingleClickAspect {
@Around
(
"methodAnnotated()"
)
public
void
aroundJoinPoint
(
ProceedingJoinPoint
joinPoint
)
throws
Throwable
{
// 取出方法的参数
Log
.
e
(
"eee"
,
"執行aroundJoinPoint"
);
View
view
=
null
;
for
(
Object
arg
:
joinPoint
.
getArgs
())
{
if
(
arg
instanceof
View
)
{
...
...
public-base/src/main/java/com/gingersoft/gsa/cloud/aspectj/SwitchPrintAspect.java
View file @
414e7e7d
...
...
@@ -15,6 +15,7 @@ import org.aspectj.lang.annotation.Pointcut;
/**
* Created by Wyh on 2020/3/2.
* 組件化使用Aspect有問題。
*/
@Aspect
public
class
SwitchPrintAspect
{
...
...
public-base/src/main/java/com/gingersoft/gsa/cloud/base/utils/AidlUtil.java
View file @
414e7e7d
...
...
@@ -6,6 +6,7 @@ import android.os.RemoteException;
import
android.widget.Toast
;
import
com.gingersoft.gsa.cloud.base.utils.log.LogUtil
;
import
com.gingersoft.gsa.cloud.base.utils.view.ImageUtils
;
import
com.sunmi.peripheral.printer.InnerPrinterCallback
;
import
com.sunmi.peripheral.printer.InnerPrinterException
;
import
com.sunmi.peripheral.printer.InnerPrinterManager
;
...
...
@@ -180,7 +181,7 @@ public class AidlUtil {
/*
*打印图片
*/
public
void
printBitmaps
(
List
<
Bitmap
>
bitmaps
,
InnerResultCallbcak
mInnerResultCallbcak
)
{
public
void
printBitmaps
(
List
<
Bitmap
>
bitmaps
,
int
paperWidth
,
InnerResultCallbcak
mInnerResultCallbcak
)
{
if
(
sunmiPrinterService
==
null
)
{
Toast
.
makeText
(
context
,
LanguageUtils
.
get_language_system
(
context
,
"server.disconnected"
,
"未連接上打印機!"
),
Toast
.
LENGTH_LONG
).
show
();
return
;
...
...
@@ -189,7 +190,7 @@ public class AidlUtil {
try
{
sunmiPrinterService
.
setAlignment
(
1
,
null
);
for
(
int
i
=
0
;
i
<
bitmaps
.
size
();
i
++)
{
sunmiPrinterService
.
printBitmap
(
bitmaps
.
get
(
i
),
mInnerResultCallbcak
);
sunmiPrinterService
.
printBitmap
(
ImageUtils
.
zoomDrawable
(
bitmaps
.
get
(
i
),
paperWidth
),
mInnerResultCallbcak
);
sunmiPrinterService
.
lineWrap
(
3
,
null
);
}
}
catch
(
RemoteException
e
)
{
...
...
public-base/src/main/java/com/gingersoft/gsa/cloud/base/widget/DialogUtils.java
View file @
414e7e7d
...
...
@@ -113,6 +113,11 @@ public abstract class DialogUtils {
}
public
DialogUtils
setCanceledOnTouchOutside
(
boolean
cancel
)
{
dialog
.
setCanceledOnTouchOutside
(
cancel
);
return
this
;
}
public
static
class
ViewHepler
{
private
final
SparseArray
<
View
>
mViews
;
private
View
mConvertView
;
...
...
public-base/src/main/java/com/gingersoft/gsa/cloud/database/bean/PrinterDeviceBean.java
View file @
414e7e7d
...
...
@@ -21,6 +21,7 @@ public class PrinterDeviceBean implements Serializable {
@Id
(
autoincrement
=
true
)
private
Long
dbid
;
private
String
name
;
private
Integer
restaurantId
;
private
String
ip
;
//ip
private
Integer
port
;
//端口
...
...
@@ -30,7 +31,8 @@ public class PrinterDeviceBean implements Serializable {
public
PrinterDeviceBean
()
{
}
public
PrinterDeviceBean
(
int
id
,
Integer
restaurantId
,
String
ip
,
Integer
port
,
int
type
)
{
public
PrinterDeviceBean
(
String
name
,
int
id
,
Integer
restaurantId
,
String
ip
,
Integer
port
,
int
type
)
{
this
.
name
=
name
;
this
.
id
=
id
;
this
.
restaurantId
=
restaurantId
;
this
.
ip
=
ip
;
...
...
@@ -39,24 +41,34 @@ public class PrinterDeviceBean implements Serializable {
}
public
PrinterDeviceBean
(
Integer
restaurantId
,
String
ip
,
Integer
port
,
int
type
)
{
public
PrinterDeviceBean
(
String
name
,
Integer
restaurantId
,
String
ip
,
Integer
port
,
int
type
)
{
this
.
name
=
name
;
this
.
restaurantId
=
restaurantId
;
this
.
ip
=
ip
;
this
.
port
=
port
;
this
.
type
=
type
;
}
@Generated
(
hash
=
1970016969
)
public
PrinterDeviceBean
(
int
id
,
Long
dbid
,
Integer
restaurantId
,
String
ip
,
Integer
port
,
@Generated
(
hash
=
2107713534
)
public
PrinterDeviceBean
(
int
id
,
Long
dbid
,
String
name
,
Integer
restaurantId
,
String
ip
,
Integer
port
,
int
type
)
{
this
.
id
=
id
;
this
.
dbid
=
dbid
;
this
.
name
=
name
;
this
.
restaurantId
=
restaurantId
;
this
.
ip
=
ip
;
this
.
port
=
port
;
this
.
type
=
type
;
}
public
String
getName
()
{
return
name
;
}
public
void
setName
(
String
name
)
{
this
.
name
=
name
;
}
public
int
getId
()
{
return
this
.
id
;
}
...
...
public-base/src/main/java/com/gingersoft/gsa/cloud/database/greendao/PrinterDeviceBeanDao.java
View file @
414e7e7d
...
...
@@ -26,10 +26,11 @@ public class PrinterDeviceBeanDao extends AbstractDao<PrinterDeviceBean, Long> {
public
static
class
Properties
{
public
final
static
Property
Id
=
new
Property
(
0
,
int
.
class
,
"id"
,
false
,
"ID"
);
public
final
static
Property
Dbid
=
new
Property
(
1
,
Long
.
class
,
"dbid"
,
true
,
"_id"
);
public
final
static
Property
RestaurantId
=
new
Property
(
2
,
Integer
.
class
,
"restaurantId"
,
false
,
"RESTAURANT_ID"
);
public
final
static
Property
Ip
=
new
Property
(
3
,
String
.
class
,
"ip"
,
false
,
"IP"
);
public
final
static
Property
Port
=
new
Property
(
4
,
Integer
.
class
,
"port"
,
false
,
"PORT"
);
public
final
static
Property
Type
=
new
Property
(
5
,
int
.
class
,
"type"
,
false
,
"TYPE"
);
public
final
static
Property
Name
=
new
Property
(
2
,
String
.
class
,
"name"
,
false
,
"NAME"
);
public
final
static
Property
RestaurantId
=
new
Property
(
3
,
Integer
.
class
,
"restaurantId"
,
false
,
"RESTAURANT_ID"
);
public
final
static
Property
Ip
=
new
Property
(
4
,
String
.
class
,
"ip"
,
false
,
"IP"
);
public
final
static
Property
Port
=
new
Property
(
5
,
Integer
.
class
,
"port"
,
false
,
"PORT"
);
public
final
static
Property
Type
=
new
Property
(
6
,
int
.
class
,
"type"
,
false
,
"TYPE"
);
}
...
...
@@ -47,10 +48,11 @@ public class PrinterDeviceBeanDao extends AbstractDao<PrinterDeviceBean, Long> {
db
.
execSQL
(
"CREATE TABLE "
+
constraint
+
"\"PRINTER_DEVICE_BEAN\" ("
+
//
"\"ID\" INTEGER NOT NULL ,"
+
// 0: id
"\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ,"
+
// 1: dbid
"\"RESTAURANT_ID\" INTEGER,"
+
// 2: restaurantId
"\"IP\" TEXT,"
+
// 3: ip
"\"PORT\" INTEGER,"
+
// 4: port
"\"TYPE\" INTEGER NOT NULL );"
);
// 5: type
"\"NAME\" TEXT,"
+
// 2: name
"\"RESTAURANT_ID\" INTEGER,"
+
// 3: restaurantId
"\"IP\" TEXT,"
+
// 4: ip
"\"PORT\" INTEGER,"
+
// 5: port
"\"TYPE\" INTEGER NOT NULL );"
);
// 6: type
}
/** Drops the underlying database table. */
...
...
@@ -69,21 +71,26 @@ public class PrinterDeviceBeanDao extends AbstractDao<PrinterDeviceBean, Long> {
stmt
.
bindLong
(
2
,
dbid
);
}
String
name
=
entity
.
getName
();
if
(
name
!=
null
)
{
stmt
.
bindString
(
3
,
name
);
}
Integer
restaurantId
=
entity
.
getRestaurantId
();
if
(
restaurantId
!=
null
)
{
stmt
.
bindLong
(
3
,
restaurantId
);
stmt
.
bindLong
(
4
,
restaurantId
);
}
String
ip
=
entity
.
getIp
();
if
(
ip
!=
null
)
{
stmt
.
bindString
(
4
,
ip
);
stmt
.
bindString
(
5
,
ip
);
}
Integer
port
=
entity
.
getPort
();
if
(
port
!=
null
)
{
stmt
.
bindLong
(
5
,
port
);
stmt
.
bindLong
(
6
,
port
);
}
stmt
.
bindLong
(
6
,
entity
.
getType
());
stmt
.
bindLong
(
7
,
entity
.
getType
());
}
@Override
...
...
@@ -96,21 +103,26 @@ public class PrinterDeviceBeanDao extends AbstractDao<PrinterDeviceBean, Long> {
stmt
.
bindLong
(
2
,
dbid
);
}
String
name
=
entity
.
getName
();
if
(
name
!=
null
)
{
stmt
.
bindString
(
3
,
name
);
}
Integer
restaurantId
=
entity
.
getRestaurantId
();
if
(
restaurantId
!=
null
)
{
stmt
.
bindLong
(
3
,
restaurantId
);
stmt
.
bindLong
(
4
,
restaurantId
);
}
String
ip
=
entity
.
getIp
();
if
(
ip
!=
null
)
{
stmt
.
bindString
(
4
,
ip
);
stmt
.
bindString
(
5
,
ip
);
}
Integer
port
=
entity
.
getPort
();
if
(
port
!=
null
)
{
stmt
.
bindLong
(
5
,
port
);
stmt
.
bindLong
(
6
,
port
);
}
stmt
.
bindLong
(
6
,
entity
.
getType
());
stmt
.
bindLong
(
7
,
entity
.
getType
());
}
@Override
...
...
@@ -123,10 +135,11 @@ public class PrinterDeviceBeanDao extends AbstractDao<PrinterDeviceBean, Long> {
PrinterDeviceBean
entity
=
new
PrinterDeviceBean
(
//
cursor
.
getInt
(
offset
+
0
),
// id
cursor
.
isNull
(
offset
+
1
)
?
null
:
cursor
.
getLong
(
offset
+
1
),
// dbid
cursor
.
isNull
(
offset
+
2
)
?
null
:
cursor
.
getInt
(
offset
+
2
),
// restaurantId
cursor
.
isNull
(
offset
+
3
)
?
null
:
cursor
.
getString
(
offset
+
3
),
// ip
cursor
.
isNull
(
offset
+
4
)
?
null
:
cursor
.
getInt
(
offset
+
4
),
// port
cursor
.
getInt
(
offset
+
5
)
// type
cursor
.
isNull
(
offset
+
2
)
?
null
:
cursor
.
getString
(
offset
+
2
),
// name
cursor
.
isNull
(
offset
+
3
)
?
null
:
cursor
.
getInt
(
offset
+
3
),
// restaurantId
cursor
.
isNull
(
offset
+
4
)
?
null
:
cursor
.
getString
(
offset
+
4
),
// ip
cursor
.
isNull
(
offset
+
5
)
?
null
:
cursor
.
getInt
(
offset
+
5
),
// port
cursor
.
getInt
(
offset
+
6
)
// type
);
return
entity
;
}
...
...
@@ -135,10 +148,11 @@ public class PrinterDeviceBeanDao extends AbstractDao<PrinterDeviceBean, Long> {
public
void
readEntity
(
Cursor
cursor
,
PrinterDeviceBean
entity
,
int
offset
)
{
entity
.
setId
(
cursor
.
getInt
(
offset
+
0
));
entity
.
setDbid
(
cursor
.
isNull
(
offset
+
1
)
?
null
:
cursor
.
getLong
(
offset
+
1
));
entity
.
setRestaurantId
(
cursor
.
isNull
(
offset
+
2
)
?
null
:
cursor
.
getInt
(
offset
+
2
));
entity
.
setIp
(
cursor
.
isNull
(
offset
+
3
)
?
null
:
cursor
.
getString
(
offset
+
3
));
entity
.
setPort
(
cursor
.
isNull
(
offset
+
4
)
?
null
:
cursor
.
getInt
(
offset
+
4
));
entity
.
setType
(
cursor
.
getInt
(
offset
+
5
));
entity
.
setName
(
cursor
.
isNull
(
offset
+
2
)
?
null
:
cursor
.
getString
(
offset
+
2
));
entity
.
setRestaurantId
(
cursor
.
isNull
(
offset
+
3
)
?
null
:
cursor
.
getInt
(
offset
+
3
));
entity
.
setIp
(
cursor
.
isNull
(
offset
+
4
)
?
null
:
cursor
.
getString
(
offset
+
4
));
entity
.
setPort
(
cursor
.
isNull
(
offset
+
5
)
?
null
:
cursor
.
getInt
(
offset
+
5
));
entity
.
setType
(
cursor
.
getInt
(
offset
+
6
));
}
@Override
...
...
public-base/src/main/java/com/gingersoft/gsa/cloud/print/PrintExecutor.java
View file @
414e7e7d
...
...
@@ -19,7 +19,8 @@ package com.gingersoft.gsa.cloud.print;
import
android.bluetooth.BluetoothDevice
;
import
android.os.AsyncTask
;
import
java.lang.ref.WeakReference
;
import
com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean
;
import
java.util.List
;
/**
...
...
@@ -32,15 +33,15 @@ public class PrintExecutor {
private
int
mReconnectTimes
=
0
;
private
int
time
=
0
;
private
PrintSocketHolder
.
OnStateChangedListener
listener
;
private
WeakReference
<
OnPrintResultListener
>
mListener
;
private
OnPrintResultListener
mListener
;
public
PrintExecutor
(
BluetoothDevice
device
,
int
type
)
{
holder
=
new
PrintSocketHolder
(
device
);
setType
(
type
);
}
public
PrintExecutor
(
String
ip
,
int
port
,
int
type
)
{
holder
=
new
PrintSocketHolder
(
ip
,
port
);
public
PrintExecutor
(
PrinterDeviceBean
printerDeviceBean
,
int
type
)
{
holder
=
new
PrintSocketHolder
(
printerDeviceBean
);
setType
(
type
);
}
...
...
@@ -118,12 +119,9 @@ public class PrintExecutor {
/**
* 设置IP及端口
*
* @param ip IP
* @param port 端口
*/
public
void
setIp
(
String
ip
,
int
port
)
{
holder
.
setIp
(
ip
,
port
);
public
void
setIp
(
PrinterDeviceBean
printerDeviceBean
)
{
holder
.
setIp
(
printerDeviceBean
);
}
/**
...
...
@@ -168,11 +166,11 @@ public class PrintExecutor {
* @param listener 回调
*/
public
void
setOnPrintResultListener
(
OnPrintResultListener
listener
)
{
mListener
=
new
WeakReference
<>(
listener
)
;
this
.
mListener
=
listener
;
}
public
interface
OnPrintResultListener
{
void
onResult
(
int
errorCode
);
void
onResult
(
int
errorCode
,
PrinterDeviceBean
printerDeviceBean
);
}
private
class
PrintTask
extends
AsyncTask
<
PrintDataMaker
,
Integer
,
Integer
>
implements
...
...
@@ -197,7 +195,7 @@ public class PrintExecutor {
if
(
values
==
null
||
values
.
length
<
1
)
return
;
if
(
listener
!=
null
)
listener
.
onStateChanged
(
values
[
0
]);
listener
.
onStateChanged
(
values
[
0
]
,
holder
.
getPrinterDeviceBean
()
);
}
@Override
...
...
@@ -216,14 +214,14 @@ public class PrintExecutor {
private
void
onResult
(
int
errorCode
)
{
try
{
if
(
mListener
!=
null
)
mListener
.
get
().
onResult
(
errorCode
);
mListener
.
onResult
(
errorCode
,
holder
.
getPrinterDeviceBean
()
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
@Override
public
void
onStateChanged
(
int
state
)
{
public
void
onStateChanged
(
int
state
,
PrinterDeviceBean
printerDeviceBean
)
{
publishProgress
(
state
);
}
}
...
...
public-base/src/main/java/com/gingersoft/gsa/cloud/print/PrintSocketHolder.java
View file @
414e7e7d
...
...
@@ -21,6 +21,7 @@ import android.bluetooth.BluetoothDevice;
import
android.bluetooth.BluetoothSocket
;
import
com.gingersoft.gsa.cloud.constans.PrintConstans
;
import
com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean
;
import
java.io.IOException
;
import
java.io.OutputStream
;
...
...
@@ -36,7 +37,7 @@ import java.util.UUID;
*/
@SuppressWarnings
({
"WeakerAccess"
,
"unused"
})
public
class
PrintSocketHolder
{
public
static
final
int
STATE_0
=
0
;
// 生成测试页面数据
public
static
final
int
STATE_0
=
1
0
;
// 生成测试页面数据
public
static
final
int
STATE_1
=
1
;
// 创建Socket连接
public
static
final
int
STATE_2
=
2
;
// 获取输出流
public
static
final
int
STATE_3
=
3
;
// 写入测试页面数据
...
...
@@ -50,8 +51,9 @@ public class PrintSocketHolder {
public
static
final
int
ERROR_6
=
-
6
;
// 关闭Socket出错
public
static
final
int
ERROR_100
=
-
100
;
// 失败
private
static
final
UUID
uuid
=
UUID
.
fromString
(
"00001101-0000-1000-8000-00805F9B34FB"
);
//蓝牙打印UUID
private
String
ip
;
private
int
port
=
9100
;
// private String ip;
// private int port = 9100;
private
PrinterDeviceBean
printerDeviceBean
;
private
BluetoothDevice
mDevice
;
private
Socket
socket
;
private
BluetoothSocket
bluetoothSocket
;
...
...
@@ -62,14 +64,14 @@ public class PrintSocketHolder {
setDevice
(
device
);
}
public
PrintSocketHolder
(
String
ip
,
int
port
)
{
setIp
(
ip
,
port
);
public
PrintSocketHolder
(
PrinterDeviceBean
printerDeviceBean
)
{
setIp
(
printerDeviceBean
);
}
@SuppressLint
(
"MissingPermission"
)
public
int
createSocket
()
{
onPrinterStateChanged
(
STATE_1
);
if
(
mDevice
==
null
&&
ip
==
null
)
if
(
mDevice
==
null
&&
(
printerDeviceBean
==
null
||
printerDeviceBean
.
getIp
()
==
null
)
)
return
ERROR_5
;
try
{
if
(
mDevice
!=
null
)
{
...
...
@@ -77,7 +79,7 @@ public class PrintSocketHolder {
bluetoothSocket
.
connect
();
}
else
{
socket
=
new
Socket
();
//ip, port
InetSocketAddress
socketAddress
=
new
InetSocketAddress
(
ip
,
port
);
InetSocketAddress
socketAddress
=
new
InetSocketAddress
(
printerDeviceBean
.
getIp
(),
printerDeviceBean
.
getPort
()
);
//设置 超时时间
socket
.
setSoTimeout
(
PrintConstans
.
SO_TIMEOUT
);
socket
.
connect
(
socketAddress
,
PrintConstans
.
PRINT_TIMEOUT
);
//开始连接ip
...
...
@@ -200,8 +202,8 @@ public class PrintSocketHolder {
*/
public
void
onPrinterStateChanged
(
int
state
)
{
try
{
if
(
mListener
!=
null
)
mListener
.
get
().
onStateChanged
(
state
);
if
(
mListener
!=
null
&&
mListener
.
get
()
!=
null
)
mListener
.
get
().
onStateChanged
(
state
,
printerDeviceBean
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
...
...
@@ -209,13 +211,26 @@ public class PrintSocketHolder {
/**
* 设置IP及端口
*
* @param ip IP
* @param port 端口
*/
public
void
setIp
(
String
ip
,
int
port
)
{
this
.
ip
=
ip
;
this
.
port
=
port
;
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
;
}
/**
...
...
@@ -237,6 +252,6 @@ public class PrintSocketHolder {
}
public
interface
OnStateChangedListener
{
void
onStateChanged
(
int
state
);
void
onStateChanged
(
int
state
,
PrinterDeviceBean
printerDeviceBean
);
}
}
public-base/src/main/java/com/gingersoft/gsa/cloud/print/PrinterUtils.java
View file @
414e7e7d
...
...
@@ -16,10 +16,17 @@
package
com
.
gingersoft
.
gsa
.
cloud
.
print
;
import
android.app.Dialog
;
import
android.content.Context
;
import
android.graphics.Bitmap
;
import
android.graphics.Color
;
import
android.graphics.Matrix
;
import
com.gingersoft.gsa.cloud.base.R
;
import
com.gingersoft.gsa.cloud.base.utils.constans.Constans
;
import
com.gingersoft.gsa.cloud.base.utils.other.SPUtils
;
import
com.gingersoft.gsa.cloud.base.widget.DialogUtils
;
import
java.util.ArrayList
;
import
java.util.List
;
...
...
@@ -441,4 +448,25 @@ public class PrinterUtils {
private
static
byte
charToByte
(
char
c
)
{
return
(
byte
)
hexStr
.
indexOf
(
c
);
}
/**
* 顯示修改打印方式的彈窗
* @param context
*/
public
static
void
switchPrintMethod
(
Context
context
){
// 顯示切換打印方式的彈窗
new
DialogUtils
(
context
,
R
.
layout
.
print_select_print_method
)
{
@Override
public
void
initLayout
(
ViewHepler
hepler
,
Dialog
dialog
)
{
hepler
.
setViewClick
(
R
.
id
.
local_print
,
v
->
{
SPUtils
.
put
(
dialog
.
getContext
(),
Constans
.
DEFAULT_PRINT_METHOD
,
Constans
.
LOCAL_PRINT
);
dialog
.
dismiss
();
});
hepler
.
setViewClick
(
R
.
id
.
internet_print
,
v
->
{
SPUtils
.
put
(
dialog
.
getContext
(),
Constans
.
DEFAULT_PRINT_METHOD
,
Constans
.
IP_PRINT
);
dialog
.
dismiss
();
});
}
}.
createDialogView
().
show
();
}
}
public-base/src/main/res/drawable-xhdpi/dialog_close.png
0 → 100644
View file @
414e7e7d
694 Bytes
table-mode/build.gradle
View file @
414e7e7d
apply
from:
rootProject
.
file
(
'cc-settings.gradle'
)
apply
plugin:
'com.jakewharton.butterknife'
android
{
compileSdkVersion
rootProject
.
ext
.
android
[
"compileSdkVersion"
]
...
...
table-mode/src/main/java/com/gingersoft/gsa/cloud/table/mvp/presenter/OrderContentPresenter.java
View file @
414e7e7d
...
...
@@ -18,14 +18,13 @@ import com.gingersoft.gsa.cloud.base.common.bean.mealManage.MyOrderManage;
import
com.gingersoft.gsa.cloud.base.common.bean.mealManage.OpenTableManage
;
import
com.gingersoft.gsa.cloud.base.utils.gson.GsonUtils
;
import
com.gingersoft.gsa.cloud.database.bean.Function
;
import
com.gingersoft.gsa.cloud.
table.R
;
import
com.gingersoft.gsa.cloud.
print.PrinterUtils
;
import
com.gingersoft.gsa.cloud.table.app.GoldConstants
;
import
com.gingersoft.gsa.cloud.table.mvp.contract.OrderContentContract
;
import
com.gingersoft.gsa.cloud.table.mvp.model.bean.BaseRespose
;
import
com.gingersoft.gsa.cloud.table.mvp.model.bean.TableDetail
;
import
com.gingersoft.gsa.cloud.table.mvp.model.bean.request.AddOrderRequest
;
import
com.gingersoft.gsa.cloud.table.mvp.model.bean.request.CreateOrderRequest
;
import
com.gingersoft.gsa.cloud.table.mvp.model.constant.MealConstant
;
import
com.gingersoft.gsa.cloud.table.mvp.model.utils.OrderAssemblyUtil
;
import
com.gingersoft.gsa.cloud.table.mvp.ui.activity.MealStandActivity
;
import
com.gingersoft.gsa.cloud.table.mvp.ui.activity.OrderContentActivity
;
...
...
@@ -38,8 +37,6 @@ import com.jess.arms.di.scope.ActivityScope;
import
com.jess.arms.http.imageloader.ImageLoader
;
import
com.jess.arms.integration.AppManager
;
import
com.jess.arms.utils.RxLifecycleUtils
;
import
com.qmuiteam.qmui.widget.dialog.QMUIDialog
;
import
com.qmuiteam.qmui.widget.dialog.QMUIDialogAction
;
import
com.scwang.smartrefresh.layout.api.RefreshLayout
;
import
java.util.ArrayList
;
...
...
@@ -157,6 +154,14 @@ public class OrderContentPresenter extends BaseOrderPresenter<OrderContentContra
}
}
});
mOrderTopFunctionAdapter
.
setmOnLongClickListener
((
v
,
position
)
->
{
if
(
mFunctionList
!=
null
)
{
if
(
mFunctionList
.
get
(
position
).
getResName
().
equals
(
"印單"
)
||
mFunctionList
.
get
(
position
).
getResName
().
equals
(
"送單"
))
{
PrinterUtils
.
switchPrintMethod
(
v
.
getContext
());
}
}
return
false
;
});
}
public
void
initTopFunctionData
()
{
...
...
table-mode/src/main/java/com/gingersoft/gsa/cloud/table/mvp/ui/activity/MealStandActivity.java
View file @
414e7e7d
package
com
.
gingersoft
.
gsa
.
cloud
.
table
.
mvp
.
ui
.
activity
;
import
android.app.Activity
;
import
android.app.Dialog
;
import
android.content.Intent
;
import
android.graphics.Color
;
import
android.os.Build
;
...
...
@@ -38,14 +37,13 @@ import com.gingersoft.gsa.cloud.base.common.bean.TableBean;
import
com.gingersoft.gsa.cloud.base.common.bean.mealManage.MyOrderManage
;
import
com.gingersoft.gsa.cloud.base.common.bean.mealManage.OpenTableManage
;
import
com.gingersoft.gsa.cloud.base.utils.VibratorUtils
;
import
com.gingersoft.gsa.cloud.base.utils.constans.Constans
;
import
com.gingersoft.gsa.cloud.base.utils.other.SPUtils
;
import
com.gingersoft.gsa.cloud.base.widget.DialogUtils
;
import
com.gingersoft.gsa.cloud.database.bean.Food
;
import
com.gingersoft.gsa.cloud.database.utils.ComboItemDaoUtils
;
import
com.gingersoft.gsa.cloud.database.utils.FoodComboDaoUtils
;
import
com.gingersoft.gsa.cloud.database.utils.FoodDaoUtils
;
import
com.gingersoft.gsa.cloud.database.utils.FoodModifierDaoUtils
;
import
com.gingersoft.gsa.cloud.print.PrinterUtils
;
import
com.gingersoft.gsa.cloud.table.R
;
import
com.gingersoft.gsa.cloud.table.R2
;
import
com.gingersoft.gsa.cloud.table.app.GoldConstants
;
...
...
@@ -1004,28 +1002,11 @@ public class MealStandActivity extends BaseActivity<MealStandPresenter> implemen
map
.
put
(
MealConstant
.
fine_tabs_ViewMode
,
rl_fine_tabs
);
map
.
put
(
MealConstant
.
ViewMode_keys
,
keyView
);
// @SwitchPrintMethod
btn_send_order
.
setOnLongClickListener
(
v
->
{
new
DialogUtils
(
mContext
,
R
.
layout
.
print_select_print_method
)
{
@Override
public
void
initLayout
(
ViewHepler
hepler
,
Dialog
dialog
)
{
hepler
.
setViewClick
(
R
.
id
.
local_print
,
v
->
{
SPUtils
.
put
(
mContext
,
Constans
.
DEFAULT_PRINT_METHOD
,
Constans
.
LOCAL_PRINT
);
dialog
.
dismiss
();
});
hepler
.
setViewClick
(
R
.
id
.
internet_print
,
v
->
{
SPUtils
.
put
(
mContext
,
Constans
.
DEFAULT_PRINT_METHOD
,
Constans
.
IP_PRINT
);
dialog
.
dismiss
();
});
}
}.
createDialogView
().
show
();
PrinterUtils
.
switchPrintMethod
(
mContext
);
return
false
;
});
// btn_send_order.setOnLongClickListener(new View.OnLongClickListener() {
// @Override
// public boolean onLongClick(View v) {
// return false;
// }
// });
}
public
FoodGroupAdapter
getFoodGroupGridViewAdapter
()
{
...
...
table-mode/src/main/java/com/gingersoft/gsa/cloud/table/mvp/ui/activity/OrderPayActivity.java
View file @
414e7e7d
...
...
@@ -24,6 +24,7 @@ import com.gingersoft.gsa.cloud.base.common.bean.mealManage.OpenTableManage;
import
com.gingersoft.gsa.cloud.base.utils.VibratorUtils
;
import
com.gingersoft.gsa.cloud.base.utils.gson.GsonUtils
;
import
com.gingersoft.gsa.cloud.base.utils.log.LogUtil
;
import
com.gingersoft.gsa.cloud.print.PrinterUtils
;
import
com.gingersoft.gsa.cloud.table.R
;
import
com.gingersoft.gsa.cloud.table.R2
;
import
com.gingersoft.gsa.cloud.table.app.payment.PayConstant
;
...
...
@@ -62,6 +63,7 @@ import javax.inject.Inject;
import
butterknife.BindView
;
import
butterknife.OnClick
;
import
butterknife.OnLongClick
;
import
static
com
.
jess
.
arms
.
utils
.
Preconditions
.
checkNotNull
;
...
...
@@ -78,7 +80,7 @@ import static com.jess.arms.utils.Preconditions.checkNotNull;
* <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
* ================================================
*/
public
class
OrderPayActivity
extends
BaseActivity
<
OrderPayPresenter
>
implements
OrderPayContract
.
View
{
public
class
OrderPayActivity
extends
BaseActivity
<
OrderPayPresenter
>
implements
OrderPayContract
.
View
,
View
.
OnLongClickListener
{
@Inject
AppManager
mAppManager
;
...
...
@@ -284,6 +286,21 @@ public class OrderPayActivity extends BaseActivity<OrderPayPresenter> implements
}
}
@Override
@OnLongClick
({
R2
.
id
.
btn_sure_pay
})
public
boolean
onLongClick
(
View
v
)
{
if
(
v
.
getId
()
==
R
.
id
.
btn_sure_pay
)
{
PrinterUtils
.
switchPrintMethod
(
mContext
);
}
return
false
;
}
//
// @SwitchPrintMethod
// public void switchPrint(View v) {
//
// PrinterUtils.switchPrintMethod(mContext);
// }
private
void
backPressed
()
{
// if (isPrepay) {
// //恢復預結賬前的食品
...
...
@@ -685,4 +702,5 @@ public class OrderPayActivity extends BaseActivity<OrderPayPresenter> implements
public
void
onPointerCaptureChanged
(
boolean
hasCapture
)
{
}
}
table-mode/src/main/java/com/gingersoft/gsa/cloud/table/mvp/ui/adapter/OrderTopFunctionAdapter.java
View file @
414e7e7d
...
...
@@ -2,7 +2,6 @@ package com.gingersoft.gsa.cloud.table.mvp.ui.adapter;
import
android.content.Context
;
import
android.view.View
;
import
android.view.ViewGroup
;
import
com.gingersoft.gsa.cloud.database.bean.Function
;
import
com.gingersoft.gsa.cloud.table.R
;
...
...
@@ -10,7 +9,6 @@ import com.gingersoft.gsa.cloud.table.R2;
import
com.jess.arms.base.BaseHolder
;
import
com.jess.arms.base.DefaultAdapter
;
import
com.qmuiteam.qmui.alpha.QMUIAlphaButton
;
import
com.qmuiteam.qmui.util.QMUIDisplayHelper
;
import
java.util.List
;
...
...
@@ -65,7 +63,6 @@ public class OrderTopFunctionAdapter extends DefaultAdapter<Function> {
btn_name
.
setTextColor
(
datasBean
.
getTextColor
());
btn_name
.
setBackgroundColor
(
datasBean
.
getBackgroundColor
());
btn_name
.
setTextSize
(
datasBean
.
getTextSize
());
}
}
...
...
user-login/build.gradle
View file @
414e7e7d
ext
.
mainApp
=
true
//设置为true,表示此module为主app module,一直以application方式编译
apply
from:
rootProject
.
file
(
"cc-settings.gradle"
)
apply
plugin:
'com.jakewharton.butterknife'
//apply plugin: 'android-aspectjx'
android
{
signingConfigs
{
GSAndroidNew
{
...
...
@@ -84,7 +83,6 @@ dependencies {
addComponent
'other_order_mode'
annotationProcessor
rootProject
.
ext
.
dependencies
[
"dagger2-compiler"
]
implementation
rootProject
.
ext
.
dependencies
[
"autosize"
]
implementation
rootProject
.
ext
.
dependencies
[
"fastjson"
]
...
...
user-login/src/main/java/com/gingersoft/gsa/cloud/user/login/mvp/ui/activity/WelcomeActivity.java
View file @
414e7e7d
...
...
@@ -113,7 +113,7 @@ public class WelcomeActivity extends LoginInterfaceImpl<WelcomePresenter> implem
}
});
guideBeanList
.
add
(
new
GuideBean
(
"多
终端云同步,轻松
管理所有"
,
"為您搭建優良高效管理平台"
,
getResources
().
getDrawable
(
R
.
mipmap
.
pic_guide_one
)));
guideBeanList
.
add
(
new
GuideBean
(
"多
終端雲同步,輕鬆
管理所有"
,
"為您搭建優良高效管理平台"
,
getResources
().
getDrawable
(
R
.
mipmap
.
pic_guide_one
)));
guideBeanList
.
add
(
new
GuideBean
(
"數據分析可視化"
,
"數據統計一目了然,直觀看到數據變化趨勢"
,
getResources
().
getDrawable
(
R
.
mipmap
.
pic_guide_two
)));
guideBeanList
.
add
(
new
GuideBean
(
"多種點餐方式"
,
"提供方便快捷的點餐服務,減低落錯單機會"
,
getResources
().
getDrawable
(
R
.
mipmap
.
pic_guide_three
)));
GuideAdapter
adapter
=
new
GuideAdapter
(
mContext
,
guideBeanList
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment