Commit 15acef1d authored by 姜敏's avatar 姜敏

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	app/src/main/java/com/xingdata/zzdpos/C.java
parents 5d9b3b38 c7e04678
<component name="ProjectDictionaryState">
<dictionary name="Eurus">
<words>
<w>addr</w>
<w>alipay</w>
<w>amountexceed</w>
<w>appid</w>
<w>baozheng</w>
<w>caocao</w>
<w>chengyaojin</w>
<w>diaochan</w>
<w>exps</w>
<w>guanyu</w>
<w>hshop</w>
<w>huanggai</w>
<w>huangxin</w>
<w>inputer</w>
<w>instrans</w>
<w>invalidmerno</w>
<w>invalidstore</w>
<w>jsonpay</w>
<w>jspay</w>
<w>kongming</w>
<w>kongrong</w>
<w>kongrun</w>
......@@ -18,17 +27,32 @@
<w>liubei</w>
<w>lvzhi</w>
<w>mawu</w>
<w>mernoblocked</w>
<w>micropay</w>
<w>nong</w>
<w>noti</w>
<w>parametererror</w>
<w>patt</w>
<w>posppp</w>
<w>qrpay</w>
<w>shixiu</w>
<w>shopppp</w>
<w>signerror</w>
<w>skugrps</w>
<w>skus</w>
<w>strs</w>
<w>sunquan</w>
<w>transclose</w>
<w>unionpay</w>
<w>unipay</w>
<w>unkonw</w>
<w>unkonwcode</w>
<w>usingpay</w>
<w>xishi</w>
<w>yanqing</w>
<w>yuefei</w>
<w>yuji</w>
<w>yyyymmddhhmmss</w>
<w>zhangfei</w>
<w>zhouyu</w>
<w>zzdpos</w>
......
......@@ -9,6 +9,7 @@
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
<option value="$PROJECT_DIR$/pay" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
......
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="ClassWithMultipleLoggers" enabled="true" level="WARNING" enabled_by_default="true">
<option name="loggerNamesString" value="java.util.logging.Logger,org.slf4j.Logger,org.apache.commons.logging.Log,org.apache.log4j.Logger" />
</inspection_tool>
<inspection_tool class="LogStatementGuardedByLogCondition" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="LoggingConditionDisagreesWithLogStatement" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="NonStaticFinalLogger" enabled="true" level="WARNING" enabled_by_default="true">
<option name="loggerClassName" value="" />
</inspection_tool>
<inspection_tool class="PlaceholderCountMatchesArgumentCount" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="StringConcatenationArgumentToLogCall" enabled="true" level="WARNING" enabled_by_default="true" />
</profile>
</component>
\ No newline at end of file
......@@ -4,6 +4,7 @@
<modules>
<module fileurl="file://$PROJECT_DIR$/TangKuPos.iml" filepath="$PROJECT_DIR$/TangKuPos.iml" />
<module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
<module fileurl="file://$PROJECT_DIR$/pay/pay.iml" filepath="$PROJECT_DIR$/pay/pay.iml" />
</modules>
</component>
</project>
\ No newline at end of file
......@@ -2,7 +2,7 @@ apply plugin: 'com.android.application'
apply plugin: 'realm-android'
android {
compileSdkVersion 27
buildToolsVersion '27.0.0'
buildToolsVersion '27.0.3'
defaultConfig {
applicationId "com.xingdata.zzdpos"
minSdkVersion 21
......@@ -57,33 +57,34 @@ dependencies {
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:27.0.2'
compile 'com.android.support:support-v4:27.0.2'
compile 'com.android.support:design:27.0.2'
compile 'com.android.support:cardview-v7:27.0.2'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile 'com.squareup.okhttp3:okhttp:3.9.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.9.0'
compile 'io.reactivex.rxjava2:rxjava:2.1.5'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.alibaba:fastjson:1.1.67.android'
compile 'com.blankj:utilcode:1.11.1'
compile 'com.facebook.fresco:fresco:1.5.0'
compile 'com.facebook.fresco:animated-gif:1.5.0'
compile 'com.hwangjr.rxbus:rxbus:2.0.0'
compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30'
compile 'com.yanzhenjie:permission:1.1.2'
compile 'com.wanjian:cockroach:0.0.5'
compile 'me.yokeyword:fragmentation:1.1.6'
compile 'com.github.arcadefire:nice-spinner:1.3.1'
compile 'com.contrarywind:Android-PickerView:3.2.5'
compile 'com.github.ybq:Android-SpinKit:1.1.0'
compile 'com.youth.banner:banner:1.4.10'
compile 'me.dm7.barcodescanner:zxing:1.9.8'
compile 'com.google.zxing:core:3.3.1'
compile(name: 'zx_print_library-debug', ext: 'aar')
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:27.0.2'
implementation 'com.android.support:support-v4:27.0.2'
implementation 'com.android.support:design:27.0.2'
implementation 'com.android.support:cardview-v7:27.0.2'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
implementation 'com.squareup.okhttp3:okhttp:3.9.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0'
implementation 'io.reactivex.rxjava2:rxjava:2.1.5'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'com.alibaba:fastjson:1.1.67.android'
implementation 'com.blankj:utilcode:1.11.1'
implementation 'com.facebook.fresco:fresco:1.5.0'
implementation 'com.facebook.fresco:animated-gif:1.5.0'
implementation 'com.hwangjr.rxbus:rxbus:2.0.0'
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30'
implementation 'com.yanzhenjie:permission:1.1.2'
implementation 'com.wanjian:cockroach:0.0.5'
implementation 'me.yokeyword:fragmentation:1.1.6'
implementation 'com.github.arcadefire:nice-spinner:1.3.1'
implementation 'com.contrarywind:Android-PickerView:3.2.5'
implementation 'com.github.ybq:Android-SpinKit:1.1.0'
implementation 'com.youth.banner:banner:1.4.10'
implementation 'me.dm7.barcodescanner:zxing:1.9.8'
implementation 'com.google.zxing:core:3.3.1'
implementation(name: 'zx_print_library-debug', ext: 'aar')
implementation project(':pay')
}
......@@ -72,7 +72,7 @@ public class App extends Application {
// 初始化异常处理
initEx();
//初始化Frwagment框架
//初始化Fragment框架
initFragment();
//初始化数据库
......
......@@ -58,14 +58,27 @@ public class C {
}
public static final class URL {
// public static final String BASE_URL = "http://demo.51zzd.cn:8080/";
public static final String BASE_URL = "http://121.40.56.52:8080/";
//public static final String BASE_URL = "http://tk.51zzd.com";//生产环境
// public static final String TEMP_PAY_URL = "http://demo.51zzd.cn/";
/**
* 测试环境(客户演示使用)
* sn:test2018 设备型号 AECRC10 (pos)
* sn:test2019 设备型号 X990 (收银机)
*/
private static final String URL_TEST = "http://121.40.56.52:8080/";
/**
* 开发平台(开发人员使用)
*/
private static final String URL_DEMO = "http://demo.51zzd.cn:8080/";
public static final String TEMP_PAY_URL = "http://121.40.56.52:8081/";
/**
* 生产平台
*/
private static final String URL_ONLINE = "http://tk.51zzd.com/";
/**
* 地址
*/
public static final String BASE_URL = URL_TEST;
private static final String PKG = "/tk/";
......@@ -275,6 +288,7 @@ public class C {
public static final String addOrderMis = ROOT_URL + "addOrderMis";
public static final String addOrderPayMis = ROOT_URL + "addOrderPayMis";
public static final String querySaleorderByVipId = ROOT_URL + "query";
public static final String addRemark = ROOT_URL + "update";
}
public final class PAY {
......@@ -289,6 +303,29 @@ public class C {
public static final String add = ROOT_URL + "add";
}
/**
* 付费相关接口
*/
public final class PAIDUP {
/**
* 付费规则查询
*/
public static final String getEnter = PKG + "/enter/query";
/**
* 开通营销
*/
public static final String activateMarketing = PKG + "/merchant/marketing";
/**
* 开通营销支付确认
*/
public static final String confirmMarketing = PKG + "/merchant/confirmMarketing";
/**
* 获取当前营销状态
*/
public static final String getMarketing = PKG + "/merchant/getMarketing";
}
public final class TICKET {
private static final String ROOT_URL = PKG + "ticket/";
......@@ -428,6 +465,13 @@ public class C {
public final class TEMP_PAY {
public static final String pay = "pay/payc/pay";
}
public final class SHOPPPP {
private static final String ROOT_URL = PKG + "shopppp/";
public static final String getPayKey = ROOT_URL + "getPayKey";
}
}
......
......@@ -11,6 +11,7 @@ import com.xingdata.zzdpos.model.Category;
import com.xingdata.zzdpos.model.Gbound;
import com.xingdata.zzdpos.model.Mscard;
import com.xingdata.zzdpos.model.Pager;
import com.xingdata.zzdpos.model.PaidUpEnter;
import com.xingdata.zzdpos.model.Trule;
import com.xingdata.zzdpos.model.Ubound;
import com.xingdata.zzdpos.model.UsskuParam;
......@@ -454,14 +455,12 @@ public final class ApiFactory {
}
public static class Pay {
public static Observable<List<com.xingdata.zzdpos.model.Pay>> query() {
return Api.getInstance().service.queryPay()
.onErrorReturn(new ErrorFilter<>())
.map(new ResultFilter<>())
.flatMap(payPager -> Observable.just(payPager.getList()))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retryWhen(new RetryHelper(3));
public static Observable<Pager<com.xingdata.zzdpos.model.Pay>> query() {
return run(Api.getInstance().service.queryPay());
}
public static Observable<String> getPayKey() {
return run(Api.getInstance().service.getPayKey());
}
}
......@@ -477,11 +476,14 @@ public final class ApiFactory {
return run(Api.getInstance().service.addOrderMis(saleorderParam));
}
public static Observable<com.xingdata.zzdpos.model.Saleorder> addOrderPayMis(com.xingdata
.zzdpos.model.Saleorder.Pay saleorderPay) {
public static Observable<com.xingdata.zzdpos.model.Saleorder> addOrderPayMis(com.xingdata.zzdpos.model.Saleorder.Pay saleorderPay) {
return run(Api.getInstance().service.addOrderPayMis(saleorderPay));
}
public static Observable<String> addRemark(String orderNo, String remark) {
return run(Api.getInstance().service.addRemark(orderNo, remark));
}
public static Observable<Pager<com.xingdata.zzdpos.model.Saleorder>>
querySaleorderByVipId(Long vipId, int pageNumber, int pageSize) {
return run(Api.getInstance().service.querySaleorderByVipId(vipId, pageNumber,
......@@ -492,14 +494,8 @@ public final class ApiFactory {
}
public static class Ticket {
public static Observable<List<com.xingdata.zzdpos.model.Ticket>> query(Long vipId) {
return Api.getInstance().service.queryTicket(vipId)
.onErrorReturn(new ErrorFilter<>())
.map(new ResultFilter<>())
.flatMap(ticketPager -> Observable.just(ticketPager.getList()))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retryWhen(new RetryHelper(3));
public static Observable<Pager<com.xingdata.zzdpos.model.Ticket>> query(Long vipId) {
return run(Api.getInstance().service.queryTicket(vipId));
}
......@@ -565,6 +561,53 @@ public final class ApiFactory {
}
}
public static class PaidUp {
/**
* 付費規則查詢
*/
public static Observable<Pager<PaidUpEnter>> getEnter() {
return Api.getInstance().service.getEnter()
.onErrorReturn(new ErrorFilter<>())
.map(new ResultFilter<>())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
/**
* 查询营销
*/
public static Observable<Object> getMarketing() {
return Api.getInstance().service.getMarketing()
.onErrorReturn(new ErrorFilter<>())
.map(new ResultFilter<>())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
/**
* 开通营销
*/
public static Observable<Object> activateMarketing(Integer months, Integer years
) {
return Api.getInstance().service.activateMarketing(months, years)
.onErrorReturn(new ErrorFilter<>())
.map(new ResultFilter<>())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
/**
* 开通营销确认
*/
public static Observable<Object> confirmMarketing(String payNo, Integer operID
) {
return Api.getInstance().service.confirmMarketing(payNo, operID)
.onErrorReturn(new ErrorFilter<>())
.map(new ResultFilter<>())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
}
public static class CsDetail {
/**
......@@ -907,7 +950,7 @@ public final class ApiFactory {
}
public static <T> Observable<T> run(Observable<HttpMessage<T>> observable) {
static <T> Observable<T> run(Observable<HttpMessage<T>> observable) {
return observable.onErrorReturn(new ErrorFilter<>())
.map(new ResultFilter<>())
.subscribeOn(Schedulers.io())
......
......@@ -15,6 +15,7 @@ import com.xingdata.zzdpos.model.Notice;
import com.xingdata.zzdpos.model.Oper;
import com.xingdata.zzdpos.model.Ossku;
import com.xingdata.zzdpos.model.Pager;
import com.xingdata.zzdpos.model.PaidUpEnter;
import com.xingdata.zzdpos.model.Pay;
import com.xingdata.zzdpos.model.Psb;
import com.xingdata.zzdpos.model.Saleorder;
......@@ -165,6 +166,18 @@ interface ApiService {
@POST(C.URL.FEED.add)
Observable<HttpMessage<Object>> addFeed(@Body Feed feed);
@POST(C.URL.PAIDUP.getEnter)
Observable<HttpMessage<Pager<PaidUpEnter>>> getEnter();
@POST(C.URL.PAIDUP.getMarketing)
Observable<HttpMessage<Object>> getMarketing();
@POST(C.URL.PAIDUP.activateMarketing)
Observable<HttpMessage<Object>> activateMarketing(@Query("months") Integer months, @Query("years") Integer years);
@POST(C.URL.PAIDUP.confirmMarketing)
Observable<HttpMessage<Object>> confirmMarketing(@Query("payNo") String payNo, @Query("openId") Integer openId);
@POST(C.URL.CSDETAIL.add)
Observable<HttpMessage<CsDetail>> addCsDetail(@Body CsDetail csDetail);
......@@ -271,6 +284,8 @@ interface ApiService {
("pageSize") int
pageSize);
@POST(C.URL.SALEORDER.addRemark)
Observable<HttpMessage<String>> addRemark(@Query("orderNo") String orderNo, @Query("orderDesc1") String remark);
@POST(C.URL.USER.query)
Observable<HttpMessage<Pager<Vip>>> queryDetailByWD(@Query("wd") String keyword, @Query
......@@ -475,4 +490,7 @@ interface ApiService {
@Query("pageSize") int pageSize);
@POST(C.URL.SHOPPPP.getPayKey)
Observable<HttpMessage<String>> getPayKey();
}
package com.xingdata.zzdpos.api;
import com.alibaba.fastjson.JSON;
import com.xingdata.zzdpos.util.ConvertUtil;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
public class JniFactory {
public static class Settle {
private static Pay.Request q;
public static Observable<String> pay(int payChannel, String payCode, Long orderAmt, String orderNo) {
q = new Pay.Request();
q.setPayChannelType(payChannel + "");
q.setOrderType("01");
q.setOrderAmt(ConvertUtil.longToString(orderAmt));
q.setChannelAuthCode(payCode);
q.setOrderNo(orderNo);
q.setOldOrderNo(orderNo);
return Jni.getInstance().service.pay(JSON.toJSONString(q))
.onErrorReturn(new ErrorFilter<>())
.map(new ResultFilter<>())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public static Observable<String> query() {
q.setOrderType("02");
return Jni.getInstance().service.pay(JSON.toJSONString(q))
.onErrorReturn(new ErrorFilter<>())
.map(new ResultFilter<>())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
}
}
package com.xingdata.zzdpos.api;
import com.xingdata.zzdpos.C;
import io.reactivex.Observable;
import retrofit2.http.GET;
import retrofit2.http.Query;
interface JniService {
@GET(C.URL.TEMP_PAY.pay)
Observable<HttpMessage<String>> pay(@Query("para") String str);
}
package com.xingdata.zzdpos.api;
import com.alibaba.fastjson.annotation.JSONField;
import com.blankj.utilcode.util.TimeUtils;
import java.text.SimpleDateFormat;
import java.util.Locale;
public class Pay {
public static class Request {
public Request() {
setDeviceType("01");
setMch_id("11");
setTer_id("00000098");
setOrderDateTime(TimeUtils.getNowString(new SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault())));
setCurrencyType("156");
setOrderName("测试");
setKey("Key");
setNotifyUrl("setNotifyUrl");
}
private String OrderType;
private String PayChannelType;
private String DeviceType;
private String Agent_id;
private String Mch_id;
private String Ter_id;
private String OrderNo;
private String PosTrace;
private String OrderDateTime;
private String CurrencyType;
private String OrderAmt;
private String OrderName;
private String ChannelAuthCode;
private String Key;
private String NotifyUrl;
private String OldOrderNo;
@JSONField(name = "OrderType")
public String getOrderType() {
return OrderType;
}
@JSONField(name = "OrderType")
public void setOrderType(String orderType) {
OrderType = orderType;
}
@JSONField(name = "PayChannelType")
public String getPayChannelType() {
return PayChannelType;
}
@JSONField(name = "PayChannelType")
public void setPayChannelType(String payChannelType) {
PayChannelType = payChannelType;
}
@JSONField(name = "DeviceType")
public String getDeviceType() {
return DeviceType;
}
@JSONField(name = "DeviceType")
public void setDeviceType(String deviceType) {
DeviceType = deviceType;
}
@JSONField(name = "Agent_id")
public String getAgent_id() {
return Agent_id;
}
@JSONField(name = "Agent_id")
public void setAgent_id(String agent_id) {
Agent_id = agent_id;
}
@JSONField(name = "Mch_id")
public String getMch_id() {
return Mch_id;
}
@JSONField(name = "Mch_id")
public void setMch_id(String mch_id) {
Mch_id = mch_id;
}
@JSONField(name = "Ter_id")
public String getTer_id() {
return Ter_id;
}
@JSONField(name = "Ter_id")
public void setTer_id(String ter_id) {
Ter_id = ter_id;
}
@JSONField(name = "OrderNo")
public String getOrderNo() {
return OrderNo;
}
@JSONField(name = "OrderNo")
public void setOrderNo(String orderNo) {
OrderNo = orderNo;
}
@JSONField(name = "PosTrace")
public String getPosTrace() {
return PosTrace;
}
@JSONField(name = "PosTrace")
public void setPosTrace(String posTrace) {
PosTrace = posTrace;
}
@JSONField(name = "OrderDateTime")
public String getOrderDateTime() {
return OrderDateTime;
}
@JSONField(name = "OrderDateTime")
public void setOrderDateTime(String orderDateTime) {
OrderDateTime = orderDateTime;
}
@JSONField(name = "CurrencyType")
public String getCurrencyType() {
return CurrencyType;
}
@JSONField(name = "CurrencyType")
public void setCurrencyType(String currencyType) {
CurrencyType = currencyType;
}
@JSONField(name = "OrderAmt")
public String getOrderAmt() {
return OrderAmt;
}
@JSONField(name = "OrderAmt")
public void setOrderAmt(String orderAmt) {
OrderAmt = orderAmt;
}
@JSONField(name = "OrderName")
public String getOrderName() {
return OrderName;
}
@JSONField(name = "OrderName")
public void setOrderName(String orderName) {
OrderName = orderName;
}
@JSONField(name = "ChannelAuthCode")
public String getChannelAuthCode() {
return ChannelAuthCode;
}
@JSONField(name = "ChannelAuthCode")
public void setChannelAuthCode(String channelAuthCode) {
ChannelAuthCode = channelAuthCode;
}
@JSONField(name = "Key")
public String getKey() {
return Key;
}
@JSONField(name = "Key")
public void setKey(String key) {
Key = key;
}
@JSONField(name = "NotifyUrl")
public String getNotifyUrl() {
return NotifyUrl;
}
@JSONField(name = "NotifyUrl")
public void setNotifyUrl(String notifyUrl) {
NotifyUrl = notifyUrl;
}
@JSONField(name = "OldOrderNo")
public String getOldOrderNo() {
return OldOrderNo;
}
@JSONField(name = "OldOrderNo")
public void setOldOrderNo(String oldOrderNo) {
OldOrderNo = oldOrderNo;
}
}
public static class Response {
private int OrderType;
private String ResponseCode;
private String ResponseMsg;
private String TradeStatus;
private String Mch_id;
private String Ter_id;
private String OrderNo;
private String tn;
private String paySign;
public int getOrderType() {
return OrderType;
}
public void setOrderType(int orderType) {
OrderType = orderType;
}
public String getResponseCode() {
return ResponseCode;
}
public void setResponseCode(String responseCode) {
ResponseCode = responseCode;
}
public String getResponseMsg() {
return ResponseMsg;
}
public void setResponseMsg(String responseMsg) {
ResponseMsg = responseMsg;
}
public String getTradeStatus() {
return TradeStatus;
}
public void setTradeStatus(String tradeStatus) {
TradeStatus = tradeStatus;
}
public String getMch_id() {
return Mch_id;
}
public void setMch_id(String mch_id) {
Mch_id = mch_id;
}
public String getTer_id() {
return Ter_id;
}
public void setTer_id(String ter_id) {
Ter_id = ter_id;
}
public String getOrderNo() {
return OrderNo;
}
public void setOrderNo(String orderNo) {
OrderNo = orderNo;
}
public String getTn() {
return tn;
}
public void setTn(String tn) {
this.tn = tn;
}
public String getPaySign() {
return paySign;
}
public void setPaySign(String paySign) {
this.paySign = paySign;
}
}
}
......@@ -34,7 +34,7 @@ class ResultFilter<T> implements Function<HttpMessage<T>, T> {
@Override
public void run() {
Intent intent = new Intent();
intent.putExtra("serverErr", "错误码:" + tHttpMessage.getReturnCode() +
intent.putExtra("serverErr", "状态码:" + tHttpMessage.getReturnCode() +
"\n\n\n" + tHttpMessage.getReturnInfo());
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClass(ActivityUtils.getTopActivity(), ServerErrActivity.class);
......@@ -72,7 +72,7 @@ class ResultFilter<T> implements Function<HttpMessage<T>, T> {
@Override
public void run() {
Intent intent = new Intent();
intent.putExtra("serverErr", "错误码:" + tHttpMessage.getReturnCode() +
intent.putExtra("serverErr", "状态码:" + tHttpMessage.getReturnCode() +
"\n\n\n" + tHttpMessage.getReturnInfo());
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClass(ActivityUtils.getTopActivity(), ServerErrActivity.class);
......
......@@ -30,8 +30,7 @@ import me.yokeyword.fragmentation.SupportActivity;
* @author Zhangzhen
*/
public abstract class BaseActivity<P extends BasePresenter, B extends ViewDataBinding> extends
SupportActivity {
public abstract class BaseActivity<P extends BasePresenter, B extends ViewDataBinding> extends SupportActivity {
public Context mContext;
public P mPresenter;
......@@ -127,7 +126,7 @@ public abstract class BaseActivity<P extends BasePresenter, B extends ViewDataBi
@Override
public void start(ISupportFragment toFragment) {
if ((System.currentTimeMillis() - mTime) > 500) {
if ((System.currentTimeMillis() - mTime) > 1000) {
mTime = System.currentTimeMillis();
super.start(toFragment);
}
......@@ -140,4 +139,13 @@ public abstract class BaseActivity<P extends BasePresenter, B extends ViewDataBi
}
super.onResume();
}
@Override
public void pop() {
if (getSupportFragmentManager().getFragments().size() > 1) {
super.pop();
} else {
finish();
}
}
}
......@@ -55,6 +55,8 @@ public abstract class BaseDialog<P extends BasePresenter, B extends ViewDataBind
public boolean isShowing;
private long recLen = -1;
private boolean shutDown = false;
//强制关闭时间
long time = 0;
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
......@@ -290,7 +292,11 @@ public abstract class BaseDialog<P extends BasePresenter, B extends ViewDataBind
if (null != mDisp && (!mDisp.isDisposed())) {
mDisp.dispose();
}
super.dismiss();
try {
super.dismiss();
} catch (NullPointerException e) {
LogUtils.e(e.getMessage());
}
}
} else {
SPUtils.getInstance().put(C.SYSTEM.DIALOGISDISMISS, true);
......@@ -298,17 +304,23 @@ public abstract class BaseDialog<P extends BasePresenter, B extends ViewDataBind
}
}
/**
* 强制关闭dialog
*/
public void toughDismiss() {
if (shutDown) {
if (recLen <= 0) {
if (System.currentTimeMillis() - time < 500) {
dismiss();
} else {
ToastUtils.showLong(recLen + "s 后可关闭");
if (recLen <= 0) {
dismiss();
} else {
ToastUtils.showLong(recLen + "s 后可关闭,双击返回按钮可强制关闭");
}
}
time = System.currentTimeMillis();
}
}
......@@ -339,5 +351,4 @@ public abstract class BaseDialog<P extends BasePresenter, B extends ViewDataBind
mBaseBinding.btnConfirm.setText(OK);
return this;
}
}
\ No newline at end of file
......@@ -24,13 +24,13 @@ import me.yokeyword.fragmentation.SupportFragment;
* @param <B> Fragment对应的ViewDataBinding
* @author Zhangzhen
*/
public abstract class BaseFragment<P extends BasePresenter, B extends ViewDataBinding> extends
SupportFragment {
public abstract class BaseFragment<P extends BasePresenter, B extends ViewDataBinding> extends SupportFragment {
public Context mContext;
public P mPresenter;
public B mViewBinding;
public LoadingDialog mLoadingDialog;
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
......@@ -39,8 +39,7 @@ public abstract class BaseFragment<P extends BasePresenter, B extends ViewDataBi
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle
savedInstanceState) {
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mContext = ActivityUtils.getTopActivity();
mPresenter = (P) ((BaseActivity) getActivity()).mPresenter;
mLoadingDialog = ((BaseActivity) getActivity()).mLoadingDialog;
......@@ -66,7 +65,6 @@ public abstract class BaseFragment<P extends BasePresenter, B extends ViewDataBi
KeyboardUtils.hideSoftInput(getActivity());
}
public String getTabTitle() {
return null;
}
......
package com.xingdata.zzdpos.base;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.support.annotation.Nullable;
import android.view.View;
import android.view.ViewGroup;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.xingdata.zzdpos.R;
import java.util.ArrayList;
import java.util.List;
public abstract class BaseMultiSelectAdapter<T, B extends ViewDataBinding> extends BaseQuickAdapter<T, BaseViewHolder> {
private List<Integer> mSelectedPositionList;
public BaseMultiSelectAdapter(int layoutResId, @Nullable List<T> data) {
super(layoutResId, data);
mSelectedPositionList = new ArrayList<>();
}
@Override
protected void convert(BaseViewHolder helper, T item) {
this.convert(helper, (B) helper.mViewBinding, mSelectedPositionList.contains(helper.getAdapterPosition()), item);
}
protected abstract void convert(BaseViewHolder helper, B mViewBinding, boolean isSelected, T item);
/**
* 获取所有选中的数据
*
* @return 选中的数据
*/
public List<T> getSelectedData() {
List<T> tList = new ArrayList<>();
for (int i = 0; i < getData().size(); i++) {
if (mSelectedPositionList.contains(i)) {
tList.add(getData().get(i));
}
}
return tList;
}
/**
* 选择全部,如果已经全选则全部取消
*/
public void selectAll() {
mSelectedPositionList = new ArrayList<>();
for (int i = 0; i < getData().size(); i++) {
mSelectedPositionList.add(i);
}
notifyDataSetChanged();
}
/**
* 选择某项数据
*
* @param position 要选定item的position
*/
public void select(int position) {
mSelectedPositionList.add(position);
this.notifyItemChanged(position);
}
/**
* 取消选择某项数据
*
* @param position 要取消的item的position
*/
public void deselect(int position) {
mSelectedPositionList.remove((Integer) position);
this.notifyItemChanged(position);
}
/**
* 反选
*
* @param position 要反选的item的position
*/
public void invert(int position) {
if (mSelectedPositionList.contains(position)) deselect(position);
else select(position);
this.notifyItemChanged(position);
}
@Override
protected View getItemView(int layoutResId, ViewGroup parent) {
ViewDataBinding binding = DataBindingUtil.inflate(mLayoutInflater, layoutResId, parent, false);
if (binding == null) return super.getItemView(layoutResId, parent);
View view = binding.getRoot();
view.setTag(R.id.BaseQuickAdapter_databinding_support, binding);
return view;
}
}
......@@ -6,6 +6,7 @@ import com.blankj.utilcode.util.TimeUtils;
import com.xingdata.zzdpos.App;
import com.xingdata.zzdpos.C;
import com.xingdata.zzdpos.base.BaseModel;
import com.xingdata.zzdpos.model.Gift;
import com.xingdata.zzdpos.model.HandoverInfo;
import com.xingdata.zzdpos.model.Level;
import com.xingdata.zzdpos.model.Ms;
......@@ -70,7 +71,7 @@ public class DBFactory {
* @return 商品List
*/
public static Observable<Pager<Sssku>> querySku(int pageNum, Long skuGrpId) {
RealmQuery<Sssku> query = DB.getInstance().get(MainPresenter.class).where(Sssku.class);
RealmQuery<Sssku> query = DB.getInstance().get(StorePresenter.class).where(Sssku.class);
//skuGrpId
if (skuGrpId != null && skuGrpId > 0) query.equalTo("skuGrpId", skuGrpId);
......@@ -90,7 +91,7 @@ public class DBFactory {
* @return 商品List
*/
public static Observable<Pager<Sssku>> querySku(int pageNum, String keyword) {
RealmQuery<Sssku> query = DB.getInstance().get(MainPresenter.class).where(Sssku.class);
RealmQuery<Sssku> query = DB.getInstance().get(StorePresenter.class).where(Sssku.class);
long _keyword = StringUtil.strToLong(keyword);
//keyword
......@@ -114,7 +115,7 @@ public class DBFactory {
* @return 组合商品
*/
public static Observable<Pager<Ussku>> queryUSku() {
RealmQuery<Ussku> query = DB.getInstance().get(MainPresenter.class).where(Ussku.class);
RealmQuery<Ussku> query = DB.getInstance().get(StorePresenter.class).where(Ussku.class);
query.equalTo("skuStatus", 0);
return Observable.just(query.findAll())
.flatMap(usskus -> {
......@@ -133,8 +134,8 @@ public class DBFactory {
* @return 商品分组
*/
public static Observable<List<Sskugrp>> querySkugrp() {
return Observable.just(DB.getInstance().get(StorePresenter.class).where(Sskugrp
.class).findAll())
return Observable.just(DB.getInstance().get(StorePresenter.class).where(Sskugrp.class)
.findAll())
.flatMap(sskugrps -> Observable.just(getList(sskugrps)));
}
......@@ -146,8 +147,8 @@ public class DBFactory {
* @return 商品名称
*/
public static String querySpuNameBySkuId(Long skuId) {
List<Sssku> ssskus = getList(DB.getInstance().get(StorePresenter.class).where(Sssku
.class).equalTo("skuId", skuId).findAll());
List<Sssku> ssskus = getList(DB.getInstance().get(StorePresenter.class).where(Sssku.class)
.equalTo("skuId", skuId).findAll());
if (ssskus.size() > 0) return ssskus.get(0).getSpuName();
else return null;
}
......@@ -161,20 +162,14 @@ public class DBFactory {
RealmQuery<Ms> query = DB.getInstance().get(StorePresenter.class).where(Ms.class);
query.equalTo("msStatus", 0);
query.notEqualTo("msTools", C.MS_TYPE.GIFT);
Long dateNow = Long.valueOf(TimeUtils.getNowString(new SimpleDateFormat("yyyyMMdd",
Locale.getDefault())));
query.beginGroup().lessThanOrEqualTo("msDateBegin", dateNow).greaterThanOrEqualTo
("msDateEnd", dateNow).endGroup();
Long dateNow = Long.valueOf(TimeUtils.getNowString(new SimpleDateFormat("yyyyMMdd", Locale.getDefault())));
query.beginGroup().lessThanOrEqualTo("msDateBegin", dateNow).greaterThanOrEqualTo("msDateEnd", dateNow).endGroup();
String weekNow = String.valueOf(TimeUtils.getWeekIndex(TimeUtils.getNowDate()));
query.contains("msWeekPlan", weekNow);
Long timeNow = Long.valueOf(TimeUtils.getNowString(new SimpleDateFormat("HHmmss",
Locale.getDefault())));
query.beginGroup().lessThanOrEqualTo("msTimeBegin", timeNow).greaterThanOrEqualTo
("msTimeEnd", timeNow).endGroup();
Long timeNow = Long.valueOf(TimeUtils.getNowString(new SimpleDateFormat("HHmmss", Locale.getDefault())));
query.beginGroup().lessThanOrEqualTo("msTimeBegin", timeNow).greaterThanOrEqualTo("msTimeEnd", timeNow).endGroup();
query.equalTo("msCoustomTag", 0);
......@@ -182,6 +177,22 @@ public class DBFactory {
return Observable.just(query.findAllSorted("msTouchTag2", Sort.DESCENDING))
.flatMap(ms -> Observable.just(getList(ms)));
}
/**
* 查询换购商品
*
* @param gifts 换购信息
* @return 换购信息列表(附带商品)
*/
public static Observable<List<Sssku>> queryGiftSkus(List<Gift> gifts) {
RealmQuery<Sssku> query = DB.getInstance().get(StorePresenter.class).where(Sssku.class);
for (int i = 0; i < gifts.size(); i++) {
if (i > 0) query.or();
query.equalTo("skuId", gifts.get(i).getSkuId());
}
return Observable.just(query.findAll()).flatMap(ssskus -> Observable.just(getList(ssskus)));
}
}
public static class Vip {
......
......@@ -5,6 +5,7 @@ import com.xingdata.api.print.entity.BaseOrderPrint;
import com.xingdata.zzdpos.db.DB;
import com.xingdata.zzdpos.ui.login.LoginPresenter;
import com.xingdata.zzdpos.ui.main.MainPresenter;
import com.xingdata.zzdpos.ui.manage.inventory.InventoryPresenter;
import com.xingdata.zzdpos.ui.marketing.ms.model.BaseBean;
import java.util.ArrayList;
......@@ -258,11 +259,11 @@ public class Cs implements BaseOrderPrint, com.xingdata.zzdpos.base.BaseBean {
}
public String getOperName() {
if (operName == null) {
operName = DB.getInstance().get(MainPresenter.class).where(Oper.class)
.equalTo("operId", getCreateOperId())
.findFirst().getOperName();
}
// if (operName == null) {
// operName = DB.getInstance().get(InventoryPresenter.class).where(Oper.class)
// .equalTo("operId", getCreateOperId())
// .findFirst().getOperName();
// }
return operName;
}
@Override
......
......@@ -3,15 +3,18 @@ package com.xingdata.zzdpos.model;
public class Gift {
public Gift(Long msId, Sssku sssku, Long addAmt) {
this.sssku = sssku;
public Gift(Long msId, Long skuId, Long addAmt, Long dateEnd) {
this.skuId = skuId;
this.msId = msId;
this.addAmt = addAmt;
this.dateEnd = dateEnd;
}
private Sssku sssku;
private Long msId;
private Long addAmt;
private Long skuId;
private Long dateEnd;
public Sssku getSssku() {
return sssku;
......@@ -37,4 +40,20 @@ public class Gift {
public void setAddAmt(Long addAmt) {
this.addAmt = addAmt;
}
public Long getSkuId() {
return skuId;
}
public void setSkuId(Long skuId) {
this.skuId = skuId;
}
public Long getDateEnd() {
return dateEnd;
}
public void setDateEnd(Long dateEnd) {
this.dateEnd = dateEnd;
}
}
......@@ -27,13 +27,13 @@ public class Ms extends RealmObject implements BaseModel, BaseBean {
* @return 是否可用
*/
public boolean isAvailable(Vip vip) {
return checkMsByDate() && checkMsByWeek() && checkMsByTime() && checkMsByVip(vip);
return checkMsByStatus() && checkMsByDate() && checkMsByWeek() && checkMsByTime() && checkMsByVip(vip);
}
public interface OnApplyListener {
void setDis(Ms ms);
void addGift(Long msId, Long skuId, long addAmt);
void addGift(Long msId, Long skuId, long addAmt, long dateEnd);
void removeGift(Long msId);
}
......@@ -73,7 +73,7 @@ public class Ms extends RealmObject implements BaseModel, BaseBean {
if (amt >= this.getPayAmt()) break;
}
if (amt >= this.getPayAmt()) {
onApplyListener.addGift(id, giftSkuId, giftSkuPrice);
onApplyListener.addGift(id, giftSkuId, giftSkuPrice, msDateEnd);
} else {
onApplyListener.removeGift(id);
}
......@@ -105,6 +105,15 @@ public class Ms extends RealmObject implements BaseModel, BaseBean {
}
}
/**
* 验证启动状态
*
* @return 是否通过验证
*/
private boolean checkMsByStatus() {
return msStatus == null || msStatus == 0;
}
/**
* 验证日期
......
package com.xingdata.zzdpos.model;
/**
* Created by Administrator on 2018/3/2.
*/
public class PaidUpEnter {
/**
* mssrvMapId : 1
* mssrvFree : 1
* mssrvPrice1 : 3000
* mssrvPrice2 : 36000
* vipLevelDef : 4
* ticketLevelDef : 9
* acctLevelDef : 2
* smsFee : 10
* updateTime : 1519808634000
* createTime : 1519808634000
* mssrvName : 开通优惠券
*/
private int mssrvMapId;
private int mssrvFree;
private int mssrvPrice1;
private long mssrvPrice2;
private int vipLevelDef;
private int ticketLevelDef;
private int acctLevelDef;
private int smsFee;
private long updateTime;
private long createTime;
private String mssrvName;
public int getMssrvMapId() {
return mssrvMapId;
}
public void setMssrvMapId(int mssrvMapId) {
this.mssrvMapId = mssrvMapId;
}
public int getMssrvFree() {
return mssrvFree;
}
public void setMssrvFree(int mssrvFree) {
this.mssrvFree = mssrvFree;
}
public int getMssrvPrice1() {
return mssrvPrice1;
}
public void setMssrvPrice1(int mssrvPrice1) {
this.mssrvPrice1 = mssrvPrice1;
}
public long getMssrvPrice2() {
return mssrvPrice2;
}
public void setMssrvPrice2(int mssrvPrice2) {
this.mssrvPrice2 = mssrvPrice2;
}
public int getVipLevelDef() {
return vipLevelDef;
}
public void setVipLevelDef(int vipLevelDef) {
this.vipLevelDef = vipLevelDef;
}
public int getTicketLevelDef() {
return ticketLevelDef;
}
public void setTicketLevelDef(int ticketLevelDef) {
this.ticketLevelDef = ticketLevelDef;
}
public int getAcctLevelDef() {
return acctLevelDef;
}
public void setAcctLevelDef(int acctLevelDef) {
this.acctLevelDef = acctLevelDef;
}
public int getSmsFee() {
return smsFee;
}
public void setSmsFee(int smsFee) {
this.smsFee = smsFee;
}
public long getUpdateTime() {
return updateTime;
}
public void setUpdateTime(long updateTime) {
this.updateTime = updateTime;
}
public long getCreateTime() {
return createTime;
}
public void setCreateTime(long createTime) {
this.createTime = createTime;
}
public String getMssrvName() {
return mssrvName;
}
public void setMssrvName(String mssrvName) {
this.mssrvName = mssrvName;
}
}
......@@ -11,6 +11,7 @@ import com.xingdata.api.print.entity.BaseOrderPrint;
import com.xingdata.zzdpos.C;
import com.xingdata.zzdpos.base.BaseBean;
import com.xingdata.zzdpos.base.BaseModel;
import com.xingdata.zzdpos.ui.login.LoginPresenter;
import com.xingdata.zzdpos.util.ConvertUtil;
import java.util.ArrayList;
......@@ -1008,7 +1009,7 @@ public class Saleorder extends SectionEntity<MediaStore.Video> implements BaseMo
@Override
public String getDRAW_URL() {
return null;
return "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx552cf715dd0107d0&redirect_uri=http://demo.51zzd.cn/wx&response_type=code&scope=snsapi_base&state=4" + LoginPresenter.loginReturnBean.getShopMapId() + "#wechat_redirect";
}
@Override
......
......@@ -31,10 +31,10 @@ public class LoadingDialog extends BaseDialog<BasePresenter, DialogLoadingBindin
this.getDialog().setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialogInterface, int i, KeyEvent keyEvent) {
if (i == keyEvent.KEYCODE_BACK) {
if (i == keyEvent.KEYCODE_BACK && keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
toughDismiss();
}
return true;
return false;
}
});
}
......
......@@ -61,7 +61,7 @@ public class FeedBackActivity extends AppCompatActivity {
@Override
protected void myOnClickListener(View v) {
if (mFeedBackBinding.editText.getText().length() < 10) {
ToastUtils.showShort("请详细描述下您遇到的问题");
ToastUtils.showShort("请详细描述下您遇到的问题(最少十个字)");
} else {
Feed feed = new Feed();
feed.setFeedText(mFeedBackBinding.editText.getText().toString() + "联系方式:" +
......
......@@ -119,7 +119,7 @@ public class LoginPresenter extends LoginContract.Presenter {
@Override
public void downList(View view, int flag, LoadingDialog loadingDialog) {
Realm realm = DBFactory.getRealm();
RealmResults<Oper> opers = realm.where(Oper.class).findAll();
RealmResults<Oper> opers = realm.where(Oper.class).equalTo("operStatus", "0").findAll();
mView.openDownList(view, opers, flag);
}
......
......@@ -13,8 +13,10 @@ import com.xingdata.zzdpos.base.BaseActivity;
import com.xingdata.zzdpos.base.BaseFragment;
import com.xingdata.zzdpos.databinding.ActivityMainBinding;
import com.xingdata.zzdpos.databinding.ItemMenuBottomBinding;
import com.xingdata.zzdpos.ui.dialog.PromptDialog;
import com.xingdata.zzdpos.ui.main.adapter.FragmentViewAdapter;
import com.xingdata.zzdpos.ui.main.dialog.HandoverDialog;
import com.xingdata.zzdpos.ui.main.dialog.PaidUpDialog;
import com.xingdata.zzdpos.ui.main.fragment.CasherFragment;
import com.xingdata.zzdpos.ui.main.fragment.MyselfFragment;
import com.xingdata.zzdpos.ui.main.fragment.ServiceFragment;
......@@ -44,6 +46,7 @@ public class MainActivity extends BaseActivity<MainPresenter, ActivityMainBindin
// private List<View> views=new ArrayList<>();
private List<ItemMenuBottomBinding> itemMenuBottomBindings = new ArrayList<>();
private HandoverDialog mHandoverDialog = new HandoverDialog();
private PaidUpDialog mPaidUpDialog = new PaidUpDialog();
@Override
public int getLayoutId() {
......@@ -52,6 +55,8 @@ public class MainActivity extends BaseActivity<MainPresenter, ActivityMainBindin
@Override
public void initView() {
ZX_PrintPOS.getInstance(this).init();
mPresenter.getPaidUpEnter();
mainActivity = this;
mPresenter.initHandoverInfo();
List<BaseFragment> fragments = new ArrayList<>();
......@@ -181,6 +186,21 @@ public class MainActivity extends BaseActivity<MainPresenter, ActivityMainBindin
mHandoverDialog.show(this);
}
@Override
public void showPaidUpVipDialog(Class activity, Integer day) {
mPaidUpDialog.setDay(day);
mPaidUpDialog.setClass(activity);
mPaidUpDialog.show(this);
}
@Override
public void showMarketingResult() {
PromptDialog mPromptDialog = new PromptDialog();
mPromptDialog.setDialogType(PromptDialog.PROMPTDIALOG_SUCC, "开通成功");
mPromptDialog.setCustomButton("确定", view -> dismissAllDialog());
mPromptDialog.show((BaseActivity) ActivityUtils.getTopActivity(), 2);
}
@Override
public void onBackPressedSupport() {
if ((System.currentTimeMillis() - mExitTime) > 1500) {
......
......@@ -4,11 +4,13 @@ package com.xingdata.zzdpos.ui.main;
import com.xingdata.zzdpos.base.BasePresenter;
import com.xingdata.zzdpos.base.BaseView;
interface MainContract {
public interface MainContract {
interface View extends BaseView {
void isShowLoading(Boolean is);
void showUptateDialog(String updateUrl, String version);
/**
* 交班确认
*/
......@@ -20,10 +22,34 @@ interface MainContract {
*/
void showHandoverDialog();
/**
* 显示会员续费页面
*/
void showPaidUpVipDialog(Class activity, Integer day);
/**
* 显示开通结果
*/
void showMarketingResult();
}
abstract class Presenter extends BasePresenter<View> {
/**
* 查詢會員规则
*/
public abstract void getPaidUpEnter();
/**
* 查詢會員付費
*/
public abstract void isPaidUpVip(Class activity);
/**
* 开通营销
*/
public abstract void activateMarketing(Integer months, Integer years);
/**
* 菜单EXIT页面 - 点击交班 打开交班报表页面
......
package com.xingdata.zzdpos.ui.main;
import android.os.Message;
import android.view.KeyEvent;
import com.alibaba.fastjson.JSON;
import com.blankj.utilcode.util.ActivityUtils;
import com.blankj.utilcode.util.AppUtils;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.SPUtils;
import com.blankj.utilcode.util.StringUtils;
import com.blankj.utilcode.util.TimeUtils;
import com.blankj.utilcode.util.ToastUtils;
import com.xingdata.api.print.ZX_PrintPOS;
import com.xingdata.zzdpos.api.ApiFactory;
import com.xingdata.zzdpos.db.DBFactory;
import com.xingdata.zzdpos.model.HandoverInfo;
import com.xingdata.zzdpos.model.PaidUpEnter;
import com.xingdata.zzdpos.ui.login.LoginPresenter;
import com.xingdata.zzdpos.util.SystemUtil;
......@@ -30,7 +24,7 @@ import io.reactivex.ObservableSource;
import io.reactivex.functions.Function;
public class MainPresenter extends MainContract.Presenter {
public static List<PaidUpEnter> mPaidUpEnters;
public static HandoverInfo handoverInfo;
......@@ -39,9 +33,68 @@ public class MainPresenter extends MainContract.Presenter {
this.initRealm();
}
@Override
public void getPaidUpEnter() {
ApiFactory.PaidUp.getEnter()
.subscribe(paidUpEnterPager -> {
if (paidUpEnterPager.getList().size() != 0) {
this.mPaidUpEnters = paidUpEnterPager.getList();
}
}
, throwable -> {
ToastUtils.showShort(throwable.getMessage());
}
);
}
@Override
public void isPaidUpVip(Class activity) {
ApiFactory.PaidUp.getMarketing()
.subscribe(object -> {
if (object.toString().length() == 0) {
mView.showPaidUpVipDialog(activity, null);
} else {
Long time = JSON.parseObject(object.toString()).getLong("openExp");
Integer day = (int) ((time - System.currentTimeMillis()) / 86400000L);
if (day <= 7) {
mView.showPaidUpVipDialog(activity, day);
} else if (activity == null) {
clickHandover();
} else {
ActivityUtils.startActivity(activity);
}
}
}
, throwable -> {
ToastUtils.showShort(throwable.getMessage());
}
);
}
@Override
public void activateMarketing(Integer months, Integer years) {
mView.isShowLoading(true);
ApiFactory.PaidUp.activateMarketing(months, years).doFinally(() -> mView.isShowLoading(false))
.subscribe(object -> {
mView.showMarketingResult();
}
, throwable -> {
ToastUtils.showShort(throwable.getMessage());
}
);
}
@Override
public void clickHandover() {
mView.showHandoverDialog();
}
......
package com.xingdata.zzdpos.ui.main.dialog;
import android.text.Html;
import android.view.View;
import com.blankj.utilcode.util.ActivityUtils;
import com.xingdata.zzdpos.R;
import com.xingdata.zzdpos.base.BaseDialog;
import com.xingdata.zzdpos.databinding.DialogPaidUpBinding;
import com.xingdata.zzdpos.model.PaidUpEnter;
import com.xingdata.zzdpos.ui.main.MainPresenter;
import com.xingdata.zzdpos.util.ConvertUtil;
/**
* 交班页面
*/
public class PaidUpDialog extends BaseDialog<MainPresenter, DialogPaidUpBinding> {
private Boolean isNew = true;
private Integer day;
private Class mClass;
public void setDay(Integer integer) {
this.day = integer;
}
public void setClass(Class mClass) {
this.mClass = mClass;
}
@Override
public int getLayoutId() {
return R.layout.dialog_paid_up;
}
@Override
public int getTitle() {
return -1;
}
@Override
public void onCancelClick(View view) {
super.onCancelClick(view);
if (!isNew) {
if (mClass != null) {
ActivityUtils.startActivity(mClass);
} else {
mPresenter.clickHandover();
}
}
}
@Override
public void onConfirmClick(View view) {
super.onConfirmClick(view);
if (isNew) {
mPresenter.activateMarketing(null, null);
dismiss();
} else {
mViewBinding.tvLine1.setVisibility(View.GONE);
mViewBinding.setIsShow(false);
}
}
@Override
public void initView() {
mViewBinding.setIsShow(true);
if (MainPresenter.mPaidUpEnters != null) {
long dayFree=0;
long price=0;
for(PaidUpEnter paidUpEnter: MainPresenter.mPaidUpEnters){
dayFree=paidUpEnter.getMssrvFree();
price=paidUpEnter.getMssrvPrice2()+price;
}
setPaidUpEnter(dayFree,price);
}
}
public void setPaidUpEnter(Long dayFree,Long price) {
if (day != null) {
if (day < 0) {
day = 0;
}
mViewBinding.tvLine1.setText(Html.fromHtml("<big><font color=\"black\">高级功能体验剩余</font></big>" +
"<big><big><big><font color=\"red\">" + day + "</font></big></big></big>" + "<big><font color=\"black\">天</font></big>"));
setBtnName("继续使用", "续费");
isNew = false;
} else {
mViewBinding.tvLine1.setText(Html.fromHtml("<big><font color=\"black\">高级功能可试用</font></big>" +
"<big><big><big><font color=\"red\">" + dayFree + "</font></big></big></big>" + "<big><font color=\"black\">月</font></big>"));
setBtnName("暂不试用", "开始试用");
isNew = true;
}
mViewBinding.tvLine2.setText(Html.fromHtml("<big><font color=\"black\">服务费:¥</font></big>" +
"<big><big><big><font color=\"black\">" + ConvertUtil.fenToYuan(Long.valueOf(price), false) + "/年" + "</font></big></big></big>"));
}
}
......@@ -19,6 +19,7 @@ import com.xingdata.zzdpos.ui.main.adapter.MenuRecyclerAdapter;
import com.xingdata.zzdpos.ui.manage.manageMenu.ManageMenuActivity;
import com.xingdata.zzdpos.ui.marketing.marketingMenu.MarketingMenuActivity;
import com.xingdata.zzdpos.ui.payment.PaymentActivity;
import com.xingdata.zzdpos.ui.sendticke.SendTicketActivity;
import com.xingdata.zzdpos.ui.statistics.StatisticsActivity;
import com.xingdata.zzdpos.ui.store.StoreActivity;
import com.xingdata.zzdpos.ui.vip.VipActivity;
......@@ -130,7 +131,7 @@ public class CasherFragment extends BaseFragment<MainPresenter, FragmentCasherBi
MarketingMenuActivity.class));
break;
case C.MENU.MENU_TICKET://优惠券
ActivityUtils.startActivity(getActivity(), com.xingdata.zzdpos.ui.sendticke.SendTicketActivity.class);
mPresenter.isPaidUpVip(SendTicketActivity.class);
break;
case C.MENU.MENU_STATISTICS://统计
ActivityUtils.startActivity(getActivity(), StatisticsActivity.class);
......@@ -158,7 +159,7 @@ public class CasherFragment extends BaseFragment<MainPresenter, FragmentCasherBi
mViewBinding.btnHandover.setOnClickListener(new OnClickListener() {
@Override
protected void myOnClickListener(View v) {
mPresenter.clickHandover();
mPresenter.isPaidUpVip(null);
}
});
......
......@@ -33,7 +33,7 @@ public class InventoryActivity extends BaseActivity<InventoryPresenter, Activity
private InventoryFragment mInventoryFragment = new InventoryFragment();
private ManageDateFragment mManageDateFragment = new ManageDateFragment();
private InventoryAddFragment mInventoryAddFragment;
;
private ScanFragment mScanFragment;
@Override
......@@ -64,8 +64,6 @@ public class InventoryActivity extends BaseActivity<InventoryPresenter, Activity
}
}
finish();
}
});
......
......@@ -33,7 +33,7 @@ public class InventoryPresenter extends InventoryContract.Presenter {
@Override
public void onAttached() {
this.initRealm();
}
......@@ -50,11 +50,11 @@ public class InventoryPresenter extends InventoryContract.Presenter {
csDetail.setCsNo(mCs.getCsNo());
csDetail.setSkuId(sssku.getSkuId());
csDetail.setOpMapId(mCs.getOpMapId().longValue());
if (csDetail.getCsCnt() == csDetail.getSkuCnt()) {
if (csDetail.getCsCnt().longValue() == csDetail.getSkuCnt().longValue()) {
csDetail.setCsResultFlag(0);
} else if (csDetail.getCsCnt() > csDetail.getSkuCnt()) {
csDetail.setCsResultFlag(1);
} else {
} else if (csDetail.getCsCnt() < csDetail.getSkuCnt()) {
csDetail.setCsResultFlag(2);
}
mView.isShowLoading(true);
......
......@@ -26,7 +26,9 @@ public class InventoryAdapter extends BaseAdapter<Cs, ItemInventoryBinding> {
@Override
protected void convert(ItemInventoryBinding mViewBinding, Cs item) {
mViewBinding.tvName.setText(item.getOperName());
if (item.getOperName() != null) {
mViewBinding.tvName.setText(item.getOperName());
}
mViewBinding.tvPhone.setText(item.getOper_mobile());
mViewBinding.tvDate.setText(TimeUtils.millis2String(item.getCreateTime()) + "");
mViewBinding.tvNum.setText(item.getCsdetailCount() + "");
......
......@@ -84,7 +84,11 @@ public class InventoryAddFragment extends BaseFragment<InventoryPresenter, Fragm
}
});
mViewBinding.btnEnd.setOnClickListener(view -> {
mPresenter.exitInventoryAdd();
if (bottomCsList.size() == 0) {
mPresenter.cancelInventoryAdd(mCs);
} else {
mPresenter.exitInventoryAdd();
}
});
......
......@@ -275,7 +275,6 @@ public class SsskuPresenter extends SsskuContract.Presenter {
public void doOnFinish() {
if (!isNeedSync) return;
final double[] nowPro = {0.0};
mView.showLoadingDialog();
SPUtils.getInstance().put(SplashActivity.SYNCHRONOUSERRORCODE, "");
SPUtils.getInstance().put(SplashActivity.SYNCHRONOUSERRORMSG, "");
for (int i = 0; i < SplashPresenter.listSync.size(); i++) {
......@@ -283,9 +282,6 @@ public class SsskuPresenter extends SsskuContract.Presenter {
@Override
public void getPro(double pro) {
nowPro[0] += pro;
if (nowPro[0] >= 100) {
mView.dismissLoadingDialog();
}
}
@Override
......
......@@ -10,8 +10,12 @@ import com.blankj.utilcode.util.ActivityUtils;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.xingdata.zzdpos.C;
import com.xingdata.zzdpos.R;
import com.xingdata.zzdpos.base.BaseActivity;
import com.xingdata.zzdpos.databinding.ActivityMarketingMenuBinding;
import com.xingdata.zzdpos.model.MarketingMenuModel;
import com.xingdata.zzdpos.ui.dialog.PromptDialog;
import com.xingdata.zzdpos.ui.main.MainPresenter;
import com.xingdata.zzdpos.ui.main.dialog.PaidUpDialog;
import com.xingdata.zzdpos.ui.marketing.integral.IntegralActivity;
import com.xingdata.zzdpos.ui.marketing.marketingMenu.adapter.MarketingMenuAdapter;
import com.xingdata.zzdpos.ui.marketing.ms.MsActivity;
......@@ -24,14 +28,19 @@ import com.xingdata.zzdpos.util.RecyclerViewUtil;
import java.util.ArrayList;
import java.util.List;
public class MarketingMenuActivity extends AppCompatActivity {
public class MarketingMenuActivity extends BaseActivity<MainPresenter, ActivityMarketingMenuBinding> implements com.xingdata.zzdpos.ui.main.MainContract.View {
MarketingMenuAdapter marketingMenuAdapter;
List<Integer> list = new ArrayList<>();
private PaidUpDialog mPaidUpDialog = new PaidUpDialog();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_marketing_menu);
public int getLayoutId() {
return R.layout.activity_marketing_menu;
}
@Override
public void initView() {
ActivityMarketingMenuBinding mViewBinding = DataBindingUtil.setContentView(
this, R.layout.activity_marketing_menu);
......@@ -70,17 +79,20 @@ public class MarketingMenuActivity extends AppCompatActivity {
break;
case C.MENU.MENU_MS_TICKET: {
//优惠券设置
ActivityUtils.startActivity(ReturnTicketActivity.class);
mPresenter.isPaidUpVip(ReturnTicketActivity.class);
}
break;
case C.MENU.MENU_MS_RECHARGE: {
//充值优惠
ActivityUtils.startActivity(RechargeRuleActivity.class);
mPresenter.isPaidUpVip(RechargeRuleActivity.class);
}
break;
case C.MENU.MENU_MS_MS: {
//营销计划
ActivityUtils.startActivity(MsActivity.class);
mPresenter.isPaidUpVip(MsActivity.class);
}
break;
case C.MENU.MENU_MS_SMS: {
......@@ -95,4 +107,44 @@ public class MarketingMenuActivity extends AppCompatActivity {
}
});
}
@Override
public void showPaidUpVipDialog(Class activity, Integer day) {
mPaidUpDialog.setDay(day);
mPaidUpDialog.setClass(activity);
mPaidUpDialog.show(this);
}
@Override
public void showMarketingResult() {
PromptDialog mPromptDialog = new PromptDialog();
mPromptDialog.setDialogType(PromptDialog.PROMPTDIALOG_SUCC, "开通成功");
mPromptDialog.setCustomButton("确定", view -> dismissAllDialog());
mPromptDialog.show((BaseActivity) ActivityUtils.getTopActivity(), 2);
}
@Override
public void isShowLoading(Boolean is) {
if (is) {
mLoadingDialog.show((BaseActivity) mContext);
} else {
if (mLoadingDialog.isShowing) {
mLoadingDialog.dismiss();
}
}
}
@Override
public void showUptateDialog(String updateUrl, String version) {
}
@Override
public void handoverOk() {
}
@Override
public void showHandoverDialog() {
}
}
......@@ -201,7 +201,6 @@ public class MsPresenter<Sku extends BaseSku> extends MsContract.Presenter<Sku>
public void doOnFinish() {
if (!isNeedSync) return;
final double[] nowPro = {0.0};
mView.showLoadingDialog();
SPUtils.getInstance().put(SplashActivity.SYNCHRONOUSERRORCODE, "");
SPUtils.getInstance().put(SplashActivity.SYNCHRONOUSERRORMSG, "");
for (int i = 0; i < SplashPresenter.listSync.size(); i++) {
......@@ -209,9 +208,6 @@ public class MsPresenter<Sku extends BaseSku> extends MsContract.Presenter<Sku>
@Override
public void getPro(double pro) {
nowPro[0] += pro;
if (nowPro[0] >= 100) {
mView.dismissLoadingDialog();
}
}
@Override
......
......@@ -21,8 +21,11 @@ import com.xingdata.zzdpos.ui.marketing.ticket.ReturnTicketPresenter;
import com.xingdata.zzdpos.util.ConvertUtil;
import com.xingdata.zzdpos.util.OnClickListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class TickerAddFragment extends BaseFragment<ReturnTicketPresenter,
DialogTicketAddSettingBinding> {
......@@ -134,14 +137,24 @@ public class TickerAddFragment extends BaseFragment<ReturnTicketPresenter,
trule.setTruleStatus(nowStatus);
trule.setTruleValAmt(ConvertUtil.yuanToFen(mViewBinding.etTicketMoney.getText().toString
()));
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
format.setTimeZone(TimeZone.getTimeZone("GMT+08:00"));
trule.setTruleExp(TimeUtils.string2Millis(mViewBinding.tvDate.getText().toString() + " " +
"23:59:59"));
trule.setTruleOrderAmt(ConvertUtil.yuanToFen(mViewBinding.etRuleMoney.getText().toString
()));
if (!mViewBinding.etTicketCount.getText().toString().equals("")) {
trule.setTruleUseNum(Byte.parseByte(mViewBinding.etTicketCount.getText().toString()));
} else {
trule.setTruleUseNum((byte) 1);
try {
Date date = format.parse(mViewBinding.tvDate.getText().toString() +
" 23:59:59");
trule.setTruleExp(date.getTime());
trule.setTruleOrderAmt(ConvertUtil.yuanToFen(mViewBinding.etRuleMoney.getText().toString
()));
if (!mViewBinding.etTicketCount.getText().toString().equals("")) {
trule.setTruleUseNum(Byte.parseByte(mViewBinding.etTicketCount.getText().toString
()));
} else {
trule.setTruleUseNum((byte) 1);
}
} catch (ParseException e) {
e.printStackTrace();
}
return trule;
}
......
package com.xingdata.zzdpos.ui.scan;
import android.content.Context;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraManager;
import android.os.Handler;
import android.view.View;
import android.view.ViewStub;
import android.widget.TextView;
import com.blankj.utilcode.constant.PermissionConstants;
import com.blankj.utilcode.util.PermissionUtils;
import com.blankj.utilcode.util.TimeUtils;
import com.xingdata.zzdpos.R;
import com.xingdata.zzdpos.base.BaseFragment;
import com.xingdata.zzdpos.base.BasePresenter;
import com.xingdata.zzdpos.databinding.FragmentStoreScanBinding;
import java.util.List;
import me.dm7.barcodescanner.core.IViewFinder;
import me.dm7.barcodescanner.core.ViewFinderView;
import me.dm7.barcodescanner.zxing.ZXingScannerView;
public class ScanFragment<P extends BasePresenter> extends BaseFragment<P, FragmentStoreScanBinding> {
private CameraManager mCameraManager;
private ZXingScannerView mScannerView;
private ZXingScannerView.ResultHandler mResultHandler;
private String titleStr = "";
private ViewStub viewStub;
private View inflated;
private Long mTime;
@Override
public int getLayoutId() {
return R.layout.fragment_store_scan;
......@@ -55,8 +66,40 @@ public class ScanFragment<P extends BasePresenter> extends BaseFragment<P, Fragm
void onBackPressed();
}
private boolean isDenied = false;
@Override
public void initView() {
isDenied = false;
mTime = TimeUtils.getNowMills();
PermissionUtils.permission(PermissionConstants.CAMERA).callback(new PermissionUtils.FullCallback() {
@Override
public void onGranted(List<String> permissionsGranted) {
isDenied = false;
initCamera();
}
@Override
public void onDenied(List<String> permissionsDeniedForever, List<String> permissionsDenied) {
isDenied = true;
}
}).request();
}
private void initCamera() {
mCameraManager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
try {
if ((mCameraManager != null ? mCameraManager.getCameraIdList().length : 0) > 1) {
mViewBinding.ivChange.setVisibility(View.VISIBLE);
} else {
mViewBinding.ivChange.setVisibility(View.GONE);
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
if (!titleStr.equals("")) {
viewStub = mViewBinding.vsTitle.getViewStub();
inflated = viewStub.inflate();
......@@ -84,18 +127,42 @@ public class ScanFragment<P extends BasePresenter> extends BaseFragment<P, Fragm
};
mScannerView.setResultHandler(mResultHandler);
mViewBinding.contentFrame.addView(mScannerView);
mViewBinding.ivChange.setOnClickListener(view -> {
if (mCurCameraId == getDefaultCameraId()) {
mCurCameraId = getFrontFacingCameraId();
mScannerView.stopCamera();
mScannerView.startCamera(getFrontFacingCameraId());
} else {
mCurCameraId = getDefaultCameraId();
mScannerView.stopCamera();
mScannerView.startCamera(getDefaultCameraId());
}
});
}
private int mCurCameraId;
@Override
public void onResume() {
super.onResume();
mScannerView.startCamera();
if (isDenied) pop();
if (mScannerView != null) mScannerView.startCamera(mCurCameraId);
}
private int getDefaultCameraId() {
return 0;
}
private int getFrontFacingCameraId() {
return 1;
}
@Override
public void onPause() {
super.onPause();
mScannerView.stopCamera();
if (mScannerView != null) mScannerView.stopCamera();
}
/**
......@@ -107,6 +174,7 @@ public class ScanFragment<P extends BasePresenter> extends BaseFragment<P, Fragm
@Override
public boolean onBackPressedSupport() {
if (TimeUtils.getNowMills() - mTime <= 500) return true;
if (mOnBackPressedListener != null) mOnBackPressedListener.onBackPressed();
return super.onBackPressedSupport();
}
......
......@@ -88,6 +88,10 @@ public class SendTickerFragment extends BaseFragment<SendTicketPresenter,
break;
case R.id.btn_send: {
if (isNull()) {
if (truleList.size() <= 0) {
ToastUtils.showLong("没有优惠券");
return;
}
long tickerId = truleList
.get(nowTickerItemId).getTruleMapId();
mLoadingDialog.show((BaseActivity) getActivity());
......
......@@ -3,6 +3,8 @@ package com.xingdata.zzdpos.ui.settle;
import android.view.MotionEvent;
import com.blankj.utilcode.util.ActivityUtils;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.TimeUtils;
import com.blankj.utilcode.util.ToastUtils;
import com.xingdata.zzdpos.C;
import com.xingdata.zzdpos.R;
......@@ -135,8 +137,10 @@ public class SettleActivity extends BaseActivity<SettlePresenter, ActivitySettle
mPasswordDialog.setSaleorder(saleorder).show(this);
break;
case C.PAY_CHANNEL.BANK:
// mPresenter.payInBank();
break;
case C.PAY_CHANNEL.ALI:
if (TimeUtils.getNowMills() - mTime < 1000) return;
this.showTitleBarByTitleMode(C.TITLE_MODE.TEXT);
mViewBinding.tvTitle.setText(R.string.settle_channel_ali);
mScanFragment.setOnScanCompletedListener(barcode -> {
......@@ -147,6 +151,7 @@ public class SettleActivity extends BaseActivity<SettlePresenter, ActivitySettle
this.start(mScanFragment);
break;
case C.PAY_CHANNEL.WECHAT:
if (TimeUtils.getNowMills() - mTime < 1000) return;
this.showTitleBarByTitleMode(C.TITLE_MODE.TEXT);
mViewBinding.tvTitle.setText(R.string.settle_channel_wechat);
mScanFragment.setOnScanCompletedListener(barcode -> {
......@@ -183,6 +188,9 @@ public class SettleActivity extends BaseActivity<SettlePresenter, ActivitySettle
@Override
public void showPayFailFragment(Throwable throwable, Saleorder saleorder) {
if (throwable != null) {
LogUtils.e(throwable.getMessage());
}
this.start(mPayResultFragment.setResult(false).setSaleorder(saleorder));
this.showTitleBarByTitleMode(C.TITLE_MODE.TEXT);
mViewBinding.tvTitle.setText(R.string.settle_pay_result_title);
......@@ -190,8 +198,8 @@ public class SettleActivity extends BaseActivity<SettlePresenter, ActivitySettle
}
@Override
public void showPayingDialog(int payType, com.xingdata.zzdpos.api.Pay.Response response) {
mPayingDialog.setType(payType).setResponse(response).show(this);
public void showPayingDialog(int payType) {
mPayingDialog.setType(payType).show(this);
}
@Override
......@@ -199,9 +207,11 @@ public class SettleActivity extends BaseActivity<SettlePresenter, ActivitySettle
return mSettleFragment.mViewBinding.etMark.getText().toString();
}
private long mTime;
@Override
public void backToSettleFragment() {
mTime = TimeUtils.getNowMills();
this.showTitleBarByTitleMode(C.TITLE_MODE.TEXT);
mViewBinding.tvTitle.setText(R.string.settle_title);
mViewBinding.vSearch.hideSoftInput();
......
......@@ -130,7 +130,7 @@ interface SettleContract {
/**
* 显示支付中页面
*/
void showPayingDialog(int payType, com.xingdata.zzdpos.api.Pay.Response response);
void showPayingDialog(int payType);
/**
* 获取备注
......
......@@ -4,7 +4,6 @@ import android.content.DialogInterface;
import com.xingdata.zzdpos.C;
import com.xingdata.zzdpos.R;
import com.xingdata.zzdpos.api.Pay;
import com.xingdata.zzdpos.base.BaseDialog;
import com.xingdata.zzdpos.databinding.DialogSettlePayingBinding;
import com.xingdata.zzdpos.ui.settle.SettlePresenter;
......@@ -12,7 +11,6 @@ import com.xingdata.zzdpos.ui.settle.SettlePresenter;
public class PayingDialog extends BaseDialog<SettlePresenter, DialogSettlePayingBinding> {
private int mType;
private Pay.Response mResponse;
@Override
protected boolean isEasy() {
......@@ -47,8 +45,4 @@ public class PayingDialog extends BaseDialog<SettlePresenter, DialogSettlePaying
return this;
}
public PayingDialog setResponse(Pay.Response response) {
this.mResponse = response;
return this;
}
}
......@@ -96,7 +96,7 @@ public class StatisticsDetailActivity extends BaseActivity<StatisticsDetailPrese
.getUpdateTime()));
viewTicketBinding.setCreateDate(com.blankj.utilcode.util.TimeUtils.date2String(ticket
.getCreateTime()));
switch (ticket.getUsedFlag()){
switch (ticket.getUsedFlag()) {
case 1:
viewTicketBinding.setIsUsed(false);
break;
......@@ -139,7 +139,7 @@ public class StatisticsDetailActivity extends BaseActivity<StatisticsDetailPrese
try {
ZX_PrintPOS.getInstance(MainActivity.mainActivity).printInventory(1, cs);
} catch (Exception e) {
ToastUtils.showShort("打印异常");
ToastUtils.showShort("无法打印");
}
mViewBinding.btnReturn.setEnabled(false);
......@@ -181,10 +181,8 @@ public class StatisticsDetailActivity extends BaseActivity<StatisticsDetailPrese
ZX_PrintPOS.getInstance(MainActivity.mainActivity).printSave(1,
vipRechargeOrder);
} catch (Exception e) {
ToastUtils.showShort("打印异常");
ToastUtils.showShort("无法打印");
}
mViewBinding.btnPrint.setEnabled(false);
mViewBinding.btnPrint.setText("已打印");
}
......@@ -212,10 +210,18 @@ public class StatisticsDetailActivity extends BaseActivity<StatisticsDetailPrese
viewOrderDetailBinding.tvAmtHint.setText("退货金额");
viewOrderDetailBinding.setPayType(mSaleorder.getSalepay() == null ? "退货" :
mSaleorder.getSalepay().getPayName());
mViewBinding.btnPrint.setVisibility(View.GONE);
mViewBinding.btnReturn.setVisibility(View.GONE);
break;
default:
viewOrderDetailBinding.setPayType(mSaleorder.getSalepay() == null ? "未支付" :
mSaleorder.getSalepay().getPayName());
if (mSaleorder.getSalepay() == null) {
viewOrderDetailBinding.setPayType("未支付");
mViewBinding.btnPrint.setVisibility(View.GONE);
mViewBinding.btnReturn.setVisibility(View.GONE);
} else {
viewOrderDetailBinding.setPayType(mSaleorder.getSalepay().getPayName());
}
}
viewOrderDetailBinding.tvAmt.setText(ConvertUtil.fenToYuan(mSaleorder.getOrderPayAmt(),
true));
......@@ -293,11 +299,10 @@ public class StatisticsDetailActivity extends BaseActivity<StatisticsDetailPrese
try {
ZX_PrintPOS.getInstance(MainActivity.mainActivity).print(1, mSaleorder);
} catch (Exception e) {
ToastUtils.showShort("打印异常");
ToastUtils.showShort("无法打印");
}
mViewBinding.btnPrint.setEnabled(false);
mViewBinding.btnPrint.setText("已打印");
}
});
}
......
......@@ -11,9 +11,7 @@ import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import com.blankj.utilcode.constant.PermissionConstants;
import com.blankj.utilcode.util.ActivityUtils;
import com.blankj.utilcode.util.PermissionUtils;
import com.blankj.utilcode.util.ToastUtils;
import com.hwangjr.rxbus.annotation.Subscribe;
import com.hwangjr.rxbus.annotation.Tag;
......@@ -23,6 +21,7 @@ import com.xingdata.zzdpos.R;
import com.xingdata.zzdpos.base.BaseActivity;
import com.xingdata.zzdpos.base.BaseSku;
import com.xingdata.zzdpos.databinding.ActivityStoreBinding;
import com.xingdata.zzdpos.model.Gift;
import com.xingdata.zzdpos.model.Ms;
import com.xingdata.zzdpos.model.Pager;
import com.xingdata.zzdpos.model.Saledetail;
......@@ -33,6 +32,7 @@ import com.xingdata.zzdpos.ui.scan.ScanFragment;
import com.xingdata.zzdpos.ui.settle.SettleActivity;
import com.xingdata.zzdpos.ui.store.dialog.CartDialog;
import com.xingdata.zzdpos.ui.store.dialog.MsDialog;
import com.xingdata.zzdpos.ui.store.fragment.GiftFragment;
import com.xingdata.zzdpos.ui.store.fragment.SearchFragment;
import com.xingdata.zzdpos.ui.store.fragment.StoreFragment;
import com.xingdata.zzdpos.util.Global;
......@@ -46,6 +46,7 @@ public class StoreActivity extends BaseActivity<StorePresenter, ActivityStoreBin
private StoreFragment mStoreFragment = new StoreFragment();
private SearchFragment mSearchFragment = new SearchFragment();
private ScanFragment mScanFragment = new ScanFragment();
private GiftFragment mGiftFragment = new GiftFragment();
private CartDialog mCartDialog = new CartDialog();
private MsDialog mMsDialog = new MsDialog();
......@@ -55,34 +56,41 @@ public class StoreActivity extends BaseActivity<StorePresenter, ActivityStoreBin
return R.layout.activity_store;
}
@Override
public void onBackPressedSupport() {
}
@Override
public void initView() {
loadRootFragment(R.id.f_store, mStoreFragment);
mViewBinding.ivCart.setOnClickListener(view -> mPresenter.clickCartLogo());
mViewBinding.tvSettle.setOnClickListener(view -> mPresenter.clickSettle());
mViewBinding.btnBack.setOnClickListener(view -> onBackPressedSupport());
mViewBinding.tvSettle.setOnClickListener(view -> {
if (mGiftFragment.isAdded()) {
mGiftFragment.clickSettleInGift();
} else {
mPresenter.clickSettle();
}
});
mViewBinding.btnBack.setOnClickListener(view -> getTopFragment().onBackPressedSupport());
mViewBinding.vSearch.setOnSearchListener(keyword -> mPresenter.searchSku(keyword));
mViewBinding.btnScan.setOnClickListener(view -> PermissionUtils.permission(PermissionConstants.CAMERA).callback(new PermissionUtils.FullCallback() {
@Override
public void onGranted(List<String> permissionsGranted) {
mPresenter.clickScan();
}
@Override
public void onDenied(List<String> permissionsDeniedForever, List<String> permissionsDenied) {
}
}).request()
);
mViewBinding.btnScan.setOnClickListener(view -> mPresenter.clickScan());
mViewBinding.btnPayment.setOnClickListener(view -> {
//显示价格输入页面以添加无码商品
Intent intent = new Intent(StoreActivity.this, PaymentActivity.class);
intent.putExtra(C.SP_KEY.SETTLE_MODE, C.SETTLE_MODE.STORE);
ActivityUtils.startActivity(intent);
});
mViewBinding.tvSelectAll.setOnClickListener(view -> {
mGiftFragment.selectAll();
});
mScanFragment.setOnScanCompletedListener(barcode -> mPresenter.scanComplete(barcode));
mScanFragment.setOnBackPressedListener(this::backToStoreFragment);
}
@Override
......@@ -163,6 +171,16 @@ public class StoreActivity extends BaseActivity<StorePresenter, ActivityStoreBin
ActivityUtils.startActivity(intent);
}
@Override
public void showGiftFragment(List<Gift> gifts) {
if (!mGiftFragment.isAdded()) {
mCartDialog.dismiss();
mViewBinding.setTitleMode(C.TITLE_MODE.GIFT);
mViewBinding.tvTitle.setText(R.string.gift_title);
this.start(mGiftFragment);
}
}
@Override
public void showSearchFragment() {
if (!mSearchFragment.isAdded()) {
......@@ -184,12 +202,14 @@ public class StoreActivity extends BaseActivity<StorePresenter, ActivityStoreBin
@Override
public void showScanFragment() {
if (!mScanFragment.isAdded()) this.start(mScanFragment);
if (!mScanFragment.isAdded()) {
mViewBinding.tvTitle.setText(R.string.store_scanner);
this.start(mScanFragment);
}
}
@Override
public void resetSearchBar() {
mViewBinding.clTitle.requestFocus();
mViewBinding.setTitleMode(C.TITLE_MODE.TEXT);
}
......@@ -206,6 +226,29 @@ public class StoreActivity extends BaseActivity<StorePresenter, ActivityStoreBin
r.play();
}
@Override
public void loadGifts(List<Gift> gifts) {
mGiftFragment.loadGifts(gifts);
}
@Override
public void backToMainActivity() {
this.finish();
}
@Override
public void backToStoreFragment() {
mViewBinding.setTitleMode(C.TITLE_MODE.TEXT);
mViewBinding.setGiftPayAmt(0L);
mViewBinding.tvTitle.setText(R.string.store_title);
mViewBinding.clTitle.requestFocus();
this.pop();
}
@Override
public void loadGiftPayAmt(Long giftPayAmt) {
mViewBinding.setGiftPayAmt(giftPayAmt);
}
/**
* 执行抖动动画
......
......@@ -3,6 +3,7 @@ package com.xingdata.zzdpos.ui.store;
import com.xingdata.zzdpos.base.BasePresenter;
import com.xingdata.zzdpos.base.BaseSku;
import com.xingdata.zzdpos.base.BaseView;
import com.xingdata.zzdpos.model.Gift;
import com.xingdata.zzdpos.model.Ms;
import com.xingdata.zzdpos.model.Pager;
import com.xingdata.zzdpos.model.Saledetail;
......@@ -106,6 +107,13 @@ interface StoreContract {
*/
void showSettle(List<Saledetail> saledetails);
/**
* 显示换购页面
*
* @param gifts 换购信息列表
*/
void showGiftFragment(List<Gift> gifts);
/**
* 显示搜索页面
*/
......@@ -139,6 +147,28 @@ interface StoreContract {
* @param result 提示音
*/
void startAlarm(boolean result);
/**
* 加载换购信息
*/
void loadGifts(List<Gift> gifts);
/**
* 返回主页面
*/
void backToMainActivity();
/**
* 返回商店主页面
*/
void backToStoreFragment();
/**
* 加载换购商品换购价格
*
* @param giftPayAmt 换购价格
*/
void loadGiftPayAmt(Long giftPayAmt);
}
abstract class Presenter extends BasePresenter<View> {
......@@ -148,6 +178,13 @@ interface StoreContract {
*/
public abstract void clickSettle();
/**
* 总体 - 在礼物界面点击结算按钮
*
* @param gifts 选择的换购商品
*/
public abstract void clickSettleInGift(List<Gift> gifts);
/**
* 总体 - 点击购物车logo
*/
......@@ -246,6 +283,13 @@ interface StoreContract {
* @param b 获取焦点
*/
public abstract void searchBarFocusChanged(boolean b);
/**
* 换购页面 - 初始化
*/
public abstract void initGift();
}
}
......@@ -3,6 +3,7 @@ package com.xingdata.zzdpos.ui.store;
import com.xingdata.zzdpos.base.BaseSku;
import com.xingdata.zzdpos.db.DB;
import com.xingdata.zzdpos.db.DBFactory;
import com.xingdata.zzdpos.model.Gift;
import com.xingdata.zzdpos.model.Ms;
import com.xingdata.zzdpos.model.Saledetail;
import com.xingdata.zzdpos.model.Saleorder;
......@@ -32,6 +33,11 @@ public class StorePresenter extends StoreContract.Presenter {
*/
private List<Saledetail> mSaledetails;
/**
* 换购商品列表
*/
private List<Gift> mGiftList;
/**
* 当前营销计划
*/
......@@ -47,11 +53,10 @@ public class StorePresenter extends StoreContract.Presenter {
@Override
public void onAttached() {
this.initRealm();
mVip = Vip.createDefault();
mSaledetails = new ArrayList<>();
mGiftList = new ArrayList<>();
mSaleorder = new Saleorder();
mOnApplyListener = new Ms.OnApplyListener() {
@Override
public void setDis(Ms ms) {
......@@ -59,13 +64,23 @@ public class StorePresenter extends StoreContract.Presenter {
}
@Override
public void addGift(Long msId, Long skuId, long addAmt) {
//这一版不做处理
public void addGift(Long msId, Long skuId, long addAmt, long dateEnd) {
for (int i = 0; i < mGiftList.size(); i++) {
if (mGiftList.get(i).getMsId().longValue() == msId) {
return;
}
}
mGiftList.add(new Gift(msId, skuId, addAmt, dateEnd));
}
@Override
public void removeGift(Long msId) {
//这一版不作处理
for (int i = 0; i < mGiftList.size(); i++) {
if (mGiftList.get(i).getMsId().longValue() == msId) {
mGiftList.remove(i);
break;
}
}
}
};
}
......@@ -73,7 +88,22 @@ public class StorePresenter extends StoreContract.Presenter {
@Override
public void clickSettle() {
if (mSaledetails.size() == 0) return;
mView.showSettle(mSaledetails);
if (mGiftList.size() > 0) {
mView.showGiftFragment(mGiftList);
} else {
mView.showSettle(mSaledetails);
}
}
@Override
public void clickSettleInGift(List<Gift> gifts) {
List<Saledetail> saledetails = new ArrayList<>();
saledetails.addAll(mSaledetails);
for (int i = 0; i < gifts.size(); i++) {
Saledetail saledetail = Saledetail.create(gifts.get(i), mVip);
saledetails.add(0, saledetail);
}
mView.showSettle(saledetails);
}
@Override
......@@ -200,6 +230,21 @@ public class StorePresenter extends StoreContract.Presenter {
if (b) mView.showSearchFragment();
}
@Override
public void initGift() {
mCompositeDisposable.add(DBFactory.Store.queryGiftSkus(mGiftList).subscribe(ssskus -> {
for (int i = 0; i < ssskus.size(); i++) {
for (int j = 0; j < mGiftList.size(); j++) {
if (ssskus.get(i).getSkuId().longValue() == mGiftList.get(j).getSkuId()) {
mGiftList.get(j).setSssku(ssskus.get(i));
break;
}
}
}
mView.loadGifts(mGiftList);
}));
}
/**
* 获取商品分组
......
package com.xingdata.zzdpos.ui.store.adapter;
import com.xingdata.zzdpos.R;
import com.xingdata.zzdpos.base.BaseMultiSelectAdapter;
import com.xingdata.zzdpos.base.BaseViewHolder;
import com.xingdata.zzdpos.databinding.ItemStoreGiftBinding;
import com.xingdata.zzdpos.model.Gift;
import com.xingdata.zzdpos.util.ConvertUtil;
import java.util.ArrayList;
import java.util.List;
public class GiftAdapter extends BaseMultiSelectAdapter<Gift, ItemStoreGiftBinding> {
public GiftAdapter() {
super(R.layout.item_store_gift, new ArrayList<>());
}
@Override
protected void convert(BaseViewHolder helper, ItemStoreGiftBinding mViewBinding, boolean isSelected, Gift item) {
mViewBinding.tvName.setText(item.getSssku().getSpuName());
mViewBinding.tvOriginalPrice.setText(ConvertUtil.fenToYuan(item.getSssku().getSkuRetailPrice1(), true));
StringBuilder sbDateEnd = new StringBuilder(item.getDateEnd().toString());
sbDateEnd.insert(6, "-");
sbDateEnd.insert(4, "-");
mViewBinding.tvDateEnd.setText("换购截止:" + sbDateEnd.toString());
mViewBinding.tvAmt.setText(ConvertUtil.fenToYuanNoZero(item.getAddAmt()) + "元");
mViewBinding.ivChecked.setImageResource(isSelected ? R.mipmap.radio_select_bg : R.mipmap.radio_normal_bg);
}
/**
* 获取所有选中的换购商品的换购价格总和
*
* @return 换购价格总和
*/
public Long getGiftPayAmt() {
Long payAmt = 0L;
List<Gift> gifts = new ArrayList<>();
gifts.addAll(getSelectedData());
for (int i = 0; i < gifts.size(); i++) {
payAmt += gifts.get(i).getAddAmt();
}
return payAmt;
}
}
......@@ -86,7 +86,8 @@ public class MsAdapter extends BaseAdapter<Ms, ItemStoreMsBinding> {
strType = mContext.getString(R.string.ms_type_money_off_info, ConvertUtil.fenToYuan(ms.getPayAmt()), ConvertUtil.fenToYuan(ms.getGiftOffAmt()));
break;
case C.MS_TYPE.GIFT:
strType = mContext.getString(R.string.ms_type_gift_info, ConvertUtil.fenToYuan(ms.getPayAmt()), ConvertUtil.fenToYuan(ms.getGiftSkuPrice()), ms.getGiftSkuName());
String spuName = DBFactory.Store.querySpuNameBySkuId(ms.getGiftSkuId());
strType = mContext.getString(R.string.ms_type_gift_info, ConvertUtil.fenToYuan(ms.getPayAmt()), ConvertUtil.fenToYuan(ms.getGiftSkuPrice()), spuName);
break;
}
......
package com.xingdata.zzdpos.ui.store.fragment;
import android.support.v7.widget.LinearLayoutManager;
import com.xingdata.zzdpos.R;
import com.xingdata.zzdpos.base.BaseFragment;
import com.xingdata.zzdpos.databinding.FragmentStoreGiftBinding;
import com.xingdata.zzdpos.model.Gift;
import com.xingdata.zzdpos.ui.store.StoreActivity;
import com.xingdata.zzdpos.ui.store.StorePresenter;
import com.xingdata.zzdpos.ui.store.adapter.GiftAdapter;
import java.util.List;
public class GiftFragment extends BaseFragment<StorePresenter, FragmentStoreGiftBinding> {
private GiftAdapter mGiftAdapter;
@Override
public int getLayoutId() {
return R.layout.fragment_store_gift;
}
@Override
public void initView() {
// init gift
mGiftAdapter = new GiftAdapter();
mViewBinding.rlGift.setAdapter(mGiftAdapter);
mViewBinding.rlGift.setLayoutManager(new LinearLayoutManager(mContext));
mGiftAdapter.setOnItemClickListener((adapter, view, position) -> {
mGiftAdapter.invert(position);
mGiftAdapter.notifyItemChanged(position);
((StoreActivity) getActivity()).loadGiftPayAmt(mGiftAdapter.getGiftPayAmt());
});
// init data
mPresenter.initGift();
}
/**
* 加载换购商品信息
*
* @param gifts 换购商品
*/
public void loadGifts(List<Gift> gifts) {
mGiftAdapter.setNewData(gifts);
}
/**
* 点击结算按钮
*/
public void clickSettleInGift() {
mPresenter.clickSettleInGift(mGiftAdapter.getSelectedData());
}
/**
* 全选
*/
public void selectAll() {
mGiftAdapter.selectAll();
((StoreActivity) getActivity()).loadGiftPayAmt(mGiftAdapter.getGiftPayAmt());
}
@Override
public boolean onBackPressedSupport() {
((StoreActivity) getActivity()).backToStoreFragment();
return super.onBackPressedSupport();
}
}
......@@ -20,6 +20,7 @@ import com.xingdata.zzdpos.base.BaseSku;
import com.xingdata.zzdpos.databinding.FragmentStoreSearchBinding;
import com.xingdata.zzdpos.model.Pager;
import com.xingdata.zzdpos.model.Saledetail;
import com.xingdata.zzdpos.ui.store.StoreActivity;
import com.xingdata.zzdpos.ui.store.StorePresenter;
import com.xingdata.zzdpos.ui.store.adapter.SkuAdapter;
......@@ -63,12 +64,6 @@ public class SearchFragment extends BaseFragment<StorePresenter, FragmentStoreSe
}
@Override
public void onDestroyView() {
mPresenter.exitSearchFragment();
super.onDestroyView();
}
/**
* 加载更多商品
*/
......@@ -218,4 +213,12 @@ public class SearchFragment extends BaseFragment<StorePresenter, FragmentStoreSe
}
});
}
@Override
public boolean onBackPressedSupport() {
((StoreActivity) getActivity()).backToStoreFragment();
mPresenter.exitSearchFragment();
return super.onBackPressedSupport();
}
}
......@@ -24,6 +24,7 @@ import com.xingdata.zzdpos.model.Ms;
import com.xingdata.zzdpos.model.Pager;
import com.xingdata.zzdpos.model.Saledetail;
import com.xingdata.zzdpos.model.Sskugrp;
import com.xingdata.zzdpos.ui.store.StoreActivity;
import com.xingdata.zzdpos.ui.store.StorePresenter;
import com.xingdata.zzdpos.ui.store.adapter.SkuAdapter;
import com.xingdata.zzdpos.ui.store.adapter.SkugrpAdapter;
......@@ -40,6 +41,11 @@ public class StoreFragment extends BaseFragment<StorePresenter, FragmentStoreBin
void onCountChange(View view, BaseSku sku, int value);
}
@Override
public boolean onBackPressedSupport() {
((StoreActivity) getActivity()).backToMainActivity();
return super.onBackPressedSupport();
}
@Override
public int getLayoutId() {
......@@ -197,7 +203,8 @@ public class StoreFragment extends BaseFragment<StorePresenter, FragmentStoreBin
strType = getString(R.string.ms_type_money_off_info, ConvertUtil.fenToYuan(ms.getPayAmt()), ConvertUtil.fenToYuan(ms.getGiftOffAmt()));
break;
case C.MS_TYPE.GIFT:
strType = getString(R.string.ms_type_gift_info, ConvertUtil.fenToYuan(ms.getPayAmt()), ConvertUtil.fenToYuan(ms.getGiftSkuPrice()), ms.getGiftSkuName());
String spuName = DBFactory.Store.querySpuNameBySkuId(ms.getGiftSkuId());
strType = getString(R.string.ms_type_gift_info, ConvertUtil.fenToYuan(ms.getPayAmt()), ConvertUtil.fenToYuan(ms.getGiftSkuPrice()), spuName);
break;
}
......
......@@ -104,7 +104,7 @@ public class VipPresenter extends VipContract.Presenter {
@Override
public void ticketQuery(Long vipID) {
ApiFactory.Ticket.query(vipID).subscribe(ticketList -> {
mView.ticketQuerySus(ticketList);
mView.ticketQuerySus(ticketList.getList());
}, throwable -> {
ToastUtils.showShort(throwable.getMessage());
});
......
......@@ -57,8 +57,8 @@ public final class SystemUtil {
e.printStackTrace();
}
}
return "test2018";
// return deviceSN;
return "test01";
}
/**
......
......@@ -16,7 +16,7 @@
android:layout_height="wrap_content"
android:layout_margin="@dimen/all_margin"
android:gravity="center"
android:text="服务器接口异常"
android:text="系统提示"
android:textSize="@dimen/et_textsize"
android:textStyle="bold"/>
......
......@@ -18,6 +18,10 @@
name="orderPayAmt"
type="long" />
<variable
name="giftPayAmt"
type="long" />
<variable
name="msDisAmt"
type="long" />
......@@ -59,7 +63,7 @@
android:id="@+id/v_search"
android:layout_width="0dp"
android:layout_height="0dp"
android:visibility="@{titleMode>1?View.VISIBLE:View.INVISIBLE}"
android:visibility="@{titleMode==3?View.VISIBLE:View.INVISIBLE}"
app:hint="@string/store_search_hint"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/btn_back"
......@@ -74,7 +78,7 @@
android:text="@string/store_title"
android:textColor="@color/black_baozheng"
android:textSize="@dimen/all_sub_title_size"
android:visibility="@{titleMode>1?View.GONE:View.VISIBLE}"
android:visibility="@{titleMode==3?View.GONE:View.VISIBLE}"
app:layout_constraintLeft_toRightOf="parent"
app:layout_constraintRight_toLeftOf="parent" />
......@@ -181,9 +185,11 @@
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/all_spacing"
android:animateLayoutChanges="true"
android:visibility="@{titleMode==4?View.GONE:View.VISIBLE}"
app:layout_constraintBottom_toTopOf="@id/fl_cart"
app:layout_constraintLeft_toRightOf="@id/fl_logo"
app:layout_constraintTop_toBottomOf="@id/fl_cart">
app:layout_constraintTop_toBottomOf="@id/fl_cart"
app:layout_goneMarginStart="@dimen/all_margin">
<TextView
android:layout_width="wrap_content"
......@@ -208,7 +214,6 @@
android:textColor="@color/red_guanyu"
android:textSize="@dimen/all_sub_title_size"
android:textStyle="bold" />
</LinearLayout>
<TextView
......@@ -233,10 +238,10 @@
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/all_margin"
android:animateLayoutChanges="true"
android:visibility="@{titleMode==4?View.GONE:View.VISIBLE}"
app:layout_constraintBottom_toBottomOf="@id/tv_settle"
app:layout_constraintLeft_toLeftOf="@id/fl_cart">
<ImageView
android:id="@+id/iv_cart"
android:layout_width="wrap_content"
......@@ -259,6 +264,70 @@
android:visibility="@{cartCount>0?View.VISIBLE:View.GONE}" />
</FrameLayout>
<TextView
android:id="@+id/tv_select_all"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:background="?attr/selectableItemBackground"
android:drawablePadding="@dimen/all_spacing"
android:drawableStart="@mipmap/radio_select_bg"
android:gravity="center_vertical"
android:paddingEnd="@dimen/all_spacing"
android:paddingStart="@dimen/all_spacing"
android:text="@string/gift_select_all"
android:textColor="@color/black_baozheng"
android:textSize="@dimen/all_text_size"
android:visibility="@{titleMode==4?View.VISIBLE:View.GONE}"
app:layout_constraintBottom_toBottomOf="@id/fl_cart"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="@id/fl_cart" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:animateLayoutChanges="true"
android:visibility="@{titleMode==4?View.VISIBLE:View.GONE}"
app:layout_constraintBottom_toTopOf="@id/fl_cart"
app:layout_constraintLeft_toRightOf="@id/tv_select_all"
app:layout_constraintTop_toBottomOf="@id/fl_cart">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/money_rmb"
android:textColor="@color/red_guanyu"
android:textSize="@dimen/all_text_size" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{ConvertUtil.fenToYuan(orderPayAmt)}"
android:textColor="@color/red_guanyu"
android:textSize="@dimen/all_sub_title_size"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/all_spacing"
android:layout_marginStart="@dimen/all_spacing"
android:text="@string/inputer_add"
android:textColor="@color/red_guanyu"
android:textSize="@dimen/all_text_size"
android:visibility="@{giftPayAmt>0?View.VISIBLE:View.GONE}" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{ConvertUtil.fenToYuan(giftPayAmt)}"
android:textColor="@color/red_guanyu"
android:textSize="@dimen/all_sub_title_size"
android:textStyle="bold"
android:visibility="@{giftPayAmt>0?View.VISIBLE:View.GONE}" />
</LinearLayout>
</android.support.constraint.ConstraintLayout>
</layout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="android.view.View" />
<variable
name="isShow"
type="Boolean" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white_caocao"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical"
android:paddingTop="@dimen/all_margin">
<TextView
android:id="@+id/tv_line_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center" />
<TextView
android:id="@+id/tv_line_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center" />
<View
android:id="@+id/view1"
android:layout_width="match_parent"
android:layout_height="@dimen/view_line_L1"
android:layout_marginTop="@dimen/all_margin"
android:background="@color/lyt_main_bg"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_line_2" />
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/all_margin"
android:visibility="@{isShow?View.VISIBLE:View.GONE}">
<ImageView
android:id="@+id/img_model_one"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/icon_manager_ticket" />
<TextView
android:id="@+id/tv_model_one"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/all_padding"
android:text="@string/paid_up_vip_model1"
android:textColor="@color/black_baozheng"
android:textSize="@dimen/all_text_size"
app:layout_constraintStart_toEndOf="@id/img_model_one"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/all_padding"
android:layout_marginTop="@dimen/all_padding"
android:text="@string/paid_up_vip_model1_detail"
android:textColor="@color/gary"
android:textSize="@dimen/all_text_size_low"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/img_model_one"
app:layout_constraintTop_toBottomOf="@id/tv_model_one" />
</android.support.constraint.ConstraintLayout>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/all_margin"
android:visibility="@{isShow?View.VISIBLE:View.GONE}">
<ImageView
android:id="@+id/img_model_two"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/top_up_preferential" />
<TextView
android:id="@+id/tv_model_two"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/all_padding"
android:text="@string/paid_up_vip_model2"
android:textColor="@color/black_baozheng"
android:textSize="@dimen/all_text_size"
app:layout_constraintStart_toEndOf="@id/img_model_two"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/paid_up_vip_model2_detail"
android:textColor="@color/gary"
android:textSize="@dimen/all_text_size_low"
android:layout_marginStart="@dimen/all_padding"
android:layout_marginTop="@dimen/all_padding"
app:layout_constraintTop_toBottomOf="@id/tv_model_two"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/img_model_two"
/>
</android.support.constraint.ConstraintLayout>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/all_margin"
android:visibility="@{isShow?View.VISIBLE:View.GONE}">
<ImageView
android:id="@+id/img_model_three"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/marketing_plan" />
<TextView
android:id="@+id/tv_model_three"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/all_padding"
android:text="@string/paid_up_vip_model3"
android:textColor="@color/black_baozheng"
android:textSize="@dimen/all_text_size"
app:layout_constraintStart_toEndOf="@id/img_model_three"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/all_padding"
android:layout_marginTop="@dimen/all_padding"
app:layout_constraintEnd_toEndOf="parent"
android:text="@string/paid_up_vip_model1_detail"
android:textColor="@color/gary"
android:textSize="@dimen/all_text_size_low"
app:layout_constraintStart_toEndOf="@id/img_model_three"
app:layout_constraintTop_toBottomOf="@id/tv_model_three" />
</android.support.constraint.ConstraintLayout>
</LinearLayout>
</layout>
\ No newline at end of file
......@@ -43,9 +43,7 @@
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@mipmap/bg_service"
/>
android:background="@mipmap/bg_service" />
</ScrollView>
......
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<import type="android.view.View" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/gray_zhouyu"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/rl_gift"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
\ No newline at end of file
......@@ -5,10 +5,10 @@
<variable
name="onClickListener"
type="com.xingdata.zzdpos.util.OnClickListener"></variable>
type="com.xingdata.zzdpos.util.OnClickListener" />
</data>
<LinearLayout
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
......@@ -20,12 +20,21 @@
android:inflatedId="@+id/iv_VsContent"
android:layout="@layout/title"
android:onClick="@{onClickListener}"
android:visibility="gone"/>
android:visibility="gone" />
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
android:layout_height="match_parent" />
<ImageView
android:id="@+id/iv_change"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="切换前后"
android:padding="@dimen/all_margin"
android:src="@mipmap/icon_camera" />
</FrameLayout>
</layout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="android.view.View" />
</data>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white_caocao"
android:paddingEnd="@null"
android:paddingStart="@dimen/all_margin">
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/iv_pic"
android:layout_width="80dp"
android:layout_height="80dp"
app:failureImage="@mipmap/icon_goods_default"
app:layout_constraintBottom_toBottomOf="@+id/ll_price"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/tv_name"
app:placeholderImage="@mipmap/icon_goods_default"
app:roundedCornerRadius="@dimen/all_shape_radius" />
<ImageView
android:id="@+id/iv_checked"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/all_margin"
android:src="@mipmap/radio_select_bg"
app:layout_constraintBottom_toTopOf="parent"
app:layout_constraintLeft_toRightOf="@id/tv_name"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="parent" />
<TextView
android:id="@+id/tv_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/all_margin"
android:layout_marginTop="@dimen/all_margin"
android:lines="2"
android:text="维达纸巾"
android:textColor="@color/black_baozheng"
android:textSize="@dimen/all_text_size"
android:textStyle="bold"
app:layout_constraintLeft_toRightOf="@id/iv_pic"
app:layout_constraintRight_toLeftOf="@id/iv_checked"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_date_end"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="截止时间 : 2017-01-02"
android:textColor="@color/red_guanyu"
android:textSize="@dimen/all_caption_size"
app:layout_constraintLeft_toLeftOf="@id/tv_name"
app:layout_constraintTop_toBottomOf="@id/tv_name" />
<TextView
android:id="@+id/tv_original_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/all_spacing"
android:text="原价 : ¥10.0"
android:textSize="@dimen/all_caption_size"
app:layout_constraintLeft_toLeftOf="@id/tv_name"
app:layout_constraintTop_toBottomOf="@id/tv_date_end" />
<LinearLayout
android:id="@+id/ll_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="@id/tv_name"
app:layout_constraintTop_toBottomOf="@id/tv_original_price">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="加"
android:textSize="@dimen/all_caption_size" />
<TextView
android:id="@+id/tv_amt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/all_spacing"
android:layout_marginStart="@dimen/all_spacing"
android:text="4元"
android:textColor="@color/red_guanyu"
android:textSize="@dimen/all_text_size"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="换购"
android:textSize="@dimen/all_caption_size" />
</LinearLayout>
<View
android:id="@+id/view2"
android:layout_width="0dp"
android:layout_height="@dimen/all_line_width"
android:layout_marginTop="@dimen/all_margin"
android:background="@color/gray_kongming"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/ll_price" />
</android.support.constraint.ConstraintLayout>
</layout>
......@@ -193,6 +193,7 @@
<string name="store_empty_hint">没有搜到此商品\n请重新搜索,或前往商品维护进行添加~</string>
<string name="store_scan_empty_hint">没有找到此商品</string>
<!--商店界面的商品详情-->
<string name="store_product_title">商品详情</string>
......@@ -562,7 +563,7 @@
<string name="settle_pay_result">支付结果</string>
<string name="settle_pay_result_title">支付完成</string>
<string name="settle_pay_succ">支付成功</string>
<string name="settle_pay_fail">支付失败</string>
<string name="settle_pay_fail">支付超时</string>
<string name="settle_pay_time">交易时间</string>
<string name="settle_pay_type">收款方式</string>
<string name="settle_pay_count">商品总数</string>
......@@ -600,6 +601,7 @@
<string name="store_clear_all">全部清空</string>
<string name="store_ms_dis">已减</string>
<string name="store_scan">扫描</string>
<string name="store_scanner">扫描商品</string>
<string name="store_search_hint">请输入商品名称/助记码/条码</string>
<string name="store_reduce">减少</string>
<string name="store_increase">添加</string>
......@@ -741,5 +743,18 @@
<string name="search_action">搜索</string>
<string name="search_clear">清空</string>
<!--续费会员-->
<string name="paid_up_vip_model1">优惠券设置</string>
<string name="paid_up_vip_model1_detail">设置优惠券面值,通过优惠券方式吸引回头客</string>
<string name="paid_up_vip_model2">充值优惠</string>
<string name="paid_up_vip_model2_detail">设置充值优惠金额,多充多送,让更多会员加入我们</string>
<string name="paid_up_vip_model3">营销计划</string>
<string name="paid_up_vip_model4_detail">提前设置打折、促销、满减、换购等优惠活动,不错过每一个节日</string>
<string name="paid_up_pay_hint">请选择支付方式</string>
<!--换购页面-->
<string name="gift_title">换购</string>
<string name="gift_select_all">全选</string>
</resources>
apply plugin: 'com.android.library'
android {
compileSdkVersion 27
defaultConfig {
minSdkVersion 21
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
implementation 'com.alibaba:fastjson:1.1.67.android'
implementation 'com.blankj:utilcode:1.11.1'
implementation 'io.reactivex.rxjava2:rxjava:2.1.5'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
implementation 'com.squareup.okhttp3:okhttp:3.9.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0'
}
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
package com.xingdata.zxpay;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() throws Exception {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getTargetContext();
assertEquals("com.xingdata.zxpay.test", appContext.getPackageName());
}
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xingdata.zxpay" />
package com.xingdata.zxpay;
public class C {
/**
* 交易状态
*/
public final static class PAY_STATE {
/**
* 支付中 (默认状态)
*/
public final static int ING = 0;
/**
* 支付成功
*/
public final static int SUCCESS = 1;
/**
* 支付失败
*/
public final static int FAIL = 2;
/**
* 自定义的错误信息的标识
*/
public final static int FAIL_CUSTOM = -999;
}
/**
* 操作类型
*/
public final static class ACTION_TYPE {
/**
* 条码支付
*/
public final static int PAY_BARCODE = 101;
/**
* 二维码支付
*/
public final static int PAY_QR = 102;
/**
* 公众号支付
*/
public final static int PAY_WOA = 103;
/**
* 退货
*/
public final static int REFUND = 200;
/**
* 撤销
*/
public final static int VOID = 300;
/**
* 查询
*/
public final static int QUERY = 400;
}
public final class PAY_CHANNEL {
public static final int CASH = 1;
public static final int WECHAT = 2;
public static final int ALI = 3;
public static final int BANK = 4;
public static final int CARD = 5;
public static final int TALLY = 9;
}
/**
* 渠道
*/
static final class HOST {
/**
* 惠尔丰平台的渠道编号
*/
final static int PAX = 100000;
}
/**
* 交互HEAD信息
*/
public final class HEAD {
public static final String CONTENT_TYPE = "application/json";
}
}
package com.xingdata.zxpay;
import com.alibaba.fastjson.JSON;
import com.xingdata.zxpay.api.Response;
import com.xingdata.zxpay.model.Shopppp;
import com.xingdata.zxpay.pax.Factory;
import io.reactivex.Observable;
public class PayCenter {
private static class PayCenterHolder {
private static final PayCenter INSTANCE = new PayCenter();
}
public static PayCenter getInstance() {
return PayCenter.PayCenterHolder.INSTANCE;
}
/**
* 交易基本信息
*/
public Shopppp mShopppp;
public PayCenter init(String json) {
mShopppp = JSON.parseObject(json, Shopppp.class);
return this;
}
/**
* 条码支付
*
* @param payChannel 支付渠道
* @param payCode 支付码
* @param orderAmt 金额
* @return 支付结果的Observable
*/
public Observable<Response> pay(int payChannel, String payCode, Long orderAmt) {
switch (mShopppp.getHost().getHostMapId()) {
case C.HOST.PAX:
return Factory.microPay(payChannel, payCode, Util.fenToYuan(orderAmt));
default:
return Observable.just(new Response(C.PAY_STATE.FAIL_CUSTOM, "未知渠道"));
}
}
/**
* QR支付
*
* @param payChannel 支付渠道
* @param orderAmt 金额
* @return 支付结果的Observable
*/
public Observable<Response> pay(int payChannel, Long orderAmt) {
switch (mShopppp.getHost().getHostMapId()) {
case C.HOST.PAX:
return Factory.qrPay(payChannel, Util.fenToYuan(orderAmt));
default:
return Observable.just(new Response(C.PAY_STATE.FAIL_CUSTOM, "未知渠道"));
}
}
/**
* 查询
*
* @return 查询结果的Observable
*/
public Observable<Response> query(int payChannel) {
switch (mShopppp.getHost().getHostMapId()) {
case C.HOST.PAX:
return Factory.query(payChannel);
default:
return Observable.just(new Response(C.PAY_STATE.FAIL_CUSTOM, "未知渠道"));
}
}
}
package com.xingdata.zxpay;
import com.blankj.utilcode.util.StringUtils;
import java.math.BigDecimal;
class Util {
/**
* 分转元
*
* @param fen 分
* @return 元
*/
public static String fenToYuan(Long fen) {
if (fen == null || fen == 0) return "0.00";
BigDecimal decimal = new BigDecimal(fen);
return decimal.divide(new BigDecimal(100), 2, BigDecimal.ROUND_DOWN).toString();
}
// /**
// * 分转元
// *
// * @param fen 分
// * @return 元
// */
// public static String fenToYuan(Long fen) {
// if (fen == null || fen == 0) return "0.00";
// java.text.DecimalFormat df = new java.text.DecimalFormat("#.00");
// return String.valueOf(df.format((double) fen / 100));
// }
/**
* 分转元
*
* @param fen 分
* @return 元
*/
public static String fenToYuanNoPoint(Long fen) {
if (fen == null) return "0";
return String.valueOf(fen / 100);
}
/**
* 折扣率转换
*
* @param dis 分
* @return 元
*/
public static String discount(int dis) {
String strFen = String.valueOf((double) dis / 10);
return noZero(strFen);
}
/**
* 分转元
*
* @param fen 分
* @param isMonetary 是否有货币单位
* @return 元
*/
public static String fenToYuan(Long fen, boolean isMonetary) {
return (isMonetary ? "¥" : "") + fenToYuan(fen);
}
/**
* 元转分
*
* @param yuan 元
* @return 分
*/
public static Long yuanToFen(String yuan) {
yuan = StringUtils.isEmpty(yuan) ? "0" : yuan;
BigDecimal b = new BigDecimal(Double.valueOf(yuan) * 100);
return b.setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
}
/**
* 字符串转数字
*
* @param str 字符串
* @return 数字
*/
public static Long stringToLong(String str) {
str = StringUtils.isEmpty(str) ? "0" : str;
return Long.valueOf(str);
}
/**
* 数字转字符串
*
* @param l 数字
* @return 字符串
*/
public static String longToString(Long l) {
if (l == null) return "0";
return String.valueOf(l);
}
/**
* 分转元去掉.0 ROUND_DOWN
*
* @param fen 分
* @return 元
*/
public static String fenToYuanNoZero(Long fen) {
String ss = fenToYuan2(fen);
return noZero(ss);
}
private static String noZero(String ss) {
if (ss.endsWith(".00")) {
ss = ss.replace(".00", "");
} else if (ss.endsWith(".0")) {
ss = ss.replace(".0", "");
} else if (ss.endsWith("0")) {
ss = ss.substring(0, ss.length() - 1);
}
return ss;
}
/**
* 分转元保留2位小數
*
* @param fen 分
* @return 元
*/
public static String fenToYuan2(Long fen) {
if (fen == null) {
return "0.00";
}
BigDecimal decimal = new BigDecimal(fen);
return decimal.divide(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_DOWN).toString();
}
/**
* 折扣率转换最大100
*
* @param dis 分
* @return 元
*/
public static String discount(Long dis) {
if (dis > 100) {
return "10";
}
BigDecimal decimal = new BigDecimal(dis);
return decimal.divide(new BigDecimal(10)).setScale(0, BigDecimal.ROUND_DOWN).toString();
}
}
package com.xingdata.zzdpos.api;
package com.xingdata.zxpay.api;
import android.support.annotation.NonNull;
import com.xingdata.zxpay.C;
import com.xingdata.zzdpos.C;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.TimeUnit;
import okhttp3.Cookie;
import okhttp3.CookieJar;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
public class Jni {
JniService service;
private static class JniHolder {
private static final Jni INSTANCE = new Jni();
}
static Jni getInstance() {
return Jni.JniHolder.INSTANCE;
}
public abstract class Api {
protected Retrofit retrofit;
private Jni() {
protected Api() {
//LOG
HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor();
logInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
......@@ -37,47 +21,25 @@ public class Jni {
//HEAD
Interceptor headInterceptor = (chain) -> chain.proceed(
chain.request().newBuilder()
.addHeader("User-Agent", C.HEAD.USER_AGENT)
.addHeader("Connection", C.HEAD.CONNECTION)
.addHeader("Content-Type", C.HEAD.CONTENT_TYPE)
.addHeader("Content-Language", C.HEAD.CONTENT_LANGUAGE)
.addHeader("Cache-Control", C.HEAD.CACHE_CONTROL)
.build());
//COOKIE
CookieJar cookieJar = new CookieJar() {
private HashMap<String, Cookie> cookieMap = new HashMap<>();
@Override
public void saveFromResponse(@NonNull HttpUrl url, @NonNull List<Cookie> cookies) {
for (int i = 0; i < cookies.size(); i++) {
cookieMap.put(cookies.get(i).name(), cookies.get(i));
}
}
@Override
public List<Cookie> loadForRequest(@NonNull HttpUrl url) {
return new ArrayList<>(cookieMap.values());
}
};
//Client
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.readTimeout(C.API_BUILDER.READ_TIMEOUT * 20, TimeUnit.MILLISECONDS)
.connectTimeout(C.API_BUILDER.CONNECT_TIMEOUT * 20, TimeUnit.MILLISECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.connectTimeout(30, TimeUnit.SECONDS)
.addInterceptor(headInterceptor)
.addInterceptor(logInterceptor)
.cookieJar(cookieJar)
.build();
Retrofit retrofit = new Retrofit.Builder()
retrofit = new Retrofit.Builder()
.client(okHttpClient)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(ConverterFactory.create())
.baseUrl(C.URL.TEMP_PAY_URL)
.baseUrl(getBaseUrl())
.build();
service = retrofit.create(JniService.class);
}
protected abstract String getBaseUrl();
}
package com.xingdata.zxpay.api;
import android.support.annotation.NonNull;
import com.alibaba.fastjson.JSON;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import okio.BufferedSource;
import okio.Okio;
import retrofit2.Converter;
import retrofit2.Retrofit;
class ConverterFactory extends Converter.Factory {
public static ConverterFactory create() {
return new ConverterFactory();
}
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,
Retrofit retrofit) {
return new FastJsonResponseBodyConverter<>(type);
}
@Override
public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[]
parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
return new FastJsonRequestBodyConverter<>();
}
class FastJsonRequestBodyConverter<T> implements Converter<T, RequestBody> {
private final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8");
@Override
public RequestBody convert(@NonNull T value) throws IOException {
return RequestBody.create(MEDIA_TYPE, JSON.toJSONBytes(value));
}
}
class FastJsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
private final Type type;
FastJsonResponseBodyConverter(Type type) {
this.type = type;
}
@Override
public T convert(@NonNull ResponseBody value) throws IOException {
BufferedSource bufferedSource = Okio.buffer(value.source());
String tempStr = bufferedSource.readUtf8();
bufferedSource.close();
return JSON.parseObject(tempStr, type);
}
}
}
\ No newline at end of file
package com.xingdata.zxpay.api;
public class Factory {
}
package com.xingdata.zxpay.api;
/**
* 和App主体交互的回应包
*/
public class Response {
public Response() {
}
public Response(int code, String msg) {
this.code = code;
this.msg = msg;
}
private int code;
private String msg;
private String body;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
}
package com.xingdata.zxpay.api;
import com.blankj.utilcode.util.LogUtils;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.functions.Function;
public class RetryHelper implements Function<Observable<Throwable>, ObservableSource<?>> {
private int retryCount;
private int retryTime;
private int nowCount = 0;
public RetryHelper(int retryCount, int retryTime) {
this.retryCount = retryCount;
this.retryTime = retryTime;
}
@Override
public ObservableSource<?> apply(Observable<Throwable> throwableObservable) throws Exception {
return throwableObservable.flatMap((Function<Throwable, ObservableSource<?>>) throwable -> {
if (throwable instanceof IOException) {
if (++nowCount <= retryCount) {
LogUtils.e("重试时间:" + retryTime + "重试:" + nowCount);
return Observable.timer(retryTime, TimeUnit.MILLISECONDS);
}
return Observable.error(new IOException("支付超时"));
} else {
return Observable.error(throwable);
}
});
}
}
package com.xingdata.zxpay.base;
public interface BaseRequest {
}
package com.xingdata.zxpay.base;
public interface BaseResponse {
}
package com.xingdata.zxpay.model;
import android.support.annotation.Nullable;
import java.util.Date;
public class Host {
private Integer hostMapId;
@Nullable
private String hostName;
@Nullable
private String hostAddr;
@Nullable
private String hostPort;
@Nullable
private Byte hostStatus;
@Nullable
private String hostCompany;
@Nullable
private String hostLawyer;
@Nullable
private String hostLawyerContact;
@Nullable
private String hostContractNumber;
@Nullable
private Long hostCostsRate;
@Nullable
private Long hostClearDate;
@Nullable
private Long hostTotalAmt;
@Nullable
private String hostKeyWechat;
@Nullable
private String hostKeyAlipay;
@Nullable
private String hostKeyUnipay;
@Nullable
private String hostNotiUrl;
@Nullable
private String hostAcqCode;
private Date updateTime;
private Date createTime;
public Integer getHostMapId() {
return hostMapId;
}
public void setHostMapId(Integer hostMapId) {
this.hostMapId = hostMapId;
}
@Nullable
public String getHostName() {
return hostName;
}
public void setHostName(@Nullable String hostName) {
this.hostName = hostName;
}
@Nullable
public String getHostAddr() {
return hostAddr;
}
public void setHostAddr(@Nullable String hostAddr) {
this.hostAddr = hostAddr;
}
@Nullable
public String getHostPort() {
return hostPort;
}
public void setHostPort(@Nullable String hostPort) {
this.hostPort = hostPort;
}
@Nullable
public Byte getHostStatus() {
return hostStatus;
}
public void setHostStatus(@Nullable Byte hostStatus) {
this.hostStatus = hostStatus;
}
@Nullable
public String getHostCompany() {
return hostCompany;
}
public void setHostCompany(@Nullable String hostCompany) {
this.hostCompany = hostCompany;
}
@Nullable
public String getHostLawyer() {
return hostLawyer;
}
public void setHostLawyer(@Nullable String hostLawyer) {
this.hostLawyer = hostLawyer;
}
@Nullable
public String getHostLawyerContact() {
return hostLawyerContact;
}
public void setHostLawyerContact(@Nullable String hostLawyerContact) {
this.hostLawyerContact = hostLawyerContact;
}
@Nullable
public String getHostContractNumber() {
return hostContractNumber;
}
public void setHostContractNumber(@Nullable String hostContractNumber) {
this.hostContractNumber = hostContractNumber;
}
@Nullable
public Long getHostCostsRate() {
return hostCostsRate;
}
public void setHostCostsRate(@Nullable Long hostCostsRate) {
this.hostCostsRate = hostCostsRate;
}
@Nullable
public Long getHostClearDate() {
return hostClearDate;
}
public void setHostClearDate(@Nullable Long hostClearDate) {
this.hostClearDate = hostClearDate;
}
@Nullable
public Long getHostTotalAmt() {
return hostTotalAmt;
}
public void setHostTotalAmt(@Nullable Long hostTotalAmt) {
this.hostTotalAmt = hostTotalAmt;
}
@Nullable
public String getHostKeyWechat() {
return hostKeyWechat;
}
public void setHostKeyWechat(@Nullable String hostKeyWechat) {
this.hostKeyWechat = hostKeyWechat;
}
@Nullable
public String getHostKeyAlipay() {
return hostKeyAlipay;
}
public void setHostKeyAlipay(@Nullable String hostKeyAlipay) {
this.hostKeyAlipay = hostKeyAlipay;
}
@Nullable
public String getHostKeyUnipay() {
return hostKeyUnipay;
}
public void setHostKeyUnipay(@Nullable String hostKeyUnipay) {
this.hostKeyUnipay = hostKeyUnipay;
}
@Nullable
public String getHostNotiUrl() {
return hostNotiUrl;
}
public void setHostNotiUrl(@Nullable String hostNotiUrl) {
this.hostNotiUrl = hostNotiUrl;
}
@Nullable
public String getHostAcqCode() {
return hostAcqCode;
}
public void setHostAcqCode(@Nullable String hostAcqCode) {
this.hostAcqCode = hostAcqCode;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
\ No newline at end of file
package com.xingdata.zxpay.model;
import android.support.annotation.Nullable;
import java.util.Date;
public class Posppp {
private Integer id;
private Integer hostMapId;
@Nullable
private Long opMapId;
@Nullable
private Long channelMapId;
private Long merMapId;
@Nullable
private String hshopName;
@Nullable
private String hshopNameabcn;
private Long casherId;
private String hshopNo;
@Nullable
private String hposNo;
private Byte pppFlag;
@Nullable
private Integer hposBatch;
@Nullable
private Integer hposTrace;
@Nullable
private String hposKey;
private Date updateTime;
private Date createTime;
@Nullable
private String hostName;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getHostMapId() {
return hostMapId;
}
public void setHostMapId(Integer hostMapId) {
this.hostMapId = hostMapId;
}
@Nullable
public Long getOpMapId() {
return opMapId;
}
public void setOpMapId(@Nullable Long opMapId) {
this.opMapId = opMapId;
}
@Nullable
public Long getChannelMapId() {
return channelMapId;
}
public void setChannelMapId(@Nullable Long channelMapId) {
this.channelMapId = channelMapId;
}
public Long getMerMapId() {
return merMapId;
}
public void setMerMapId(Long merMapId) {
this.merMapId = merMapId;
}
@Nullable
public String getHshopName() {
return hshopName;
}
public void setHshopName(@Nullable String hshopName) {
this.hshopName = hshopName;
}
@Nullable
public String getHshopNameabcn() {
return hshopNameabcn;
}
public void setHshopNameabcn(@Nullable String hshopNameabcn) {
this.hshopNameabcn = hshopNameabcn;
}
public Long getCasherId() {
return casherId;
}
public void setCasherId(Long casherId) {
this.casherId = casherId;
}
public String getHshopNo() {
return hshopNo;
}
public void setHshopNo(String hshopNo) {
this.hshopNo = hshopNo;
}
@Nullable
public String getHposNo() {
return hposNo;
}
public void setHposNo(@Nullable String hposNo) {
this.hposNo = hposNo;
}
public Byte getPppFlag() {
return pppFlag;
}
public void setPppFlag(Byte pppFlag) {
this.pppFlag = pppFlag;
}
@Nullable
public Integer getHposBatch() {
return hposBatch;
}
public void setHposBatch(@Nullable Integer hposBatch) {
this.hposBatch = hposBatch;
}
@Nullable
public Integer getHposTrace() {
return hposTrace;
}
public void setHposTrace(@Nullable Integer hposTrace) {
this.hposTrace = hposTrace;
}
@Nullable
public String getHposKey() {
return hposKey;
}
public void setHposKey(@Nullable String hposKey) {
this.hposKey = hposKey;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Nullable
public String getHostName() {
return hostName;
}
public void setHostName(@Nullable String hostName) {
this.hostName = hostName;
}
}
\ No newline at end of file
package com.xingdata.zxpay.model;
import android.support.annotation.Nullable;
import java.util.Date;
public class Shopppp {
private Integer id;
private Integer hostMapId;
@Nullable
private Long opMapId;
@Nullable
private Long channelMapId;
private Long merMapId;
@Nullable
private String hshopName;
@Nullable
private String hshopNameabcn;
@Nullable
private String hshopNo;
private Byte pppFlag;
@Nullable
private String shopAppidDisp;
@Nullable
private String shopAppidScan;
@Nullable
private String hshopKeyWechat;
@Nullable
private String hshopKeyAlipay;
@Nullable
private String hshopKeyUnipay;
private Date updateTime;
private Date createTime;
@Nullable
private String hostName;
@Nullable
private Posppp posppp;
@Nullable
private Host host;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getHostMapId() {
return hostMapId;
}
public void setHostMapId(Integer hostMapId) {
this.hostMapId = hostMapId;
}
@Nullable
public Long getOpMapId() {
return opMapId;
}
public void setOpMapId(@Nullable Long opMapId) {
this.opMapId = opMapId;
}
@Nullable
public Long getChannelMapId() {
return channelMapId;
}
public void setChannelMapId(@Nullable Long channelMapId) {
this.channelMapId = channelMapId;
}
public Long getMerMapId() {
return merMapId;
}
public void setMerMapId(Long merMapId) {
this.merMapId = merMapId;
}
@Nullable
public String getHshopName() {
return hshopName;
}
public void setHshopName(@Nullable String hshopName) {
this.hshopName = hshopName;
}
@Nullable
public String getHshopNameabcn() {
return hshopNameabcn;
}
public void setHshopNameabcn(@Nullable String hshopNameabcn) {
this.hshopNameabcn = hshopNameabcn;
}
@Nullable
public String getHshopNo() {
return hshopNo;
}
public void setHshopNo(@Nullable String hshopNo) {
this.hshopNo = hshopNo;
}
public Byte getPppFlag() {
return pppFlag;
}
public void setPppFlag(Byte pppFlag) {
this.pppFlag = pppFlag;
}
@Nullable
public String getShopAppidDisp() {
return shopAppidDisp;
}
public void setShopAppidDisp(@Nullable String shopAppidDisp) {
this.shopAppidDisp = shopAppidDisp;
}
@Nullable
public String getShopAppidScan() {
return shopAppidScan;
}
public void setShopAppidScan(@Nullable String shopAppidScan) {
this.shopAppidScan = shopAppidScan;
}
@Nullable
public String getHshopKeyWechat() {
return hshopKeyWechat;
}
public void setHshopKeyWechat(@Nullable String hshopKeyWechat) {
this.hshopKeyWechat = hshopKeyWechat;
}
@Nullable
public String getHshopKeyAlipay() {
return hshopKeyAlipay;
}
public void setHshopKeyAlipay(@Nullable String hshopKeyAlipay) {
this.hshopKeyAlipay = hshopKeyAlipay;
}
@Nullable
public String getHshopKeyUnipay() {
return hshopKeyUnipay;
}
public void setHshopKeyUnipay(@Nullable String hshopKeyUnipay) {
this.hshopKeyUnipay = hshopKeyUnipay;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Nullable
public String getHostName() {
return hostName;
}
public void setHostName(@Nullable String hostName) {
this.hostName = hostName;
}
@Nullable
public Posppp getPosppp() {
return posppp;
}
public void setPosppp(@Nullable Posppp posppp) {
this.posppp = posppp;
}
@Nullable
public Host getHost() {
return host;
}
public void setHost(@Nullable Host host) {
this.host = host;
}
}
\ No newline at end of file
package com.xingdata.zxpay.pax;
import com.xingdata.zxpay.PayCenter;
class Api extends com.xingdata.zxpay.api.Api {
Service service;
private static class ApiHolder {
private static final Api INSTANCE = new Api();
}
static Api getInstance() {
return ApiHolder.INSTANCE;
}
Api() {
super();
service = retrofit.create(Service.class);
}
@Override
protected String getBaseUrl() {
return PayCenter.getInstance().mShopppp.getHost().getHostAddr();
}
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
package com.xingdata.zxpay.pax;
import io.reactivex.functions.Function;
class ResultFilter implements Function<Response, com.xingdata.zxpay.api.Response> {
@Override
public com.xingdata.zxpay.api.Response apply(Response response) throws Exception {
com.xingdata.zxpay.api.Response r = new com.xingdata.zxpay.api.Response();
r.setMsg(response.getMsg());
switch (response.getCode()) {
case C.CODE.SUCCESS:
r.setCode(com.xingdata.zxpay.C.PAY_STATE.SUCCESS);
break;
case C.CODE.USINGPAY:
case C.CODE.UNKONW:
r.setCode(com.xingdata.zxpay.C.PAY_STATE.ING);
break;
default:
r.setCode(com.xingdata.zxpay.C.PAY_STATE.FAIL);
break;
}
switch (response.getMethod()) {
case C.METHOD.QRPAY:
r.setBody(response.getCodeUrl());
break;
}
return r;
}
}
\ No newline at end of file
package com.xingdata.zxpay.pax;
import io.reactivex.Observable;
import retrofit2.http.Body;
import retrofit2.http.POST;
interface Service {
@POST(C.URL.ACTION)
Observable<Response> action(@Body com.xingdata.zxpay.pax.Request request);
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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