Commit 4ff4f6af by luofan

处理工单去除上传照片,增加上传视频,服务记录查看签名改为验收视频

parent b6358e44
......@@ -41,9 +41,9 @@ public class CameraActivity extends AppCompatActivity {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
if (getIntent().hasExtra(Constants.IS_SOP_VIDEO)){
if (getIntent().hasExtra(Constants.IS_SOP_VIDEO)) {
setContentView(R.layout.activity_camera_sop);
}else {
} else {
setContentView(R.layout.activity_camera);
}
jCameraView = (JCameraView) findViewById(R.id.jcameraview);
......@@ -58,7 +58,12 @@ public class CameraActivity extends AppCompatActivity {
jCameraView.setFeatures(jCameraView.BUTTON_STATE_BOTH);
jCameraView.setTip(getResources().getString(R.string.moment_take_photo));
}
if (getIntent().hasExtra(Constants.MIN_TIME)) {
int min = getIntent().getIntExtra(Constants.MIN_TIME, 1500);
int max = getIntent().getIntExtra(Constants.MAX_TIME, 10 * 1000);
jCameraView.setDuration(max);
jCameraView.setMinDuration(min);
}
jCameraView.setErrorLisenter(new ErrorListener() {
@Override
public void onError() {
......
......@@ -270,6 +270,8 @@ public class Constants {
public static final int CAMERA_VIDEO = 102;
public static final int MINIMUM_COMPRESSSIZE = 10*1024; //图片压缩大小临界值
public static final HashMap<Integer,List<TreeAddressBean>> treeAddressMap = new HashMap<>(); //地址数据
public static final String MIN_TIME ="min_time";
public static final String MAX_TIME ="max_time";
/**
* 主动申请备件.
......
......@@ -55,6 +55,14 @@ public class MediaChooseUtils {
}
/**
* 选择单个视频
*/
public static void chooseOneVideo(Activity activity,int videoLength,int code) {
PictureSelectionModel selector = getPictureSelectionModel(activity, PictureMimeType.ofVideo(),1, videoLength);
selector.isCamera(false).forResult(code);
}
/**
* 选择多个视频
*/
public static void chooseVideos(Activity activity,int maxCount,int videoLength) {
......
......@@ -75,7 +75,7 @@
<string name="order_serve_type">服务类型</string>
<string name="order_photo_text">服务照片(故障及解决照片,限5张)</string>
<!--<string name="order_hint">故障现象或服务需求描述,及解决方案描述,若没有解决请说明原因(最多200字)。</string>-->
<string name="order_hint">请认真记录本次服务过程和最终完成情况,如有重要事项请详细说明。作为派单方和客户事后调查服务质量的重要依据。(最多200字)</string>
<string name="order_hint">完成服务任务后,请拍摄并上传10秒现场视频,以供现场用户和派单方商家验收。</string>
<string name="tv_about">关于我们</string>
<string name="tv_about_us">扫码关注我们的微信服务号</string>
<string name="tv_about_us_text">&#160;&#160;&#160;&#160;传统低效的客服体系,正在成为厂商、服务商、消费者的包袱。大鱼准备以科技之力进行客服产业革命。运用Ai、云和大数据等技术,连接厂商、销售商、服务商和消费者,打造去中心化的智能共享客户服务解决方案。</string>
......@@ -388,7 +388,7 @@
<string name="check_initial_state">查看初始状态</string>
<string name="reassignment_reason">改派原因</string>
<string name="cancle_reason">取消原因</string>
<string name="check_reason">查看结果</string>
<string name="check_reason">服务记录</string>
<string name="check_accept">查看验收</string>
<string name="check_location">查看位置</string>
<string name="part_record">备件记录</string>
......
......@@ -341,6 +341,10 @@ public class CaptureLayout extends FrameLayout {
btn_capture.setDuration(duration);
}
public void setMinDuration(int duration) {
btn_capture.setMinDuration(duration);
}
public void setButtonFeatures(int state) {
btn_capture.setButtonFeatures(state);
}
......
......@@ -106,6 +106,7 @@ public class JCameraView extends FrameLayout implements CameraInterface.CameraOp
private int iconLeft = 0; //左图标
private int iconRight = 0; //右图标
private int duration = 0; //录制时间
private int min_duration = 0; //最短录制时间
//缩放梯度
private int zoomGradient = 0;
......@@ -144,7 +145,12 @@ public class JCameraView extends FrameLayout implements CameraInterface.CameraOp
this.duration = duration;
if (mCaptureLayout != null)
mCaptureLayout.setDuration(duration);
}
public void setMinDuration(int duration) {
this.min_duration = duration;
if (mCaptureLayout != null)
mCaptureLayout.setMinDuration(min_duration);
}
private void initData() {
......
......@@ -758,6 +758,15 @@ public class OrderDetail implements Serializable {
private double latitude;
private double longitude;
private String address;
private String shortVideoUrl;
public String getShortVideoUrl() {
return shortVideoUrl;
}
public void setShortVideoUrl(String shortVideoUrl) {
this.shortVideoUrl = shortVideoUrl;
}
public String getAddress() {
return address;
......
......@@ -33,11 +33,13 @@ public interface MultiProcessOrderContract {
String getSnNumbers();
void setSnNumbers(String snStrs);
void showSnView(boolean show);
String getVideo();
}
abstract class Presenter extends BasePresenter<View> {
public abstract void commitOrder(List<String> imageUrl, List<String> snImages, int id, String info);
public abstract void commitOrder(List<String> imageUrl, List<String> snImages, int id, String info,String videoUrl);
public abstract void commitPhoto();
......
......@@ -58,6 +58,7 @@ public class MultiProcessOrderPresenter extends MultiProcessOrderContract.Presen
private String mPhone;
private int mKaId;
private int sopOrderVersion;
private String videoUrl; //视频上传成功后的地址
@Override
public void onAttached() {
......@@ -91,8 +92,8 @@ public class MultiProcessOrderPresenter extends MultiProcessOrderContract.Presen
// }
}
private void commitOrder(List<String> list, List<String> snList) {
commitOrder(list, snList, mSpu.getId(), mInfo.get());
private void commitOrder(List<String> list, List<String> snList,String videoUrl) {
commitOrder(list, snList, mSpu.getId(), mInfo.get(),videoUrl);
PictureFileUtils.deleteCacheDirFile(BaseApplication.getContext());
}
......@@ -120,12 +121,13 @@ public class MultiProcessOrderPresenter extends MultiProcessOrderContract.Presen
}
@Override
public void commitOrder(List<String> imageUrl, List<String> snImages, int id, String info) {
public void commitOrder(List<String> imageUrl, List<String> snImages, int id, String info,String videoUrl) {
HashMap<String, Object> params = new HashMap<>();
params.put("customerCheckComment", info);
params.put("id", id);
params.put("brandName", mBrandName.get());
params.put("sn", mView.getSnNumbers());
params.put("shortVideoUrl", videoUrl);
//照片上传
if (imageUrl != null) {
StringBuilder str = new StringBuilder();
......@@ -205,22 +207,42 @@ public class MultiProcessOrderPresenter extends MultiProcessOrderContract.Presen
ToastUtils.showShortToast(R.string.sn_not_null);
return;
}
if(TextUtils.isEmpty(mView.getVideo())){
ToastUtils.showShortToast("视频不能为空");
return;
}
mView.showDialog();
MultipartBody.Part[] parts;
List<String> imageUrl = mView.getImages();
if (imageUrl != null && imageUrl.size() > 0) {
parts = packPhoto(imageUrl);
if (parts.length == 0) {
commitOrder(mHttpUrl, null);
} else {
BaseApiFactory.uploadPhoto(parts).subscribe(baseObserver(list -> {
list.addAll(0, mHttpUrl);
commitOrder(list, null);
}));
uploadVideo(mView.getVideo());
// MultipartBody.Part[] parts;
// List<String> imageUrl = mView.getImages();
// if (imageUrl != null && imageUrl.size() > 0) {
// parts = packPhoto(imageUrl);
// if (parts.length == 0) {
// commitOrder(mHttpUrl, null);
// } else {
// BaseApiFactory.uploadPhoto(parts).subscribe(baseObserver(list -> {
// list.addAll(0, mHttpUrl);
// commitOrder(list, null);
// }));
// }
// } else {
// commitOrder(null, null);
// }
}
private void uploadVideo(String videoPath) {
mView.showDialog();
File file = new File(videoPath);
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("fileUpload", file.getName(), requestFile);
BaseApiFactory.uploadVideo(body).subscribe(baseObserver(data -> {
if (!TextUtils.isEmpty(data)) {
videoUrl = data;
commitOrder(null, null,videoUrl);
} else {
commitOrder(null, null);
mView.showToast("视频上传失败");
}
}));
}
......
package com.dayu.order.ui.activity;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
......@@ -12,8 +14,10 @@ import android.widget.EditText;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.dayu.base.ui.activity.BaseActivity;
import com.dayu.base.ui.activity.CameraActivity;
import com.dayu.base.ui.adapter.PhotoViewAdapter;
import com.dayu.base.ui.adapter.SpacesItemDecoration;
import com.dayu.common.Constants;
import com.dayu.order.R;
import com.dayu.order.common.SubmitCheckEvent;
import com.dayu.order.databinding.ActivityMultiProcessOrderBinding;
......@@ -21,7 +25,10 @@ import com.dayu.order.presenter.multiprocessorder.MultiProcessOrderContract;
import com.dayu.order.presenter.multiprocessorder.MultiProcessOrderPresenter;
import com.dayu.utils.CommonUtils;
import com.dayu.utils.LogUtils;
import com.dayu.utils.MPermissionUtils;
import com.dayu.utils.MediaChooseUtils;
import com.dayu.utils.ToastUtils;
import com.dayu.widgets.TextDialog;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
import com.luck.picture.lib.PictureSelector;
......@@ -30,8 +37,15 @@ import com.luck.picture.lib.entity.LocalMedia;
import org.greenrobot.eventbus.Subscribe;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import cn.jzvd.Jzvd;
import cn.jzvd.JzvdStd;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
/**
* Created by luofan
......@@ -47,8 +61,8 @@ public class MultiProcessOrderActivity extends BaseActivity<MultiProcessOrderPre
private ArrayList<String> mSnNumbers = new ArrayList<>();
private BaseQuickAdapter<Integer, BaseViewHolder> snAdapter;
private int scanSnPos;
private PhotoViewAdapter mAdapter;
private String videoPath;
@Override
public int getLayoutId() {
......@@ -96,9 +110,58 @@ public class MultiProcessOrderActivity extends BaseActivity<MultiProcessOrderPre
}
};
mBind.rvSn.setAdapter(snAdapter);
// } else {
// snAdapter.notifyDataSetChanged();
// }
mBind.rlVideo.setOnClickListener(v -> chooseVideo());
mBind.ivDelete.setOnClickListener(v -> {
videoPath = "";
setVideoView();
});
mBind.jzVideo.setOnClickListener(v -> showToast("click"));
}
protected void chooseVideo() {
if (TextUtils.isEmpty(videoPath)) {
showVideoDailog();
}
}
//选中视频弹框
private void showVideoDailog() {
List<String> list = new ArrayList<>();
list.add("拍摄");
list.add("本地选择");
TextDialog.getInstance().showBottomDialog(mActivity, list, pos -> {
if (pos == 0) {
recordVideo();
} else {
MediaChooseUtils.chooseOneVideo(this, 10,PictureConfig.TYPE_VIDEO);
}
});
}
//录制视频
private void recordVideo() {
String[] mPerArr = new String[]{Manifest.permission.RECORD_AUDIO};
MPermissionUtils.requestPermissionsResult(mActivity, 1, mPerArr, new MPermissionUtils.OnPermissionListener() {
@SuppressLint("CheckResult")
@Override
public void onPermissionGranted() {
Observable.timer(1000, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(aLong -> {
Intent intent = new Intent(MultiProcessOrderActivity.this, CameraActivity.class);
intent.putExtra(Constants.ONLY_VIDEO, true);
intent.putExtra(Constants.MIN_TIME, 5*1000);
intent.putExtra(Constants.MAX_TIME, 10*1000);
startActivityForResult(intent, Constants.CAMERA_CODE);
});
}
@Override
public void onPermissionDenied() {
ToastUtils.showShortToast(R.string.request_permission_failure);
}
});
}
//跳转到扫描页面
......@@ -186,7 +249,23 @@ public class MultiProcessOrderActivity extends BaseActivity<MultiProcessOrderPre
mAdapter.setData(mImages);
}
break;
case PictureConfig.TYPE_VIDEO:
List<LocalMedia> mSelectList = PictureSelector.obtainMultipleResult(data);
if (mSelectList != null) {
videoPath = mSelectList.get(0).getPath();
File file = new File(videoPath);
if (file.length() > 500 * 1024 * 1024) {
showToast("视频文件不能大于500M");
videoPath = "";
} else {
setVideoView();
}
}
break;
}
} else if (resultCode == Constants.CAMERA_VIDEO) {
videoPath = data.getStringExtra("videoPath");
setVideoView();
}
}
......@@ -209,7 +288,7 @@ public class MultiProcessOrderActivity extends BaseActivity<MultiProcessOrderPre
mSnItems.add(mSnItems.size() + 1);
setSnAdapter();
}
LogUtils.e("SnNumbers_set: " + mSnNumbers.size()+" "+mSnItems.size());
LogUtils.e("SnNumbers_set: " + mSnNumbers.size() + " " + mSnItems.size());
}
@Override
......@@ -219,7 +298,7 @@ public class MultiProcessOrderActivity extends BaseActivity<MultiProcessOrderPre
mBind.rvSn.setVisibility(View.VISIBLE);
mBind.tvAddSn.setVisibility(View.VISIBLE);
mBind.rvSn.setLayoutManager(new LinearLayoutManager(this));
if (snAdapter == null){
if (snAdapter == null) {
mSnItems.add(1);
setSnAdapter();
}
......@@ -238,9 +317,27 @@ public class MultiProcessOrderActivity extends BaseActivity<MultiProcessOrderPre
}
}
@Override
public String getVideo() {
return videoPath;
}
//设置视频布局显示状态
protected void setVideoView() {
if (TextUtils.isEmpty(videoPath)) {
mBind.jzVideo.setVisibility(View.GONE);
mBind.ivDelete.setVisibility(View.GONE);
} else {
mBind.ivDelete.setVisibility(View.VISIBLE);
mBind.jzVideo.setVisibility(View.VISIBLE);
mBind.jzVideo.setUp(videoPath, "");
CommonUtils.setVideoThumb(mActivity, mBind.jzVideo, videoPath);
}
}
//是否包含空数据
private boolean contiansEmpty(ArrayList<String> mSnNumbers) {
for (String s : mSnNumbers){
for (String s : mSnNumbers) {
if (TextUtils.isEmpty(s))
return true;
}
......@@ -248,7 +345,21 @@ public class MultiProcessOrderActivity extends BaseActivity<MultiProcessOrderPre
}
@Subscribe
public void afterCheck(SubmitCheckEvent event){
public void afterCheck(SubmitCheckEvent event) {
finish();
}
@Override
public void onPause() {
super.onPause();
JzvdStd.goOnPlayOnPause();
}
@Override
public void onBackPressed() {
if (!Jzvd.backPress()) {
super.onBackPressed();
}
}
}
package com.dayu.order.ui.adapter;
import android.content.Intent;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.View;
import com.dayu.base.ui.activity.VideoPreviewActivty;
import com.dayu.base.ui.adapter.CoreAdapter;
import com.dayu.common.Constants;
import com.dayu.order.R;
import com.dayu.order.api.protocol.OrderDetail;
import com.dayu.order.databinding.ServeDatailsItemBinding;
......@@ -12,6 +15,10 @@ import com.dayu.order.presenter.orderserver.OrderServerPresenter;
import com.dayu.utils.LogUtils;
import com.dayu.utils.UIUtils;
import java.util.ArrayList;
import cn.jzvd.JzvdStd;
/**
* Created by luofan
* on 2018/4/23.
......@@ -100,7 +107,7 @@ public class OrderServerAdapter extends CoreAdapter<OrderDetail.RecordBean, Serv
}
if (UIUtils.getString(R.string.user_chcek).equals(item.getOperation())) {
holder.serverCheck.setText(UIUtils.getString(R.string.check_signature));
holder.serverCheck.setText("验收视频");
holder.serverCheck.setVisibility(View.VISIBLE);
holder.serverTimeComment.setVisibility(View.GONE);
}
......@@ -116,7 +123,14 @@ public class OrderServerAdapter extends CoreAdapter<OrderDetail.RecordBean, Serv
holder.serverCheck.setOnClickListener(v -> presenter.dumpCheckContent(position));
}
if (UIUtils.getString(R.string.user_chcek).equals(item.getOperation())) {
holder.serverCheck.setOnClickListener(v -> presenter.dumpCheckSignature(position));
holder.serverCheck.setOnClickListener(v -> {
ArrayList<String> list = new ArrayList<>();
list.add(item.getShortVideoUrl());
Intent intent = new Intent(mContext, VideoPreviewActivty.class);
intent.putStringArrayListExtra(Constants.BUNDLE_KEY_ID, list);
mContext.startActivity(intent);
});
}
if (UIUtils.getString(R.string.order_remark).equals(item.getCommentName())) {
holder.serverCheck.setOnClickListener(v -> presenter.dumpCheckContent(position));
......
package com.dayu.order.ui.fragment;
import android.os.Bundle;
import android.view.View;
import com.dayu.base.ui.activity.ImgGalleryActivty;
import com.dayu.base.ui.fragment.BaseFragment;
......@@ -11,6 +12,7 @@ import com.dayu.order.databinding.FragmentOrderServeBinding;
import com.dayu.order.presenter.orderserver.OrderServerContract;
import com.dayu.order.presenter.orderserver.OrderServerPresenter;
import com.dayu.order.ui.adapter.OrderServerAdapter;
import com.dayu.utils.CommonUtils;
import com.umeng.analytics.MobclickAgent;
/**
......
......@@ -40,10 +40,11 @@
android:screenOrientation="portrait" />
<activity
android:name=".ui.activity.OrderDetailsActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:launchMode="singleTask"
android:windowSoftInputMode="adjustResize"
android:screenOrientation="portrait" />
android:configChanges="orientation|screenSize|keyboardHidden"
android:screenOrientation="portrait"
/>
<activity
android:name=".ui.activity.ReturnPartNewActivity"
android:screenOrientation="portrait" />
......@@ -72,8 +73,8 @@
<activity
android:name=".ui.activity.MultiProcessOrderActivity"
android:hardwareAccelerated="true"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize" />
android:configChanges="orientation|screenSize|keyboardHidden"
android:screenOrientation="portrait" />
<activity
android:name=".ui.activity.SignatureActivity"
android:screenOrientation="landscape" />
......
......@@ -239,50 +239,60 @@
android:textColor="@color/tv_cl"
android:textSize="14sp" />
<RelativeLayout
<LinearLayout
android:id="@+id/time_Three"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_server_info"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:background="@color/cl_white">
android:background="@color/cl_white"
android:orientation="vertical">
<TextView
android:id="@+id/time_subscribe_remark"
<RelativeLayout
android:id="@+id/rl_video"
android:layout_width="match_parent"
android:layout_height="180dp"
android:layout_margin="10dp"
android:background="@drawable/bg_input_gray_react">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_13.3"
android:layout_marginTop="@dimen/dp_27"
android:text="@string/tv_work_order_five"
android:textColor="@color/cl_home_title_text_color"
android:textSize="@dimen/sp_15"
android:visibility="gone" />
android:layout_centerInParent="true"
android:src="@drawable/icon_video"
/>
<EditText
android:id="@+id/et_serve_info"
<cn.jzvd.JzvdStd
android:id="@+id/jz_video"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_147"
android:layout_marginLeft="@dimen/dp_8"
android:layout_marginTop="@dimen/dp_17"
android:layout_marginRight="@dimen/dp_8"
android:layout_toRightOf="@id/time_subscribe_remark"
android:background="@drawable/subscribe_time_shape"
android:gravity="top"
android:hint="@string/order_hint"
android:maxEms="200"
android:padding="10dp"
android:text="@={presenter.mInfo}"
android:textColor="@color/cl_home_title_text_color"
android:textColorHint="@color/cl_selector_hui"
android:textSize="@dimen/sp_13.3" />
android:layout_height="match_parent"
android:visibility="gone" />
<ImageView
android:id="@+id/iv_delete"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:src="@drawable/img_photo_delete"
android:visibility="gone" />
</RelativeLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="@string/order_hint" />
</LinearLayout>
<RelativeLayout
android:id="@+id/photo_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:layout_below="@id/time_Three">
<TextView
......
......@@ -110,5 +110,10 @@
android:layout_height="match_parent"
android:layout_weight="1" />
<cn.jzvd.JzvdStd
android:visibility="gone"
android:id="@+id/jz_video"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</layout>
\ No newline at end of file
......@@ -33,6 +33,5 @@
app:itemType="@layout/serve_datails_item"
android:layout_marginBottom="@dimen/dp_10"
/>
</RelativeLayout>
</layout>
\ No newline at end of file
......@@ -26,7 +26,7 @@
<string name="no_str"></string>
<string name="yes_str"></string>
<string name="collect_device_info">收集设备信息</string>
<string name="record_service_result">记录服务结果</string>
<string name="record_service_result">上传完工验收视频</string>
<string name="pls_fill_pre_sn">请先补全上面的序列号</string>
<string name="take_order_failure">抢单失败</string>
<string name="take_oreder_success_tosee">接单成功,请移至待预约列表查看</string>
......
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