Commit ec787706 authored by hywang's avatar hywang

1.增加锡盟临时打标功能

parent 0cd584fb
......@@ -122,6 +122,22 @@
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize" />
<activity
android:name=".ui.cattle.activity.CattleMainActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize" />
<activity
android:name=".ui.cattle.activity.CattleMarkActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize" />
<activity
android:name=".ui.cattle.activity.CattleUploadActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize" />
</application>
</manifest>
\ No newline at end of file
......@@ -69,6 +69,9 @@ public class Configs {
public static PrinterInstance myPrinter;
//是否是锡盟临时项目
public static boolean isCattle = true;
// public static boolean ISCONNECTED;
public static String packageName(Context context) {
......
......@@ -7,6 +7,7 @@ import androidx.annotation.NonNull;
import com.phlx.wool.data.http.HttpDataSource;
import com.phlx.wool.data.local.LocalDataSource;
import com.phlx.wool.db.DbUtil;
import com.phlx.wool.entity.CattleLabelEntity;
import com.phlx.wool.entity.DivisionEntity;
import com.phlx.wool.entity.DivisionEntityDao;
import com.phlx.wool.entity.EntryRegistrationEntity;
......@@ -140,6 +141,11 @@ public class Repository extends BaseModel implements HttpDataSource, LocalDataSo
return mHttpDataSource.submitHarmless(body);
}
@Override
public Observable<CattleResponse<List<CattleLabelEntity>>> uploadCattleMark(RequestBody body) {
return mHttpDataSource.uploadCattleMark(body);
}
@Override
public void saveUserName(String userName) {
......
......@@ -8,6 +8,9 @@ import androidx.annotation.VisibleForTesting;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import com.phlx.wool.ui.cattle.vm.CattleMainVM;
import com.phlx.wool.ui.cattle.vm.CattleMarkVM;
import com.phlx.wool.ui.cattle.vm.CattleUploadVM;
import com.phlx.wool.ui.inventory.InventoryVM;
import com.phlx.wool.ui.login.LoginVM;
import com.phlx.wool.ui.main.MainVM;
......@@ -94,6 +97,17 @@ public class VMFactory extends ViewModelProvider.NewInstanceFactory {
return (T) new VillusGaugeVM(mApplication, repository);
}else if (modelClass.isAssignableFrom(SlaughterEntryVM.class)) {
return (T) new SlaughterEntryVM(mApplication, repository);
//锡盟临时项目
}else if (modelClass.isAssignableFrom(CattleMainVM.class)) {
return (T) new CattleMainVM(mApplication, repository);
}else if (modelClass.isAssignableFrom(CattleMarkVM.class)) {
return (T) new CattleMarkVM(mApplication, repository);
}else if (modelClass.isAssignableFrom(CattleUploadVM.class)) {
return (T) new CattleUploadVM(mApplication, repository);
}
throw new IllegalArgumentException("Unknown ViewModel class: " + modelClass.getName());
}
......
......@@ -2,6 +2,7 @@ package com.phlx.wool.data.http;
import com.phlx.wool.entity.CattleLabelEntity;
import com.phlx.wool.entity.DivisionEntity;
import com.phlx.wool.entity.EntryRegistrationEntity;
import com.phlx.wool.entity.Harmless;
......@@ -133,5 +134,14 @@ public interface ApiService {
@Headers({"Content-Type: application/json", "Accept: application/json"})
@POST("/app/innocuitymanagerecord/saveList")
Observable<CattleResponse<List<Harmless>>> submitHarmless(@Body RequestBody body);
/**
* 锡盟补打上传
*/
@Headers({"Content-Type: application/json", "Accept: application/json"})
@POST("/dataServer/uploadCattleresume")
Observable<CattleResponse<List<CattleLabelEntity>>> uploadCattleMark(@Body RequestBody body);
}
......@@ -2,6 +2,7 @@ package com.phlx.wool.data.http;
import com.phlx.wool.entity.CattleLabelEntity;
import com.phlx.wool.entity.DivisionEntity;
import com.phlx.wool.entity.EntryRegistrationEntity;
import com.phlx.wool.entity.Harmless;
......@@ -105,4 +106,9 @@ public interface HttpDataSource {
*/
Observable<CattleResponse<List<Harmless>>> submitHarmless(@Body RequestBody body);
/**
* 锡盟补打上传
*/
Observable<CattleResponse<List<CattleLabelEntity>>> uploadCattleMark(@Body RequestBody body);
}
......@@ -2,6 +2,7 @@ package com.phlx.wool.data.http;
import com.phlx.wool.entity.CattleLabelEntity;
import com.phlx.wool.entity.DivisionEntity;
import com.phlx.wool.entity.EntryRegistrationEntity;
import com.phlx.wool.entity.Harmless;
......@@ -122,5 +123,10 @@ public class HttpDataSourceImpl implements HttpDataSource {
return apiService.submitHarmless(body);
}
@Override
public Observable<CattleResponse<List<CattleLabelEntity>>> uploadCattleMark(RequestBody body) {
return apiService.uploadCattleMark(body);
}
}
package com.phlx.wool.entity;
import android.os.Parcel;
import android.os.Parcelable;
import androidx.databinding.BaseObservable;
import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Generated;
/**
* 锡盟临时录入数据bean
*/
@Entity
public class CattleLabelEntity extends BaseObservable implements Parcelable {
/**
* 主键
*/
@Id
private String id;
/**
* 耳标号
*/
private String registrationNo;
/**
* 个体号
*/
private String individualNo;
/**
* 出生日期
*/
private String birthdate;
/**
* 血统
*/
private String ancestryId;
/**
* 性别
*/
private String sex;
/**
* 体重
*/
private String weight;
/**
* 胸围
*/
private String bust;
/**
* 管围
*/
private String tubeCircumference;
/**
* 体高
*/
private String bodyHeight;
/**
* 体斜长
*/
private String bodyObliqueLength;
/**
* 照片路径
*/
private String markImgPath;
/**
* 照片
*/
private String photo;
/**
* 状态(育种,育成,成年,淘汰,出售)
*/
private String status;
/**
* 时间戳
*/
private String inputTime;
/**
* 备用
*/
private String spare1;
/**
* 备用
*/
private String spare2;
/**
* 备用
*/
private String spare3;
/**
* 备用
*/
private String spare4;
/** 创建者 */
private String createBy;
/** 创建时间 */
private String createTime;
public CattleLabelEntity() {
}
protected CattleLabelEntity(Parcel in) {
id = in.readString();
registrationNo = in.readString();
individualNo = in.readString();
birthdate = in.readString();
ancestryId = in.readString();
sex = in.readString();
weight = in.readString();
bust = in.readString();
tubeCircumference = in.readString();
bodyHeight = in.readString();
bodyObliqueLength = in.readString();
markImgPath = in.readString();
photo = in.readString();
status = in.readString();
inputTime = in.readString();
spare1 = in.readString();
spare2 = in.readString();
spare3 = in.readString();
spare4 = in.readString();
createBy = in.readString();
createTime = in.readString();
}
@Generated(hash = 1246556714)
public CattleLabelEntity(String id, String registrationNo, String individualNo, String birthdate,
String ancestryId, String sex, String weight, String bust, String tubeCircumference,
String bodyHeight, String bodyObliqueLength, String markImgPath, String photo,
String status, String inputTime, String spare1, String spare2, String spare3, String spare4,
String createBy, String createTime) {
this.id = id;
this.registrationNo = registrationNo;
this.individualNo = individualNo;
this.birthdate = birthdate;
this.ancestryId = ancestryId;
this.sex = sex;
this.weight = weight;
this.bust = bust;
this.tubeCircumference = tubeCircumference;
this.bodyHeight = bodyHeight;
this.bodyObliqueLength = bodyObliqueLength;
this.markImgPath = markImgPath;
this.photo = photo;
this.status = status;
this.inputTime = inputTime;
this.spare1 = spare1;
this.spare2 = spare2;
this.spare3 = spare3;
this.spare4 = spare4;
this.createBy = createBy;
this.createTime = createTime;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(id);
dest.writeString(registrationNo);
dest.writeString(individualNo);
dest.writeString(birthdate);
dest.writeString(ancestryId);
dest.writeString(sex);
dest.writeString(weight);
dest.writeString(bust);
dest.writeString(tubeCircumference);
dest.writeString(bodyHeight);
dest.writeString(bodyObliqueLength);
dest.writeString(markImgPath);
dest.writeString(photo);
dest.writeString(status);
dest.writeString(inputTime);
dest.writeString(spare1);
dest.writeString(spare2);
dest.writeString(spare3);
dest.writeString(spare4);
dest.writeString(createBy);
dest.writeString(createTime);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<CattleLabelEntity> CREATOR = new Creator<CattleLabelEntity>() {
@Override
public CattleLabelEntity createFromParcel(Parcel in) {
return new CattleLabelEntity(in);
}
@Override
public CattleLabelEntity[] newArray(int size) {
return new CattleLabelEntity[size];
}
};
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getRegistrationNo() {
return registrationNo;
}
public void setRegistrationNo(String registrationNo) {
this.registrationNo = registrationNo;
}
public String getIndividualNo() {
return individualNo;
}
public void setIndividualNo(String individualNo) {
this.individualNo = individualNo;
}
public String getBirthdate() {
return birthdate;
}
public void setBirthdate(String birthdate) {
this.birthdate = birthdate;
}
public String getAncestryId() {
return ancestryId;
}
public void setAncestryId(String ancestryId) {
this.ancestryId = ancestryId;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getWeight() {
return weight;
}
public void setWeight(String weight) {
this.weight = weight;
}
public String getBust() {
return bust;
}
public void setBust(String bust) {
this.bust = bust;
}
public String getTubeCircumference() {
return tubeCircumference;
}
public void setTubeCircumference(String tubeCircumference) {
this.tubeCircumference = tubeCircumference;
}
public String getBodyHeight() {
return bodyHeight;
}
public void setBodyHeight(String bodyHeight) {
this.bodyHeight = bodyHeight;
}
public String getBodyObliqueLength() {
return bodyObliqueLength;
}
public void setBodyObliqueLength(String bodyObliqueLength) {
this.bodyObliqueLength = bodyObliqueLength;
}
public String getMarkImgPath() {
return markImgPath;
}
public void setMarkImgPath(String markImgPath) {
this.markImgPath = markImgPath;
}
public String getPhoto() {
return photo;
}
public void setPhoto(String photo) {
this.photo = photo;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getInputTime() {
return inputTime;
}
public void setInputTime(String inputTime) {
this.inputTime = inputTime;
}
public String getSpare1() {
return spare1;
}
public void setSpare1(String spare1) {
this.spare1 = spare1;
}
public String getSpare2() {
return spare2;
}
public void setSpare2(String spare2) {
this.spare2 = spare2;
}
public String getSpare3() {
return spare3;
}
public void setSpare3(String spare3) {
this.spare3 = spare3;
}
public String getSpare4() {
return spare4;
}
public void setSpare4(String spare4) {
this.spare4 = spare4;
}
public String getCreateBy() {
return createBy;
}
public void setCreateBy(String createBy) {
this.createBy = createBy;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
@Override
public String toString() {
return "CattleLabelEntity{" +
"id='" + id + '\'' +
", registrationNo='" + registrationNo + '\'' +
", individualNo='" + individualNo + '\'' +
", birthdate='" + birthdate + '\'' +
", ancestryId='" + ancestryId + '\'' +
", sex='" + sex + '\'' +
", weight='" + weight + '\'' +
", bust='" + bust + '\'' +
", tubeCircumference='" + tubeCircumference + '\'' +
", bodyHeight='" + bodyHeight + '\'' +
", bodyObliqueLength='" + bodyObliqueLength + '\'' +
", markImgPath='" + markImgPath + '\'' +
", photo='" + photo + '\'' +
", status='" + status + '\'' +
", inputTime='" + inputTime + '\'' +
", spare1='" + spare1 + '\'' +
", spare2='" + spare2 + '\'' +
", spare3='" + spare3 + '\'' +
", spare4='" + spare4 + '\'' +
", createBy='" + createBy + '\'' +
", createTime='" + createTime + '\'' +
'}';
}
}
......@@ -48,11 +48,13 @@ public class RetrofitClient {
private static final int CACHE_TIMEOUT = 10 * 1024 * 1024;
//服务端根路径
public static String baseUrl =
"58.18.92.126"
// "192.168.8.189"
// "58.18.92.126"//阿拉善正式
"39.101.170.186"//锡盟正式
// "192.168.8.189"//张敏
;
public static String port =
"899"
// "899"//阿拉善正式
"8999"//锡盟正式/ 张敏
// "80"
;
......
package com.phlx.wool.ui.cattle.activity;
import android.os.Bundle;
import androidx.lifecycle.ViewModelProviders;
import com.phlx.wool.R;
import com.phlx.wool.data.VMFactory;
import com.phlx.wool.databinding.ActivityCattleMainBinding;
import com.phlx.wool.ui.base.BaseActivity;
import com.phlx.wool.ui.cattle.vm.CattleMainVM;
import com.phlx.wool.ui.inventory.InventoryVM;
import me.tatarka.bindingcollectionadapter2.BR;
public class CattleMainActivity extends BaseActivity<ActivityCattleMainBinding, CattleMainVM> {
@Override
public int initContentView(Bundle savedInstanceState) {
return R.layout.activity_cattle_main;
}
@Override
public int initVariableId() {
return BR.viewModel;
}
@Override
public void initParam() {
super.initParam();
}
@Override
public CattleMainVM initViewModel() {
VMFactory factory = VMFactory.getInstance(getApplication());
return ViewModelProviders.of(this, factory).get(CattleMainVM.class);
}
@Override
public void initData() {
super.initData();
}
@Override
public void initViewObservable() {
super.initViewObservable();
}
}
package com.phlx.wool.ui.cattle.activity;
import android.Manifest;
import android.app.Dialog;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.text.InputType;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.bigkoo.pickerview.builder.TimePickerBuilder;
import com.bigkoo.pickerview.listener.OnTimeSelectChangeListener;
import com.bigkoo.pickerview.listener.OnTimeSelectListener;
import com.bigkoo.pickerview.view.TimePickerView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;
import com.phlx.wool.Configs;
import com.phlx.wool.R;
import com.phlx.wool.data.VMFactory;
import com.phlx.wool.databinding.ActivityCattleMarkBinding;
import com.phlx.wool.ui.base.BaseActivity;
import com.phlx.wool.ui.cattle.vm.CattleMarkVM;
import com.phlx.wool.ui.main.MainActivity;
import com.phlx.wool.ui.slaughter.SlaughterEntryActivity;
import com.phlx.wool.ui.slaughter.vm.SlaughterEntryVM;
import com.phlx.wool.util.BaseImageUtils;
import com.phlx.wool.util.ImagePicker;
import com.tbruyelle.rxpermissions2.RxPermissions;
import java.util.Date;
import io.reactivex.functions.Consumer;
import me.goldze.mvvmhabit.utils.ToastUtils;
import me.tatarka.bindingcollectionadapter2.BR;
public class CattleMarkActivity extends BaseActivity<ActivityCattleMarkBinding, CattleMarkVM> {
private ImagePicker markImagePicker;
private TimePickerView pvTime;
@Override
public int initContentView(Bundle savedInstanceState) {
return R.layout.activity_cattle_mark;
}
@Override
public int initVariableId() {
return BR.viewModel;
}
@Override
public void initParam() {
super.initParam();
}
@Override
public CattleMarkVM initViewModel() {
VMFactory factory = VMFactory.getInstance(getApplication());
return ViewModelProviders.of(this, factory).get(CattleMarkVM.class);
}
@Override
public void initData() {
super.initData();
viewModel.initToolbar();
initTimePicker();
if (markImagePicker == null) {
markImagePicker = new ImagePicker(CattleMarkActivity.this);
markImagePicker.setOnImagePickerListener(new ImagePicker.OnImagePickerListener() {
@Override
public void onSuccess(String path) {
Bitmap bitmap = BaseImageUtils.decodeBitmap(path, CattleMarkActivity.this);
// Bitmap bitmap2 = BaseImageUtils.rotateBitmapByDegree(bitmap, BaseImageUtils.getBitmapDegree(path));
BaseImageUtils.saveBitmapToSDCard(bitmap, viewModel.getMarkImgUrl());
viewModel.entity.setMarkImgPath(viewModel.getMarkImgUrl());
Glide.with(CattleMarkActivity.this)
.load(viewModel.getMarkImgUrl())
.apply(
new RequestOptions()
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.error(R.drawable.no_image)
.fallback(R.drawable.no_image)
)
.into(binding.markPhotoView);
}
});
}
}
@Override
public void initViewObservable() {
super.initViewObservable();
viewModel.birthDay.observe(this, aBoolean -> {
pvTime.show(binding.entryDayTv);
});
viewModel.markPhotoOnClick.observe(this, aBoolean -> {
RxPermissions rxPermissions = new RxPermissions(CattleMarkActivity.this);
rxPermissions.request(Manifest.permission.CAMERA, Manifest.permission
.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)
.subscribe(new Consumer<Boolean>() {
@Override
public void accept(Boolean aBoolean) throws Exception {
if (aBoolean) {
markImagePicker.show(CattleMarkActivity.this);
} else {
ToastUtils.showShort("权限被拒绝");
}
}
});
});
viewModel.scanLabelOnClick.observe(this, new Observer<Boolean>() {
@Override
public void onChanged(Boolean aBoolean) {
new MaterialDialog.Builder(CattleMarkActivity.this)
.title("耳标录入")
// .iconRes(R.drawable.ic_logo)
.content("通过拍子扫描低频耳标")
// .widgetColor(Color.BLUE)//输入框光标的颜色
.inputType(InputType.TYPE_CLASS_NUMBER)//可以输入的类型
//前2个一个是hint一个是预输入的文字
.input("", "", new MaterialDialog.InputCallback() {
@Override
public void onInput(@NonNull MaterialDialog dialog, CharSequence input) {
Log.i("scan", "输入的是:" + input);
}
})
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
// dialog.getActionButton(DialogAction.POSITIVE).setEnabled(false);
viewModel.setScanLabel(dialog.getInputEditText().getText().toString());
}
})
.show();
}
});
}
private void initTimePicker() {//Dialog 模式下,在底部弹出
pvTime = new TimePickerBuilder(this, new OnTimeSelectListener() {
@Override
public void onTimeSelect(Date date, View v) {
viewModel.setBirthDate(date);
}
})
.setTimeSelectChangeListener(new OnTimeSelectChangeListener() {
@Override
public void onTimeSelectChanged(Date date) {
}
})
.setType(new boolean[]{true, true, true, false, false, false})
.isDialog(true) //默认设置false ,内部实现将DecorView 作为它的父控件。
.addOnCancelClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.i("pvTime", "onCancelClickListener");
}
})
.setItemVisibleCount(5) //若设置偶数,实际值会加1(比如设置6,则最大可见条目为7)
.setLineSpacingMultiplier(2.0f)
.isAlphaGradient(true)
.build();
Dialog mDialog = pvTime.getDialog();
if (mDialog != null) {
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT,
Gravity.BOTTOM);
params.leftMargin = 0;
params.rightMargin = 0;
pvTime.getDialogContainerLayout().setLayoutParams(params);
Window dialogWindow = mDialog.getWindow();
if (dialogWindow != null) {
dialogWindow.setWindowAnimations(com.bigkoo.pickerview.R.style.picker_view_slide_anim);//修改动画样式
dialogWindow.setGravity(Gravity.BOTTOM);//改成Bottom,底部显示
dialogWindow.setDimAmount(0.3f);
}
}
}
}
package com.phlx.wool.ui.cattle.activity;
import android.os.Bundle;
import androidx.lifecycle.ViewModelProviders;
import com.phlx.wool.R;
import com.phlx.wool.data.VMFactory;
import com.phlx.wool.databinding.ActivityCattleUploadBinding;
import com.phlx.wool.ui.base.BaseActivity;
import com.phlx.wool.ui.cattle.vm.CattleUploadVM;
import me.tatarka.bindingcollectionadapter2.BR;
public class CattleUploadActivity extends BaseActivity<ActivityCattleUploadBinding, CattleUploadVM> {
@Override
public int initContentView(Bundle savedInstanceState) {
return R.layout.activity_cattle_upload;
}
@Override
public int initVariableId() {
return BR.viewModel;
}
@Override
public void initParam() {
super.initParam();
}
@Override
public CattleUploadVM initViewModel() {
VMFactory factory = VMFactory.getInstance(getApplication());
return ViewModelProviders.of(this, factory).get(CattleUploadVM.class);
}
@Override
public void initData() {
super.initData();
setSupportActionBar(binding.include.toolbar);
viewModel.initToolbar();
}
@Override
public void initViewObservable() {
super.initViewObservable();
}
@Override
protected void onResume() {
super.onResume();
viewModel.refreshUploadCount();
}
}
package com.phlx.wool.ui.cattle.vm;
import android.app.Application;
import androidx.annotation.NonNull;
import androidx.databinding.ObservableField;
import com.phlx.wool.data.Repository;
import com.phlx.wool.entity.CattleLabelEntity;
import com.phlx.wool.ui.base.BackBarVM;
import com.phlx.wool.ui.cattle.activity.CattleMarkActivity;
import com.phlx.wool.ui.cattle.activity.CattleUploadActivity;
import java.util.Observable;
import me.goldze.mvvmhabit.binding.command.BindingAction;
import me.goldze.mvvmhabit.binding.command.BindingCommand;
public class CattleMainVM extends BackBarVM<Repository> {
public CattleMainVM(@NonNull Application application, Repository model) {
super(application, model);
}
/**
* 打标
*/
public BindingCommand onLabelClickCommand = new BindingCommand(new BindingAction() {
@Override
public void call() {
startActivity(CattleMarkActivity.class);
}
});
/**
* 上传
*/
public BindingCommand onUploadClickCommand = new BindingCommand(new BindingAction() {
@Override
public void call() {
startActivity(CattleUploadActivity.class);
}
});
}
package com.phlx.wool.ui.cattle.vm;
import android.app.Application;
import android.graphics.drawable.Drawable;
import android.os.Environment;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import com.phlx.wool.Configs;
import com.phlx.wool.R;
import com.phlx.wool.data.Repository;
import com.phlx.wool.db.DbUtil;
import com.phlx.wool.db.interf.DbIDUCallBack;
import com.phlx.wool.entity.CattleLabelEntity;
import com.phlx.wool.entity.DivisionEntity;
import com.phlx.wool.entity.EntryRegistrationEntity;
import com.phlx.wool.ui.base.BackBarVM;
import com.phlx.wool.util.BaseImageUtils;
import com.phlx.wool.widget.ItemData;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import cn.hutool.core.util.IdUtil;
import me.goldze.mvvmhabit.binding.command.BindingAction;
import me.goldze.mvvmhabit.binding.command.BindingCommand;
import me.goldze.mvvmhabit.binding.command.BindingConsumer;
import me.goldze.mvvmhabit.binding.viewadapter.spinner.IKeyAndValue;
import me.goldze.mvvmhabit.bus.event.SingleLiveEvent;
import me.goldze.mvvmhabit.utils.KLog;
import me.goldze.mvvmhabit.utils.SPUtils;
import me.goldze.mvvmhabit.utils.StringUtils;
import me.goldze.mvvmhabit.utils.ToastUtils;
public class CattleMarkVM extends BackBarVM<Repository> {
public CattleLabelEntity entity;
private SimpleDateFormat dateFormat;
public Drawable drawableImg;
//照片路径
private String markeImgUrl;
private File markFile;
public SingleLiveEvent<Boolean> birthDay = new SingleLiveEvent<>();
public SingleLiveEvent<Boolean> markPhotoOnClick = new SingleLiveEvent<>();
public SingleLiveEvent<Boolean> scanLabelOnClick = new SingleLiveEvent<>();
private List<CattleLabelEntity> uploadData;
public List<IKeyAndValue> ancestryItemData, sexItemData;
public CattleMarkVM(@NonNull Application application, Repository model) {
super(application, model);
}
//初始化ToolBar
public void initToolbar() {
setBackTitleText("补打标签");
setSettingVisibleObservable(View.GONE);
setBackRightTextVisible(View.VISIBLE);
setBackRightText("保存");
initData();
}
private void initData() {
entity = new CattleLabelEntity();
long idNo = IdUtil.createSnowflake(3, 1).nextId();
entity.setId(idNo + "");
markeImgUrl = Environment.getExternalStorageDirectory().getAbsolutePath() +
"/tracing/picture/"
+ "markCiq" + idNo + ".jpg";
markFile = new File(markeImgUrl);
//ImageView的占位图片,可以解决RecyclerView中图片错误问题
drawableImg = ContextCompat.getDrawable(getApplication(), R.drawable.no_image);
dateFormat = new SimpleDateFormat("yyyy-MM-dd");
//血统数据
ancestryItemData = new ArrayList<>();
ancestryItemData.add(new ItemData("苏尼特羊", "10"));
ancestryItemData.add(new ItemData("乌珠穆沁羊", "20"));
ancestryItemData.add(new ItemData("乌冉克羊", "30"));
ancestryItemData.add(new ItemData("察哈尔羊", "40"));
//性别
sexItemData = new ArrayList<>();
sexItemData.add(new ItemData("母", "0"));
sexItemData.add(new ItemData("公", "1"));
sexItemData.add(new ItemData("其他", "2"));
}
public BindingCommand<IKeyAndValue> onAncestrySelectorCommand = new BindingCommand<>(new BindingConsumer<IKeyAndValue>() {
@Override
public void call(IKeyAndValue iKeyAndValue) {
entity.setAncestryId(iKeyAndValue.getValue());
}
});
public BindingCommand<IKeyAndValue> onSexSelectorCommand = new BindingCommand<>(new BindingConsumer<IKeyAndValue>() {
@Override
public void call(IKeyAndValue iKeyAndValue) {
entity.setSex(iKeyAndValue.getValue());
}
});
//畜生日期
public BindingCommand onBirthDateClick = new BindingCommand(() -> birthDay.call());
public void setBirthDate(Date date) {
dateFormat = new SimpleDateFormat("yyyy-MM-dd");
entity.setBirthdate(dateFormat.format(date));
entity.notifyChange();
}
public String getMarkImgUrl() {
return markeImgUrl;
}
public BindingCommand markPhotoOnClickCommand = new BindingCommand(new BindingAction() {
@Override
public void call() {
markPhotoOnClick.call();
}
});
public BindingCommand onScanLabelClick = new BindingCommand(new BindingAction() {
@Override
public void call() {
scanLabelOnClick.call();
}
});
public void setScanLabel(String scanLabel) {
if (scanLabel.length() == 15) {
ToastUtils.showShort("scan:" + scanLabel);
entity.setRegistrationNo(scanLabel);
entity.notifyChange();
} else {
ToastUtils.showShort("非法扫描:" + scanLabel);
}
}
/**
* 离线保存本地,在线先上传,后保存本地
*/
@Override
protected void backRightTextOnClick() {
if (StringUtils.isEmpty(entity.getRegistrationNo())) {
ToastUtils.showShort("请扫描耳标");
return;
}
if (StringUtils.isEmpty(entity.getIndividualNo())) {
ToastUtils.showShort("请填写个体号");
return;
}
if (StringUtils.isEmpty(entity.getBirthdate())) {
ToastUtils.showShort("请选择出生日期");
return;
}
if (StringUtils.isEmpty(entity.getWeight())) {
ToastUtils.showShort("请填写体重");
return;
}
if (StringUtils.isEmpty(entity.getMarkImgPath())) {
ToastUtils.showShort("请上传打标图片");
return;
}
entity.setCreateBy(SPUtils.getInstance().getString(Configs.SP_LOGIN_NAME));
dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
entity.setCreateTime(dateFormat.format(new Date()));
if (entity.getMarkImgPath() != null && !entity.getMarkImgPath().equals(""))
entity.setPhoto(BaseImageUtils.bitmapToString(entity.getMarkImgPath(), getApplication()));
uploadData = new ArrayList<>();
uploadData.add(entity);
KLog.e(uploadData.size() + uploadData.toString());
/**
* 存储数据库
*/
showDialog("正在保存本地...");
DbUtil.getInstance().setDbIDUCallBack(new DbIDUCallBack() {
@Override
public void onNotification(boolean result) {
dismissDialog();
if (result) {
ToastUtils.showShort("打标保存成功");
backMain();
} else {
ToastUtils.showShort("打标保存失败");
}
}
}).insertAsyncBatch(CattleLabelEntity.class, uploadData);
}
public void backMain() {
finish();
}
}
package com.phlx.wool.ui.cattle.vm;
import android.app.Application;
import androidx.annotation.NonNull;
import androidx.databinding.ObservableField;
import com.google.gson.GsonBuilder;
import com.phlx.wool.data.Repository;
import com.phlx.wool.db.DbUtil;
import com.phlx.wool.db.interf.DbIDUCallBack;
import com.phlx.wool.db.interf.DbQueryCallBack;
import com.phlx.wool.entity.CattleLabelEntity;
import com.phlx.wool.entity.Marking;
import com.phlx.wool.entity.MarkingDao;
import com.phlx.wool.params.CattleResponse;
import com.phlx.wool.params.UploadParams;
import com.phlx.wool.ui.base.BackBarVM;
import org.greenrobot.greendao.query.QueryBuilder;
import java.util.List;
import io.reactivex.functions.Consumer;
import me.goldze.mvvmhabit.binding.command.BindingCommand;
import me.goldze.mvvmhabit.http.ResponseThrowable;
import me.goldze.mvvmhabit.utils.KLog;
import me.goldze.mvvmhabit.utils.RxUtils;
import me.goldze.mvvmhabit.utils.ToastUtils;
import okhttp3.MediaType;
import okhttp3.RequestBody;
public class CattleUploadVM extends BackBarVM<Repository> {
public ObservableField<String> markingLabelNum = new ObservableField<>("补打记录");
public CattleUploadVM(@NonNull Application application, Repository model) {
super(application, model);
refreshUploadCount();
}
//初始化ToolBar
public void initToolbar() {
setBackTitleText("上传");
}
public BindingCommand onUploadClickCommand = new BindingCommand(() -> {
uploadMarking();
});
//查询每项未上传记录数量
public void refreshUploadCount() {
markingLabelNum.set("补打记录 " + "(" + DbUtil.getInstance().count(CattleLabelEntity.class) + ")");
}
private void uploadMarking() {
QueryBuilder<CattleLabelEntity> builder =
DbUtil.getInstance().getQueryBuilder(CattleLabelEntity.class);
DbUtil.getInstance().setDbQueryCallBack(new DbQueryCallBack<CattleLabelEntity>() {
@Override
public void onSuccess(List<CattleLabelEntity> result) {
if (result != null && result.size() > 0) {
String postInfoStr =
new GsonBuilder().serializeNulls()
// .excludeFieldsWithoutExposeAnnotation()
.create().toJson(new UploadParams<List<CattleLabelEntity>>(result));
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), postInfoStr);
KLog.e(postInfoStr);
addSubscribe(model.uploadCattleMark(body)
.compose(RxUtils.bindToLifecycle(getLifecycleProvider()))
.compose(RxUtils.schedulersTransformer())
.compose(RxUtils.exceptionTransformer())
.doOnSubscribe(disposable -> showDialog("正在上传补打记录数据..."))
.subscribe((Consumer<CattleResponse<List<CattleLabelEntity>>>) response -> {
KLog.e(response.getCode() + response.getMsg());
if (response.getCode() == 0) {
DbUtil.getInstance().setDbIDUCallBack(new DbIDUCallBack() {
@Override
public void onNotification(boolean result) {
if (result) {
dismissDialog();
refreshUploadCount();
}else{
ToastUtils.showShort("删除补打记录失败");
}
}
}).deleteAsyncAll(CattleLabelEntity.class);
} else {
dismissDialog();
ToastUtils.showShort("补打记录上传失败");
}
}, (Consumer<ResponseThrowable>) throwable -> {
dismissDialog();
ToastUtils.showShort(throwable.message);
})
);
} else {
}
}
@Override
public void onFailed() {
ToastUtils.showShort("补打记录数据库查询失败");
}
}).queryAsyncAll(CattleLabelEntity.class, builder);
}
}
......@@ -17,6 +17,7 @@ import com.phlx.wool.net.NetworkUtils;
import com.phlx.wool.params.CattleResponse;
import com.phlx.wool.params.UserParams;
import com.phlx.wool.ui.base.BackBarVM;
import com.phlx.wool.ui.cattle.activity.CattleMainActivity;
import com.phlx.wool.ui.main.MainActivity;
import com.phlx.wool.ui.splash.SplashActivity;
import com.phlx.wool.util.StringUtil;
......@@ -144,6 +145,10 @@ public class LoginVM extends BackBarVM<Repository> {
SPUtils.getInstance().put(Configs.SP_FREQUENCY, response.getData().getUser().getFrequencyConfig());
}
VMFactory.getInstance(getApplication()).refreshRepository();
if(Configs.isCattle){
startActivity(CattleMainActivity.class);
finish();
}else {
if (SPUtils.getInstance().getBoolean("isFirst", true)) {
startActivity(SplashActivity.class);
finish();
......@@ -151,6 +156,7 @@ public class LoginVM extends BackBarVM<Repository> {
startActivity(MainActivity.class);
finish();
}
}
} else {
ToastUtils.showShort("服务器:" + response.getMsg());
}
......@@ -193,7 +199,11 @@ public class LoginVM extends BackBarVM<Repository> {
return;
}
Configs.FREQUENCY_CONFIG = SPUtils.getInstance().getString(Configs.SP_FREQUENCY);
if(Configs.isCattle){
startActivity(CattleMainActivity.class);
}else {
startActivity(MainActivity.class);
}
finish();
} else {
ToastUtils.showShort("请先联机登录");
......
......@@ -3,6 +3,8 @@ package com.phlx.wool.util;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.media.ExifInterface;
import android.os.Environment;
import android.util.Base64;
import android.util.Log;
......@@ -10,6 +12,7 @@ import android.util.Log;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
......@@ -125,4 +128,53 @@ public class BaseImageUtils {
}
}
/**
* 获取图片的旋转角度
*
* @param path 图片绝对路径
* @return 图片的旋转角度
*/
public static int getBitmapDegree(String path) {
int degree = 0;
try {
// 从指定路径下读取图片,并获取其EXIF信息
ExifInterface exifInterface = new ExifInterface(path);
// 获取图片的旋转信息
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
/**
* 将图片按照指定的角度进行旋转
*
* @param bitmap 需要旋转的图片
* @param degree 指定的旋转角度
* @return 旋转后的图片
*/
public static Bitmap rotateBitmapByDegree(Bitmap bitmap, int degree) {
// 根据旋转角度,生成旋转矩阵
Matrix matrix = new Matrix();
matrix.postRotate(degree);
// 将原始图片按照旋转矩阵进行旋转,并得到新的图片
Bitmap newBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
if (bitmap != null && !bitmap.isRecycled()) {
bitmap.recycle();
}
return newBitmap;
}
}
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:binding="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="viewModel"
type="com.phlx.wool.ui.cattle.vm.CattleMainVM" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打标"
binding:onClickCommand="@{viewModel.onLabelClickCommand}"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:text="上传"
binding:onClickCommand="@{viewModel.onUploadClickCommand}"
/>
</LinearLayout>
</layout>
\ No newline at end of file
This diff is collapsed.
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:binding="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="viewModel"
type="com.phlx.wool.ui.cattle.vm.CattleUploadVM" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/setting_bg">
<include
android:id="@+id/include"
layout="@layout/layout_back_bar"
binding:backBarVM="@{viewModel.backBarVM}" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="@dimen/dp_250"
android:layout_marginStart="@dimen/dp_15"
android:layout_marginTop="@dimen/dp_15"
android:layout_marginEnd="@dimen/dp_15"
android:background="@color/white"
binding:layout_constraintTop_toBottomOf="@+id/include">
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/marking_info_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_20"
android:layout_marginTop="@dimen/dp_20"
android:checked="true"
android:text="@{viewModel.markingLabelNum}"
android:textColor="@color/black"
binding:layout_constraintStart_toStartOf="parent"
binding:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/harmless_info_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_20"
android:layout_marginEnd="@dimen/dp_20"
android:visibility="invisible"
android:textColor="@color/black"
android:textSize="@dimen/desc_text_size"
binding:layout_constraintEnd_toEndOf="parent"
binding:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/quarantine_info_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_20"
android:visibility="invisible"
android:textColor="@color/black"
android:textSize="@dimen/desc_text_size"
binding:layout_constraintStart_toStartOf="@id/marking_info_desc"
binding:layout_constraintTop_toBottomOf="@+id/marking_info_desc"/>
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/villus_buy_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_20"
android:layout_marginEnd="@dimen/dp_20"
android:visibility="invisible"
android:textColor="@color/black"
android:textSize="@dimen/desc_text_size"
binding:layout_constraintStart_toStartOf="@id/harmless_info_desc"
binding:layout_constraintTop_toBottomOf="@+id/harmless_info_desc"/>
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/villus_gauge_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_20"
android:visibility="invisible"
android:textColor="@color/black"
android:textSize="@dimen/desc_text_size"
binding:layout_constraintStart_toStartOf="@id/marking_info_desc"
binding:layout_constraintTop_toBottomOf="@+id/quarantine_info_desc"/>
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/slaughter_entry_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_20"
android:layout_marginEnd="@dimen/dp_20"
android:visibility="invisible"
android:textColor="@color/black"
android:textSize="@dimen/desc_text_size"
binding:layout_constraintStart_toStartOf="@id/villus_buy_desc"
binding:layout_constraintTop_toBottomOf="@+id/villus_buy_desc" />
<View
android:id="@+id/clear_line"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_2"
android:layout_marginStart="@dimen/dp_10"
android:layout_marginTop="@dimen/dp_20"
android:layout_marginEnd="@dimen/dp_10"
android:background="@color/setting_bg"
binding:layout_constraintStart_toStartOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/villus_gauge_desc" />
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/all_selected_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_20"
android:visibility="invisible"
android:text="全选"
android:textColor="@color/black"
android:textSize="@dimen/desc_text_size"
binding:layout_constraintStart_toStartOf="@id/marking_info_desc"
binding:layout_constraintTop_toBottomOf="@+id/clear_line"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.appcompat.widget.AppCompatButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dp_30"
android:background="@drawable/save_btn_bg"
android:text="上传"
android:textColor="@color/white"
android:textSize="@dimen/btn_size"
binding:layout_constraintBottom_toBottomOf="parent"
binding:layout_constraintEnd_toEndOf="parent"
binding:layout_constraintStart_toStartOf="parent"
binding:onClickCommand="@{viewModel.onUploadClickCommand}" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
<resources>
<string name="app_name">追溯系统</string>
<!-- <string name="app_name">追溯系统</string>-->
<string name="app_name">补打系统</string>
<string name="setting">设置</string>
<string name="jobNum">工号:</string>
<string name="pleaseInputUserName">请输入用户名</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 to comment