Commit 6e994d9c authored by hywang's avatar hywang

1.增加屠宰进场功能;

2.增加数据库版本更新。
parent bf8ea70f
......@@ -46,7 +46,8 @@ android {
}
greendao {
schemaVersion 1 //数据库版本号
schemaVersion 5 //数据库版本号
targetGenDir 'src/main/java'
}
dependencies {
......@@ -59,6 +60,7 @@ dependencies {
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'org.greenrobot:eventbus:3.2.0'
implementation 'org.greenrobot:greendao:3.2.2'
implementation 'io.github.yuweiguocn:GreenDaoUpgradeHelper:v2.2.1'
// TinyPinyin核心包,约80KB
implementation 'com.github.promeg:tinypinyin:2.0.3'
implementation 'com.github.promeg:tinypinyin-lexicons-android-cncity:2.0.3'
......@@ -76,4 +78,6 @@ dependencies {
//生成主键
implementation 'cn.hutool:hutool-all:4.5.6'
//图片加载
implementation 'com.github.YancyYe:GalleryPick:1.2.1'
}
......@@ -4,6 +4,7 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
......@@ -27,6 +28,17 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.phlx.wool.file_provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
<activity
android:name=".ui.login.LoginActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
......@@ -105,6 +117,11 @@
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize" />
<activity android:name=".ui.villus.BluetoothDeviceList" />
<activity
android:name=".ui.slaughter.SlaughterEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize" />
</application>
</manifest>
\ No newline at end of file
......@@ -57,6 +57,7 @@ public class Configs {
public static final String WORK_TYPE_M = "work_type_mark";
public static final String WORK_TYPE_Q = "work_type_quarantine";
public static final String WORK_TYPE_H = "work_type_harmless";
public static final String WORK_TYPE_SE = "work_type_slaughter_entry";
//0 高频,1低频
public static String FREQUENCY_CONFIG = "1";
......
......@@ -9,6 +9,7 @@ import com.phlx.wool.data.local.LocalDataSource;
import com.phlx.wool.db.DbUtil;
import com.phlx.wool.entity.DivisionEntity;
import com.phlx.wool.entity.DivisionEntityDao;
import com.phlx.wool.entity.EntryRegistrationEntity;
import com.phlx.wool.entity.Harmless;
import com.phlx.wool.entity.Label;
import com.phlx.wool.entity.Marking;
......@@ -18,14 +19,12 @@ import com.phlx.wool.entity.Unit;
import com.phlx.wool.entity.User;
import com.phlx.wool.entity.Variety;
import com.phlx.wool.entity.Veterinary;
import com.phlx.wool.entity.VeterinaryDao;
import com.phlx.wool.entity.VillusBuyEntity;
import com.phlx.wool.entity.VillusBuyEntityDao;
import com.phlx.wool.entity.VillusGaugeEntity;
import com.phlx.wool.params.BasicParams;
import com.phlx.wool.params.CattleResponse;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.query.QueryBuilder;
import java.util.List;
......@@ -126,6 +125,11 @@ public class Repository extends BaseModel implements HttpDataSource, LocalDataSo
return mHttpDataSource.submitVillusGauge(body);
}
@Override
public Observable<CattleResponse<List<EntryRegistrationEntity>>> submitSlaughterEntry(RequestBody body) {
return mHttpDataSource.submitSlaughterEntry(body);
}
@Override
public Observable<CattleResponse<List<Quarantine>>> submitQuarantine(RequestBody body) {
return mHttpDataSource.submitQuarantine(body);
......
......@@ -11,6 +11,7 @@ import androidx.lifecycle.ViewModelProvider;
import com.phlx.wool.ui.inventory.InventoryVM;
import com.phlx.wool.ui.login.LoginVM;
import com.phlx.wool.ui.main.MainVM;
import com.phlx.wool.ui.slaughter.vm.SlaughterEntryVM;
import com.phlx.wool.ui.splash.SplashVM;
import com.phlx.wool.ui.sync.vm.ClearVM;
import com.phlx.wool.ui.sync.vm.DownloadVM;
......@@ -91,6 +92,8 @@ public class VMFactory extends ViewModelProvider.NewInstanceFactory {
return (T) new VillusBuyVM(mApplication, repository);
}else if (modelClass.isAssignableFrom(VillusGaugeVM.class)) {
return (T) new VillusGaugeVM(mApplication, repository);
}else if (modelClass.isAssignableFrom(SlaughterEntryVM.class)) {
return (T) new SlaughterEntryVM(mApplication, repository);
}
throw new IllegalArgumentException("Unknown ViewModel class: " + modelClass.getName());
}
......
......@@ -3,6 +3,7 @@ package com.phlx.wool.data.http;
import com.phlx.wool.entity.DivisionEntity;
import com.phlx.wool.entity.EntryRegistrationEntity;
import com.phlx.wool.entity.Harmless;
import com.phlx.wool.entity.Label;
import com.phlx.wool.entity.Marking;
......@@ -112,6 +113,13 @@ public interface ApiService {
@POST("/app/villus/saveListVillusGauge")
Observable<CattleResponse<List<VillusGaugeEntity>>> submitVillusGauge(@Body RequestBody body);
/**
* 上传屠宰进场信息
*/
@Headers({"Content-Type: application/json", "Accept: application/json"})
@POST("/app/entryRegistrat/saveList")
Observable<CattleResponse<List<EntryRegistrationEntity>>> submitSlaughterEntry(@Body RequestBody body);
/**
* 上传产地检疫
*/
......
......@@ -3,6 +3,7 @@ package com.phlx.wool.data.http;
import com.phlx.wool.entity.DivisionEntity;
import com.phlx.wool.entity.EntryRegistrationEntity;
import com.phlx.wool.entity.Harmless;
import com.phlx.wool.entity.Label;
import com.phlx.wool.entity.Marking;
......@@ -89,6 +90,11 @@ public interface HttpDataSource {
*/
Observable<CattleResponse<List<VillusGaugeEntity>>> submitVillusGauge(@Body RequestBody body);
/**
* 上传屠宰进场信息
*/
Observable<CattleResponse<List<EntryRegistrationEntity>>> submitSlaughterEntry(@Body RequestBody body);
/**
* 上传产地检疫
*/
......
......@@ -3,6 +3,7 @@ package com.phlx.wool.data.http;
import com.phlx.wool.entity.DivisionEntity;
import com.phlx.wool.entity.EntryRegistrationEntity;
import com.phlx.wool.entity.Harmless;
import com.phlx.wool.entity.Label;
import com.phlx.wool.entity.Marking;
......@@ -106,6 +107,11 @@ public class HttpDataSourceImpl implements HttpDataSource {
return apiService.submitVillusGauge(body);
}
@Override
public Observable<CattleResponse<List<EntryRegistrationEntity>>> submitSlaughterEntry(RequestBody body) {
return apiService.submitSlaughterEntry(body);
}
@Override
public Observable<CattleResponse<List<Quarantine>>> submitQuarantine(RequestBody body) {
return apiService.submitQuarantine(body);
......
......@@ -2,7 +2,6 @@ package com.phlx.wool.db;
import android.app.Application;
import com.phlx.wool.App;
import com.phlx.wool.db.interf.DbIDUCallBack;
import com.phlx.wool.db.interf.DbQueryCallBack;
......@@ -38,18 +37,20 @@ public class DbUtil {
private DaoMaster mDaoMaster;
private AbstractDao mAbstractDao;
private static DbUtil mDbUtils;
private DaoMaster.DevOpenHelper mHelper;
private MyOpenHelper mHelper;
private DbQueryCallBack mQueryCallBack;
private DbIDUCallBack mIDUCallBack;
private DbUtil(Application application, String dbName, String passWord) {
if (mHelper == null) {
mHelper = new DaoMaster.DevOpenHelper(application, dbName);
mHelper = new MyOpenHelper(application, dbName, null);
}
if (passWord == null || passWord.isEmpty()) {
mDaoMaster = new DaoMaster(mHelper.getWritableDb());
mDaoMaster = new DaoMaster(mHelper.getWritableDatabase());
// mDaoMaster = new DaoMaster(mHelper.getWritableDb());
} else {
mDaoMaster = new DaoMaster(mHelper.getEncryptedReadableDb(passWord));
// mDaoMaster = new DaoMaster(mHelper.getEncryptedReadableDb(passWord));
}
mDaoSession = mDaoMaster.newSession();
......
package com.phlx.wool.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import com.github.yuweiguocn.library.greendao.MigrationHelper;
import com.phlx.wool.entity.CacheLabel;
import com.phlx.wool.entity.CacheLabelDao;
import com.phlx.wool.entity.DaoMaster;
import com.phlx.wool.entity.DivisionEntityDao;
import com.phlx.wool.entity.EntryRegistrationEntity;
import com.phlx.wool.entity.EntryRegistrationEntityDao;
import com.phlx.wool.entity.HarmlessDao;
import com.phlx.wool.entity.HarmlessDetailDao;
import com.phlx.wool.entity.LabelDao;
import com.phlx.wool.entity.MarkingDao;
import com.phlx.wool.entity.QuarantineDao;
import com.phlx.wool.entity.QuarantineDetailDao;
import com.phlx.wool.entity.TreatmentMethodDao;
import com.phlx.wool.entity.UnitDao;
import com.phlx.wool.entity.VarietyDao;
import com.phlx.wool.entity.VeterinaryDao;
import com.phlx.wool.entity.VillusBuyEntityDao;
import com.phlx.wool.entity.VillusGaugeEntityDao;
import org.greenrobot.greendao.database.Database;
public class MyOpenHelper extends DaoMaster.DevOpenHelper {
public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
super(context, name, factory);
}
@Override
public void onUpgrade(Database db, int oldVersion, int newVersion) {
//把需要管理的数据库表DAO作为最后一个参数传入到方法中
MigrationHelper.migrate(db, new MigrationHelper.ReCreateAllTableListener() {
@Override
public void onCreateAllTables(Database db, boolean ifNotExists) {
DaoMaster.createAllTables(db, ifNotExists);
}
@Override
public void onDropAllTables(Database db, boolean ifExists) {
DaoMaster.dropAllTables(db, ifExists);
}
}, DivisionEntityDao.class, HarmlessDao.class, HarmlessDetailDao.class, LabelDao.class
, MarkingDao.class, QuarantineDao.class, QuarantineDetailDao.class
, TreatmentMethodDao.class, UnitDao.class, VarietyDao.class, VeterinaryDao.class
, VillusBuyEntityDao.class, VillusGaugeEntityDao.class, EntryRegistrationEntityDao.class, CacheLabelDao.class);
}
}
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;
@Entity
public class CacheLabel extends BaseObservable implements Parcelable {
@Id(autoincrement = false)
private String epc;
private String tid;
public CacheLabel() {
}
protected CacheLabel(Parcel in) {
epc = in.readString();
tid = in.readString();
}
@Generated(hash = 709708457)
public CacheLabel(String epc, String tid) {
this.epc = epc;
this.tid = tid;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(epc);
dest.writeString(tid);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<CacheLabel> CREATOR = new Creator<CacheLabel>() {
@Override
public CacheLabel createFromParcel(Parcel in) {
return new CacheLabel(in);
}
@Override
public CacheLabel[] newArray(int size) {
return new CacheLabel[size];
}
};
public String getEpc() {
return epc;
}
public void setEpc(String epc) {
this.epc = epc;
}
public String getTid() {
return tid;
}
public void setTid(String tid) {
this.tid = tid;
}
}
package com.phlx.wool.entity;
import android.os.Parcel;
import android.os.Parcelable;
import androidx.databinding.BaseObservable;
import com.google.gson.annotations.SerializedName;
import com.phlx.wool.util.StringConverter;
import org.greenrobot.greendao.annotation.Convert;
import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import java.util.List;
import org.greenrobot.greendao.annotation.Generated;
/**
* 屠宰进场bean
*/
@Entity
public class EntryRegistrationEntity extends BaseObservable implements Parcelable {
/** $column.columnComment */
@Id(autoincrement = false)
private Long id;
/** 流水号 */
private String serialNo;
/** 牧户代码 */
private String pastureUnitId;
/** 牧户名称 */
private String pastureUnitName;
/** 进厂时间 */
private String entryDate;
/** 进厂数量 */
private String entryNum;
/** 记录人 */
private String recorder;
/** 检疫合格证图片 */
private String quarantineCertificateImg;
/** 检疫合格证姓名 */
private String quarantineCertificateName;
/** 检疫合格证身份证号 */
private String quarantineCertificateIdcard;
private String quarantineImgPath;
/** 低频耳标集合 */
@Convert(columnType = String.class, converter = StringConverter.class)
private List<String> list;
/** 创建者 */
private String createBy;
/** 创建时间 */
private String createTime;
/**
* 数据状态 0--上传成功,1----未上传或上传失败
*/
private int status;
/** 时间戳 */
@SerializedName("inputTime")
private Long timestamp;
public EntryRegistrationEntity() {
}
protected EntryRegistrationEntity(Parcel in) {
if (in.readByte() == 0) {
id = null;
} else {
id = in.readLong();
}
serialNo = in.readString();
pastureUnitId = in.readString();
pastureUnitName = in.readString();
entryDate = in.readString();
entryNum = in.readString();
recorder = in.readString();
quarantineCertificateImg = in.readString();
quarantineCertificateName = in.readString();
quarantineCertificateIdcard = in.readString();
quarantineImgPath = in.readString();
list = in.createStringArrayList();
createBy = in.readString();
createTime = in.readString();
status = in.readInt();
if (in.readByte() == 0) {
timestamp = null;
} else {
timestamp = in.readLong();
}
}
@Generated(hash = 505362997)
public EntryRegistrationEntity(Long id, String serialNo, String pastureUnitId, String pastureUnitName,
String entryDate, String entryNum, String recorder, String quarantineCertificateImg,
String quarantineCertificateName, String quarantineCertificateIdcard, String quarantineImgPath,
List<String> list, String createBy, String createTime, int status, Long timestamp) {
this.id = id;
this.serialNo = serialNo;
this.pastureUnitId = pastureUnitId;
this.pastureUnitName = pastureUnitName;
this.entryDate = entryDate;
this.entryNum = entryNum;
this.recorder = recorder;
this.quarantineCertificateImg = quarantineCertificateImg;
this.quarantineCertificateName = quarantineCertificateName;
this.quarantineCertificateIdcard = quarantineCertificateIdcard;
this.quarantineImgPath = quarantineImgPath;
this.list = list;
this.createBy = createBy;
this.createTime = createTime;
this.status = status;
this.timestamp = timestamp;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
if (id == null) {
dest.writeByte((byte) 0);
} else {
dest.writeByte((byte) 1);
dest.writeLong(id);
}
dest.writeString(serialNo);
dest.writeString(pastureUnitId);
dest.writeString(pastureUnitName);
dest.writeString(entryDate);
dest.writeString(entryNum);
dest.writeString(recorder);
dest.writeString(quarantineCertificateImg);
dest.writeString(quarantineCertificateName);
dest.writeString(quarantineCertificateIdcard);
dest.writeString(quarantineImgPath);
dest.writeStringList(list);
dest.writeString(createBy);
dest.writeString(createTime);
dest.writeInt(status);
if (timestamp == null) {
dest.writeByte((byte) 0);
} else {
dest.writeByte((byte) 1);
dest.writeLong(timestamp);
}
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<EntryRegistrationEntity> CREATOR = new Creator<EntryRegistrationEntity>() {
@Override
public EntryRegistrationEntity createFromParcel(Parcel in) {
return new EntryRegistrationEntity(in);
}
@Override
public EntryRegistrationEntity[] newArray(int size) {
return new EntryRegistrationEntity[size];
}
};
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getSerialNo() {
return serialNo;
}
public void setSerialNo(String serialNo) {
this.serialNo = serialNo;
}
public String getPastureUnitId() {
return pastureUnitId;
}
public void setPastureUnitId(String pastureUnitId) {
this.pastureUnitId = pastureUnitId;
}
public String getPastureUnitName() {
return pastureUnitName;
}
public void setPastureUnitName(String pastureUnitName) {
this.pastureUnitName = pastureUnitName;
}
public String getEntryDate() {
return entryDate;
}
public void setEntryDate(String entryDate) {
this.entryDate = entryDate;
}
public String getEntryNum() {
return entryNum;
}
public void setEntryNum(String entryNum) {
this.entryNum = entryNum;
}
public String getRecorder() {
return recorder;
}
public void setRecorder(String recorder) {
this.recorder = recorder;
}
public String getQuarantineCertificateImg() {
return quarantineCertificateImg;
}
public void setQuarantineCertificateImg(String quarantineCertificateImg) {
this.quarantineCertificateImg = quarantineCertificateImg;
}
public String getQuarantineCertificateName() {
return quarantineCertificateName;
}
public void setQuarantineCertificateName(String quarantineCertificateName) {
this.quarantineCertificateName = quarantineCertificateName;
}
public String getQuarantineCertificateIdcard() {
return quarantineCertificateIdcard;
}
public void setQuarantineCertificateIdcard(String quarantineCertificateIdcard) {
this.quarantineCertificateIdcard = quarantineCertificateIdcard;
}
public String getQuarantineImgPath() {
return quarantineImgPath;
}
public void setQuarantineImgPath(String quarantineImgPath) {
this.quarantineImgPath = quarantineImgPath;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
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;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public Long getTimestamp() {
return timestamp;
}
public void setTimestamp(Long timestamp) {
this.timestamp = timestamp;
}
@Override
public String toString() {
return "EntryRegistrationEntity{" +
"id=" + id +
", serialNo='" + serialNo + '\'' +
", pastureUnitId='" + pastureUnitId + '\'' +
", pastureUnitName='" + pastureUnitName + '\'' +
", entryDate='" + entryDate + '\'' +
", entryNum='" + entryNum + '\'' +
", recorder='" + recorder + '\'' +
", quarantineCertificateImg='" + quarantineCertificateImg + '\'' +
", quarantineCertificateName='" + quarantineCertificateName + '\'' +
", quarantineCertificateIdcard='" + quarantineCertificateIdcard + '\'' +
", quarantineImgPath='" + quarantineImgPath + '\'' +
", list=" + list +
", createBy='" + createBy + '\'' +
", createTime='" + createTime + '\'' +
", status=" + status +
", timestamp=" + timestamp +
'}';
}
}
......@@ -70,10 +70,10 @@ public class VillusBuyEntity extends BaseObservable implements Parcelable {
private String productId;
/** 标签被打印的次数 */
private int printCount;
private Integer printCount;
/** 二维码被扫描的次数 */
private int scanCount;
private Integer scanCount;
/** 创建者 */
private String createBy;
......@@ -86,6 +86,9 @@ public class VillusBuyEntity extends BaseObservable implements Parcelable {
*/
private int status;
private Integer testNum;
private int numTest;
public VillusBuyEntity() {
}
......@@ -105,18 +108,33 @@ public class VillusBuyEntity extends BaseObservable implements Parcelable {
pastureUnitName = in.readString();
pastureUnitPhone = in.readString();
productId = in.readString();
if (in.readByte() == 0) {
printCount = null;
} else {
printCount = in.readInt();
}
if (in.readByte() == 0) {
scanCount = null;
} else {
scanCount = in.readInt();
}
createBy = in.readString();
createTime = in.readString();
status = in.readInt();
if (in.readByte() == 0) {
testNum = null;
} else {
testNum = in.readInt();
}
numTest = in.readInt();
}
@Generated(hash = 1651539007)
@Generated(hash = 2021863346)
public VillusBuyEntity(Long id, String buyBatch, String revision, String buyWeight,
String buyFactory, String buyDate, String personInCharge, String pastureUnitId,
String pastureUnitName, String pastureUnitPhone, String productId, int printCount,
int scanCount, String createBy, String createTime, int status) {
String pastureUnitName, String pastureUnitPhone, String productId,
Integer printCount, Integer scanCount, String createBy, String createTime,
int status, Integer testNum, int numTest) {
this.id = id;
this.buyBatch = buyBatch;
this.revision = revision;
......@@ -133,6 +151,8 @@ public class VillusBuyEntity extends BaseObservable implements Parcelable {
this.createBy = createBy;
this.createTime = createTime;
this.status = status;
this.testNum = testNum;
this.numTest = numTest;
}
@Override
......@@ -153,11 +173,28 @@ public class VillusBuyEntity extends BaseObservable implements Parcelable {
dest.writeString(pastureUnitName);
dest.writeString(pastureUnitPhone);
dest.writeString(productId);
if (printCount == null) {
dest.writeByte((byte) 0);
} else {
dest.writeByte((byte) 1);
dest.writeInt(printCount);
}
if (scanCount == null) {
dest.writeByte((byte) 0);
} else {
dest.writeByte((byte) 1);
dest.writeInt(scanCount);
}
dest.writeString(createBy);
dest.writeString(createTime);
dest.writeInt(status);
if (testNum == null) {
dest.writeByte((byte) 0);
} else {
dest.writeByte((byte) 1);
dest.writeInt(testNum);
}
dest.writeInt(numTest);
}
@Override
......@@ -265,19 +302,19 @@ public class VillusBuyEntity extends BaseObservable implements Parcelable {
this.productId = productId;
}
public int getPrintCount() {
public Integer getPrintCount() {
return printCount;
}
public void setPrintCount(int printCount) {
public void setPrintCount(Integer printCount) {
this.printCount = printCount;
}
public int getScanCount() {
public Integer getScanCount() {
return scanCount;
}
public void setScanCount(int scanCount) {
public void setScanCount(Integer scanCount) {
this.scanCount = scanCount;
}
......@@ -305,25 +342,19 @@ public class VillusBuyEntity extends BaseObservable implements Parcelable {
this.status = status;
}
@Override
public String toString() {
return "VillusBuyEntity{" +
"id=" + id +
", buyBatch='" + buyBatch + '\'' +
", revision='" + revision + '\'' +
", buyWeight='" + buyWeight + '\'' +
", buyFactory='" + buyFactory + '\'' +
", buyDate='" + buyDate + '\'' +
", personInCharge='" + personInCharge + '\'' +
", pastureUnitId='" + pastureUnitId + '\'' +
", pastureUnitName='" + pastureUnitName + '\'' +
", pastureUnitPhone='" + pastureUnitPhone + '\'' +
", productId='" + productId + '\'' +
", printCount=" + printCount +
", scanCount=" + scanCount +
", createBy='" + createBy + '\'' +
", createTime='" + createTime + '\'' +
", status=" + status +
'}';
public Integer getTestNum() {
return testNum;
}
public void setTestNum(Integer testNum) {
this.testNum = testNum;
}
public int getNumTest() {
return numTest;
}
public void setNumTest(int numTest) {
this.numTest = numTest;
}
}
......@@ -49,7 +49,7 @@ public class RetrofitClient {
//服务端根路径
public static String baseUrl =
"58.18.92.126"
// "192.168.100.101"
// "192.168.8.189"
;
public static String port =
"899"
......
......@@ -82,7 +82,7 @@ public class InventoryActivity extends BaseActivity<ActivityInventoryBinding, In
super.initData();
setSupportActionBar(binding.include.toolbar);
disableShowSoftInput(binding.etInvDesc);
// disableShowSoftInput(binding.etInvDesc);
viewModel.initToolbar(type);
binding.setAdapter(new BindingRecyclerViewAdapter());
if ("0".equals(Configs.FREQUENCY_CONFIG)) {
......
......@@ -21,12 +21,19 @@ 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.db.interf.DbQueryCallBack;
import com.phlx.wool.entity.CacheLabel;
import com.phlx.wool.entity.EntryRegistrationEntity;
import com.phlx.wool.entity.Label;
import com.phlx.wool.entity.LabelDao;
import com.phlx.wool.entity.Marking;
import com.phlx.wool.entity.VillusBuyEntity;
import com.phlx.wool.event.EventMsg;
import com.phlx.wool.event.EventTag;
import com.phlx.wool.rfid.ModuleManager;
import com.phlx.wool.ui.base.BackBarVM;
import com.phlx.wool.ui.slaughter.SlaughterEntryActivity;
import com.phlx.wool.ui.work.harmless.HarmlessActivity;
import com.phlx.wool.ui.work.mark.MarkingActivity;
import com.phlx.wool.ui.work.quarantine.QuarantineActivity;
......@@ -54,7 +61,6 @@ import me.goldze.mvvmhabit.http.ResponseThrowable;
import me.goldze.mvvmhabit.utils.KLog;
import me.goldze.mvvmhabit.utils.RxUtils;
import me.goldze.mvvmhabit.utils.SPUtils;
import me.goldze.mvvmhabit.utils.StringUtils;
import me.goldze.mvvmhabit.utils.ToastUtils;
import me.tatarka.bindingcollectionadapter2.ItemBinding;
......@@ -86,6 +92,8 @@ public class InventoryVM extends BackBarVM<Repository> implements OnInventoryLis
private String type;
private boolean isCacheLabel;
public InventoryVM(@NonNull Application application, Repository repository) {
super(application, repository);
map = new HashMap<>();
......@@ -110,6 +118,13 @@ public class InventoryVM extends BackBarVM<Repository> implements OnInventoryLis
setBackTitleText("检疫记录");
} else if (type.equals(Configs.WORK_TYPE_H)) {
setBackTitleText("无害化处理");
} else if (type.equals(Configs.WORK_TYPE_SE)) {
setBackTitleText("屠宰进场");
}
//如果是屠宰进场,就加载缓存标签
if (type.equals(Configs.WORK_TYPE_SE)) {
queryCacheLabel();
}
}
......@@ -179,7 +194,7 @@ public class InventoryVM extends BackBarVM<Repository> implements OnInventoryLis
return;
}
if (mList.size() >= 20) {
if (!type.equals(Configs.WORK_TYPE_SE) && mList.size() >= 20) {
ToastUtils.showShort("单次标签扫描已达20上限");
return;
}
......@@ -209,6 +224,8 @@ public class InventoryVM extends BackBarVM<Repository> implements OnInventoryLis
public void call() {
if (mList != null && mList.size() > 0) {
if (type.equals(Configs.WORK_TYPE_SE))
clearCacheLabel();
jumpToActivity();
} else {
ToastUtils.showShort("请扫描耳标");
......@@ -248,7 +265,7 @@ public class InventoryVM extends BackBarVM<Repository> implements OnInventoryLis
})
.subscribe((Consumer<Label>) response -> {
dismissDialog();
if (legalCount > 0) {
if (legalCount > 0 && !isCacheLabel) {
labelCheckEvent.setValue(response);
} else {
addLabel(_label);
......@@ -266,19 +283,102 @@ public class InventoryVM extends BackBarVM<Repository> implements OnInventoryLis
observableList.add(itemViewModel);
labelCount++;
labelNum.set(String.valueOf(labelCount));
if (!isCacheLabel)
soundPool.play(musicId.get(1), 1, 1, 0, 0, 1);
map.put(tag, mList.size() - 1);
//如果是屠宰进场,就缓存标签
if (type.equals(Configs.WORK_TYPE_SE) && !isCacheLabel) {
cacheLabel(_label);
isCacheLabel = false;
}
}
/**
* 缓存扫到的标签
*
* @param _label
*/
private void cacheLabel(Label _label) {
CacheLabel cl = new CacheLabel();
cl.setEpc(_label.getEpc());
cl.setTid(_label.getTid());
List<CacheLabel> cacheLabels = new ArrayList<>();
cacheLabels.add(cl);
DbUtil.getInstance().setDbIDUCallBack(new DbIDUCallBack() {
@Override
public void onNotification(boolean result) {
dismissDialog();
if (result) {
} else {
ToastUtils.showShort("标签缓存失败");
}
}
}).insertAsyncBatch(CacheLabel.class, cacheLabels);
}
/**
* 进入屠宰扫标签页面时加载缓存的标签
*/
private void queryCacheLabel() {
DbUtil.getInstance().setDbQueryCallBack(new DbQueryCallBack<CacheLabel>() {
@Override
public void onSuccess(List<CacheLabel> result) {
if (result != null) {
for (CacheLabel cl : result) {
String epc = cl.getEpc();
String tid = cl.getTid();
String tag = epc + tid;
if (!map.containsKey(tag)) {
Label label = new Label();
label.setEpc(epc);
label.setTid(tid);
isCacheLabel = true;
checkLabel(label);
}
}
} else {
ToastUtils.showShort("加载缓存标签失败");
}
}
@Override
public void onFailed() {
ToastUtils.showShort("加载缓存标签错误");
}
}).queryAsyncAll(CacheLabel.class, null);
}
/**
* 删除缓存标签数据
*/
private void clearCacheLabel() {
DbUtil.getInstance().setDbIDUCallBack(new DbIDUCallBack() {
@Override
public void onNotification(boolean result) {
if (result) {
} else {
ToastUtils.showShort("删除标签缓存数据失败");
}
}
}).deleteAsyncAll(CacheLabel.class);
}
public void setTest(String testcount){
public void setTest(String testcount) {
testlNum.set(testcount);
}
public void setTest2(String testcount){
public void setTest2(String testcount) {
testpNum.set(testcount);
}
public void setTest3(String testcount){
public void setTest3(String testcount) {
testyNum.set(testcount);
}
......@@ -292,6 +392,8 @@ public class InventoryVM extends BackBarVM<Repository> implements OnInventoryLis
startActivity(QuarantineActivity.class, mBundle);
} else if (type.equals(Configs.WORK_TYPE_H)) {
startActivity(HarmlessActivity.class, mBundle);
} else if (type.equals(Configs.WORK_TYPE_SE)) {
startActivity(SlaughterEntryActivity.class, mBundle);
}
finish();
} else {
......@@ -313,6 +415,8 @@ public class InventoryVM extends BackBarVM<Repository> implements OnInventoryLis
labelNum.set("");
map.clear();
tipDesc.set("");
if (type.equals(Configs.WORK_TYPE_SE))
clearCacheLabel();
}
});
......
......@@ -7,8 +7,6 @@ import androidx.annotation.NonNull;
import com.phlx.wool.Configs;
import com.phlx.wool.data.Repository;
import com.phlx.wool.db.DbUtil;
import com.phlx.wool.entity.DivisionEntity;
import com.phlx.wool.entity.VillusBuyEntity;
import com.phlx.wool.ui.base.MainBarVM;
import com.phlx.wool.ui.inventory.InventoryActivity;
......@@ -20,13 +18,9 @@ import com.phlx.wool.ui.villus.VillusBuyActivity;
import com.phlx.wool.ui.villus.VillusGaugeActivity;
import com.phlx.wool.ui.work.unit.UnitActivity;
import com.phlx.wool.util.PrintLabel;
import com.printer.sdk.PrinterConstants;
import com.printer.sdk.PrinterConstants.Command;
import com.printer.sdk.PrinterInstance;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import me.goldze.mvvmhabit.binding.command.BindingAction;
......@@ -135,6 +129,21 @@ public class MainVM extends MainBarVM<Repository> {
}
});
public BindingCommand OnSlaughterEntryClickCommand = new BindingCommand(new BindingAction() {
@Override
public void call() {
unitSp = SPUtils.getInstance().getString(Configs.SP_UNIT_NAME, "");
if (unitSp.isEmpty()) {
nullEvent.call();
} else {
Bundle mBundle = new Bundle();
mBundle.putString("type", Configs.WORK_TYPE_SE);
startActivity(InventoryActivity.class, mBundle);
}
}
});
public List<String> getVillusBuyList() {
List<String> villusBuyNoList = new ArrayList<>();
villusBuyEntities = new ArrayList<>();
......
package com.phlx.wool.ui.slaughter;
import android.Manifest;
import android.app.Dialog;
import android.graphics.Bitmap;
import android.os.Bundle;
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.databinding.Observable;
import androidx.lifecycle.ViewModelProviders;
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.BR;
import com.phlx.wool.R;
import com.phlx.wool.data.VMFactory;
import com.phlx.wool.databinding.ActivitySlaughterEntryBinding;
import com.phlx.wool.entity.Label;
import com.phlx.wool.ui.base.BaseActivity;
import com.phlx.wool.ui.slaughter.vm.SlaughterEntryVM;
import com.phlx.wool.ui.villus.vm.VillusBuyVM;
import com.phlx.wool.util.BaseImageUtils;
import com.phlx.wool.util.ImagePicker;
import com.tbruyelle.rxpermissions2.RxPermissions;
import java.util.ArrayList;
import java.util.Date;
import io.reactivex.functions.Consumer;
import me.goldze.mvvmhabit.base.BaseViewModel;
import me.goldze.mvvmhabit.utils.ToastUtils;
public class SlaughterEntryActivity extends BaseActivity<ActivitySlaughterEntryBinding, SlaughterEntryVM> {
private ArrayList<Label> labels;
private ImagePicker quarantineImagePicker;
private TimePickerView pvTime;
@Override
public int initContentView(Bundle savedInstanceState) {
return R.layout.activity_slaughter_entry;
}
@Override
public int initVariableId() {
return BR.viewModel;
}
@Override
public void initParam() {
super.initParam();
Bundle mBundle = getIntent().getExtras();
if (mBundle != null) {
labels = mBundle.getParcelableArrayList("list");
}
}
@Override
public SlaughterEntryVM initViewModel() {
VMFactory factory = VMFactory.getInstance(getApplication());
return ViewModelProviders.of(this, factory).get(SlaughterEntryVM.class);
}
@Override
public void initData() {
super.initData();
viewModel.setLabels(labels);
viewModel.initToolbar();
initTimePicker();
if (quarantineImagePicker == null) {
quarantineImagePicker = new ImagePicker(SlaughterEntryActivity.this);
quarantineImagePicker.setOnImagePickerListener(new ImagePicker.OnImagePickerListener() {
@Override
public void onSuccess(String path) {
Bitmap bitmap = BaseImageUtils.decodeBitmap(path, SlaughterEntryActivity.this);
BaseImageUtils.saveBitmapToSDCard(bitmap, viewModel.getQuarantineImgUrl());
viewModel.entity.setQuarantineImgPath(viewModel.getQuarantineImgUrl());
Glide.with(SlaughterEntryActivity.this)
.load(viewModel.getQuarantineImgUrl())
.apply(
new RequestOptions()
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.error(R.drawable.no_image)
.fallback(R.drawable.no_image)
)
.into(binding.quarantinePhotoView);
}
});
}
}
@Override
public void initViewObservable() {
super.initViewObservable();
viewModel.entryDay.observe(this, aBoolean -> {
pvTime.show(binding.entryDayTv);
});
viewModel.quarantinePhotoOnClick.observe(this, aBoolean -> {
RxPermissions rxPermissions = new RxPermissions(SlaughterEntryActivity.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) {
quarantineImagePicker.show(SlaughterEntryActivity.this);
} else {
ToastUtils.showShort("权限被拒绝");
}
}
});
});
}
private void initTimePicker() {//Dialog 模式下,在底部弹出
pvTime = new TimePickerBuilder(this, new OnTimeSelectListener() {
@Override
public void onTimeSelect(Date date, View v) {
viewModel.setEntryDate(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.slaughter.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.google.gson.GsonBuilder;
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.EntryRegistrationEntity;
import com.phlx.wool.entity.Label;
import com.phlx.wool.entity.VillusBuyEntity;
import com.phlx.wool.event.EventMsg;
import com.phlx.wool.event.EventTag;
import com.phlx.wool.params.CattleResponse;
import com.phlx.wool.params.UploadParams;
import com.phlx.wool.ui.base.BackBarVM;
import com.phlx.wool.util.BaseImageUtils;
import com.phlx.wool.util.StringUtil;
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 io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import me.goldze.mvvmhabit.base.BaseViewModel;
import me.goldze.mvvmhabit.binding.command.BindingAction;
import me.goldze.mvvmhabit.binding.command.BindingCommand;
import me.goldze.mvvmhabit.bus.RxBus;
import me.goldze.mvvmhabit.bus.RxSubscriptions;
import me.goldze.mvvmhabit.bus.event.SingleLiveEvent;
import me.goldze.mvvmhabit.http.ResponseThrowable;
import me.goldze.mvvmhabit.utils.KLog;
import me.goldze.mvvmhabit.utils.RxUtils;
import me.goldze.mvvmhabit.utils.SPUtils;
import me.goldze.mvvmhabit.utils.StringUtils;
import me.goldze.mvvmhabit.utils.ToastUtils;
import okhttp3.MediaType;
import okhttp3.RequestBody;
public class SlaughterEntryVM extends BackBarVM<Repository> {
public EntryRegistrationEntity entity;
private ArrayList<Label> labels;
public Drawable drawableImg;
//照片路径
private String quarantineImgUrl;
private File quarantineFile;
private Disposable inventoryBus;
public SingleLiveEvent<Boolean> entryDay = new SingleLiveEvent<>();
public SingleLiveEvent<Boolean> quarantinePhotoOnClick = new SingleLiveEvent<>();
private SimpleDateFormat dateFormat;
private List<EntryRegistrationEntity> uploadData;
public SlaughterEntryVM(@NonNull Application application, Repository model) {
super(application, model);
}
//初始化ToolBar
public void initToolbar() {
setBackTitleText("屠宰进场");
setSettingVisibleObservable(View.GONE);
setBackRightTextVisible(View.VISIBLE);
setBackRightText("保存");
if (entity == null) {
initEntity();
}
//养殖单位
entity.setPastureUnitName(SPUtils.getInstance().getString(Configs.SP_UNIT_NAME, ""));
entity.setPastureUnitId(SPUtils.getInstance().getString(Configs.SP_UNIT_CODE, ""));
// entity.setPastureUnitPhone(SPUtils.getInstance().getString(Configs.SP_UNIT_PHONE, ""));
// entity.setRevision(SPUtils.getInstance().getString(Configs.SP_UNIT_REVISION, ""));
dateFormat = new SimpleDateFormat("yyyy-MM-dd");
}
public void setLabels(ArrayList<Label> labels) {
this.labels = labels;
}
public void initEntity() {
entity = new EntryRegistrationEntity();
long batchNo = IdUtil.createSnowflake(3, 1).nextId();
entity.setId(batchNo);
entity.setCreateBy(SPUtils.getInstance().getString("name"));
dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
Date _date = new Date();
entity.setSerialNo(dateFormat.format(_date) + "-" + SPUtils.getInstance().getString(Configs.SP_ID));
dateFormat = new SimpleDateFormat("yyyy-MM-dd");
entity.setEntryNum(String.valueOf(labels.size()));
quarantineImgUrl = Environment.getExternalStorageDirectory().getAbsolutePath() +
"/tracing/picture/"
+ "slaughterCiq" + batchNo + ".jpg";
quarantineFile = new File(quarantineImgUrl);
//ImageView的占位图片,可以解决RecyclerView中图片错误问题
drawableImg = ContextCompat.getDrawable(getApplication(), R.drawable.no_image);
List<String> epcList = new ArrayList<>();
for (Label label : labels) {
epcList.add(label.getEpc());
}
entity.setList(epcList);
}
public String getQuarantineImgUrl() {
return quarantineImgUrl;
}
//进场日期
public BindingCommand onEntryDateClick = new BindingCommand(() -> entryDay.call());
public void setEntryDate(Date date) {
dateFormat = new SimpleDateFormat("yyyy-MM-dd");
entity.setEntryDate(dateFormat.format(date));
entity.notifyChange();
}
public BindingCommand quarantinePhotoOnClickCommand = new BindingCommand(new BindingAction() {
@Override
public void call() {
quarantinePhotoOnClick.call();
}
});
/**
* 离线保存本地,在线先上传,后保存本地
*/
@Override
protected void backRightTextOnClick() {
if (StringUtils.isEmpty(entity.getEntryDate())) {
ToastUtils.showShort("请选择收购日期");
return;
}
// if (StringUtils.isEmpty(entity.getRevision())) {
// ToastUtils.showShort("请选择所属苏木");
// return;
// }
if (StringUtils.isEmpty(entity.getEntryNum())) {
ToastUtils.showShort("请填写进场数量");
return;
}
if (StringUtils.isEmpty(entity.getRecorder())) {
ToastUtils.showShort("请填写负责人");
return;
}
if (StringUtils.isEmpty(entity.getQuarantineImgPath())) {
ToastUtils.showShort("请上传检疫合格证图片");
return;
}
uploadData = new ArrayList<>();
entity.setCreateBy(SPUtils.getInstance().getString(Configs.SP_LOGIN_NAME));
dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
entity.setCreateTime(dateFormat.format(new Date()));
entity.setStatus(1);
uploadData.add(entity);
KLog.e(uploadData.size() + uploadData.toString());
/**
* 存储数据库
*/
showDialog("正在保存本地...");
DbUtil.getInstance().setDbIDUCallBack(new DbIDUCallBack() {
@Override
public void onNotification(boolean result) {
dismissDialog();
if (result) {
if (Configs.isOnLine) {
uploadSlaughterEntry();
} else {
ToastUtils.showShort("屠宰入场保存成功");
backMain();
}
} else {
ToastUtils.showShort("屠宰入场保存失败");
}
}
}).insertAsyncBatch(EntryRegistrationEntity.class, uploadData);
}
private void uploadSlaughterEntry() {
if (uploadData != null && uploadData.size() > 0) {
EntryRegistrationEntity _entryRegistrationEntity = uploadData.get(0);
if (_entryRegistrationEntity.getQuarantineImgPath() != null && !_entryRegistrationEntity.getQuarantineImgPath().equals(""))
_entryRegistrationEntity.setQuarantineCertificateImg(BaseImageUtils.bitmapToString(_entryRegistrationEntity.getQuarantineImgPath(), getApplication()));
}
String postInfoStr =
new GsonBuilder().serializeNulls()
// .excludeFieldsWithoutExposeAnnotation()
.create().toJson(new UploadParams<List<EntryRegistrationEntity>>(uploadData));
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), postInfoStr);
KLog.e(postInfoStr);
addSubscribe(model.submitSlaughterEntry(body)
.compose(RxUtils.bindToLifecycle(getLifecycleProvider()))
.compose(RxUtils.schedulersTransformer())
.compose(RxUtils.exceptionTransformer())
.doOnSubscribe(disposable -> showDialog("正在上传屠宰进场数据..."))
.subscribe((Consumer<CattleResponse<List<VillusBuyEntity>>>) response -> {
KLog.e(response.getCode() + response.getMsg());
if (response.getCode() == 0) {
for (int i = 0; i < uploadData.size(); i++) {
uploadData.get(i).setStatus(0);
}
DbUtil.getInstance().setDbIDUCallBack(new DbIDUCallBack() {
@Override
public void onNotification(boolean result) {
if (result) {
dismissDialog();
ToastUtils.showShort("屠宰进场上传成功");
finish();
}
}
}).insertAsyncBatch(EntryRegistrationEntity.class, uploadData);
} else {
dismissDialog();
ToastUtils.showShort("屠宰进场上传失败");
}
}, (Consumer<ResponseThrowable>) throwable -> {
dismissDialog();
ToastUtils.showShort(throwable.message);
})
);
}
public void backMain() {
finish();
}
@Override
public void registerRxBus() {
super.registerRxBus();
inventoryBus =
RxBus.getDefault().toObservable(EventMsg.class).subscribe(eventType -> {
if (eventType.getAction().equals(EventTag.EVENT_INVENTORY_DATA)) {
}
});
RxSubscriptions.add(inventoryBus);
}
@Override
public void removeRxBus() {
super.removeRxBus();
RxSubscriptions.remove(inventoryBus);
}
}
......@@ -13,24 +13,18 @@ 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.Harmless;
import com.phlx.wool.entity.Label;
import com.phlx.wool.entity.Marking;
import com.phlx.wool.entity.Quarantine;
import com.phlx.wool.entity.TreatmentMethod;
import com.phlx.wool.entity.Unit;
import com.phlx.wool.entity.Variety;
import com.phlx.wool.entity.Veterinary;
import com.phlx.wool.entity.VillusBuyEntity;
import com.phlx.wool.entity.VillusBuyEntityDao;
import com.phlx.wool.entity.VillusGaugeEntity;
import com.phlx.wool.params.BasicParams;
import com.phlx.wool.params.CattleResponse;
import com.phlx.wool.params.PostParams;
import com.phlx.wool.ui.base.BackBarVM;
import com.phlx.wool.ui.main.MainActivity;
import org.greenrobot.greendao.query.QueryBuilder;
import org.greenrobot.greendao.query.WhereCondition;
import java.text.ParseException;
......@@ -46,7 +40,6 @@ import me.goldze.mvvmhabit.http.ResponseThrowable;
import me.goldze.mvvmhabit.utils.KLog;
import me.goldze.mvvmhabit.utils.RxUtils;
import me.goldze.mvvmhabit.utils.SPUtils;
import me.goldze.mvvmhabit.utils.ToastUtils;
import okhttp3.MediaType;
import okhttp3.RequestBody;
......@@ -173,10 +166,13 @@ public class DownloadVM extends BackBarVM<Repository> {
if (isDownloadLabel.get() && !isLabelDownload) {
baseDateUpload();
} else if (isDownloadBasic.get() && !isBasicDownload) {
DbUtil.getInstance().deleteAll(TreatmentMethod.class);
DbUtil.getInstance().deleteAll(Variety.class);
requestBasicInfo();
} else if (isDownloadUnit.get() && !isUnitDownload) {
queryUnitInputTime(unitPageIndex, 100000);
} else if (isDownloadVeterinary.get() && !isVeterinaryDownload) {
DbUtil.getInstance().deleteAll(Veterinary.class);
requestVeterinary();
} else if (isDownloadVillusBuy.get() && !isVillusBuyDownload) {
requestVillusBuy();
......@@ -352,8 +348,8 @@ public class DownloadVM extends BackBarVM<Repository> {
private void requestVeterinary() {
isVeterinaryDownload = true;
PostParams postParams = new PostParams();
postParams.setInputTime(0);
postParams.setPageNum(1);
postParams.setInputTime(0);
postParams.setPageSize(200);
postParams.setYears("");
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), new Gson().toJson(postParams));
......
......@@ -13,6 +13,8 @@ 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.EntryRegistrationEntity;
import com.phlx.wool.entity.EntryRegistrationEntityDao;
import com.phlx.wool.entity.Harmless;
import com.phlx.wool.entity.HarmlessDao;
import com.phlx.wool.entity.HarmlessDetail;
......@@ -62,17 +64,19 @@ public class UploadVM extends BackBarVM<Repository> {
public ObservableField<String> harmlessLabelNum = new ObservableField<>("无害化处理");
public ObservableField<String> quarantineLabelNum = new ObservableField<>("检疫记录");
public ObservableField<String> villusBuyLabelNum = new ObservableField<>("绒毛购买");
public ObservableField<String> villusgaugelabelnum = new ObservableField<>("绒毛测量");
public ObservableField<String> villusGaugeLabelNum = new ObservableField<>("绒毛测量");
public ObservableField<String> slaughterEntryLabelNum = new ObservableField<>("屠宰进场");
public ObservableField<Boolean> isUploadMarking = new ObservableField<Boolean>(false);
public ObservableField<Boolean> isUploadHarmless = new ObservableField<Boolean>(false);
public ObservableField<Boolean> isUploadQuarantine = new ObservableField<Boolean>(false);
public ObservableField<Boolean> isUploadVillusBuy = new ObservableField<Boolean>(false);
public ObservableField<Boolean> isUploadVillusGauge = new ObservableField<Boolean>(false);
public ObservableField<Boolean> isUploadSlaughterEntry = new ObservableField<Boolean>(false);
public ObservableField<Boolean> isUploadAll = new ObservableField<Boolean>(false);
public ObservableInt uploadDataVisibility = new ObservableInt();
private boolean isMarkingUpload, isHarmlessUpload, isQuarantineUpload, isVillusBuyUpload, isVillusGaugeUpload;
private boolean isMarkingUpload, isHarmlessUpload, isQuarantineUpload, isVillusBuyUpload, isVillusGaugeUpload, isSlaughterEntryUpload;
public UploadVM(@NonNull Application application, Repository repository) {
super(application, repository);
......@@ -128,6 +132,14 @@ public class UploadVM extends BackBarVM<Repository> {
}
});
public BindingCommand<Boolean> onUploadSlaughterEntryCommand =
new BindingCommand<>(new BindingConsumer<Boolean>() {
@Override
public void call(Boolean isChecked) {
isUploadSlaughterEntry.set(isChecked);
}
});
public BindingCommand<Boolean> onUploadAllCommand =
new BindingCommand<>(new BindingConsumer<Boolean>() {
@Override
......@@ -143,6 +155,7 @@ public class UploadVM extends BackBarVM<Repository> {
isUploadQuarantine.set(isSelected);
isUploadVillusBuy.set(isSelected);
isUploadVillusGauge.set(isSelected);
isUploadSlaughterEntry.set(isSelected);
}
//查询每项未上传记录数量
......@@ -152,6 +165,8 @@ public class UploadVM extends BackBarVM<Repository> {
harmlessLabelNum.set("无害化处理 " + "(" + DbUtil.getInstance().count(Harmless.class) + ")");
quarantineLabelNum.set("检疫记录 " + "(" + DbUtil.getInstance().count(Quarantine.class) + ")");
// villusBuyLabelNum.set("绒毛购买 " + "(" + DbUtil.getInstance().count(VillusBuyEntity.class) + ")");
QueryBuilder<VillusBuyEntity> builder =
DbUtil.getInstance().getQueryBuilder(VillusBuyEntity.class)
.where(VillusBuyEntityDao.Properties.Status.eq(1));
......@@ -170,8 +185,10 @@ public class UploadVM extends BackBarVM<Repository> {
villusBuyLabelNum.set("绒毛购买 " + "(" + "-" + ")");
}
}).queryAsyncAll(VillusBuyEntity.class, builder);
villusgaugelabelnum.set("绒毛测量 " + "(" + DbUtil.getInstance().count(VillusGaugeEntity.class) + ")");
;
villusGaugeLabelNum.set("绒毛测量 " + "(" + DbUtil.getInstance().count(VillusGaugeEntity.class) + ")");
slaughterEntryLabelNum.set("屠宰进场 " + "(" + DbUtil.getInstance().count(EntryRegistrationEntity.class) + ")");
}
private void uploadNext() {
......@@ -186,9 +203,12 @@ public class UploadVM extends BackBarVM<Repository> {
uploadVillusBuy();
} else if (isUploadVillusGauge.get() && !isVillusGaugeUpload) {
uploadVillusGauge();
} else if (isUploadSlaughterEntry.get() && !isSlaughterEntryUpload) {
uploadSlaughterEntry();
} else {
refreshUploadCount();
if (!isUploadMarking.get() && !isUploadHarmless.get() && !isUploadQuarantine.get() && !isUploadVillusBuy.get() && !isUploadVillusGauge.get()) {
if (!isUploadMarking.get() && !isUploadHarmless.get() && !isUploadQuarantine.get() && !isUploadVillusBuy.get() && !isUploadVillusGauge.get()
&& !isUploadSlaughterEntry.get()) {
ToastUtils.showShort("请选择上传的项目");
} else if (!"".equals(toastStr)) {
ToastUtils.showShort(toastStr);
......@@ -207,6 +227,7 @@ public class UploadVM extends BackBarVM<Repository> {
isQuarantineUpload = false;
isVillusBuyUpload = false;
isVillusGaugeUpload = false;
isSlaughterEntryUpload = false;
toastStr = "";
uploadNext();
......@@ -558,4 +579,69 @@ public class UploadVM extends BackBarVM<Repository> {
}).queryAsyncAll(VillusGaugeEntity.class, builder);
}
/**
* 上传屠宰进场数据
*/
private void uploadSlaughterEntry() {
QueryBuilder<EntryRegistrationEntity> builder =
DbUtil.getInstance().getQueryBuilder(EntryRegistrationEntity.class).
where(EntryRegistrationEntityDao.Properties.Status.eq(1));
DbUtil.getInstance().setDbQueryCallBack(new DbQueryCallBack<EntryRegistrationEntity>() {
@Override
public void onSuccess(List<EntryRegistrationEntity> result) {
isSlaughterEntryUpload = true;
if (result != null && result.size() > 0) {
KLog.e(result.toString());
String postInfoStr =
new GsonBuilder().serializeNulls()
// .excludeFieldsWithoutExposeAnnotation()
.create().toJson(new UploadParams<List<EntryRegistrationEntity>>(result));
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), postInfoStr);
KLog.e(postInfoStr);
addSubscribe(model.submitSlaughterEntry(body)
.compose(RxUtils.bindToLifecycle(getLifecycleProvider()))
.compose(RxUtils.schedulersTransformer())
.compose(RxUtils.exceptionTransformer())
.doOnSubscribe(disposable -> showDialog("正在上传屠宰进场数据..."))
.subscribe((Consumer<CattleResponse<List<EntryRegistrationEntity>>>) response -> {
KLog.e(response.getCode() + response.getMsg());
dismissDialog();
if (response.getCode() == 0) {
for (EntryRegistrationEntity entryRegistrationEntity : result) {
entryRegistrationEntity.setStatus(0);
}
DbUtil.getInstance().setDbIDUCallBack(new DbIDUCallBack() {
@Override
public void onNotification(boolean result) {
if (result) {
DbUtil.getInstance().deleteAll(EntryRegistrationEntity.class);
} else {
ToastUtils.showShort("删除屠宰进场数据失败");
}
uploadNext();
}
}).updateAsyncBatch(EntryRegistrationEntity.class, result);
} else {
toastStr += "上传屠宰进场数据失败;";
ToastUtils.showShort("上传屠宰进场数据失败");
uploadNext();
}
}, (Consumer<ResponseThrowable>) throwable -> {
dismissDialog();
ToastUtils.showShort(throwable.message);
uploadNext();
})
);
} else {
uploadNext();
}
}
@Override
public void onFailed() {
ToastUtils.showShort("查询屠宰进场数据失败");
}
}).queryAsyncAll(EntryRegistrationEntity.class, builder);
}
}
......@@ -198,6 +198,7 @@ public class VillusBuyVM extends BackBarVM<Repository> {
entity.setStatus(1);
entity.setProductId(StringUtil.to32String(IdUtil.createSnowflake(3, 1).nextId()));
entity.setPrintCount(0);
entity.setScanCount(0);
uploadData.add(entity);
KLog.e(uploadData.size() + uploadData.toString());
......@@ -208,14 +209,16 @@ public class VillusBuyVM extends BackBarVM<Repository> {
DbUtil.getInstance().setDbIDUCallBack(new DbIDUCallBack() {
@Override
public void onNotification(boolean result) {
if (result) {
dismissDialog();
if (result) {
if (Configs.isOnLine) {
uploadVillusBuy();
} else {
ToastUtils.showShort("绒毛购买保存成功");
backMain();
}
}else{
ToastUtils.showShort("绒毛购买保存失败");
}
}
}).insertAsyncBatch(VillusBuyEntity.class, uploadData);
......
package com.phlx.wool.util;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.util.Base64;
import android.util.Log;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
/**
* 作者 : lei
* 时间 : 2018/12/27 11 : 31
*/
public class BaseImageUtils {
//把bitmap转换成String
public static String bitmapToString(String filePath, Context context) {
Bitmap bm = decodeBitmap(filePath, context);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 80, baos);
byte[] b = baos.toByteArray();
Log.d("d", "压缩后的大小=" + b.length);
return Base64.encodeToString(b, Base64.DEFAULT);
}
/**
* 2 * 加载本地大图片
* 3 *
* 4 * @param localPath
* 5 * @param context
* 6 * @return
* 7
*/
public static Bitmap decodeBitmap(String localPath, Context context) {
BitmapFactory.Options opts = new BitmapFactory.Options();
// 置为true,仅仅返回图片的分辨率
opts.inJustDecodeBounds = true;
BitmapFactory.decodeFile(localPath, opts);
// 得到原图的分辨率;
int srcHeight = opts.outHeight;
int srcWidth = opts.outWidth;
// 得到设备的分辨率
int screenHeight = context.getResources().getDisplayMetrics().heightPixels;
int screenWidth = context.getResources().getDisplayMetrics().widthPixels;
// 通过比较得到合适的比例值;
// 屏幕的 宽320 高 480 ,图片的宽3000 ,高是2262 3000/320=9 2262/480=5,,使用大的比例值
int scale = 1;
int sx = srcWidth / screenWidth;
int sy = srcHeight / screenHeight;
if (sx >= sy && sx > 1) {
scale = sx;
}
if (sy >= sx && sy > 1) {
scale = sy;
}
// 根据比例值,缩放图片,并加载到内存中;
// 置为false,让BitmapFactory.decodeFile()返回一个图片对象
opts.inJustDecodeBounds = false;
// 可以把图片缩放为原图的1/scale * 1/scale
opts.inSampleSize = scale;
// 得到缩放后的bitmap
// Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()
// + "/lp.jpg", opts);
return BitmapFactory.decodeFile(localPath, opts);
}
//base64字符串转化成图片
public static boolean saveBaseImage(String base64, String path) {
try {
byte[] b = Base64.decode(base64, Base64.DEFAULT);
//生成jpeg图片
OutputStream out = new FileOutputStream(path);
out.write(b);
out.flush();
out.close();
return true;
} catch (Exception e) {
return false;
}
}
/**
* 将bitmap对象保存成图片到sd卡中
*/
public static void saveBitmapToSDCard(Bitmap bitmap, String path) {
File folder = new File(Environment.getExternalStorageDirectory()
.getAbsolutePath() +
"/tracing/picture");
if (!folder.exists()) {
folder.mkdirs();
}
File file = new File(path);
try {
FileOutputStream fileOutputStream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, ((OutputStream) fileOutputStream));
//设置PNG的话,透明区域不会变成黑色
fileOutputStream.close();
System.out.println("----------save success-------------------");
recycle(bitmap);
} catch (Exception v0) {
v0.printStackTrace();
}
}
/**
* 回收Bitmap
*
* @param thumbBmp 需要被回收的bitmap
*/
public static void recycle(Bitmap thumbBmp) {
if (thumbBmp != null && !thumbBmp.isRecycled()) {
thumbBmp.recycle();
}
}
}
package com.phlx.wool.util;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import com.bumptech.glide.Glide;
import com.yancy.gallerypick.config.GalleryConfig;
import com.yancy.gallerypick.config.GalleryPick;
import com.yancy.gallerypick.inter.IHandlerCallBack;
import com.yancy.gallerypick.inter.ImageLoader;
import com.yancy.gallerypick.widget.GalleryImageView;
import java.util.ArrayList;
import java.util.List;
public class ImagePicker {
private static final String TAG = ImagePicker.class.getName();
private static final String DEFAULT_DIR = "/tracing/camera";
private IHandlerCallBack iHandlerCallBack;
private GalleryConfig galleryConfig;
private List<String> path = new ArrayList<>();
private OnImagePickerListener listener;
private Context mContext;
public ImagePicker(Context context) {
this.mContext = context;
initGallery();
}
private class GlideImageLoader implements ImageLoader {
@Override
public void displayImage(Activity activity, Context context, String path, GalleryImageView galleryImageView, int width, int
height) {
Glide.with(context).load(path).into(galleryImageView);
}
@Override
public void clearMemoryCache() {
}
}
private void initGallery() {
iHandlerCallBack = new IHandlerCallBack() {
@Override
public void onStart() {
Log.i(TAG, "onStart: 开启");
}
@Override
public void onSuccess(List<String> photoList) {
Log.i(TAG, "onSuccess: 返回数据");
path.clear();
for (String s : photoList) {
Log.i(TAG, s);
path.add(s);
}
if (listener != null && path.size() > 0) {
listener.onSuccess(path.get(0));
}
}
@Override
public void onCancel() {
Log.i(TAG, "onCancel: 取消");
}
@Override
public void onFinish() {
Log.i(TAG, "onFinish: 结束");
}
@Override
public void onError() {
Log.i(TAG, "onError: 出错");
}
};
galleryConfig = new GalleryConfig.Builder().imageLoader(new GlideImageLoader()) // ImageLoader 加载框架(必填)
.iHandlerCallBack(iHandlerCallBack) // 监听接口(必填)
.provider(mContext.getPackageName() + ".file_provider") // provider (必填)
.multiSelect(false)
.isOpenCamera(true) // 是否现实相机按钮 默认:false
.filePath(DEFAULT_DIR) // 图片存放路径
.build();
}
public void show(Activity activity) {
GalleryPick.getInstance().setGalleryConfig(galleryConfig).open(activity);
}
public void setOnImagePickerListener(OnImagePickerListener listener) {
this.listener = listener;
}
public interface OnImagePickerListener {
void onSuccess(String path);
}
}
package com.phlx.wool.util;
import org.greenrobot.greendao.converter.PropertyConverter;
import java.util.Arrays;
import java.util.List;
public class StringConverter implements PropertyConverter<List<String>, String> {
@Override
public List<String> convertToEntityProperty(String databaseValue) {
if (databaseValue == null) {
return null;
}
else {
List<String> list = Arrays.asList(databaseValue.split(","));
return list;
}
}
@Override
public String convertToDatabaseValue(List<String> entityProperty) {
if(entityProperty==null){
return null;
}
else{
StringBuilder sb= new StringBuilder();
for(String link:entityProperty){
sb.append(link);
sb.append(",");
}
return sb.toString();
}
}
}
......@@ -33,6 +33,18 @@
binding:layout_constraintStart_toStartOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/include" />
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="@dimen/dp_0"
binding:layout_constraintBottom_toBottomOf="parent"
binding:layout_constraintEnd_toEndOf="parent"
binding:layout_constraintStart_toStartOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/main_bg">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<View
android:id="@+id/unit_tip_line"
android:layout_width="@dimen/dp_2"
......@@ -41,7 +53,7 @@
android:layout_marginTop="@dimen/dp_15"
android:background="#4963cd"
binding:layout_constraintStart_toStartOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/main_bg" />
binding:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/unit_tip_desc"
......@@ -53,7 +65,7 @@
android:textColor="@color/black"
android:textSize="@dimen/sp_14"
binding:layout_constraintStart_toEndOf="@id/data_tip_line"
binding:layout_constraintTop_toBottomOf="@+id/main_bg" />
binding:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/unit_line"
......@@ -113,7 +125,6 @@
binding:layout_constraintStart_toStartOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/data_tip_desc" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/marking_btn"
android:layout_width="wrap_content"
......@@ -197,6 +208,79 @@
binding:layout_constraintTop_toBottomOf="@+id/marking_btn"
binding:onClickCommand="@{viewModel.OnVillusPrintClickCommand}" />
<View
android:id="@+id/slaughter_tip_line"
android:layout_width="@dimen/dp_2"
android:layout_height="@dimen/dp_13"
android:layout_marginStart="@dimen/dp_20"
android:layout_marginTop="@dimen/dp_15"
android:background="#18ba57"
binding:layout_constraintStart_toStartOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/villus_buy_btn" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/slaughter_tip_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_15"
android:layout_marginTop="@dimen/dp_11"
android:text="@string/slaughter"
android:textColor="@color/black"
android:textSize="@dimen/sp_14"
binding:layout_constraintStart_toEndOf="@id/data_tip_line"
binding:layout_constraintTop_toBottomOf="@+id/villus_buy_btn" />
<View
android:id="@+id/slaughter_line"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_2"
android:layout_marginStart="@dimen/dp_15"
android:layout_marginTop="@dimen/dp_5"
android:layout_marginEnd="@dimen/dp_15"
android:background="#dcdee4"
binding:layout_constraintStart_toStartOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/slaughter_tip_desc" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/slaughter_entry_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_10"
android:drawableTop="@mipmap/ic_marking"
android:drawablePadding="@dimen/dp_10"
android:text="@string/slaughter_entry"
android:textSize="@dimen/main_btn_size"
binding:layout_constraintStart_toStartOf="@+id/select_unit_btn"
binding:layout_constraintTop_toBottomOf="@+id/slaughter_line"
binding:onClickCommand="@{viewModel.OnSlaughterEntryClickCommand}" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/slaughter_change_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_40"
android:layout_marginTop="@dimen/dp_10"
android:drawableTop="@mipmap/ic_quarantine"
android:drawablePadding="@dimen/dp_10"
android:text="@string/quarantine"
android:textSize="@dimen/main_btn_size"
binding:layout_constraintStart_toEndOf="@+id/slaughter_entry_btn"
binding:layout_constraintTop_toBottomOf="@+id/slaughter_line"
binding:onClickCommand="@{viewModel.OnQuarantineClickCommand}" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/slaughter_quarantine_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_40"
android:layout_marginTop="@dimen/dp_10"
android:drawableTop="@mipmap/ic_harmless"
android:drawablePadding="@dimen/dp_10"
android:text="@string/harmless"
android:textSize="@dimen/main_btn_size"
binding:layout_constraintStart_toEndOf="@+id/slaughter_change_btn"
binding:layout_constraintTop_toBottomOf="@+id/slaughter_line"
binding:onClickCommand="@{viewModel.OnHarmlessClickCommand}" />
<View
android:id="@+id/sync_tip_line"
......@@ -206,7 +290,7 @@
android:layout_marginTop="@dimen/dp_15"
android:background="#ff3c3c"
binding:layout_constraintStart_toStartOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/villus_buy_btn" />
binding:layout_constraintTop_toBottomOf="@+id/slaughter_entry_btn" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/sync_tip_desc"
......@@ -218,7 +302,7 @@
android:textColor="@color/black"
android:textSize="@dimen/sp_14"
binding:layout_constraintStart_toEndOf="@id/sync_tip_line"
binding:layout_constraintTop_toBottomOf="@+id/villus_buy_btn" />
binding:layout_constraintTop_toBottomOf="@+id/slaughter_entry_btn" />
<View
android:id="@+id/sync_line"
......@@ -277,6 +361,8 @@
binding:onClickCommand="@{viewModel.OnClearDataClickCommand}" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
<include
layout="@layout/drawer_left"
......
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:binding="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/tools"
app:ignore="NamespaceTypo">
<data>
<variable
name="viewModel"
type="com.phlx.wool.ui.slaughter.vm.SlaughterEntryVM" />
<variable
name="spinnerAdapter"
type="android.widget.ArrayAdapter" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/include"
layout="@layout/layout_back_bar"
binding:backBarVM="@{viewModel.backBarVM}" />
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="@dimen/dp_0"
binding:layout_constraintBottom_toBottomOf="parent"
binding:layout_constraintEnd_toEndOf="parent"
binding:layout_constraintStart_toStartOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/include">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="@dimen/dp_0"
android:layout_marginStart="@dimen/dp_30"
android:layout_marginTop="@dimen/dp_10"
android:layout_marginEnd="@dimen/dp_30">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/marking_guideline_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
binding:layout_constraintGuide_begin="69dp" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/veterinary_selected_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/select_unit"
android:textColor="@color/black"
android:textSize="@dimen/desc_text_size"
binding:layout_constraintBaseline_toBaselineOf="@id/veterinary_edit"
binding:layout_constraintBottom_toTopOf="@+id/batch_selected_desc"
binding:layout_constraintStart_toStartOf="parent"
binding:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/veterinary_edit"
android:layout_width="@dimen/dp_0"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_5"
android:background="@drawable/input_frame_bg"
android:gravity="center_vertical"
android:text="@={viewModel.entity.pastureUnitName}"
android:textSize="@dimen/edit_size"
binding:layout_constraintLeft_toLeftOf="@+id/marking_guideline_vertical"
binding:layout_constraintRight_toRightOf="parent"
binding:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/batch_selected_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/entry_batch"
android:textColor="@color/black"
android:textSize="@dimen/desc_text_size"
binding:layout_constraintBaseline_toBaselineOf="@id/batch_edit"
binding:layout_constraintStart_toStartOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/veterinary_selected_desc"
binding:layout_constraintBottom_toTopOf="@+id/batch_day_desc" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/batch_edit"
android:layout_width="@dimen/dp_0"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_5"
android:background="@drawable/input_frame_bg"
android:gravity="center_vertical"
android:text="@={viewModel.entity.serialNo}"
android:textSize="@dimen/edit_size"
android:enabled="false"
binding:layout_constraintLeft_toLeftOf="@+id/marking_guideline_vertical"
binding:layout_constraintRight_toRightOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/veterinary_edit"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/entry_day_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/entry_day"
android:textColor="@color/black"
android:textSize="@dimen/desc_text_size"
binding:layout_constraintBaseline_toBaselineOf="@id/entry_day_tv"
binding:layout_constraintBottom_toTopOf="@+id/l_variety_selected_desc"
binding:layout_constraintStart_toStartOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/batch_selected_desc" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/entry_day_tv"
android:layout_width="@dimen/dp_0"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/dp_5"
android:background="@drawable/input_frame_bg"
android:drawableEnd="@mipmap/ic_date_btn"
android:drawablePadding="@dimen/dp_3"
android:gravity="center_vertical"
android:hint="请选择进场日期"
android:text="@={viewModel.entity.entryDate}"
android:textSize="@dimen/edit_size"
binding:layout_constraintBottom_toTopOf="@+id/superior_division_sp"
binding:layout_constraintLeft_toLeftOf="@+id/marking_guideline_vertical"
binding:layout_constraintRight_toRightOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/batch_edit"
binding:onClickCommand="@{viewModel.onEntryDateClick}" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/l_variety_selected_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/superior_pertain"
android:visibility="gone"
android:textColor="@color/black"
android:textSize="@dimen/desc_text_size"
binding:layout_constraintBottom_toTopOf="@+id/variety_selected_desc"
binding:layout_constraintStart_toStartOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/entry_day_desc" />
<Spinner
android:id="@+id/superior_division_sp"
android:layout_width="@dimen/dp_0"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_5"
android:minHeight="@dimen/dp_40"
android:visibility="gone"
android:spinnerMode="dialog"
binding:layout_constraintBottom_toTopOf="@+id/variety_sp"
binding:layout_constraintLeft_toLeftOf="@+id/marking_guideline_vertical"
binding:layout_constraintRight_toRightOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/entry_day_tv"
/>
<!-- binding:itemDatas="@{viewModel.superiorPertainItemData}"-->
<!-- binding:onItemSelectedCommand="@{viewModel.onSuperiorPertainSelectorCommand}"-->
<!-- binding:valueReply="@{viewModel.entity.revision}"-->
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/variety_selected_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pertain"
android:visibility="gone"
android:textColor="@color/black"
android:textSize="@dimen/desc_text_size"
binding:layout_constraintBottom_toTopOf="@+id/birth_place_desc"
binding:layout_constraintStart_toStartOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/l_variety_selected_desc" />
<!-- app:items="@{viewModel.pertainItemData}"-->
<!-- binding:valueReply="@{viewModel.entity.revision}" -->
<androidx.appcompat.widget.AppCompatSpinner
android:id="@+id/division_sp"
android:layout_width="@dimen/dp_0"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_5"
android:minHeight="@dimen/dp_40"
android:visibility="gone"
android:spinnerMode="dialog"
app:adapter="@{spinnerAdapter}"
binding:layout_constraintBottom_toTopOf="@+id/birth_place_edit"
binding:layout_constraintLeft_toLeftOf="@+id/marking_guideline_vertical"
binding:layout_constraintRight_toRightOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/superior_division_sp"
/>
<!-- binding:itemDatas="@{viewModel.pertainItemData}"-->
<!-- binding:onItemSelectedCommand="@{viewModel.onPertainSelectorCommand}"-->
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/entry_count_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/entry_count"
android:textColor="@color/black"
android:textSize="@dimen/desc_text_size"
binding:layout_constraintBaseline_toBaselineOf="@id/entry_count_edit"
binding:layout_constraintBottom_toTopOf="@+id/weight_selected_desc"
binding:layout_constraintStart_toStartOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/variety_selected_desc" />
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/entry_count_edit"
android:layout_width="@dimen/dp_0"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_5"
android:background="@drawable/input_frame_bg"
android:hint="请输入进场数量"
android:maxLines="1"
android:inputType="number"
android:enabled="false"
android:text="@={viewModel.entity.entryNum}"
android:textSize="@dimen/edit_size"
binding:layout_constraintBottom_toTopOf="@+id/weight_edit"
binding:layout_constraintLeft_toLeftOf="@+id/marking_guideline_vertical"
binding:layout_constraintRight_toRightOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/division_sp" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/weight_selected_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/person_in_charge"
android:textColor="@color/black"
android:textSize="@dimen/desc_text_size"
binding:layout_constraintBaseline_toBaselineOf="@id/weight_edit"
binding:layout_constraintBottom_toTopOf="@+id/breed_sheep_desc"
binding:layout_constraintStart_toStartOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/entry_count_desc" />
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/weight_edit"
android:layout_width="@dimen/dp_0"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_5"
android:background="@drawable/input_frame_bg"
android:hint="请输入负责人"
android:maxLines="1"
android:text="@={viewModel.entity.recorder}"
android:textSize="@dimen/edit_size"
binding:layout_constraintBottom_toTopOf="@+id/breed_sheep_cb"
binding:layout_constraintLeft_toLeftOf="@+id/marking_guideline_vertical"
binding:layout_constraintRight_toRightOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/entry_count_edit" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/certificate_name_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/quarantine_certificate_name"
android:textColor="@color/black"
android:textSize="@dimen/desc_text_size"
binding:layout_constraintBaseline_toBaselineOf="@id/certificate_name_edit"
binding:layout_constraintBottom_toTopOf="@+id/twin_sheep_desc"
binding:layout_constraintStart_toStartOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/weight_selected_desc" />
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/certificate_name_edit"
android:layout_width="@dimen/dp_0"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_5"
android:background="@drawable/input_frame_bg"
android:hint="请输入检疫合格证姓名"
android:maxLines="1"
android:text="@={viewModel.entity.quarantineCertificateName}"
android:textSize="@dimen/edit_size"
binding:layout_constraintBottom_toTopOf="@+id/twin_sheep_cb"
binding:layout_constraintHorizontal_bias="0.0"
binding:layout_constraintLeft_toLeftOf="@+id/marking_guideline_vertical"
binding:layout_constraintRight_toRightOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/weight_edit" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/certificate_idcard_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/quarantine_certificate_idcard"
android:textColor="@color/black"
android:textSize="@dimen/desc_text_size"
binding:layout_constraintBaseline_toBaselineOf="@id/certificate_idcard_edit"
binding:layout_constraintBottom_toTopOf="@+id/twin_sheep_desc"
binding:layout_constraintStart_toStartOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/certificate_name_desc" />
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/certificate_idcard_edit"
android:layout_width="@dimen/dp_0"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_5"
android:background="@drawable/input_frame_bg"
android:hint="请输入负责人"
android:maxLines="1"
android:text="@={viewModel.entity.quarantineCertificateIdcard}"
android:textSize="@dimen/edit_size"
binding:layout_constraintBottom_toTopOf="@+id/twin_sheep_cb"
binding:layout_constraintHorizontal_bias="0.0"
binding:layout_constraintLeft_toLeftOf="@+id/marking_guideline_vertical"
binding:layout_constraintRight_toRightOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/certificate_name_edit" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/quarantine_photo_view"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_300"
android:src="@{viewModel.drawableImg}"
binding:onClickCommand="@{viewModel.quarantinePhotoOnClickCommand}"
binding:url="@{viewModel.entity.quarantineImgPath}"
binding:layout_constraintLeft_toLeftOf="parent"
binding:layout_constraintRight_toRightOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/certificate_idcard_edit"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
......@@ -88,13 +88,26 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_20"
android:checked="@{viewModel.isUploadVillusGauge}"
android:text="@{viewModel.villusgaugelabelnum}"
android:text="@{viewModel.villusGaugeLabelNum}"
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"
binding:onCheckedChangedCommand="@{viewModel.onUploadVillusGaugeCommand}" />
<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:checked="@{viewModel.isUploadSlaughterEntry}"
android:text="@{viewModel.slaughterEntryLabelNum}"
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"
binding:onCheckedChangedCommand="@{viewModel.onUploadSlaughterEntryCommand}" />
<View
android:id="@+id/clear_line"
......
......@@ -15,6 +15,7 @@
<string name="villus_buy">绒毛收购</string>
<string name="villus_gauge">绒毛测量</string>
<string name="villus_print">绒毛收购打印</string>
<string name="slaughter_entry">屠宰进场</string>
<string name="download">下载数据</string>
<string name="upload">上传数据</string>
<string name="re_login">重新登录</string>
......@@ -22,11 +23,17 @@
<string name="select_unit">养殖单位</string>
<string name="veterinary">兽医</string>
<string name="buy_batch">收购批次</string>
<string name="entry_batch">进场批次</string>
<string name="superior_pertain">所属旗</string>
<string name="pertain">所属苏木</string>
<string name="buy_day">收购日期</string>
<string name="buy_weight">收购重量</string>
<string name="buy_factory">收购厂家</string>
<string name="entry_day">进场日期</string>
<string name="entry_count">进场数量</string>
<string name="quarantine_certificate_img">检疫合格证图片</string>
<string name="quarantine_certificate_name">检疫合格证姓名</string>
<string name="quarantine_certificate_idcard">检疫合格证身份证号</string>
<string name="person_in_charge">负责人</string>
<string name="gauge_day">测量日期</string>
<string name="diameter">直径μm</string>
......@@ -89,6 +96,7 @@
<string name="disconnect_blue">断开蓝牙</string>
<string name="dot">.</string>
<string name="data_entry">数据采集</string>
<string name="slaughter">屠宰</string>
<string name="data_sync">数据同步</string>
<string name="unit">养殖单位</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<external-path
name="external"
path="" />
<files-path
name="files"
path="" />
<cache-path
name="cache"
path="" />
</paths>
</resources>
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