Commit 1e5bffbd by Wyh

7.04 修改打印一些數據。登陸頁面,加了billNo

parent 05241d29
......@@ -40,6 +40,21 @@ public class JsonUtils {
}
/**
* json字符串转换bean对象,异常捕捉
*/
public static <T> T parseObject(Object json, Class<T> classOfT) {
try {
if (null == json) {
return null;
}
return JSON.parseObject(JSONObject.toJSONString(json), classOfT);
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
/**
* object转换List对象,异常捕捉
*/
public static <T> List<T> parseArray(Object object, Class<T> classOfT) {
......
......@@ -48,7 +48,7 @@ public class OkHttp3Utils {
.connectTimeout(GsaCloudApplication.REQUEST_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(GsaCloudApplication.REQUEST_TIMEOUT, TimeUnit.SECONDS)
.addInterceptor(new UserAgentIntercepter())
.addInterceptor(new LoggingInterceptor())
// .addInterceptor(new LoggingInterceptor())
.build();
}
......
......@@ -20,51 +20,34 @@ public class PrinterDeviceBean implements Serializable {
@Property(nameInDb = "_id")
@Id(autoincrement = true)
private Long dbid;
private String name;
private Integer restaurantId;
private String ip;//ip
private Long uid;
private Integer port;//端口
// private int type;//打印機紙張類型 為1時是58mm,否則是88mm
private Integer status;//2為默認打印機,1為普通打印機
private Integer type;//2為默認打印機,1為普通打印機
private int printerModelId;//打印機機型id
private Long printerModelId;//打印機機型id
private String paperSpecification;//紙張規格
private String printerName;//打印機機型名稱
private String model;//打印機型號
private String noteContent;//備註
private Long printerDeviceDefaultId;
/**
* 飛單1打印機id
*/
private Long printerDeviceId;
private Long flyPrinterDeviceId;
/**
* 飛單2 打印機id
*/
private Long defaultPrinterDeviceId;
private Long flyPrinterDeviceId2;
@Generated(hash = 626885316)
public PrinterDeviceBean() {
}
public PrinterDeviceBean(String name, Long id, Integer restaurantId, String ip, Integer port, int type) {
this.name = name;
this.id = id;
this.restaurantId = restaurantId;
this.ip = ip;
this.port = port;
}
public PrinterDeviceBean(String name, Integer restaurantId, String ip, Integer port, int type) {
this.name = name;
this.restaurantId = restaurantId;
this.ip = ip;
this.port = port;
}
@Generated(hash = 1626972301)
public PrinterDeviceBean(Long id, Long dbid, String name, Integer restaurantId, String ip, Long uid, Integer port, Integer status, int printerModelId, String paperSpecification, String printerName, String model, Long printerDeviceId, Long defaultPrinterDeviceId) {
@Generated(hash = 1228354346)
public PrinterDeviceBean(Long id, Long dbid, String name, Integer restaurantId, String ip, Long uid, Integer port, Integer type, Long printerModelId, String paperSpecification, String printerName, String model, String noteContent, Long printerDeviceDefaultId, Long flyPrinterDeviceId, Long flyPrinterDeviceId2) {
this.id = id;
this.dbid = dbid;
this.name = name;
......@@ -72,25 +55,19 @@ public class PrinterDeviceBean implements Serializable {
this.ip = ip;
this.uid = uid;
this.port = port;
this.status = status;
this.type = type;
this.printerModelId = printerModelId;
this.paperSpecification = paperSpecification;
this.printerName = printerName;
this.model = model;
this.printerDeviceId = printerDeviceId;
this.defaultPrinterDeviceId = defaultPrinterDeviceId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
this.noteContent = noteContent;
this.printerDeviceDefaultId = printerDeviceDefaultId;
this.flyPrinterDeviceId = flyPrinterDeviceId;
this.flyPrinterDeviceId2 = flyPrinterDeviceId2;
}
public Long getId() {
return this.id;
return id;
}
public void setId(Long id) {
......@@ -98,74 +75,69 @@ public class PrinterDeviceBean implements Serializable {
}
public Long getDbid() {
return this.dbid;
return dbid;
}
public void setDbid(Long dbid) {
this.dbid = dbid;
}
public Integer getRestaurantId() {
return restaurantId;
public String getName() {
return name;
}
public String getIp() {
return this.ip;
public void setName(String name) {
this.name = name;
}
public void setIp(String ip) {
this.ip = ip;
public Integer getRestaurantId() {
return restaurantId;
}
public Integer getPort() {
return this.port;
public void setRestaurantId(Integer restaurantId) {
this.restaurantId = restaurantId;
}
public void setPort(Integer port) {
this.port = port;
public String getIp() {
return ip;
}
// public int getType() {
// return this.type;
// }
//
// public void setType(int type) {
// this.type = type;
// }
public void setRestaurantId(Integer restaurantId) {
this.restaurantId = restaurantId;
public void setIp(String ip) {
this.ip = ip;
}
public int getStatus() {
return this.status;
public Long getUid() {
return uid;
}
public void setStatus(Integer status) {
this.status = status;
public void setUid(Long uid) {
this.uid = uid;
}
public Long getPrinterDeviceId() {
return this.printerDeviceId;
public Integer getPort() {
return port;
}
public void setPrinterDeviceId(Long printerDeviceId) {
this.printerDeviceId = printerDeviceId;
public void setPort(Integer port) {
this.port = port;
}
public Long getDefaultPrinterDeviceId() {
return this.defaultPrinterDeviceId;
public Integer getType() {
if (type == null) {
return 0;
}
return type;
}
public void setDefaultPrinterDeviceId(Long defaultPrinterDeviceId) {
this.defaultPrinterDeviceId = defaultPrinterDeviceId;
public void setType(Integer type) {
this.type = type;
}
public int getPrinterModelId() {
public Long getPrinterModelId() {
return printerModelId;
}
public void setPrinterModelId(int printerModelId) {
public void setPrinterModelId(Long printerModelId) {
this.printerModelId = printerModelId;
}
......@@ -193,12 +165,35 @@ public class PrinterDeviceBean implements Serializable {
this.model = model;
}
public String getNoteContent() {
return noteContent;
}
public Long getUid() {
return uid;
public void setNoteContent(String noteContent) {
this.noteContent = noteContent;
}
public void setUid(Long uid) {
this.uid = uid;
public Long getFlyPrinterDeviceId() {
return flyPrinterDeviceId;
}
public void setFlyPrinterDeviceId(Long flyPrinterDeviceId) {
this.flyPrinterDeviceId = flyPrinterDeviceId;
}
public Long getFlyPrinterDeviceId2() {
return flyPrinterDeviceId2;
}
public void setFlyPrinterDeviceId2(Long flyPrinterDeviceId2) {
this.flyPrinterDeviceId2 = flyPrinterDeviceId2;
}
public Long getPrinterDeviceDefaultId() {
return printerDeviceDefaultId;
}
public void setPrinterDeviceDefaultId(Long printerDeviceDefaultId) {
this.printerDeviceDefaultId = printerDeviceDefaultId;
}
}
package com.gingersoft.gsa.cloud.database.bean;
import java.util.List;
public class PrinterListBean {
private int count;
private List<PrinterDeviceBean> list;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public List<PrinterDeviceBean> getList() {
return list;
}
public void setList(List<PrinterDeviceBean> list) {
this.list = list;
}
}
......@@ -68,14 +68,16 @@ class OrderDetails {
var ID: Int = 0
var CREATE_TIME: String? = null
var takeFoodCode: String? = null
var billNo: String? = null
var RECEIVER: String? = null
var TOTAL_AMOUNT: String? = null
//後台不會返回
var order_type: Int = 0
var orderPayType: Int = 0//1為貨到付款,其他是在線支付
var orderPayType: Int = 0//0店內支付,1為貨到付款,2是在線支付
var isDelete: Int = 1 //默認為1,為0是第三方物流,其他則是本店配送
var payType: Int = 0//1:積分支付;2:支付寶;3:财付通;4:微信支付;5:貨到付款;6:其他支付
var payName: String? = null
var payTime: String? = null
var PRODUCT_NAME: List<PRODUCTNAMEBean>? = null
var couponList: List<CouponBean>? = null
......
......@@ -8,7 +8,7 @@ public class BrandsBean {
private long sysTime;
private List<BrandsData> data;
public class BrandsData {
public static class BrandsData {
/**
* brandId : 242
* brandName : 莫拉塔
......
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_checkbox_checked" android:state_checked="true"/>
<item android:drawable="@drawable/ic_checkbox_uncheck" android:state_checked="false"/>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="@dimen/dp_0_5"
android:color="@color/color_aaa" />
<corners android:radius="@dimen/dp_4" />
</shape>
\ No newline at end of file
......@@ -87,6 +87,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="人數:"
android:visibility="gone"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_kitchen_location" />
......
......@@ -7,8 +7,8 @@ ext {
targetSdkVersion : 28,
//正式版: 1.0.1 1
//內部測試版:1.1.1 11
versionCode : 12,
versionName : "1.1.2"
versionCode : 13,
versionName : "1.1.3"
]
version = [
......
<resources>
<string name="user_login_name" translatable="false">Ricepon POS</string>
<string name="user_login_welcome_login" translatable="false">歡迎登陸商戶端</string>
<string name="user_login_welcome_login" translatable="false">商戶端</string>
</resources>
......@@ -14,7 +14,6 @@ import retrofit2.http.POST;
*/
public interface MainService {
@Headers({"Domain-Name: system_url"})
@POST("user/logout" + RetrofitUrlManager.IDENTIFICATION_PATH_SIZE + 2)
Observable<Object> loginOut(@Body RequestBody requestBody);
......
......@@ -114,7 +114,6 @@ public class NewMainPresenter extends BasePresenter<NewMainContract.Model, NewMa
public void loginOut() {
RequestBody requestBody = new FormBody.Builder()
.add("restaurantId", GsaCloudApplication.getRestaurantId(mApplication) + "")
.add("type", "2")
.build();
clearHeartbeat();
......@@ -132,7 +131,6 @@ public class NewMainPresenter extends BasePresenter<NewMainContract.Model, NewMa
mRootView.loginOut();
//清空用戶信息
GsaCloudApplication.clearMemberInfo();
}
});
}
......
......@@ -34,7 +34,7 @@ class LookLogActivity : AppCompatActivity() {
}
rv_log.layoutManager = LinearLayoutManager(this)
val logAdapter = LogAdapter(ml)
logAdapter.setOnItemClickListener { adapter, view, position ->
logAdapter.setOnItemClickListener { _, _, position ->
scroll_log.visibility = View.VISIBLE
var x = ml[position]
if (!x.isDirectory) {
......
......@@ -14,6 +14,7 @@ import com.billy.cc.core.component.CC
import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication
import com.gingersoft.gsa.cloud.base.common.bean.mealManage.MyOrderManage
import com.gingersoft.gsa.cloud.base.utils.gson.GsonUtils
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils
import com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils
import com.gingersoft.gsa.cloud.base.widget.DialogUtils
import com.gingersoft.gsa.cloud.constans.PrintConstans
......@@ -292,7 +293,7 @@ class PageViewModel(private val repository: WeatherRepository) : ViewModel() {
}
BtnBuilder.printBtn -> {
//打印
printOrder(dataBean, listener)
printOrder(PrintCode, dataBean, listener)
}
BtnBuilder.ProductionCompletedBtn -> {
//製作完成
......@@ -307,10 +308,12 @@ class PageViewModel(private val repository: WeatherRepository) : ViewModel() {
}
fun gsUpdateOrderStatus(orderDetails: OrderDetails.DataBean, payTypeId: Int = 0, listener: (Int, Boolean) -> Unit) {
fun gsUpdateOrderStatus(orderDetails: OrderDetails.DataBean, payTypeId: Int = 0, payName:String?, listener: (Int, Boolean) -> Unit) {
launch({
repository.gsUpdateOrderStatus(orderDetails.ID.toString(), 4, orderDetails.order_type, 3, "", "", "", "0", "", 1, 0, payTypeId).apply {
orderDetails.payType = payTypeId
orderDetails.payName = payName
orderDetails.payTime = TimeUtils.getCurrentTimeInString(TimeUtils.DEFAULT_DATE_FORMAT)
val bean = GsonUtils.GsonToBean(GsonUtils.GsonString(data), OrderClosingBean::class.java)
orderDetails.oldPoints = bean.oldPoints
orderDetails.nowPoints = bean.nowPoints
......@@ -456,16 +459,13 @@ class PageViewModel(private val repository: WeatherRepository) : ViewModel() {
launch({
//單獨包起來,哪怕這接口報錯也不要影響到正常的邏輯
repository.addPrj(dataBean.Order_ID.toString(), restaurantId, ids.toString())
},{})
}, {})
if (this.code == "1") {
listener.invoke(OrderDelivery, true)
// 打印印單
// 初始化用於打印的view
// 送單成功後,再調用接口獲取取餐碼
getOrderInfo(dataBean.ID.toString()) {
if (it != null) {
printOrder(dataBean, listener)
}
repository.getOrderInfo(dataBean.ID.toString()).apply {
printOrder(OrderDelivery, data?.get(0)!!, listener)
}
} else {
listener.invoke(OrderDelivery, false)
......@@ -477,7 +477,7 @@ class PageViewModel(private val repository: WeatherRepository) : ViewModel() {
/**
* 打印訂單
*/
private fun printOrder(dataBean: OrderDetails.DataBean, listener: (Int, Boolean) -> Unit) {
private fun printOrder(code: Int, dataBean: OrderDetails.DataBean, listener: (Int, Boolean) -> Unit) {
//訂單信息和廚房單
MyOrderManage.setDataBean(dataBean)
CC.obtainBuilder("Component.Print")
......@@ -486,7 +486,7 @@ class PageViewModel(private val repository: WeatherRepository) : ViewModel() {
.build()
.callAsyncCallbackOnMainThread { _, result ->
MyOrderManage.setDataBean(null)
listener.invoke(PrintCode, result.isSuccess)
listener.invoke(code, result.isSuccess)
}
}
......@@ -709,7 +709,7 @@ class PageViewModel(private val repository: WeatherRepository) : ViewModel() {
/**
* 取消訂單
*/
fun cancelOrder(memberId: String, memberName:String, orderId: String, reasonId: String, reasonDesc: String, listener: (Boolean) -> Unit) {
fun cancelOrder(memberId: String, memberName: String, orderId: String, reasonId: String, reasonDesc: String, listener: (Boolean) -> Unit) {
launch({
repository.updateOrderStates(memberId, orderId, "6", memberName, reasonId, reasonDesc).apply {
listener.invoke(code == "1")
......
......@@ -40,6 +40,7 @@ class OrderDetailsActivity : BaseActivity() {
private lateinit var orderId: String
private var orderType: Int = 0
private var orderPayType: Int = 0
private var isRead: Int = -1
lateinit var skeletonScreen: ViewSkeletonScreen
override fun onCreate(savedInstanceState: Bundle?) {
......@@ -58,10 +59,13 @@ class OrderDetailsActivity : BaseActivity() {
orderId = intent.getStringExtra("orderId")//訂單id
orderType = intent.getIntExtra("orderType", 0)//訂單類型
orderPayType = intent.getIntExtra("orderPayType", 0)//訂單支付方式
isRead = intent.getIntExtra("isRead", -1)//是否已讀訂單
pageViewModel = ViewModelProvider(this, InjectorUtil.getWeatherModelFactory())[PageViewModel::class.java].apply {
//設為已讀
if (isRead == 0) {
//如果是未讀,調用設為已讀接口
updateIsRead(orderId)
}
//獲取訂單詳情
getOrderDetails(orderId, binding)
}
......@@ -139,14 +143,8 @@ class OrderDetailsActivity : BaseActivity() {
tv_order_state.setTextColor(resources.getColor(R.color.order_state0_color))
}
}
binding.patMethod = when (orderDetails.payType) {
1 -> "積分支付"
2 -> "支付寶"
3 -> "财付通"
4 -> "微信支付"
5 -> "貨到付款"
6 -> "其他支付"
else -> ""
if (orderDetails.orderPayType == 2 && orderDetails.payName != null) {
binding.patMethod = orderDetails.payName
}
binding.orderStatus = type + orderStatusText
......@@ -176,7 +174,7 @@ class OrderDetailsActivity : BaseActivity() {
BtnBuilder.closingBtn -> {
//如果是在線支付的訂單,就直接修改訂單狀態
if (orderPayType != 1) {
gsUpdateOrderStatus(orderDetails, orderDetails.order_type) { status, isSuccess ->
gsUpdateOrderStatus(orderDetails, orderDetails.order_type, orderDetails.payName) { status, isSuccess ->
if (isSuccess) {
finish()
} else {
......@@ -210,7 +208,7 @@ class OrderDetailsActivity : BaseActivity() {
}
OrderDelivery -> {
//已確認訂單,重新刷新當前頁面
if(isSuccess){
if (isSuccess) {
finish()
ToastUtils.show(this@OrderDetailsActivity, "訂單已確認")
} else {
......@@ -226,7 +224,7 @@ class OrderDetailsActivity : BaseActivity() {
})
}
PageViewModel.ProductionComplete -> {
if(isSuccess){
if (isSuccess) {
finish()
}
ToastUtils.show(this@OrderDetailsActivity, if (isSuccess) {
......
......@@ -63,7 +63,7 @@ class PayActivity : BaseActivity() {
other_pay_view.notifyBillMethodAdapter(PayTypeInfo.getPayMethodByPayType(it))
})
other_pay_view.setmOnSureClickLisenter {payMethods->
other_pay_view.setmOnSureClickLisenter { payMethods ->
//確認結賬,調用結賬接口
object : DialogUtils(this, R.layout.other_order_pause_orders) {
override fun initLayout(hepler: ViewHepler, dialog: Dialog) {
......@@ -71,7 +71,7 @@ class PayActivity : BaseActivity() {
hepler.getView<TextView>(R.id.tv_dialog_confirm).setOnClickListener {
dialog.dismiss()
showLoading()
pageViewModel.gsUpdateOrderStatus(orderDetails, payMethods[0].id) { _, _ ->
pageViewModel.gsUpdateOrderStatus(orderDetails, payMethods[0].id, payMethods[0].name) { _, _ ->
cancelDialogForLoading()
setResult(RESULT_OK)
finish()
......
......@@ -69,7 +69,6 @@ class OtherOrdersAdapter(var context: Context) : Adapter<OtherOrdersAdapter.View
data.STATUS == 0 -> {
state = "待確認"
bg.setColor(getColor(R.color.order_state0_color))
//執行動畫
if (data.isRead == 0) {
holder.flBorder.visibility = View.VISIBLE//顯示邊框
......
......@@ -60,6 +60,7 @@ class PlaceholderFragment : BaseFragment(R.layout.fragment_other_order) {
intent.putExtra("orderType", data.order_type)
intent.putExtra("orderStatus", data.STATUS)
intent.putExtra("orderPayType", data.orderPayType)
intent.putExtra("isRead", data.isRead)
startActivity(intent)
......
......@@ -189,6 +189,58 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_14"
android:paddingLeft="@dimen/dp_7"
android:paddingRight="@dimen/dp_14"
android:visibility='@{(data.takeFoodCode==null||data.takeFoodCode.length()==0||data.takeFoodCode.equals("0"))?View.GONE:View.VISIBLE}'>
<TextView
android:id="@+id/tv_take_food_text"
style="@style/otherOrderReceiving_title_textStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取餐碼:" />
<TextView
android:id="@+id/tv_take_food_code"
style="@style/otherOrderReceiving_information_textStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_toRightOf="@id/tv_take_food_text"
android:gravity="right"
android:text="@{data.takeFoodCode}" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_14"
android:paddingLeft="@dimen/dp_7"
android:paddingRight="@dimen/dp_14"
android:visibility="@{(data.billNo==null||data.billNo.length()==0)?View.GONE:View.VISIBLE}">
<TextView
android:id="@+id/tv_bill_num_text"
style="@style/otherOrderReceiving_title_textStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="訂單號:" />
<TextView
android:id="@+id/tv_bill_num"
style="@style/otherOrderReceiving_information_textStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_toRightOf="@id/tv_bill_num_text"
android:gravity="right"
android:text="@{data.billNo}" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_14"
android:paddingLeft="@dimen/dp_7"
android:paddingRight="@dimen/dp_14">
<TextView
......@@ -239,14 +291,15 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_14"
android:paddingLeft="@dimen/dp_7"
android:paddingRight="@dimen/dp_14">
android:paddingRight="@dimen/dp_14"
android:visibility="@{isSelf?View.GONE:View.VISIBLE}">
<TextView
android:id="@+id/tv_receive_address_text"
style="@style/otherOrderReceiving_title_textStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{isSelf?@string/meal_code:@string/receiving_address}" />
android:text="@string/receiving_address" />
<TextView
android:id="@+id/tv_receive_address"
......@@ -256,7 +309,7 @@
android:layout_alignParentRight="true"
android:layout_toRightOf="@id/tv_receive_address_text"
android:gravity="right"
android:text="@{isSelf?data.takeFoodCode:data.addressDetail}" />
android:text="@{data.addressDetail}" />
</RelativeLayout>
......
......@@ -6,6 +6,7 @@ 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.gingersoft.gsa.cloud.database.bean.PrinterListBean;
import com.jess.arms.di.scope.FragmentScope;
import com.jess.arms.http.imageloader.ImageLoader;
import com.jess.arms.integration.AppManager;
......@@ -69,7 +70,9 @@ public class IpPrintListActivityPresenter extends BasePresenter<IpPrintListActiv
@Override
public void onNext(BaseResult baseResult) {
if (baseResult.isSuccess()) {
List<PrinterDeviceBean> deviceBeans = JsonUtils.parseArray(baseResult.getData(), PrinterDeviceBean.class);
PrinterListBean printerListBean = JsonUtils.parseObject(baseResult.getData(), PrinterListBean.class);
if(printerListBean != null) {
List<PrinterDeviceBean> deviceBeans = printerListBean.getList();
if (deviceBeans != null && deviceBeans.size() > 0) {
mRootView.loadPrinterList(deviceBeans);
PrinterManager.getPrinterManager().setDeviceBeans(deviceBeans);
......@@ -79,6 +82,9 @@ public class IpPrintListActivityPresenter extends BasePresenter<IpPrintListActiv
} else {
mRootView.loadFile();
}
} else {
mRootView.loadFile();
}
}
});
}
......
......@@ -7,6 +7,7 @@ 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.gingersoft.gsa.cloud.database.bean.PrinterListBean;
import com.jess.arms.di.scope.ActivityScope;
import com.jess.arms.http.imageloader.ImageLoader;
import com.jess.arms.integration.AppManager;
......@@ -78,10 +79,14 @@ public class PrintPresenter extends BasePresenter<PrintContract.Model, PrintCont
@Override
public void onNext(BaseResult baseResult) {
if (baseResult.isSuccess()) {
List<PrinterDeviceBean> deviceBeans = JsonUtils.parseArray(baseResult.getData(), PrinterDeviceBean.class);
PrinterListBean deviceBeans = JsonUtils.parseObject(baseResult.getData(), PrinterListBean.class);
if(deviceBeans != null){
//有打印機,返回true
PrinterManager.getPrinterManager().setDeviceBeans(deviceBeans);
mRootView.showPrinterList(deviceBeans);
PrinterManager.getPrinterManager().setDeviceBeans(deviceBeans.getList());
mRootView.showPrinterList(deviceBeans.getList());
} else {
mRootView.showPrinterList(null);
}
} else {
mRootView.showPrinterList(null);
}
......
......@@ -23,6 +23,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.RequestBody;
......@@ -91,8 +92,7 @@ public class PrinterAddPresenter extends BasePresenter<PrinterAddContract.Model,
* 添加打印機
*/
public void addPrinter(PrinterDeviceBean printerDeviceBean) {
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), JsonUtils.toJson(printerDeviceBean));
mModel.addPrinter(requestBody)
mModel.addPrinter(getRequestBody(printerDeviceBean))
.subscribeOn(Schedulers.io())
.doOnSubscribe(disposable -> mRootView.showLoading(""))
.subscribeOn(AndroidSchedulers.mainThread())
......@@ -114,9 +114,8 @@ public class PrinterAddPresenter extends BasePresenter<PrinterAddContract.Model,
/**
* 更新打印機信息
*/
public void updatePrinterInfo(PrinterDeviceBean deviceBean) {
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), Objects.requireNonNull(JsonUtils.toJson(deviceBean)));
mModel.updatePrinter(requestBody)
public void updatePrinterInfo(PrinterDeviceBean printerDeviceBean) {
mModel.updatePrinter(getRequestBody(printerDeviceBean))
.subscribeOn(Schedulers.io())
.doOnSubscribe(disposable -> mRootView.showLoading(""))
.subscribeOn(AndroidSchedulers.mainThread())
......@@ -128,13 +127,32 @@ public class PrinterAddPresenter extends BasePresenter<PrinterAddContract.Model,
public void onNext(BaseResult baseResult) {
if (baseResult.isSuccess()) {
mRootView.showMessage("保存成功");
mRootView.updatePrinterSuccess(deviceBean);
mRootView.updatePrinterSuccess(printerDeviceBean);
mRootView.killMyself();
}
}
});
}
private RequestBody getRequestBody(PrinterDeviceBean printerDeviceBean) {
FormBody.Builder builder = new FormBody.Builder()
.add("restaurantId", printerDeviceBean.getRestaurantId() + "")
.add("name", printerDeviceBean.getName())
.add("ip", printerDeviceBean.getIp())
.add("port", printerDeviceBean.getPort() + "")
.add("printerModelId", printerDeviceBean.getPrinterModelId() + "")
.add("type", printerDeviceBean.getType() + "")
.add("id", printerDeviceBean.getId() + "");
if (printerDeviceBean.getFlyPrinterDeviceId() != null) {
builder.add("flyPrinterDeviceId", printerDeviceBean.getFlyPrinterDeviceId() + "");
}
if (printerDeviceBean.getFlyPrinterDeviceId2() != null) {
builder.add("flyPrinterDeviceId2", printerDeviceBean.getFlyPrinterDeviceId2() + "");
}
return builder.build();
}
/**
* 獲取打印機機型列表
......
......@@ -15,15 +15,14 @@ import com.gingersoft.gsa.cloud.base.common.bean.mealManage.MyOrderManage;
import com.gingersoft.gsa.cloud.base.utils.MoneyUtil;
import com.gingersoft.gsa.cloud.base.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.base.utils.view.ImageUtils;
import com.gingersoft.gsa.cloud.constans.ExpandConstant;
import com.gingersoft.gsa.cloud.database.bean.ExpandInfo;
import com.gingersoft.gsa.cloud.database.utils.ExpandInfoDaoUtils;
import com.gingersoft.gsa.cloud.print.bean.OrderDetails;
import com.joe.print.R;
import com.joe.print.mvp.model.bean.PrintBillBean;
import com.joe.print.mvp.ui.adapter.BillItemAdapter;
import com.joe.print.mvp.ui.adapter.OtherOrderAdapter;
import com.gingersoft.gsa.cloud.print.bean.OrderDetails;
import com.joe.print.R;
import java.util.ArrayList;
import java.util.HashMap;
......@@ -210,6 +209,8 @@ public class PrintOtherOrder extends PrinterRoot {
private Bitmap initPrintView(Context context, OrderDetails.DataBean data) {
View view = LayoutInflater.from(context).inflate(R.layout.print_confirm_order_view, null, false);
TextView tvOrderClosing = view.findViewById(R.id.tv_order_closing);
TextView tvBillNumber = view.findViewById(R.id.tv_bill_number);
//品牌名
setText(view, R.id.tv_brand_name, GsaCloudApplication.getBrandName(context));
//餐廳名
......@@ -223,6 +224,11 @@ public class PrintOtherOrder extends PrinterRoot {
} else {
view.findViewById(R.id.tv_order_take_food_code).setVisibility(View.GONE);
}
if (data.getBillNo() == null || data.getBillNo().length() <= 0) {
tvBillNumber.setVisibility(View.GONE);
} else {
tvBillNumber.setText("訂單號:" + data.getBillNo());
}
//訂單創建時間
setText(view, R.id.tv_order_create, context.getString(R.string.create_order_time) + TimeUtils.parseTimeRepeat(data.getCREATE_TIME(), TimeUtils.DEFAULT_DATE_FORMAT));
String amountUnit = context.getString(R.string.amount_unit);
......@@ -257,27 +263,20 @@ public class PrintOtherOrder extends PrinterRoot {
setText(view, R.id.tv_total, amountUnit + data.getTOTAL_AMOUNT());
//支付金額
setText(view, R.id.tv_pay_amount_text, "支付金額:" + amountUnit + MoneyUtil.sub(Double.parseDouble(data.getTOTAL_AMOUNT()), data.getDiscount_amount()));
//支付類型:貨到付款,在線支付
String payType = "";
if (data.getPayType() == 1) {
payType = ":積分支付";
} else if (data.getPayType() == 2) {
payType = ":支付寶";
} else if (data.getPayType() == 3) {
payType = ":财付通";
} else if (data.getPayType() == 4) {
payType = ":微信支付";
} else if (data.getPayType() == 5) {
payType = ":貨到付款";
} else if (data.getPayType() == 6) {
payType = ":其他支付";
}
if (data.getOrderPayType() == 1) {
//貨到付款
setText(view, R.id.tv_pay_type, "貨到付款");
} else {
setText(view, R.id.tv_pay_type, "在線支付" + payType);
} else if (data.getOrderPayType() == 0) {
setText(view, R.id.tv_pay_type, "店內支付");
} else if (data.getOrderPayType() == 2) {
setText(view, R.id.tv_pay_type, "在線支付");
//顯示支付時間
if (data.getPayTime() != null) {
tvOrderClosing.setText("支付時間:" + data.getPayTime());
tvOrderClosing.setVisibility(View.VISIBLE);
}
}
setText(view, R.id.tv_pay_amount_text, "支付金額:" + amountUnit + MoneyUtil.sub(Double.parseDouble(data.getTOTAL_AMOUNT()), data.getDiscount_amount()));
//收貨時間
setText(view, R.id.tv_delivery_time, data.getOrder_type() == 2 ? data.getSEND_TIME() : data.getTakeTime());
if (data.getOrder_type() != 2) {
......@@ -294,7 +293,6 @@ public class PrintOtherOrder extends PrinterRoot {
setText(view, R.id.tv_phone, "手機號:" + data.getPHONE());
//底部時間
// setText(view, R.id.tv_bottom_time, "手機號:" + data.getPHONE());
//備註
if (data.getRemark() != null && !data.getRemark().isEmpty()) {
setText(view, R.id.tv_remark, "備註:" + data.getRemark());
......@@ -308,8 +306,6 @@ public class PrintOtherOrder extends PrinterRoot {
rvFoodList.setLayoutManager(new LinearLayoutManager(context));
rvFoodList.setAdapter(new OtherOrderAdapter(context, data.getPRODUCT_NAME(), true));
}
return viewToBitmap(context, view);
}
......
......@@ -70,6 +70,8 @@ public class PrintOtherOrderClosing extends PrinterRoot {
TextView tvAddPoints = view.findViewById(R.id.tv_addPoints);//本次添加積分
TextView tvOldPoints = view.findViewById(R.id.tv_oldPoints);//之前的積分
TextView lineMember = view.findViewById(R.id.line_member_info);
TextView tvOrderClosing = view.findViewById(R.id.tv_order_closing);
TextView tvBillNumber = view.findViewById(R.id.tv_bill_number);
//品牌名
setText(view, R.id.tv_brand_name, GsaCloudApplication.getBrandName(context));
//餐廳名
......@@ -83,6 +85,11 @@ public class PrintOtherOrderClosing extends PrinterRoot {
} else {
view.findViewById(R.id.tv_order_take_food_code).setVisibility(View.GONE);
}
if (data.getBillNo() == null || data.getBillNo().length() <= 0) {
tvBillNumber.setVisibility(View.GONE);
} else {
tvBillNumber.setText("訂單號:" + data.getBillNo());
}
//訂單創建時間
setText(view, R.id.tv_order_create, context.getString(R.string.create_order_time) + TimeUtils.parseTimeRepeat(data.getCREATE_TIME(), TimeUtils.DEFAULT_DATE_FORMAT));
String amountUnit = context.getString(R.string.amount_unit);
......@@ -106,28 +113,25 @@ public class PrintOtherOrderClosing extends PrinterRoot {
rvBill.setAdapter(adapter);
//總金額
setText(view, R.id.tv_total, amountUnit + data.getTOTAL_AMOUNT());
//支付金額
setText(view, R.id.tv_pay_amount_text, "支付金額:" + amountUnit + MoneyUtil.sub(Double.parseDouble(data.getTOTAL_AMOUNT()), data.getDiscount_amount()));
//支付類型:貨到付款,在線支付
String payType = "";
if (data.getPayType() == 1) {
payType = ":積分支付";
} else if (data.getPayType() == 2) {
payType = ":支付寶";
} else if (data.getPayType() == 3) {
payType = ":财付通";
} else if (data.getPayType() == 4) {
payType = ":微信支付";
} else if (data.getPayType() == 5) {
payType = ":貨到付款";
} else if (data.getPayType() == 6) {
payType = ":其他支付";
}
if (data.getOrderPayType() == 1) {
//貨到付款
setText(view, R.id.tv_pay_type, "貨到付款");
if (data.getPayName() != null) {
//支付金額
setText(view, R.id.tv_pay_amount_text, data.getPayName() + ":" + amountUnit + MoneyUtil.sub(Double.parseDouble(data.getTOTAL_AMOUNT()), data.getDiscount_amount()));
} else {
setText(view, R.id.tv_pay_type, "在線支付" + payType);
setIsShow(view, R.id.tv_pay_amount_text,false);
setIsShow(view, R.id.tv_pay_amount_line,false);
}
} else if (data.getOrderPayType() == 0) {
setText(view, R.id.tv_pay_type, "店內支付");
} else if (data.getOrderPayType() == 2) {
setText(view, R.id.tv_pay_type, "在線支付");
setText(view, R.id.tv_pay_amount_text, data.getPayName() + ":" + amountUnit + MoneyUtil.sub(Double.parseDouble(data.getTOTAL_AMOUNT()), data.getDiscount_amount()));
}
if (data.getPayTime() != null) {
tvOrderClosing.setText("結賬時間:" + data.getPayTime());
tvOrderClosing.setVisibility(View.VISIBLE);
}
//收貨時間
setText(view, R.id.tv_delivery_time, data.getOrder_type() == 2 ? data.getSEND_TIME() : data.getTakeTime());
......
......@@ -113,7 +113,10 @@ public class PrintPrjKitchen extends PrinterRoot {
tvTableNumber.setText(data.get(0).getTableName());
tvTableNumber2.setText(data.get(0).getTableName());
//人數
if(data.get(0).getPerson() != 0) {
tvPeople.setText(data.get(0).getPerson() + "");
view.findViewById(R.id.tv_people_text).setVisibility(View.VISIBLE);
}
//訂單號
tvOrderNumber.setText(data.get(0).getOrderNo());
//開台時間
......
......@@ -105,6 +105,9 @@ public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedLis
((TextView) parentView.findViewById(viewId)).setText(text);
}
public void setIsShow(View parentView, int viewId, boolean isShow) {
parentView.findViewById(viewId).setVisibility(isShow ? View.VISIBLE : View.GONE);
}
/**
* 把Map中Key相同,则各个value添加到一起,汇总值
......@@ -429,7 +432,7 @@ public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedLis
private PrinterDeviceBean getDefaultPrintInList(List<PrinterDeviceBean> printerDeviceBeans) {
if (printerDeviceBeans != null) {
for (PrinterDeviceBean printerDeviceBean : printerDeviceBeans) {
if (printerDeviceBean.getStatus() == 2) {
if (printerDeviceBean.getPrinterDeviceDefaultId() != null) {
//默認打印機
return printerDeviceBean;
}
......@@ -496,6 +499,7 @@ public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedLis
printWidth = 480;
printerDeviceBean.setPaperSpecification(printWidth + "");
}
Log.e("ccc", "紙張寬度:" + printWidth);
List<Bitmap> zoomBitmap = null;
if (bitmaps != null) {
zoomBitmap = new ArrayList<>();
......@@ -508,8 +512,8 @@ public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedLis
return;
}
//獲取打印機機型,如果是EPSON的打印機,調用EPSON的打印方法
if (printerDeviceBean.getPrinterName().contains("EPSON")
|| printerDeviceBean.getModel().contains("EPSON")) {
if (printerDeviceBean.getPrinterName().toLowerCase().contains("EPSON".toLowerCase())
|| printerDeviceBean.getModel().toLowerCase().contains("EPSON".toLowerCase())) {
List<Bitmap> finalZoomBitmap = zoomBitmap;
mPrinter = new EpsonPrint();
mPrinter.initializeObject(mContext, this);
......@@ -519,11 +523,13 @@ public abstract class PrinterRoot implements PrintSocketHolder.OnStateChangedLis
isSuccess = mPrinter.printData(printerDeviceBean.getIp(), finalZoomBitmap.get(j));
}
disconnectPrinter();
if (printListener != null) {
if (isSuccess) {
printListener.printSuccess();
} else {
printListener.printFile();
}
}
}).start();
} else {
PrintExecutor executor = new PrintExecutor(printerDeviceBean);
......
......@@ -124,7 +124,7 @@ public class PrjService extends Service implements PrintSocketHolder.OnStateChan
//請求到數據,停止輪詢,開始打印,在打印完之後再重新開始輪詢
startPrint(s);
//開啟另一個定時,三十秒之後自動請求,避免上面的打印成功或失敗時沒有回調。
Observable.timer(30, TimeUnit.SECONDS)
Observable.timer(10, TimeUnit.SECONDS)
.subscribe(new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {
......
......@@ -132,16 +132,6 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
finish();
}
} else {
// printerDeviceBeans = new ArrayList<>();
// PrinterDeviceBean printerDeviceBean = new PrinterDeviceBean();
// printerDeviceBean.setName("EPSON");
// printerDeviceBean.setIp("192.168.1.203");
// printerDeviceBean.setPort(9100);
// printerDeviceBean.setStatus(2);
// printerDeviceBean.setPaperSpecification("200");
// printerDeviceBean.setPrinterName("EPSON");
// printerDeviceBean.setModel("EPSON");
// printerDeviceBeans.add(printerDeviceBean);
if (printerDeviceBeans == null || printerDeviceBeans.size() <= 0) {
mPresenter.getPrinterList(GsaCloudApplication.getRestaurantId(mContext));
} else {
......
......@@ -116,22 +116,22 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem
mTvModel.setText(printerDeviceBean.getPrinterName() + "\u3000" + printerDeviceBean.getModel());
}
}
mSwitchDefalute.setChecked(printerDeviceBean.getStatus() == 2);
mSwitchDefalute.setChecked(printerDeviceBean.getType() == 2);
if (devicess != null && devicess.size() > 0) {
if (printerDeviceBean.getPrinterDeviceId() != null && printerDeviceBean.getPrinterDeviceId() != 0) {
if (printerDeviceBean.getFlyPrinterDeviceId() != null && printerDeviceBean.getFlyPrinterDeviceId() != 0) {
//有飛單
for (int i = 0; i < devicess.size(); i++) {
if (devicess.get(i).getId() == printerDeviceBean.getPrinterDeviceId()) {
if (devicess.get(i).getId() == printerDeviceBean.getFlyPrinterDeviceId()) {
mTvFailNameOne.setText(devicess.get(i).getName());
oneFailPosition = i;
mTvFailNameOne.setTextColor(getResources().getColor(R.color.color_3c));
}
}
}
if (printerDeviceBean.getDefaultPrinterDeviceId() != null && printerDeviceBean.getDefaultPrinterDeviceId() != 0) {
if (printerDeviceBean.getFlyPrinterDeviceId2() != null && printerDeviceBean.getFlyPrinterDeviceId2() != 0) {
//有飛單2222
for (int i = 0; i < devicess.size(); i++) {
if (devicess.get(i).getId() == printerDeviceBean.getDefaultPrinterDeviceId()) {
if (devicess.get(i).getId() == printerDeviceBean.getFlyPrinterDeviceId2()) {
mTvFailNameTwo.setText(devicess.get(i).getName());
twoFailPosition = i;
mTvFailNameTwo.setTextColor(getResources().getColor(R.color.color_3c));
......@@ -360,26 +360,33 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem
}
//飛單打印機
if (oneFailPosition != -1) {
deviceBean.setPrinterDeviceId(devicess.get(oneFailPosition).getId());
deviceBean.setFlyPrinterDeviceId(devicess.get(oneFailPosition).getId());
}
if (twoFailPosition != -1) {
deviceBean.setDefaultPrinterDeviceId(devicess.get(twoFailPosition).getId());
deviceBean.setFlyPrinterDeviceId2(devicess.get(twoFailPosition).getId());
}
//是否默認
deviceBean.setStatus(mSwitchDefalute.isChecked() ? 2 : 1);
deviceBean.setType(mSwitchDefalute.isChecked() ? 2 : 1);
//打印機機型
if (modelPosition < 0) {
//modelPosition小於0,說明用戶沒有選擇機型
if (printerDeviceBean != null) {
//如果打印機以前的信息不為空,則用之前的機型信息
deviceBean.setPrinterModelId(printerDeviceBean.getPrinterModelId());
deviceBean.setPaperSpecification(printerDeviceBean.getPaperSpecification());
}
} else {
//如果用戶選擇了打印機機型,判斷機型數據是否為空,不為空就設置機型信息
if (printModelBeans != null && printModelBeans.size() > modelPosition) {
deviceBean.setPrinterModelId(printModelBeans.get(modelPosition).getId());
deviceBean.setPrinterModelId((long) printModelBeans.get(modelPosition).getId());
deviceBean.setPaperSpecification(printModelBeans.get(modelPosition).getPaperSpecification());
}
}
if (deviceBean.getPrinterModelId() == null) {
ToastUtils.show(mContext, "請選擇打印機機型");
return;
}
//添加打印機
if (v.getId() == R.id.printer_add) {
if (isEditPrinter && printerDeviceBean != null) {
......@@ -389,6 +396,7 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem
mPresenter.updatePrinterInfo(deviceBean);
} else {
deviceBean.setUid(null);
deviceBean.setRestaurantId(GsaCloudApplication.getRestaurantId(mContext));
mPresenter.addPrinter(deviceBean);
}
} else if (v.getId() == R.id.print_test) {
......
......@@ -8,11 +8,8 @@ import androidx.annotation.Nullable;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.joe.print.R;
import com.gingersoft.gsa.cloud.constans.PrintConstans;
import java.util.List;
......@@ -26,6 +23,7 @@ public class PrinterListAdapter extends BaseQuickAdapter<PrinterDeviceBean, Base
public PrinterListAdapter(@Nullable List<PrinterDeviceBean> data, Context mContext) {
super(R.layout.printer_item, data);
this.mContext = mContext;
addChildClickViewIds(R.id.layout_delete);
}
@Override
......@@ -37,13 +35,8 @@ public class PrinterListAdapter extends BaseQuickAdapter<PrinterDeviceBean, Base
} else {
helper.setText(R.id.tv_printer_port, String.format(mContext.getString(R.string.print_port), item.getPort() + ""));
}
((RadioButton) helper.getView(R.id.cb_printer_item)).setChecked(item.getStatus() == 2);
helper.getView(R.id.tv_default_print).setVisibility(item.getStatus() == 2 ? View.VISIBLE : View.GONE);
// helper.setOnItemSelectedClickListener(R.id.layout_delete,)
// helper.addOnClickListener(R.id.layout_delete);
addChildClickViewIds(R.id.layout_delete);
((RadioButton) helper.getView(R.id.cb_printer_item)).setChecked(item.getType() == 2);
helper.getView(R.id.tv_default_print).setVisibility(item.getPrinterDeviceDefaultId() != null ? View.VISIBLE : View.GONE);
}
......
......@@ -269,7 +269,6 @@ public class IpPrintListActivityFragment extends BaseFragment<IpPrintListActivit
// int position = adapterPosition - mRvPrintList.getHeaderCount();
}
});// 监听拖拽和侧滑删除,更新UI和数据源。
printListAdapter = new PrinterListAdapter(devicess, mContext);
printListAdapter.setOnItemChildClickListener((adapter, view, position) -> {
if (view.getId() == R.id.layout_delete) {
......
......@@ -91,6 +91,13 @@
android:text='單號:' />
<TextView
android:id="@+id/tv_bill_number"
style="@style/print_other_order_twenty_six_style"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text='訂單號:' />
<TextView
android:id="@+id/tv_order_take_food_code"
style="@style/print_other_order_thirty_style"
android:layout_width="wrap_content"
......@@ -106,6 +113,13 @@
android:text='開單時間' />
<TextView
android:id="@+id/tv_order_closing"
style="@style/print_other_order_twenty_six_style"
android:layout_width="wrap_content"
android:visibility="gone"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_remark"
style="@style/print_other_order_thirty_style"
android:layout_width="wrap_content"
......@@ -206,6 +220,7 @@
android:text="支付金額:" />
<TextView
android:id="@+id/tv_pay_amount_line"
style="@style/print_other_order_twenty_six_style"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment