Commit 6af78c69 by 罗翻

增加签名

parent 38b35a63
Showing with 1372 additions and 61 deletions
[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":11},"path":"app-release.apk","properties":{"packageId":"com.dayu.bigfish.demo","split":"","minSdkVersion":"16"}}]
\ No newline at end of file
[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":11},"path":"app-release.apk","properties":{"packageId":"com.dayu.bigfish","split":"","minSdkVersion":"16"}}]
\ No newline at end of file
......@@ -148,7 +148,11 @@ public class Api {
return Observable.create(e -> {
if (response.isSuccess()) {
if (!e.isDisposed()) {
e.onNext(response.getData());
if (response.getData() != null) {
e.onNext(response.getData());
} else {
e.onError(new ServerException(Constants.ERROR_NULL, ""));
}
}
} else {
if (!e.isDisposed()) {
......
......@@ -150,6 +150,9 @@ public class ServerException extends Exception {
case "GLOBAL1005":
message = BaseApplication.getContext().getString(R.string.global1005); //数据越界异
break;
case Constants.ERROR_NULL:
message = Constants.NOT_SHOW;
break;
default:
message = BaseApplication.getContext().getString(R.string.get_info_failed);
break;
......
......@@ -148,6 +148,8 @@ public class Constants {
public static final String LATITUDE = "latitude";
public static final String URL = "url";
public static final String ERROR_NULL = "-1";
/**
* 主动申请备件.
......
......@@ -44,6 +44,19 @@ public class GlideImageLoader {
.apply(options)
.into(view);
}
public static void loadNoCache(Context context, String imageRes, ImageView view) {
RequestOptions options = new RequestOptions()
.centerCrop()
.placeholder(R.drawable.camera)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
;
Glide.with(context)
.load(imageRes)
.transition(withCrossFade())
.apply(options)
.into(view);
}
/**
* 压缩图片(质量压缩)
......
<?xml version="1.0" encoding="utf-8"?>
<layout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/title"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true">
<TextView
android:id="@+id/title_left"
style="@style/title_left"
android:textSize="14sp" />
<TextView
android:id="@+id/title"
style="@style/text_title" />
<ImageView
android:id="@+id/title_right"
style="@style/title_right_image" />
<ImageView
style="@style/card_line"
android:layout_below="@+id/title_right" />
</RelativeLayout>
</layout>
\ No newline at end of file
......@@ -333,6 +333,7 @@
<string name="system_chcek">系统验收</string>
<string name="single_server_num">已完成%1$d/共%2$d</string>
<string name="server_num">共%1$d项服务</string>
<string name="company_mobile">联系技术支持</string>
......
......@@ -111,7 +111,9 @@ public class LocationUtils {
*/
public static void destroy() {
mHandler = null;
mlocationClient.onDestroy();
if (mlocationClient != null) {
mlocationClient.onDestroy();
}
mlocationClient = null;
mListener = null;
}
......
......@@ -12,6 +12,7 @@ import com.dayu.order.api.protocol.ServerInstruction;
import com.dayu.order.api.protocol.ShipperCompany;
import com.dayu.order.api.protocol.Spu;
import com.dayu.order.api.protocol.Tab;
import com.dayu.order.api.protocol.companyManager;
import java.util.List;
......@@ -132,4 +133,8 @@ public class OrderApiFactory {
public static Observable<Spu> getMultiProcessInfo(int id) {
return Api.getService(OrderService.class).getMultiProcessInfo(id).compose(Api.applySchedulers());
}
public static Observable<companyManager> getManagerMobile(int companyId, int managerType) {
return Api.getService(OrderService.class).getManagerMobile(companyId,managerType).compose(Api.applySchedulers());
}
}
......@@ -12,6 +12,7 @@ import com.dayu.order.api.protocol.ServerInstruction;
import com.dayu.order.api.protocol.ShipperCompany;
import com.dayu.order.api.protocol.Spu;
import com.dayu.order.api.protocol.Tab;
import com.dayu.order.api.protocol.companyManager;
import com.dayu.order.common.OrderConstant;
import java.util.List;
......@@ -297,6 +298,10 @@ interface OrderService {
@GET(OrderConstant.CHECK_PROCESS_MULTI_ORDER)
Observable<BaseResponse<Spu>> getMultiProcessInfo(@Path("id") int id);
/**
* 获取技术支持电话
* @return
*/
@GET(OrderConstant.COMPAY_MANAGER_MOBILE)
Observable<BaseResponse<Spu>> getManagerMobile(@Path("id") int id);
Observable<BaseResponse<companyManager>> getManagerMobile(@Query("companyId") int companyId, @Query("managerType") int managerType);
}
......@@ -52,6 +52,15 @@ public class Order {
private int createdSource;
private List<Spu> spus;
private Integer commited;
private Integer kaCompanyId;
public Integer getKaCompanyId() {
return kaCompanyId;
}
public void setKaCompanyId(Integer kaCompanyId) {
this.kaCompanyId = kaCompanyId;
}
public Integer getCommited() {
return commited;
......
......@@ -72,6 +72,24 @@ public class OrderDetail implements Serializable {
private Integer createdSource; //1.服务商自己填写的工单2.厂商系统派3.ka系统4.多任务
private List<accessories> accessories;
private List<Spu> spus;
private Integer needEsignature;//1:需要2:不需要.
private String esignatureImg;
public Integer getNeedEsignature() {
return needEsignature;
}
public void setNeedEsignature(Integer needEsignature) {
this.needEsignature = needEsignature;
}
public String getEsignatureImg() {
return esignatureImg;
}
public void setEsignatureImg(String esignatureImg) {
this.esignatureImg = esignatureImg;
}
public List<Spu> getSpus() {
return spus;
......
......@@ -35,6 +35,24 @@ public class Spu implements Serializable, Parcelable {
*/
private String customerCheckComment;
private List<Pic> listPic;
private Integer needSerialNumPic;//1需要;2不需要.
private String serialNumPicUrl;
public Integer getNeedSerialNumPic() {
return needSerialNumPic;
}
public void setNeedSerialNumPic(Integer needSerialNumPic) {
this.needSerialNumPic = needSerialNumPic;
}
public String getSerialNumPicUrl() {
return serialNumPicUrl;
}
public void setSerialNumPicUrl(String serialNumPicUrl) {
this.serialNumPicUrl = serialNumPicUrl;
}
public String getCustomerCheckComment() {
return customerCheckComment;
......
package com.dayu.order.api.protocol;
/**
* Created by luofan
* on 2018/6/12.
*/
public class companyManager {
private Integer accountId;
private Integer companyId;
private String createTime;
private String created;
private Integer id;
private Integer managerType;
private String mobile;
private String name;
private String updateTime;
private String updated;
public Integer getAccountId() {
return accountId;
}
public void setAccountId(Integer accountId) {
this.accountId = accountId;
}
public Integer getCompanyId() {
return companyId;
}
public void setCompanyId(Integer companyId) {
this.companyId = companyId;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getCreated() {
return created;
}
public void setCreated(String created) {
this.created = created;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getManagerType() {
return managerType;
}
public void setManagerType(Integer managerType) {
this.managerType = managerType;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
public String getUpdated() {
return updated;
}
public void setUpdated(String updated) {
this.updated = updated;
}
}
......@@ -18,6 +18,7 @@ public class OrderConstant {
public final static String SPU = "spu";
public final static String CREATEDSOURCE = "created_source";
public final static String KAADDRESSID = "ka_address_id";
public final static String ORDER_TYPE = "order_type";//0:单任务单数量
/**
* 异常单获取.
......
......@@ -4,6 +4,7 @@ package com.dayu.order.presenter.multipleprocess;
import com.dayu.base.ui.presenter.BaseListPresenter;
import com.dayu.common.BaseView;
import java.util.ArrayList;
import java.util.HashMap;
/**
......@@ -14,12 +15,22 @@ public interface MultipleProcessContract {
interface View extends BaseView {
HashMap<String, Object> getParams();
void setRepairType();
void initPayerPhotoView(ArrayList<String> list);
void showPayerDialog();
ArrayList<String> getImages();
void showSignature();
}
abstract class Presenter extends BaseListPresenter<View> {
public abstract void processOrder();
public abstract void getOrderInfo(int orderId);
}
}
......@@ -3,10 +3,12 @@ package com.dayu.order.presenter.multipleprocess;
import android.databinding.ObservableField;
import com.alibaba.android.arouter.launcher.ARouter;
import com.dayu.base.api.BaseApiFactory;
import com.dayu.order.R;
import com.dayu.order.api.OrderApiFactory;
import com.dayu.order.api.protocol.Spu;
import com.dayu.order.common.OrderConstant;
import com.dayu.order.ui.activity.SignatureActivity;
import com.dayu.provider.event.RefreshServe;
import com.dayu.provider.router.RouterPath;
import com.dayu.utils.ToastUtils;
......@@ -16,10 +18,13 @@ import com.dayu.utils.UserManager;
import org.greenrobot.eventbus.EventBus;
import org.json.JSONObject;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
/**
......@@ -32,12 +37,20 @@ public class MultipleProcessPresenter extends MultipleProcessContract.Presenter
private ArrayList<Spu> mSpus;
private int mAccountId;
private String mRepairType;
private int mOrderType;//1:单任务但数量.
private ArrayList<String> mImages = new ArrayList<>();
private Integer mNeedEsignature;
private String mSignatureUrl;
@Override
public void onAttached() {
mAccountId = Integer.parseInt(UserManager.getInstance().getUser().getAccountId());
mSpus = mView.getBundle().getParcelableArrayList(OrderConstant.SPUS);
int type = mView.getBundle().getInt(OrderConstant.ORDER_TYPE);
mDatas.set(mSpus);
if (mSpus.size() == 1 && type == 1) {
mOrderType = 1;
}
getOrderInfo(mSpus.get(0).getOrderId());
}
......@@ -51,12 +64,91 @@ public class MultipleProcessPresenter extends MultipleProcessContract.Presenter
return mFootDatas;
}
public void process() {
File file = new File(SignatureActivity.path);
if (!file.exists()) {
ToastUtils.showShortToast("请让客户签名!");
return;
}
commitePhoto();
}
private void commitePhoto() {
MultipartBody.Part[] parts;
ArrayList<String> imageUrl = mView.getImages();
if (imageUrl != null && imageUrl.size() > 0) {
parts = packPhoto(imageUrl);
mView.showDialog();
BaseApiFactory.uploadPhoto(parts).subscribe(baseObserver(list -> {
if (mNeedEsignature == 1) {
mView.showDialog();
File file = new File(SignatureActivity.path);
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part part = MultipartBody.Part.createFormData("fileUpload", file.getName(), requestFile);
BaseApiFactory.uploadPhoto(part).subscribe(baseObserver(
urls -> {
mSignatureUrl = urls.get(0);
processOrder();
}));
} else {
mImages.addAll(list);
processOrder();
}
}));
} else {
if (mNeedEsignature == 1) {
mView.showDialog();
File file = new File(SignatureActivity.path);
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part part = MultipartBody.Part.createFormData("fileUpload", file.getName(), requestFile);
BaseApiFactory.uploadPhoto(part).subscribe(baseObserver(
urls -> {
mSignatureUrl = urls.get(0);
processOrder();
}));
} else {
processOrder();
}
}
}
private MultipartBody.Part[] packPhoto(List<String> imageUrl) {
ArrayList<File> files = new ArrayList<>();
if (imageUrl != null && imageUrl.size() > 0) {
for (int i = 0; i < imageUrl.size(); i++) {
files.add(new File(imageUrl.get(i)));
}
}
MultipartBody.Part[] part = new MultipartBody.Part[files.size()];
for (int i = 0; i < files.size(); i++) {
RequestBody requestFile =
RequestBody.create(MediaType.parse("multipart/form-data"), files.get(i));
MultipartBody.Part body =
MultipartBody.Part.createFormData("fileUpload", files.get(i).getName(), requestFile);
part[i] = body;
}
return part;
}
@Override
public void processOrder() {
mView.showDialog();
HashMap<String, Object> params = mView.getParams();
params.put("engineerId", mAccountId);
params.put("id", mSpus.get(0).getOrderId());
if (mImages.size() > 0) {
StringBuilder str = new StringBuilder();
for (int a = 0; a < mImages.size(); a++) {
if (a == mImages.size() - 1) {
str.append(mImages.get(a));
} else {
str.append(mImages.get(a));
str.append(",");
}
params.put("pics", str);
}
}
params.put("esignatureImg", mSignatureUrl);
JSONObject jsonObject = new JSONObject(params);
RequestBody body = RequestBody.create(MediaType.parse("application/json"), jsonObject.toString());
OrderApiFactory.commitOrder(body).subscribe(baseObserver(integer -> {
......@@ -76,10 +168,18 @@ public class MultipleProcessPresenter extends MultipleProcessContract.Presenter
mRepairType = UIUtils.getString(R.string.payer_baowai);
}
mView.setRepairType();
mNeedEsignature = detail.getNeedEsignature();
if (mNeedEsignature == 1) {
mView.showSignature();
}
}));
}
public String getRepairType() {
return mRepairType;
}
public int getOrderType() {
return mOrderType;
}
}
......@@ -26,12 +26,16 @@ public interface MultiProcessOrderContract {
*/
void initPhotoView(ArrayList<String> list);
void initSnPic(String url);
List<String> getImages();
List<String> getSnImages();
}
abstract class Presenter extends BasePresenter<View> {
public abstract void commitOrder(List<String> imageUrl, int id, String info);
public abstract void commitOrder(List<String> imageUrl, List<String> snImages, int id, String info);
public abstract void commitPhoto();
......
......@@ -3,6 +3,7 @@ package com.dayu.order.presenter.multiprocessorder;
import android.databinding.ObservableField;
import android.os.Bundle;
import android.text.TextUtils;
import com.dayu.base.api.BaseApiFactory;
import com.dayu.common.BaseApplication;
......@@ -14,6 +15,7 @@ import com.dayu.order.common.OrderConstant;
import com.dayu.order.ui.activity.MultiProcessOrderActivity;
import com.dayu.order.ui.activity.ServerInstructionActivity;
import com.dayu.order.ui.activity.SopWebViewActivity;
import com.dayu.utils.ToastUtils;
import com.luck.picture.lib.tools.PictureFileUtils;
import com.umeng.analytics.MobclickAgent;
......@@ -37,11 +39,13 @@ public class MultiProcessOrderPresenter extends MultiProcessOrderContract.Presen
private Spu mSpu;
private ArrayList<String> mImages = new ArrayList<>();
private ArrayList<String> mHttpUrl = new ArrayList<>();
private ArrayList<String> mSnHttpUrl = new ArrayList<>();
public ObservableField<Spu> mDetail = new ObservableField<>();
public ObservableField<String> mInfo = new ObservableField<>();
public ObservableField<String> mBrandName = new ObservableField<>();
public ObservableField<String> mSn = new ObservableField<>();
public ObservableField<Boolean> mSpuState = new ObservableField<>();
public ObservableField<Boolean> mIsShowSn = new ObservableField<>(false);
private ArrayList<Spu> mSpus;
private int mId;
......@@ -61,22 +65,32 @@ public class MultiProcessOrderPresenter extends MultiProcessOrderContract.Presen
} else {
mSpuState.set(false);
}
if (mSpu.getStatus() == 2) {
getInfo();
}
getInfo();
// if (mSpu.getStatus() == 2) {
// getInfo();
// }
}
private void commitOrder(List<String> list) {
commitOrder(list, mSpu.getId(), mInfo.get());
private void commitOrder(List<String> list, List<String> snList) {
commitOrder(list, snList, mSpu.getId(), mInfo.get());
PictureFileUtils.deleteCacheDirFile(BaseApplication.getContext());
}
private MultipartBody.Part[] packPhoto(List<String> imageUrl) {
private MultipartBody.Part[] packPhoto(List<String> imageUrl, String type) {
ArrayList<File> files = new ArrayList<>();
if (type.equals("sn")) {
mSnHttpUrl.clear();
} else {
mHttpUrl.clear();
}
if (imageUrl != null && imageUrl.size() > 0) {
for (int i = 0; i < imageUrl.size(); i++) {
if (imageUrl.get(i).contains("http")) {
mHttpUrl.add(imageUrl.get(i));
if (type.equals("sn")) {
mSnHttpUrl.add(imageUrl.get(i));
} else {
mHttpUrl.add(imageUrl.get(i));
}
} else {
files.add(new File(imageUrl.get(i)));
}
......@@ -94,7 +108,7 @@ public class MultiProcessOrderPresenter extends MultiProcessOrderContract.Presen
}
@Override
public void commitOrder(List<String> imageUrl, int id, String info) {
public void commitOrder(List<String> imageUrl, List<String> snImages, int id, String info) {
HashMap<String, Object> params = new HashMap<>();
params.put("customerCheckComment", info);
params.put("id", id);
......@@ -115,6 +129,11 @@ public class MultiProcessOrderPresenter extends MultiProcessOrderContract.Presen
} else {
params.put("pics", null);
}
if (snImages != null) {
params.put("serialNumPicUrl", snImages.get(0));
} else {
params.put("serialNumPicUrl", null);
}
JSONObject jsonObject = new JSONObject(params);
RequestBody body = RequestBody.create(MediaType.parse("application/json"), jsonObject.toString());
OrderApiFactory.processMultiOrder(body).subscribe(baseObserver(integer -> doNext()));
......@@ -153,21 +172,56 @@ public class MultiProcessOrderPresenter extends MultiProcessOrderContract.Presen
@Override
public void commitPhoto() {
if (mIsShowSn.get() && (TextUtils.isEmpty(mSn.get()) || mView.getSnImages().size() == 0)) {
ToastUtils.showShortToast("序列号和序列号照片不能为空");
return;
}
mView.showDialog();
MultipartBody.Part[] parts;
List<String> imageUrl = mView.getImages();
if (imageUrl != null && imageUrl.size() > 0) {
parts = packPhoto(imageUrl);
parts = packPhoto(imageUrl, "");
if (parts.length == 0) {
commitOrder(mHttpUrl);
if (mIsShowSn.get()) {
List<String> images = mView.getSnImages();
MultipartBody.Part[] snParts = packPhoto(images, "sn");
if (mSnHttpUrl.size() == 1) {
commitOrder(mHttpUrl, mSnHttpUrl);
} else {
BaseApiFactory.uploadPhoto(snParts).subscribe(baseObserver(
list -> commitOrder(mHttpUrl, list)));
}
} else {
commitOrder(mHttpUrl, null);
}
} else {
BaseApiFactory.uploadPhoto(parts).subscribe(baseObserver(list -> {
list.addAll(0, mHttpUrl);
commitOrder(list);
if (mIsShowSn.get()) {
List<String> images = mView.getSnImages();
MultipartBody.Part[] snParts = packPhoto(images, "sn");
if (mSnHttpUrl.size() == 1) {
commitOrder(list, mSnHttpUrl);
} else {
BaseApiFactory.uploadPhoto(snParts).subscribe(baseObserver(
list1 -> commitOrder(list, list1)));
}
}
}));
}
}else {
commitOrder(null);
} else {
if (mIsShowSn.get()) {
List<String> images = mView.getSnImages();
MultipartBody.Part[] snParts = packPhoto(images, "sn");
if (mSnHttpUrl.size() == 1) {
commitOrder(null, mSnHttpUrl);
} else {
BaseApiFactory.uploadPhoto(snParts).subscribe(baseObserver(
list -> commitOrder(null, list)));
}
} else {
commitOrder(null, null);
}
}
}
......@@ -204,6 +258,12 @@ public class MultiProcessOrderPresenter extends MultiProcessOrderContract.Presen
imges.add(pic.getPictureUrl());
}
mView.initPhotoView(imges);
if (spu.getSerialNumPicUrl() != null) {
mView.initSnPic(spu.getSerialNumPicUrl());
}
if (spu.getNeedSerialNumPic() != null && spu.getNeedSerialNumPic() == 1) {
mIsShowSn.set(true);
}
}));
}
}
......@@ -56,7 +56,7 @@ public class OrderServerPresenter extends OrderServerContract.Presenter {
@Override
public void dumpToSop(int id) {
Bundle bundle = new Bundle();
if (mDetails.getCreatedSource() == 4) {
if (mDetails.getCreatedSource() == 2 || mDetails.getCreatedSource() == 3 || mDetails.getCreatedSource() == 4) {
bundle.putInt(ORDER_ID, id);
} else {
bundle.putInt(ORDER_ID, mDetails.getId());
......
......@@ -50,6 +50,8 @@ public interface ProcessOrderContract {
void showNoPayerDialog();
void showSelectPayerDialog(OnCloseListener listener);
ArrayList<String> getSnImages();
}
abstract class Presenter extends BasePresenter<View> {
......
......@@ -17,5 +17,9 @@ public interface ServerInfoContract {
public abstract void getServerInfo();
public abstract void dumpServerList(int id);
public abstract void callPhone();
public abstract void getPhone();
}
}
package com.dayu.order.presenter.serverinfo;
import android.content.Intent;
import android.databinding.ObservableField;
import android.net.Uri;
import android.os.Bundle;
import com.dayu.common.Constants;
import com.dayu.order.api.OrderApiFactory;
import com.dayu.order.api.protocol.Spu;
import com.dayu.order.api.protocol.companyManager;
import com.dayu.order.common.OrderConstant;
import com.dayu.order.ui.activity.ServerListActivity;
import java.util.List;
import io.reactivex.functions.Consumer;
/**
* Created by luofan
* on 2017/11/8.
......@@ -18,12 +23,19 @@ import java.util.List;
public class ServerInfoPresenter extends ServerInfoContract.Presenter {
public ObservableField<Object> mDatas = new ObservableField<>();
public ObservableField<Object> mHeadDatas = new ObservableField<>();
public ObservableField<Integer> mCanProcess = new ObservableField();
public ObservableField<Integer> mCanProcess = new ObservableField<>();
public ObservableField<Boolean> mIsShowPhone = new ObservableField<>(false);
private int mId;
private Integer mKaId;
private String mPhone;
@Override
public void onAttached() {
mId = mView.getBundle().getInt(Constants.ID);
mKaId = mView.getBundle().getInt(OrderConstant.KAADDRESSID, -1);
if (mKaId != -1) {
getPhone();
}
}
@Override
......@@ -57,6 +69,31 @@ public class ServerInfoPresenter extends ServerInfoContract.Presenter {
}
@Override
public void callPhone() {
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:" + mPhone));
mView.startActivityForIntent(intent);
}
@Override
public void getPhone() {
mView.showDialog();
OrderApiFactory.getManagerMobile(mKaId, 3).subscribe(baseObserver(new Consumer<companyManager>() {
@Override
public void accept(companyManager companyManager) throws Exception {
mPhone = companyManager.getMobile();
if (mPhone != null) {
mIsShowPhone.set(true);
}
}
}, responeThrowable -> {
if (Constants.ERROR_NULL.equals(responeThrowable.subCode)) {
mIsShowPhone.set(false);
}
}));
}
@Override
public void refresh() {
getServerInfo();
}
......
......@@ -17,5 +17,10 @@ public interface ServerListContract {
public abstract void getServerList();
public abstract void dumpToProcess();
public abstract void callPhone();
public abstract void getPhone();
}
}
package com.dayu.order.presenter.serverlist;
import android.content.Intent;
import android.databinding.ObservableField;
import android.net.Uri;
import android.os.Bundle;
import com.dayu.common.Constants;
......@@ -19,7 +21,11 @@ public class ServerListPresenter extends ServerListContract.Presenter {
public ObservableField<Object> mDatas = new ObservableField<>();
public ObservableField<Boolean> mCanProcess = new ObservableField<>();
public ObservableField<Boolean> mIsShowProcess = new ObservableField<>();
public ObservableField<Boolean> mIsShowPhone = new ObservableField<>(false);
private int mId;
private Integer mKaId;
private String mPhone;
private int mOrderType;
@Override
public ObservableField<Object> getSourceDatas() {
......@@ -30,16 +36,20 @@ public class ServerListPresenter extends ServerListContract.Presenter {
public void onAttached() {
mId = mView.getBundle().getInt(Constants.ID);
String type = mView.getBundle().getString(OrderConstant.SPUS);
mKaId = mView.getBundle().getInt(OrderConstant.KAADDRESSID, -1);
if (mKaId != -1) {
getPhone();
}
if (OrderConstant.SPUS.equals(type)) {
mIsShowProcess.set(false);
} else {
mIsShowProcess.set(true);
}
mView.showDialog();
}
@Override
public void getServerList() {
mView.showDialog();
OrderApiFactory.getServerList(mId).subscribe(baseObserver(spus -> {
mDatas.set(spus);
boolean flag = true;
......@@ -49,14 +59,40 @@ public class ServerListPresenter extends ServerListContract.Presenter {
}
}
mCanProcess.set(flag);
if (spus.size() == 1) {
mOrderType = 1;
}
}));
}
@Override
public void dumpToProcess() {
Bundle bundle = new Bundle();
bundle.putParcelableArrayList(OrderConstant.SPUS,(ArrayList<Spu>)mDatas.get());
mView.startActivity(MultipleProcessActivity.class,bundle);
bundle.putParcelableArrayList(OrderConstant.SPUS, (ArrayList<Spu>) mDatas.get());
bundle.putInt(OrderConstant.ORDER_TYPE, mOrderType);
mView.startActivity(MultipleProcessActivity.class, bundle);
}
@Override
public void callPhone() {
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:" + mPhone));
mView.startActivityForIntent(intent);
}
@Override
public void getPhone() {
mView.showDialog();
OrderApiFactory.getManagerMobile(mKaId, 3).subscribe(baseObserver(companyManager -> {
mPhone = companyManager.getMobile();
if (mPhone != null) {
mIsShowPhone.set(true);
}
}, responeThrowable -> {
if (Constants.ERROR_NULL.equals(responeThrowable.subCode)) {
mIsShowPhone.set(false);
}
}));
}
@Override
......
......@@ -39,6 +39,8 @@ public class MultiProcessOrderActivity extends BaseActivity<MultiProcessOrderPre
private ImageView mAddIV;
private List<LocalMedia> mSelectList;
private ArrayList<String> mImages = new ArrayList<>();
private ArrayList<String> mSnImages = new ArrayList<>();
private int mPhotoState;//1.服务照片2.sn照片
@Override
public int getLayoutId() {
......@@ -49,7 +51,24 @@ public class MultiProcessOrderActivity extends BaseActivity<MultiProcessOrderPre
@Override
public void initView() {
mSelectList = new ArrayList<>();
mAddIV.setOnClickListener(v -> showPicDialog());
mAddIV.setOnClickListener(v -> {
mPhotoState = 1;
showPicDialog();
});
mBind.ivSn.setOnClickListener(v -> {
if (mSnImages.size() > 0) {
dumpPic(mSnImages);
} else {
mPhotoState = 2;
showPicDialog();
}
});
mBind.ivDelete.setOnClickListener(v -> {
mBind.ivSn.setImageResource(R.drawable.icon_sn);
mBind.ivDelete.setVisibility(View.GONE);
mSnImages.clear();
});
}
@Override
......@@ -66,9 +85,15 @@ public class MultiProcessOrderActivity extends BaseActivity<MultiProcessOrderPre
}
public void showPicDialog() {
int size;
if (mPhotoState == 1) {
size = 5 - mImages.size();
} else {
size = 1 - mSnImages.size();
}
PictureSelectionModel selector = PictureSelector.create(mActivity)
.openGallery(PictureMimeType.ofImage())//全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()
.maxSelectNum(5 - mImages.size())// 最大图片选择数量 int
.maxSelectNum(size)// 最大图片选择数量 int
.imageSpanCount(4)// 每行显示个数 int
.selectionMode(PictureConfig.MULTIPLE)// 多选 or 单选 PictureConfig.MULTIPLE or PictureConfig.SINGLE
.previewImage(true)// 是否可预览图片 true or false
......@@ -109,6 +134,13 @@ public class MultiProcessOrderActivity extends BaseActivity<MultiProcessOrderPre
initPhoto(list, mBind.llImage, mAddIV);
}
@Override
public void initSnPic(String url) {
GlideImageLoader.load(mActivity, url, mBind.ivSn);
mBind.ivDelete.setVisibility(View.VISIBLE);
mSnImages.add(url);
}
public void initPhoto(ArrayList<String> list, LinearLayout layout, ImageView mAdd) {
layout.removeAllViews();
for (int i = 0; i < list.size(); i++) {
......@@ -150,9 +182,18 @@ public class MultiProcessOrderActivity extends BaseActivity<MultiProcessOrderPre
mSelectList = PictureSelector.obtainMultipleResult(data);
if (mSelectList != null) {
for (int a = 0; a < mSelectList.size(); a++) {
mImages.add(mSelectList.get(a).getCompressPath());
if (mPhotoState == 1) {
mImages.add(mSelectList.get(a).getCompressPath());
} else {
mSnImages.add(mSelectList.get(a).getCompressPath());
}
}
if (mPhotoState == 1) {
initPhotoView(mImages);
} else {
GlideImageLoader.load(mActivity, mSnImages.get(0), mBind.ivSn);
mBind.ivDelete.setVisibility(View.VISIBLE);
}
initPhotoView(mImages);
}
break;
}
......@@ -163,4 +204,9 @@ public class MultiProcessOrderActivity extends BaseActivity<MultiProcessOrderPre
public List<String> getImages() {
return mImages;
}
@Override
public List<String> getSnImages() {
return mSnImages;
}
}
......@@ -58,7 +58,7 @@ public class OrderDetailsActivity extends BaseActivity<OrderDetailPresenter, Act
mMultiDetailFragment = MultiOrderDetailFragment.newInstance(detail);
orderDatailsServeFragment = OrderDetailsServeFragment.newInstance(detail);
mOrderPartFragment = OrderPartFragment.newInstance(detail);
if (detail.getCreatedSource() == 4) {
if (detail.getCreatedSource() == 2 || detail.getCreatedSource() == 3 || detail.getCreatedSource() == 4) {
mFragments.add(mMultiDetailFragment);
} else {
mFragments.add(orderDatailsFragment);
......@@ -66,7 +66,7 @@ public class OrderDetailsActivity extends BaseActivity<OrderDetailPresenter, Act
mFragments.add(orderDatailsServeFragment);
mFragments.add(mOrderPartFragment);
mBind.titleBack.setOnClickListener(v -> dumpBack());
if (detail.getCreatedSource() != 3 && detail.getCreatedSource() != 4) {
if (detail.getCreatedSource() != 2 && detail.getCreatedSource() != 3 && detail.getCreatedSource() != 4) {
mBind.btnPart.setVisibility(View.GONE);
mBind.btnServer.setBackgroundResource(R.drawable.detail_end_selector);
}
......
......@@ -47,6 +47,7 @@ public class ProcessOrderActivity extends BaseActivity<ProcessOrderPresenter, Ac
private List<LocalMedia> mSelectList;
private ArrayList<String> mImages = new ArrayList<>();
private ArrayList<String> mPayerImages = new ArrayList<>();
private ArrayList<String> mSnImages = new ArrayList<>();
private int mPhotoState = 0; //0:payer
@Override
......@@ -66,6 +67,19 @@ public class ProcessOrderActivity extends BaseActivity<ProcessOrderPresenter, Ac
mPhotoState = 0;
showPicDialog();
});
mBind.ivSn.setOnClickListener(v -> {
if (mSnImages.size() > 0) {
dumpPic(mSnImages);
} else {
mPhotoState = 2;
showPicDialog();
}
});
mBind.ivDelete.setOnClickListener(v -> {
mBind.ivSn.setImageResource(R.drawable.icon_sn);
mBind.ivDelete.setVisibility(View.GONE);
mSnImages.clear();
});
}
@Override
......@@ -91,8 +105,10 @@ public class ProcessOrderActivity extends BaseActivity<ProcessOrderPresenter, Ac
int size;
if (mPhotoState == 0) {
size = 5 - mPayerImages.size();
} else {
} else if (mPhotoState == 1) {
size = 5 - mImages.size();
} else {
size = 1 - mSnImages.size();
}
PictureSelectionModel selector = PictureSelector.create(mActivity)
.openGallery(PictureMimeType.ofImage())//全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()
......@@ -237,11 +253,16 @@ public class ProcessOrderActivity extends BaseActivity<ProcessOrderPresenter, Ac
customDialog.setTitle(getString(R.string.payer_select_title))
.setNegativeButton(getString(R.string.cancle))
.setPositiveButton(getString(R.string.submit))
.setPositiveButtonColor(UIUtils.getColor(R.color.common_red));
.setPositiveButtonColor(UIUtils.getColor(R.color.common_red));
customDialog.show();
}
@Override
public ArrayList<String> getSnImages() {
return mSnImages;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
......@@ -252,14 +273,21 @@ public class ProcessOrderActivity extends BaseActivity<ProcessOrderPresenter, Ac
for (int a = 0; a < mSelectList.size(); a++) {
if (mPhotoState == 0) {
mPayerImages.add(mSelectList.get(a).getCompressPath());
} else {
} else if (mPhotoState == 1) {
mImages.add(mSelectList.get(a).getCompressPath());
} else {
mSnImages.add(mSelectList.get(a).getCompressPath());
}
}
if (mPhotoState == 0) {
initPayerPhotoView(mPayerImages);
} else {
} else if (mPhotoState == 1) {
initPhotoView(mImages);
} else {
if (mSnImages.size() > 0) {
GlideImageLoader.load(mActivity, mSnImages.get(0), mBind.ivSn);
mBind.ivDelete.setVisibility(View.VISIBLE);
}
}
}
break;
......
package com.dayu.order.ui.activity;
import android.os.Environment;
import com.dayu.base.ui.activity.DataBindingActivity;
import com.dayu.order.R;
import com.dayu.order.databinding.ActivitySignatureLayoutBinding;
import com.dayu.utils.ToastUtils;
import java.io.File;
import java.io.IOException;
/**
* Created by luofan
* on 2018/6/12.
*/
public class SignatureActivity extends DataBindingActivity<ActivitySignatureLayoutBinding> {
public static String path = Environment.getExternalStorageDirectory() + "/dayu/image/signature.png";
@Override
public int getLayoutId() {
return R.layout.activity_signature_layout;
}
@Override
public void initView() {
mBind.titleRight.setOnClickListener(v -> mBind.view.clear());
mBind.titleBack.setOnClickListener(v -> finish());
mBind.tvSave.setOnClickListener(v -> {
if (mBind.view.isSign()) {
File file = new File(Environment.getExternalStorageDirectory() + "/dayu/image/");
try {
if (!file.exists()) {
file.mkdirs();
}
mBind.view.save(path);
setResult(100);
finish();
} catch (IOException e) {
e.printStackTrace();
}
} else {
ToastUtils.showLongToast("还没有签名!");
}
});
}
}
......@@ -13,6 +13,7 @@ import com.dayu.location.base.LocationUtils;
import com.dayu.order.R;
import com.dayu.order.api.protocol.Order;
import com.dayu.order.api.protocol.Spu;
import com.dayu.order.common.OrderConstant;
import com.dayu.order.databinding.FragmentOrderdoingItemBinding;
import com.dayu.order.presenter.orderdoing.OrderDoingPresenter;
import com.dayu.order.ui.activity.ProcessOrderActivity;
......@@ -243,7 +244,7 @@ public class OrderAdapter extends CoreAdapter<Order, FragmentOrderdoingItemBindi
MobclickAgent.onEvent(mContext, "take_phone", map_ekv);
});
}
if (item.getCreatedSource() == 4) {
if (item.getCreatedSource() == 2 || item.getCreatedSource() == 3 || item.getCreatedSource() == 4) {
holder.itemTextWeixiu.setText(item.getSpus().get(0).getProviderTypeName());
holder.itemTextWeixiuLeixing.setText(item.getSpus().get(0).getKaSpuName());
......@@ -267,7 +268,7 @@ public class OrderAdapter extends CoreAdapter<Order, FragmentOrderdoingItemBindi
private void processClick(Order it, FragmentOrderdoingItemBinding h, int posiiton) {
mItem = it;
mBind = h;
if (mItem.getCreatedSource() == 4 && mItem.getStatus() == 4) {
if ((mItem.getCreatedSource() == 2 || mItem.getCreatedSource() == 3 || mItem.getCreatedSource() == 4) && mItem.getStatus() == 4) {
dumpServerActivity(mItem, posiiton);
} else if (mItem.getStatus() == 4 && mItem.getSubStatus() == 3) {
dumpProcessActivity(mItem, posiiton);
......@@ -365,6 +366,9 @@ public class OrderAdapter extends CoreAdapter<Order, FragmentOrderdoingItemBindi
} else {
return;
}
if (order.getKaCompanyId() != null) {
bundle.putInt(OrderConstant.KAADDRESSID, order.getKaCompanyId());
}
intent.putExtra(Constants.BUNDLE, bundle);
mContext.startActivity(intent);
}
......
......@@ -57,7 +57,7 @@ public class OrderFourTabAdapter extends CoreAdapter<Order, FragmentOrderCancleI
item.getDistrictName() + item.getAddress());
helper.errorState.setText(mContext.getString(R.string.order_cancle));
if (item.getCreatedSource() == 4) {
if (item.getCreatedSource() == 2 || item.getCreatedSource() == 3 || item.getCreatedSource() == 4) {
if (item.getSpus().size() < 1) {
return;
}
......
......@@ -98,7 +98,7 @@ public class OrderServerAdapter extends CoreAdapter<OrderDetail.RecordBean, Serv
}
}
if (UIUtils.getString(R.string.check_accept).equals(item.getCommentName()) || UIUtils.getString(R.string.system_chcek).equals(item.getOperation())) {
if (mDetail.getCreatedSource() == 4) {
if (mDetail.getCreatedSource() == 2 || mDetail.getCreatedSource() == 3 || mDetail.getCreatedSource() == 4) {
holder.serverCheck.setVisibility(View.GONE);
} else {
holder.serverCheck.setVisibility(View.VISIBLE);
......@@ -112,7 +112,7 @@ public class OrderServerAdapter extends CoreAdapter<OrderDetail.RecordBean, Serv
holder.serverCheck.setOnClickListener(v -> presenter.dumpMap(item.getLatitude(), item.getLongitude(), item.getAddress()));
}
if (UIUtils.getString(R.string.check_reason).equals(item.getCommentName())) {
if (mDetail.getCreatedSource() == 4) {
if (mDetail.getCreatedSource() == 2 || mDetail.getCreatedSource() == 3 || mDetail.getCreatedSource() == 4) {
if (item.getCommentInfo() != null) {
holder.serverCheck.setOnClickListener(v -> presenter.dumpToSop(Integer.parseInt(item.getCommentInfo())));
}
......
package com.dayu.order.ui.view;
/**
* Created by luofan
* on 2018/6/12.
*/
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import com.dayu.order.R;
import com.dayu.order.ui.view.glide.SignFileOutputStream;
import com.dayu.order.ui.view.point.DrawPoint;
import com.dayu.order.ui.view.point.PointUtil;
import com.dayu.order.ui.view.point.TimedPoint;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class HandWriteView extends View {
List<TimedPoint> points = new ArrayList<>();
Stack<TimedPoint> cachePoints = new Stack<>();
PointUtil pointUtil = new PointUtil();
private Bitmap mBitmap;
private Canvas mCanvas;
private Paint mPaint;
private boolean isSign = false;
private int mBackColor = Color.WHITE;
public HandWriteView(Context context) {
this(context, null);
}
public HandWriteView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public HandWriteView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.HandWriteView);
int maxWidth = a.getDimensionPixelSize(R.styleable.HandWriteView_paintMaxWidth, 16);
int minWidth = a.getDimensionPixelSize(R.styleable.HandWriteView_paintMinWidth, 8);
int paintColor = a.getColor(R.styleable.HandWriteView_paintColor, Color.BLACK);
pointUtil.setWidth(minWidth, maxWidth);
mPaint = new Paint();
mPaint.setColor(paintColor);
mPaint.setStrokeWidth(10);
mPaint.setAntiAlias(true);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeJoin(Paint.Join.ROUND);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
getParent().requestDisallowInterceptTouchEvent(true);
points.clear();
addPoint(getNewPoint(x, y));
break;
case MotionEvent.ACTION_MOVE:
addPoint(getNewPoint(x, y));
break;
case MotionEvent.ACTION_UP:
isSign = true;
addPoint(getNewPoint(x, y));
getParent().requestDisallowInterceptTouchEvent(false);
break;
}
invalidate();
return true;
}
private TimedPoint getNewPoint(float x, float y) {
if (cachePoints.empty()) {
return new TimedPoint(x, y);
} else return cachePoints.pop().set(x, y);
}
private void recyclePoint(TimedPoint point) {
cachePoints.push(point);
}
@Override
protected void onDraw(Canvas canvas) {
//画背景 如果有需要的话
super.onDraw(canvas);
if (mBitmap != null) {
canvas.drawBitmap(mBitmap, 0, 0, null);
}
}
private void addPoint(TimedPoint point) {
points.add(point);
if (points.size() > 3) {
ensureSignatureBitmap();
TimedPoint s0 = points.get(0);
TimedPoint s1 = points.get(1);
TimedPoint s2 = points.get(2);
TimedPoint s3 = points.get(3);
float cx1 = s1.x + (s2.x - s0.x) / 4;
float cy1 = s1.y + (s2.y - s0.y) / 4;
float cx2 = s2.x - (s3.x - s1.x) / 4;
float cy2 = s2.y - (s3.y - s1.y) / 4;
pointUtil.set(s1, getNewPoint(cx1, cy1), getNewPoint(cx2, cy2), s2);
float originalWidth = mPaint.getStrokeWidth();
float drawSteps = (float) Math.floor(pointUtil.length());
for (int i = 0; i < drawSteps; i++) {
float t = (float) i / drawSteps;
DrawPoint drawPoint = pointUtil.calculate(t);
mPaint.setStrokeWidth(drawPoint.width);
mCanvas.drawPoint(drawPoint.x, drawPoint.y, mPaint);
}
mPaint.setStrokeWidth(originalWidth);
recyclePoint(points.remove(0));
recyclePoint(pointUtil.control1);
recyclePoint(pointUtil.control2);
} else if (points.size() == 1) {
points.add(getNewPoint(point.x, point.y));
}
}
private void ensureSignatureBitmap() {
if (mBitmap == null) {
mBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
}
}
/**
* 保存画板
*
* @param path 保存到路劲
*/
public void save(String path) throws IOException {
save(path, false, 0, false);
}
public void save(String path, boolean isEncrypt) throws IOException {
save(path, false, 0, isEncrypt);
}
/**
* 保存画板
*
* @param path 保存到路径
* @param clearBlank 是否清楚空白区域
* @param blank 边缘空白区域
* @param isEncrypt 加密存储,选择加密存储会自动追加后缀为.sign
*/
public void save(String path, boolean clearBlank, int blank, boolean isEncrypt) throws IOException {
Bitmap bitmap = mBitmap;
if (clearBlank) {
bitmap = clearBlank(bitmap, blank);
}
if (isEncrypt) path = path + ".sign";
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);
byte[] buffer = bos.toByteArray();
if (buffer != null) {
File file = new File(path);
if (file.exists()) {
file.delete();
}
OutputStream outputStream = isEncrypt ? new SignFileOutputStream(file) : new FileOutputStream(file);
outputStream.write(buffer);
outputStream.close();
}
}
/**
* 逐行扫描 清除边界空白。
*
* @param bp
* @param blank 边距留多少个像素
* @return
*/
private Bitmap clearBlank(Bitmap bp, int blank) {
int HEIGHT = bp.getHeight();
int WIDTH = bp.getWidth();
int top = 0, left = 0, right = WIDTH, bottom = HEIGHT;
int[] pixs = new int[WIDTH];
boolean isStop;
for (int y = 0; y < HEIGHT; y++) {
bp.getPixels(pixs, 0, WIDTH, 0, y, WIDTH, 1);
isStop = false;
for (int pix : pixs) {
if (pix != mBackColor) {
top = y;
isStop = true;
break;
}
}
if (isStop) {
break;
}
}
for (int y = HEIGHT - 1; y >= 0; y--) {
bp.getPixels(pixs, 0, WIDTH, 0, y, WIDTH, 1);
isStop = false;
for (int pix : pixs) {
if (pix != mBackColor) {
bottom = y;
isStop = true;
break;
}
}
if (isStop) {
break;
}
}
int scanHeight = bottom - top;
pixs = new int[scanHeight];
for (int x = 0; x < WIDTH; x++) {
bp.getPixels(pixs, 0, 1, x, top, 1, scanHeight);
isStop = false;
for (int pix : pixs) {
if (pix != mBackColor) {
left = x;
isStop = true;
break;
}
}
if (isStop) {
break;
}
}
for (int x = WIDTH - 1; x > 0; x--) {
bp.getPixels(pixs, 0, 1, x, top, 1, scanHeight);
isStop = false;
for (int pix : pixs) {
if (pix != mBackColor) {
right = x;
isStop = true;
break;
}
}
if (isStop) {
break;
}
}
if (blank < 0) {
blank = 0;
}
left = left - blank > 0 ? left - blank : 0;
top = top - blank > 0 ? top - blank : 0;
right = right + blank > WIDTH - 1 ? WIDTH - 1 : right + blank;
bottom = bottom + blank > HEIGHT - 1 ? HEIGHT - 1 : bottom + blank;
return Bitmap.createBitmap(bp, left, top, right - left, bottom - top);
}
public void setPaintColor(int paintColor) {
mPaint.setColor(paintColor);
}
public void setPaintWidth(int mMinWidth, int mMaxWidth) {
if (mMinWidth > 0 && mMaxWidth > 0 && mMinWidth <= mMaxWidth)
pointUtil.setWidth(mMinWidth, mMaxWidth);
}
public void clear() {
if (mBitmap != null && !mBitmap.isRecycled()) {
mBitmap.recycle();
}
mBitmap = null;
ensureSignatureBitmap();
invalidate();
isSign = false;
}
public boolean isSign() {
return isSign;
}
}
\ No newline at end of file
package com.dayu.order.ui.view.glide;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/**
* @version 1.0
* @auth wastrel
* @date 2018/2/6 13:21
* @copyRight 四川金信石信息技术有限公司
* @since 1.0
*/
public class SignFileInputStream extends FileInputStream {
byte[] BYTE_MAP = new byte[256];
public SignFileInputStream(String name) throws IOException {
this(new File(name));
}
public SignFileInputStream(File file) throws IOException {
super(file);
if (file.length() <= 256) throw new IOException("Not a .sign File");
byte[] magicNum = new byte[2];
super.read(magicNum,0,2);
if (magicNum[0] == 0x1A && magicNum[1] == 0x2A) {
byte[] temp = new byte[256];
super.read(temp, 0, 256);
for (int i = 0; i < temp.length; i++) {
BYTE_MAP[temp[i] & 0xFF] = (byte) i;
}
} else {
throw new IOException("Not a .sign File,Magic num not 0x1A,0x2A");
}
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
int t = super.read(b, off, len);
for (int i = off; i < off + t; i++) {
b[i] = BYTE_MAP[b[i] & 0xFF];
}
return t;
}
}
package com.dayu.order.ui.view.glide;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
public class SignFileOutputStream extends FileOutputStream {
byte[] BYTE_MAP;
public SignFileOutputStream(String name) throws IOException {
this(new File(name));
}
public SignFileOutputStream(File file) throws IOException {
super(file);
BYTE_MAP = new byte[256];
for (int i = 0; i < 256; i++) {
BYTE_MAP[i] = (byte) i;
}
Random random = new Random();
for (int i = 0; i < BYTE_MAP.length; i++) {
int p = random.nextInt(256);
byte b = BYTE_MAP[i];
BYTE_MAP[i] = BYTE_MAP[p];
BYTE_MAP[p] = b;
}
//write magic num
super.write(new byte[]{0x1A, 0x2A}, 0, 2);
super.write(BYTE_MAP, 0, 256);
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
for (int i = off; i < off + len; i++) {
b[i] = BYTE_MAP[b[i] & 0xFF];
}
super.write(b, off, len);
}
}
package com.dayu.order.ui.view.point;
/**
* Created by luofan
* on 2018/6/12.
*/
public class DrawPoint {
public float x;
public float y;
public float width;
public DrawPoint set(float x, float y, float width) {
this.x = x;
this.y = y;
this.width = width;
return this;
}
}
package com.dayu.order.ui.view.point;
/**
* Created by luofan
* on 2018/6/12.
*/
public class PointUtil {
public TimedPoint startPoint;
public TimedPoint control1;
public TimedPoint control2;
public TimedPoint endPoint;
private int mMinWidth = 8;
private int mMaxWidth = 16;
private float mVelocityFilterWeight = 0.9f;
private float mLastVelocity;
private float mLastWidth;
private float mStartWidth;
private float widthDelta;
private DrawPoint drawPoint = new DrawPoint();
public PointUtil() {
}
public void setWidth(int mMinWidth, int mMaxWidth) {
this.mMinWidth = mMinWidth;
this.mMaxWidth = mMaxWidth;
}
public PointUtil set(TimedPoint startPoint, TimedPoint control1,
TimedPoint control2, TimedPoint endPoint) {
this.startPoint = startPoint;
this.control1 = control1;
this.control2 = control2;
this.endPoint = endPoint;
float velocity = startPoint.velocityTo(endPoint);
velocity = Float.isNaN(velocity) ? 0.0f : velocity;
velocity = mVelocityFilterWeight * velocity
+ (1 - mVelocityFilterWeight) * mLastVelocity;
float newWidth = mMinWidth + (mMaxWidth - mMinWidth) / (Math.max(1, velocity));
mLastVelocity = velocity;
widthDelta = newWidth - mLastWidth;
mStartWidth = mLastWidth;
mLastWidth = newWidth;
return this;
}
/**
* 获得贝塞尔曲线的长度
*
* @return
*/
public float length() {
int steps = 10;
float length = 0;
double cx, cy, px = 0, py = 0, xDiff, yDiff;
for (int i = 0; i <= steps; i++) {
float t = (float) i / steps;
cx = point(t, this.startPoint.x, this.control1.x,
this.control2.x, this.endPoint.x);
cy = point(t, this.startPoint.y, this.control1.y,
this.control2.y, this.endPoint.y);
if (i > 0) {
xDiff = cx - px;
yDiff = cy - py;
length += Math.sqrt(xDiff * xDiff + yDiff * yDiff);
}
px = cx;
py = cy;
}
return length;
}
/**
* 求分段的贝塞尔曲线长度。
* //P(t)=p1(1-t)^3+3p2(1-t)^2t+3p3(1-t)t^2+p4t^3;
*
* @param t
* @param start
* @param c1
* @param c2
* @param end
* @return
*/
public double point(float t, float start, float c1, float c2, float end) {
return start * (1.0 - t) * (1.0 - t) * (1.0 - t)
+ 3.0 * c1 * (1.0 - t) * (1.0 - t) * t
+ 3.0 * c2 * (1.0 - t) * t * t
+ end * t * t * t;
}
public DrawPoint calculate(float t) {
float tt = t * t;
float ttt = tt * t;
float u = 1 - t;
float uu = u * u;
float uuu = uu * u;
float x = uuu * this.startPoint.x;
x += 3 * uu * t * this.control1.x;
x += 3 * u * tt * this.control2.x;
x += ttt * this.endPoint.x;
float y = uuu * this.startPoint.y;
y += 3 * uu * t * this.control1.y;
y += 3 * u * tt * this.control2.y;
y += ttt * this.endPoint.y;
return drawPoint.set(x, y, mStartWidth + ttt * widthDelta);
}
}
package com.dayu.order.ui.view.point;
/**
* Created by luofan
* on 2018/6/12.
*/
public class TimedPoint {
public float x;
public float y;
public long timestamp;
public TimedPoint(float x, float y) {
this.x = x;
this.y = y;
this.timestamp = System.currentTimeMillis();
}
public TimedPoint set(float x, float y) {
this.x = x;
this.y = y;
this.timestamp = System.currentTimeMillis();
return this;
}
public float distanceTo(TimedPoint point) {
return (float) Math.sqrt(Math.pow(point.x - x, 2) + Math.pow(point.y - y, 2));
}
public float velocityTo(TimedPoint point) {
long t = point.timestamp - timestamp;
if (t == 0) return 0;
else return distanceTo(point) / t;
}
}
......@@ -71,5 +71,8 @@
android:name=".ui.activity.MultiProcessOrderActivity"
android:windowSoftInputMode="stateVisible|adjustResize"
android:screenOrientation="portrait" />
<activity
android:name=".ui.activity.SignatureActivity"
android:screenOrientation="landscape" />
</application>
</manifest>
......@@ -54,15 +54,13 @@
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/tv_modify_sop"
>
android:layout_below="@id/tv_modify_sop">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/cl_white"
android:layout_marginBottom="@dimen/dp_15"
>
android:background="@color/cl_white">
<TextView
android:id="@+id/tv_product_title"
......@@ -80,8 +78,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_product_title"
android:layout_marginBottom="@dimen/dp_10"
>
android:layout_marginBottom="@dimen/dp_10">
<RelativeLayout
android:id="@+id/rl_product"
......@@ -146,9 +143,9 @@
android:layout_centerVertical="true"
android:layout_marginLeft="90dp"
android:layout_toRightOf="@id/text_two_text"
android:background="@null"
android:hint="@string/order_brand_name"
android:text="@={presenter.mBrandName}"
android:background="@null"
android:textColor="@color/cl_selector_hui"
android:textSize="@dimen/sp_15" />
......@@ -211,6 +208,16 @@
android:textColor="@color/cl_home_title_text_color"
android:textSize="@dimen/sp_15" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@id/tv_serial_num"
android:text="*"
android:textColor="#F74848"
android:textSize="@dimen/sp_15"
android:visibility="@{presenter.mIsShowSn?View.VISIBLE:View.GONE}" />
<EditText
android:id="@+id/et_serial_num"
android:layout_width="match_parent"
......@@ -218,9 +225,9 @@
android:layout_centerVertical="true"
android:layout_marginLeft="75dp"
android:layout_toRightOf="@id/tv_serial_num"
android:background="@null"
android:hint="@string/order_serail_hint"
android:text="@={presenter.mSn}"
android:background="@null"
android:textColor="@color/cl_selector_hui"
android:textSize="@dimen/sp_15" />
</RelativeLayout>
......@@ -230,11 +237,38 @@
style="@style/line"
android:layout_below="@id/rl_serial_num" />
<RelativeLayout
android:id="@+id/ll_sn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/line_serial"
android:orientation="horizontal"
android:visibility="@{presenter.mIsShowSn?View.VISIBLE:View.GONE}">
<ImageView
android:id="@+id/iv_sn"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginBottom="@dimen/dp_15"
android:layout_marginLeft="@dimen/dp_15"
android:layout_marginTop="@dimen/dp_15"
android:src="@drawable/icon_sn" />
<ImageView
android:id="@+id/iv_delete"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginLeft="95dp"
android:layout_marginTop="@dimen/dp_15"
android:src="@drawable/img_photo_delete"
android:visibility="gone" />
</RelativeLayout>
<TextView
android:id="@+id/tv_server_info"
android:layout_width="match_parent"
android:layout_height="43dp"
android:layout_below="@+id/line_serial"
android:layout_below="@+id/ll_sn"
android:background="@color/tv_bg"
android:paddingLeft="@dimen/dp_15"
android:paddingTop="18dp"
......
......@@ -63,7 +63,7 @@
android:layout_alignParentBottom="true"
android:background="@color/bg_button"
android:gravity="center"
android:onClick="@{()->presenter.processOrder()}"
android:onClick="@{()->presenter.process()}"
android:text="提交验收"
android:textColor="@color/white" />
......
......@@ -207,6 +207,16 @@
android:textColor="@color/cl_home_title_text_color"
android:textSize="@dimen/sp_15" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@id/tv_serial_num"
android:text="*"
android:textColor="#F74848"
android:textSize="@dimen/sp_15"
android:visibility="gone" />
<EditText
android:id="@+id/et_serial_num"
android:layout_width="match_parent"
......@@ -226,11 +236,38 @@
style="@style/line"
android:layout_below="@id/rl_serial_num" />
<RelativeLayout
android:id="@+id/ll_sn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/line_serial"
android:orientation="horizontal"
android:visibility="gone">
<ImageView
android:id="@+id/iv_sn"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginBottom="@dimen/dp_15"
android:layout_marginLeft="@dimen/dp_15"
android:layout_marginTop="@dimen/dp_15"
android:src="@drawable/icon_sn" />
<ImageView
android:id="@+id/iv_delete"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginLeft="95dp"
android:layout_marginTop="@dimen/dp_15"
android:src="@drawable/img_photo_delete"
android:visibility="gone" />
</RelativeLayout>
<TextView
android:id="@+id/tv_palyer_title"
android:layout_width="match_parent"
android:layout_height="43dp"
android:layout_below="@+id/line_serial"
android:layout_below="@+id/ll_sn"
android:background="@color/tv_bg"
android:paddingLeft="@dimen/dp_15"
android:paddingTop="18dp"
......@@ -497,7 +534,7 @@
android:layout_centerHorizontal="true"
android:background="@null"
android:hint="@string/input_up_door_money"
android:inputType="number"
android:inputType="numberDecimal"
android:text="@{presenter.mOrderField.doorPrice}"
android:textColor="@color/cl_home_title_text_color"
android:textColorHint="@color/cl_selector_hui"
......@@ -542,7 +579,7 @@
android:layout_centerHorizontal="true"
android:background="@null"
android:hint="@string/input_up_money"
android:inputType="number"
android:inputType="numberDecimal"
android:text="@{presenter.mOrderField.serverPrice}"
android:textColor="@color/cl_home_title_text_color"
android:textColorHint="@color/cl_selector_hui"
......@@ -587,7 +624,7 @@
android:layout_centerHorizontal="true"
android:background="@null"
android:hint="@string/input_cailiao_money"
android:inputType="number"
android:inputType="numberDecimal"
android:text="@{presenter.mOrderField.materialCost}"
android:textColor="@color/cl_home_title_text_color"
android:textColorHint="@color/cl_selector_hui"
......@@ -632,7 +669,7 @@
android:layout_centerHorizontal="true"
android:background="@null"
android:hint="@string/input_other_money"
android:inputType="number"
android:inputType="numberDecimal"
android:text="@{presenter.mOrderField.otherPrice}"
android:textColor="@color/cl_home_title_text_color"
android:textColorHint="@color/cl_selector_hui"
......
......@@ -7,6 +7,8 @@
<variable
name="presenter"
type="com.dayu.order.presenter.serverinfo.ServerInfoPresenter" />
<import type="android.view.View" />
</data>
<RelativeLayout
......@@ -24,9 +26,16 @@
<ImageView
android:id="@+id/receiving_back"
style="@style/title_image_back"
android:onClick="@{()->presenter.dumpBack()}"
android:onClick="@{()->presenter.dumpBack()}" />
/>
<TextView
android:id="@+id/tv_right_title"
style="@style/title_right_text"
android:onClick="@{()->presenter.callPhone()}"
android:text="@string/company_mobile"
android:textColor="#3faafc"
android:textSize="@dimen/dp_13.3"
android:visibility="@{presenter.mIsShowPhone?View.VISIBLE:View.GONE}" />
</RelativeLayout>
<ImageView
......
......@@ -31,9 +31,16 @@
<ImageView
android:id="@+id/receiving_back"
style="@style/title_image_back"
android:onClick="@{()->presenter.dumpBack()}"
android:onClick="@{()->presenter.dumpBack()}" />
/>
<TextView
android:id="@+id/tv_right_title"
style="@style/title_right_text"
android:onClick="@{()->presenter.callPhone()}"
android:text="@string/company_mobile"
android:textColor="#3faafc"
android:visibility="@{presenter.mIsShowPhone?View.VISIBLE:View.GONE}"
android:textSize="@dimen/dp_13.3" />
</RelativeLayout>
<ImageView style="@style/card_line" />
......
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout style="@style/title">
<ImageView
android:id="@+id/title_back"
style="@style/title_image_back" />
<TextView
style="@style/text_title"
android:text="电子签名" />
<TextView
android:id="@+id/title_right"
style="@style/title_right_text"
android:text="重新签名" />
</RelativeLayout>
<ImageView style="@style/card_line" />
<com.dayu.order.ui.view.HandWriteView
android:id="@+id/view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_margin="@dimen/dp_8"
android:background="@color/white"
android:layout_weight="1"
app:paintColor="@color/tv_cl"
app:paintMaxWidth="20px"
app:paintMinWidth="10px" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:gravity="center">
<TextView
android:id="@+id/tv_save"
android:layout_width="345dp"
android:layout_height="47dp"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
android:background="@color/bg_button"
android:text="完成签名"
android:gravity="center"
android:textColor="@color/white"
android:textSize="16sp" />
</LinearLayout>
</LinearLayout>
</layout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="HandWriteView">
<attr name="paintColor" format="color"/>
<attr name="paintMaxWidth" format="dimension"/>
<attr name="paintMinWidth" format="dimension"/>
</declare-styleable>
</resources>
\ No newline at end of file
......@@ -67,10 +67,19 @@ public class UserConstant {
*/
public final static String PERSON_LICENCES = "/api-user/" + "licenceInfo/accountId/{accountId}";
/**
* 获取个人资质.
*/
public final static String PERSON_LICENCE = "/api-user/" + "licenceInfo/{id}";
/**
* 身份证识别.
*/
public final static String IDENTITY_OCR = "/api-detect/" + "detect/cardOcr";
/**
* 活体检测.
*/
public final static String FACE_OCR = "/api-user/" + "/accountExt/engineerMegLiveVerify";
}
......@@ -12,9 +12,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cl_white"
android:orientation="vertical"
>
android:orientation="vertical">
<RelativeLayout
style="@style/title"
......
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 sign in to comment