Commit fba199d5 by 吴春元

集成 FRID 和扫码 标签

出库和盘点初步完成
parent 77e20911
......@@ -149,4 +149,6 @@ dependencies {
// implementation 'com.github.donkingliang:LabelsView:1.5.0'
implementation files('libs\\platform_sdk_v3.1.221124.jar')
implementation files('libs\\USDKLibrary-v2.3.0710.aar')
}
\ No newline at end of file
......@@ -30,12 +30,13 @@
android:name="android.app.lib_name"
android:value="" />
</activity>
<activity android:name=".ui.MainActivity" />
<activity android:name=".ui.out.OutboundActivity" />
<activity android:name=".ui.login.LoginActivity" />
<activity android:name=".ui.out.OutboundDetailActivity" />
<activity android:name=".ui.out.OutboundDetailListActivity" />
<activity android:name=".ui.review.ReviewDetailActivity" />
<activity android:name=".ui.review.ReviewTaskActivity" />
</application>
<!-- Android 10+ 需要添加 -->
......
......@@ -2,8 +2,14 @@ package com.sxyz.rfid;
import android.app.Activity;
import android.content.Context;
import android.device.DeviceManager;
import android.device.ScanManager;
import android.device.scanner.configuration.PropertyID;
import android.device.scanner.configuration.Triggering;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.util.Log;
import androidx.multidex.MultiDex;
import androidx.multidex.MultiDexApplication;
......@@ -26,6 +32,9 @@ public class App extends MultiDexApplication {
public RfidManager mRfidManager;
public boolean RFID_INIT_STATUS = false;
public int readerType = 0;
public static ScanManager mScanManager;
public static String ip;
public static String port;
public static App getInstance() {
return instance;
......@@ -40,13 +49,81 @@ public class App extends MultiDexApplication {
super.onCreate();
instance = this;
mContext = getApplicationContext();
// initRfid();
initGreenDao();
mActivityList = new LinkedList<>();
Hawk.init(getApplicationContext()).build();
ip = Hawk.get(AppConfig.Ip.IP);
port = Hawk.get(AppConfig.Ip.PORT);
// initRfid();
initScan();
initGreenDao();
registerActivityLifecycleCallbacks(new MyActivityLifecycle(getContext()));
}
private void initScan() {
mScanManager = new ScanManager();
mScanManager.closeScanner();
mScanManager.switchOutputMode(0);//0: 广播模式 1:键盘模式
mScanManager.setTriggerMode(Triggering.HOST);
mScanManager.setPropertyInts(new int[]{PropertyID.SEND_GOOD_READ_BEEP_ENABLE}, new int[]{1});
//value * 100 ms ;MIN == 1 ,MAX == 99 设置两个间隔条码的间隔时间,例如传1--> 1*100ms == 100ms;传最大值 99 --> 99*100ms == 9900ms ,即间隔 9900毫秒
// mScanManager.setPropertyInts(new int[]{PropertyID.TIMEOUT_BETWEEN_SAME_SYMBOL}, new int[]{1});
//关闭广播模式的声音
// mScanManager.setPropertyInts(new int[]{PropertyID.SEND_GOOD_READ_BEEP_ENABLE},new int[]{0});
//关闭键盘模式的声音
// mScanManager.setParameterInts(new int[]{PropertyID.SEND_GOOD_READ_BEEP_ENABLE},new int[]{0});
// hostModel();//设置连续扫码或者单次扫码
// eventKeyEnable523();
// getHandShankKeyCode();
}
/**
* 单扫模式
*/
public void hostModel() {
mScanManager.setTriggerMode(Triggering.HOST);
}
/**
* 连扫模式
*/
public void continuousModel() {
mScanManager.setTriggerMode(Triggering.CONTINUOUS);
String sn = new DeviceManager().getDeviceId();//SN号,唯一
}
/**
* 设置间隔时间
*
* @param interval 连续扫码的间隔时间 单位毫秒 范围0~5000ms
*/
public void setIntervalTime(int interval) {
int[] idGap = new int[]{0x0a2a, 0x0028};
int[] idmode = new int[2];
idmode[0] = interval;//连续间隔 单位毫秒
idmode[1] = 50;
mScanManager.setParameterInts(idGap, idmode);
}
private void eventKeyEnable523() {
//TODO 设置触发扫描出光的按钮
DeviceManager mDeviceManager = new DeviceManager();
mDeviceManager.setSettingProperty("persist-persist.sys.rfid.key", "0");//新增代码逻辑
mDeviceManager.setSettingProperty("persist-persist.sys.scan.key", "520-521-522-523-"); //"520-521-522-523-" 520、521、522、523出光
Log.e("ScanManager", " mDeviceManager.setSettingProperty() ");
}
private String getHandShankKeyCode() {
//TODO 获取触发扫描出光的键值
DeviceManager mDeviceManager = new DeviceManager();
String scanKey = mDeviceManager.getSettingProperty("persist-persist.sys.scan.key"); //"520-521-522-523-" 520、521、522、523出光
if (!TextUtils.isEmpty(scanKey)) {
//判断是否有523的键值注册,true:有523键值 false:没有
// 如果没有,可根据业务来进行后续处理,比如判断没有包含523,这时候又需要手柄按键自动触发出光,那么可以调用注册 523 按键值的方法
boolean contains = scanKey.contains("523");
}
return scanKey;
}
public void initRfid() {
SoundTool.getInstance(getApplicationContext());
// 在异步回调中拿到RFID实例
......@@ -69,6 +146,7 @@ public class App extends MultiDexApplication {
}, 1500);
}
public void addActivity(Activity activity) {
// 判断当前集合中不存在该Activity
if (!mActivityList.contains(activity)) {
......
......@@ -2,8 +2,10 @@ package com.sxyz.rfid;
public class AppConfig {
public static final boolean DEBUG = false;
//后台线上、测试环境地址
//public static final String BASE_URL = DEBUG ? "https://fzt.sxyztech.cn/prod-api/" : "http://192.168.19.165:8060/";
//public static final String BASE_URL = DEBUG ? "https://fzt.sxyztech.cn/prod-api/" : "http://192.168.19.142:8060/";
public static final String BASE_URL = DEBUG ? "https://fzt.sxyztech.cn/prod-api/" : "http://192.168.19.88:10011/";
public static class Ip {
public final static String IP = "ip";
public final static String PORT = "port";
}
}
......@@ -12,4 +12,8 @@ import com.sxyz.rfid.ui.login.bean.UserBean;
*/
public interface ILoginPresenter {
void doLogin(AppCompatActivity activity, UserBean mUserBean);
void doGetInfo(AppCompatActivity activity);
}
......@@ -4,6 +4,8 @@ import android.app.Activity;
import androidx.fragment.app.Fragment;
import com.sxyz.rfid.presenter.model.OperatorBean;
/**
* @Description: 出库
* @Project: rfid-app
......@@ -11,7 +13,7 @@ import androidx.fragment.app.Fragment;
*/
public interface IOutBoundPresenter {
//查询出库单列表
void doOutBoundList(Fragment activity, int pageSize, int pageNum);
void doOutBoundList(Fragment activity, int pageSize, int pageNum, String orderNo);
//查询出库明细
void doOutBoundDetailList(Activity activity, int orderId);
......@@ -25,4 +27,20 @@ public interface IOutBoundPresenter {
//出库明细-撤销操作
void doOutBoundDetailCancel(Activity activity, int itemId);
//查询出库单关联的RFID列表
void doGetOutBoundFridList(Activity activity, String rfidTag);
//出库RFID-确认出库
/**
* num
* operatorId 1
* orderId 2
* rfidTag "BQ002"
*
* @param activity
* @param dataBean
*/
void doOutBoundFrid(Activity activity, OperatorBean dataBean);
}
package com.sxyz.rfid.presenter;
import android.app.Activity;
import androidx.fragment.app.Fragment;
import com.sxyz.rfid.presenter.model.ReviewTaskCheck;
/**
* @Description: 盘点
* @Project: rfid-app
* @Author: chunyuan.wu
*/
public interface IReviewPresenter {
//查询盘点列表
void doReviewList(Fragment activity, int pageSize, int pageNum, String taskNo);
//删除盘点任务
void doDeleteReviewTask(Fragment activity, int taskId);
//盘点详情 - 盘点任务明细信息
void doReviewDetail(Activity activity, int taskId);
//盘点详情列表 - 盘点任务明细信息
void doReviewDetailList(Activity activity, int taskId);
//盘点结果
void doReviewResult(Activity activity, int taskId);
//执行盘点 - 任务基础信息 - 扫描执行盘点
void doReviewScanTaskCheck(Activity activity, ReviewTaskCheck reviewTaskCheck);
//执行盘点 - RFID执行盘点
void doReviewRfidTaskCheck(Activity activity, ReviewTaskCheck reviewTaskCheck);
//结束盘点
void doStopReviewTask(Fragment activity, int taskId);
}
......@@ -5,6 +5,7 @@ import androidx.appcompat.app.AppCompatActivity;
import com.sxyz.rfid.presenter.ILoginPresenter;
import com.sxyz.rfid.presenter.model.LoginModel;
import com.sxyz.rfid.presenter.model.UserInfoModel;
import com.sxyz.rfid.presenter.view.ILoginView;
import com.sxyz.rfid.retrofit.callback.Object1Observer;
import com.sxyz.rfid.retrofit.config.Transformer;
......@@ -44,4 +45,20 @@ public class LoginPresenterImpl implements ILoginPresenter {
}
});
}
@Override
public void doGetInfo(AppCompatActivity activity) {
RetrofitUtils.getInstance().getApiService().getUserInfo()
.compose(Transformer.switchSchedulers(CustomProgressDialog.createLoadingDialog(activity, ""))).subscribe(new Object1Observer<UserInfoModel>() {
@Override
public void onSuccess(UserInfoModel userInfoModel) {
view.getUserInfoSuccess(userInfoModel);
}
@Override
public void onFailed(Throwable throwable) {
}
});
}
}
......@@ -8,6 +8,7 @@ import com.sxyz.rfid.presenter.IOutBoundPresenter;
import com.sxyz.rfid.presenter.model.OperatorBean;
import com.sxyz.rfid.presenter.model.OutBoundDetailModel;
import com.sxyz.rfid.presenter.model.OutboundFlowingWaterModel;
import com.sxyz.rfid.presenter.model.OutboundFridModel;
import com.sxyz.rfid.presenter.model.OutboundModel;
import com.sxyz.rfid.presenter.view.IOutBoundView;
import com.sxyz.rfid.retrofit.callback.Object1Observer;
......@@ -33,8 +34,8 @@ public class OutBoundPresenterImpl implements IOutBoundPresenter {
}
@Override
public void doOutBoundList(Fragment activity, int pageSize, int pageNum) {
RetrofitUtils.getInstance().getApiService().getOutboundList(pageSize, pageNum).compose(Transformer.switchSchedulers(CustomProgressDialog.createLoadingDialog(activity.getActivity(), ""))).subscribe(new Object1Observer<OutboundModel>() {
public void doOutBoundList(Fragment activity, int pageSize, int pageNum, String orderNo) {
RetrofitUtils.getInstance().getApiService().getOutboundList(pageSize, pageNum, orderNo).compose(Transformer.switchSchedulers(CustomProgressDialog.createLoadingDialog(activity.getActivity(), ""))).subscribe(new Object1Observer<OutboundModel>() {
@Override
public void onSuccess(OutboundModel model) {
......@@ -113,4 +114,40 @@ public class OutBoundPresenterImpl implements IOutBoundPresenter {
}
});
}
/**
* 查询出库流水-根据RFID标签查询
*
* @param activity
* @param rfidTag
*/
@Override
public void doGetOutBoundFridList(Activity activity, String rfidTag) {
RetrofitUtils.getInstance().getApiService().getOutboundFridList(rfidTag).compose(Transformer.switchSchedulers(CustomProgressDialog.createLoadingDialog(activity, ""))).subscribe(new Object1Observer<OutboundFridModel>() {
@Override
public void onSuccess(OutboundFridModel model) {
view.outBoundFridSuccess(model);
}
@Override
public void onFailed(Throwable throwable) {
}
});
}
@Override
public void doOutBoundFrid(Activity activity, OperatorBean dataBean) {
RetrofitUtils.getInstance().getApiService().doOutBoundFrid(dataBean).compose(Transformer.switchSchedulers(CustomProgressDialog.createLoadingDialog(activity, ""))).subscribe(new Object1Observer<Object>() {
@Override
public void onSuccess(Object model) {
view.outSubmitBoundFridSuccess();
}
@Override
public void onFailed(Throwable throwable) {
}
});
}
}
package com.sxyz.rfid.presenter.imp;
import android.app.Activity;
import androidx.fragment.app.Fragment;
import com.sxyz.rfid.presenter.IReviewPresenter;
import com.sxyz.rfid.presenter.model.ReviewDetailListModel;
import com.sxyz.rfid.presenter.model.ReviewDetailModel;
import com.sxyz.rfid.presenter.model.ReviewModel;
import com.sxyz.rfid.presenter.model.ReviewResultModel;
import com.sxyz.rfid.presenter.model.ReviewRfidTaskCheckModel;
import com.sxyz.rfid.presenter.model.ReviewTaskCheck;
import com.sxyz.rfid.presenter.view.IReviewView;
import com.sxyz.rfid.retrofit.callback.Object1Observer;
import com.sxyz.rfid.retrofit.callback.Object2Observer;
import com.sxyz.rfid.retrofit.callback.ObjectObserver;
import com.sxyz.rfid.retrofit.config.Transformer;
import com.sxyz.rfid.retrofit.http.RetrofitUtils;
import com.sxyz.rfid.utils.ToastUtil;
import com.sxyz.rfid.widgets.CustomProgressDialog;
/**
* @Description: 盘点
* @Project: rfid-app
* @Package: com.sxyz.rfid.ui.out
* @author: chunyuanwu
* @date: 2025年12月29日 16:00:58
* @version: 1.0.0
*/
public class ReviewPresenterImpl implements IReviewPresenter {
private IReviewView view;
public ReviewPresenterImpl(IReviewView view) {
this.view = view;
}
@Override
public void doReviewList(Fragment activity, int pageSize, int pageNum, String taskNo) {
RetrofitUtils.getInstance().getApiService().getReviewList(pageSize, pageNum, taskNo).compose(Transformer.switchSchedulers(CustomProgressDialog.createLoadingDialog(activity.getActivity(), ""))).subscribe(new Object1Observer<ReviewModel>() {
@Override
public void onSuccess(ReviewModel model) {
if (pageNum == 1) {
view.reviewSuccess(model);
} else {
view.reviewLoadMoreSuccess(model);
}
}
@Override
public void onFailed(Throwable throwable) {
}
});
}
@Override
public void doDeleteReviewTask(Fragment activity, int taskId) {
RetrofitUtils.getInstance().getApiService().deleteReviewTask(taskId).compose(Transformer.switchSchedulers(CustomProgressDialog.createLoadingDialog(activity.getActivity(), ""))).subscribe(new Object1Observer<Object>() {
@Override
public void onSuccess(Object model) {
view.deleteReviewTaskSuccess();
}
@Override
public void onFailed(Throwable throwable) {
}
});
}
@Override
public void doReviewDetail(Activity activity, int taskId) {
RetrofitUtils.getInstance().getApiService().getReviewDetail(taskId).compose(Transformer.switchSchedulers()).subscribe(new Object1Observer<ReviewDetailModel>() {
@Override
public void onSuccess(ReviewDetailModel model) {
view.reviewDetailSuccess(model);
}
@Override
public void onFailed(Throwable throwable) {
}
});
}
@Override
public void doReviewDetailList(Activity activity, int taskId) {
RetrofitUtils.getInstance().getApiService().getReviewDetailList(10000000, 1, taskId).compose(Transformer.switchSchedulers()).subscribe(new Object1Observer<ReviewDetailListModel>() {
@Override
public void onSuccess(ReviewDetailListModel model) {
view.reviewDetailListSuccess(model);
}
@Override
public void onFailed(Throwable throwable) {
}
});
}
@Override
public void doReviewResult(Activity activity, int taskId) {
RetrofitUtils.getInstance().getApiService().getReviewResult(taskId).compose(Transformer.switchSchedulers()).subscribe(new Object1Observer<ReviewResultModel>() {
@Override
public void onSuccess(ReviewResultModel model) {
view.reviewResultSuccess(model);
}
@Override
public void onFailed(Throwable throwable) {
}
});
}
@Override
public void doReviewScanTaskCheck(Activity activity, ReviewTaskCheck reviewTaskCheck) {
RetrofitUtils.getInstance().getApiService().doReviewScanTaskCheck(reviewTaskCheck).compose(Transformer.switchSchedulers()).subscribe(new Object1Observer<ReviewRfidTaskCheckModel>() {
@Override
public void onSuccess(ReviewRfidTaskCheckModel model) {
view.reviewScanTaskCheckSuccess(model);
}
@Override
public void onFailed(Throwable throwable) {
}
});
}
@Override
public void doReviewRfidTaskCheck(Activity activity, ReviewTaskCheck reviewTaskCheck) {
RetrofitUtils.getInstance().getApiService().doReviewRfidTaskCheck(reviewTaskCheck).compose(Transformer.switchSchedulers()).subscribe(new Object1Observer<ReviewRfidTaskCheckModel>() {
@Override
public void onSuccess(ReviewRfidTaskCheckModel model) {
view.reviewRfidTaskCheckSuccess(model);
}
@Override
public void onFailed(Throwable throwable) {
}
});
}
@Override
public void doStopReviewTask(Fragment activity, int taskId) {
RetrofitUtils.getInstance().getApiService().doStopReviewTask(taskId).compose(Transformer.switchSchedulers(CustomProgressDialog.createLoadingDialog(activity.getActivity(), ""))).subscribe(new Object1Observer<Object>() {
@Override
public void onSuccess(Object model) {
view.stopReviewTaskSuccess();
}
@Override
public void onFailed(Throwable throwable) {
}
});
}
}
......@@ -12,9 +12,52 @@ package com.sxyz.rfid.presenter.model;
*/
public class OperatorBean {
private int operatorId;
private String num;
private int orderId;
private String rfidTag;
// public OperatorBean(int operatorId, int num, int orderId, String rfidTag) {
// this.operatorId = operatorId;
// this.num = num;
// this.orderId = orderId;
// this.rfidTag = rfidTag;
// }
public OperatorBean() {
}
public OperatorBean(int operatorId) {
this.operatorId = operatorId;
}
public int getOperatorId() {
return operatorId;
}
public void setOperatorId(int operatorId) {
this.operatorId = operatorId;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
public int getOrderId() {
return orderId;
}
public void setOrderId(int orderId) {
this.orderId = orderId;
}
public String getRfidTag() {
return rfidTag;
}
public void setRfidTag(String rfidTag) {
this.rfidTag = rfidTag;
}
}
......@@ -94,11 +94,11 @@ public class OutBoundDetailModel implements Serializable {
private int itemId;
private int orderId;
private int materialId;
private int planQuantity;
private int actualQuantity;
private double planQuantity;
private double actualQuantity;
private String unit;
private int unitPrice;
private int amount;
private double unitPrice;
private double amount;
private Object batchNo;
private Object pickingLocation;
private Object pickingQuantity;
......@@ -196,19 +196,19 @@ public class OutBoundDetailModel implements Serializable {
this.materialId = materialId;
}
public int getPlanQuantity() {
public double getPlanQuantity() {
return planQuantity;
}
public void setPlanQuantity(int planQuantity) {
public void setPlanQuantity(double planQuantity) {
this.planQuantity = planQuantity;
}
public int getActualQuantity() {
public double getActualQuantity() {
return actualQuantity;
}
public void setActualQuantity(int actualQuantity) {
public void setActualQuantity(double actualQuantity) {
this.actualQuantity = actualQuantity;
}
......@@ -220,19 +220,19 @@ public class OutBoundDetailModel implements Serializable {
this.unit = unit;
}
public int getUnitPrice() {
public double getUnitPrice() {
return unitPrice;
}
public void setUnitPrice(int unitPrice) {
public void setUnitPrice(double unitPrice) {
this.unitPrice = unitPrice;
}
public int getAmount() {
public double getAmount() {
return amount;
}
public void setAmount(int amount) {
public void setAmount(double amount) {
this.amount = amount;
}
......
package com.sxyz.rfid.presenter.model;
import java.util.List;
/**
* 主要功能:
*
* @Description:
* @Project: rfid-app
* @Package: com.sxyz.rfid.presenter.model
* @author: chunyuanwu
* @date: 2026年01月05日 13:07
* @version: 1.0.0
*/
public class ReviewDetailModel {
/**
* msg : 操作成功
* code : 200
* data : {"createBy":null,"createTime":"2025-12-29 11:58:25","updateBy":null,"updateTime":"2026-01-04 16:15:57","remark":"从计划【PDJH-20251225001】生成的任务(天)","taskId":2,"planId":2,"taskNo":"PLAN-807049194DA2","taskName":"2025年年度周期盘点\t - ","warehouseId":2,"warehouseName":"冷藏仓库","areaIds":"2","areaName":"","materialIds":null,"locationRange":null,"assigneeId":null,"assistantIds":null,"taskStatus":"3","startTime":"2025-12-30","endTime":null,"totalItems":6,"countedItems":6,"inventoryDevice":null,"areaIdsList":[2],"materialIdList":[]}
*/
private String msg;
private int code;
private DataBean data;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public DataBean getData() {
return data;
}
public void setData(DataBean data) {
this.data = data;
}
public static class DataBean {
/**
* createBy : null
* createTime : 2025-12-29 11:58:25
* updateBy : null
* updateTime : 2026-01-04 16:15:57
* remark : 从计划【PDJH-20251225001】生成的任务(天)
* taskId : 2
* planId : 2
* taskNo : PLAN-807049194DA2
* taskName : 2025年年度周期盘点-
* warehouseId : 2
* warehouseName : 冷藏仓库
* areaIds : 2
* areaName :
* materialIds : null
* locationRange : null
* assigneeId : null
* assistantIds : null
* taskStatus : 3
* startTime : 2025-12-30
* endTime : null
* totalItems : 6
* countedItems : 6
* inventoryDevice : null
* areaIdsList : [2]
* materialIdList : []
*/
private Object createBy;
private String createTime;
private Object updateBy;
private String updateTime;
private String remark;
private int taskId;
private int planId;
private String taskNo;
private String taskName;
private int warehouseId;
private String warehouseName;
private String areaIds;
private String areaName;
private Object materialIds;
private Object locationRange;
private Object assigneeId;
private Object assistantIds;
private String taskStatus;
private String startTime;
private Object endTime;
private int totalItems;
private int countedItems;
private Object inventoryDevice;
private List<Integer> areaIdsList;
private List<?> materialIdList;
public Object getCreateBy() {
return createBy;
}
public void setCreateBy(Object createBy) {
this.createBy = createBy;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public Object getUpdateBy() {
return updateBy;
}
public void setUpdateBy(Object updateBy) {
this.updateBy = updateBy;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public int getTaskId() {
return taskId;
}
public void setTaskId(int taskId) {
this.taskId = taskId;
}
public int getPlanId() {
return planId;
}
public void setPlanId(int planId) {
this.planId = planId;
}
public String getTaskNo() {
return taskNo;
}
public void setTaskNo(String taskNo) {
this.taskNo = taskNo;
}
public String getTaskName() {
return taskName;
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
public int getWarehouseId() {
return warehouseId;
}
public void setWarehouseId(int warehouseId) {
this.warehouseId = warehouseId;
}
public String getWarehouseName() {
return warehouseName;
}
public void setWarehouseName(String warehouseName) {
this.warehouseName = warehouseName;
}
public String getAreaIds() {
return areaIds;
}
public void setAreaIds(String areaIds) {
this.areaIds = areaIds;
}
public String getAreaName() {
return areaName;
}
public void setAreaName(String areaName) {
this.areaName = areaName;
}
public Object getMaterialIds() {
return materialIds;
}
public void setMaterialIds(Object materialIds) {
this.materialIds = materialIds;
}
public Object getLocationRange() {
return locationRange;
}
public void setLocationRange(Object locationRange) {
this.locationRange = locationRange;
}
public Object getAssigneeId() {
return assigneeId;
}
public void setAssigneeId(Object assigneeId) {
this.assigneeId = assigneeId;
}
public Object getAssistantIds() {
return assistantIds;
}
public void setAssistantIds(Object assistantIds) {
this.assistantIds = assistantIds;
}
public String getTaskStatus() {
return taskStatus;
}
public void setTaskStatus(String taskStatus) {
this.taskStatus = taskStatus;
}
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public Object getEndTime() {
return endTime;
}
public void setEndTime(Object endTime) {
this.endTime = endTime;
}
public int getTotalItems() {
return totalItems;
}
public void setTotalItems(int totalItems) {
this.totalItems = totalItems;
}
public int getCountedItems() {
return countedItems;
}
public void setCountedItems(int countedItems) {
this.countedItems = countedItems;
}
public Object getInventoryDevice() {
return inventoryDevice;
}
public void setInventoryDevice(Object inventoryDevice) {
this.inventoryDevice = inventoryDevice;
}
public List<Integer> getAreaIdsList() {
return areaIdsList;
}
public void setAreaIdsList(List<Integer> areaIdsList) {
this.areaIdsList = areaIdsList;
}
public List<?> getMaterialIdList() {
return materialIdList;
}
public void setMaterialIdList(List<?> materialIdList) {
this.materialIdList = materialIdList;
}
}
}
package com.sxyz.rfid.presenter.model;
import java.io.Serializable;
import java.util.List;
/**
* 主要功能:
*
* @Description:
* @Project: rfid-app
* @Package: com.sxyz.rfid.presenter.model
* @author: chunyuanwu
* @date: 2026年01月05日 08:41
* @version: 1.0.0
*/
public class ReviewModel implements Serializable {
/**
* total : 1
* rows : [{"createBy":null,"createTime":"2025-12-29 11:58:25","updateBy":null,"updateTime":"2026-01-04 16:15:57","remark":"从计划【PDJH-20251225001】生成的任务(天)","taskId":2,"planId":2,"taskNo":"PLAN-807049194DA2","taskName":"2025年年度周期盘点\t - ","warehouseId":2,"warehouseName":"冷藏仓库","areaIds":"2","areaName":"","materialIds":null,"locationRange":null,"assigneeId":null,"assistantIds":null,"taskStatus":"3","startTime":"2025-12-30","endTime":null,"totalItems":6,"countedItems":6,"inventoryDevice":null,"materialIdList":[],"areaIdsList":[2]}]
* code : 200
* msg : 查询成功
*/
private int total;
private int code;
private String msg;
private List<RowsBean> rows;
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public List<RowsBean> getRows() {
return rows;
}
public void setRows(List<RowsBean> rows) {
this.rows = rows;
}
public static class RowsBean implements Serializable {
/**
* createBy : null
* createTime : 2025-12-29 11:58:25
* updateBy : null
* updateTime : 2026-01-04 16:15:57
* remark : 从计划【PDJH-20251225001】生成的任务(天)
* taskId : 2
* planId : 2
* taskNo : PLAN-807049194DA2
* taskName : 2025年年度周期盘点-
* warehouseId : 2
* warehouseName : 冷藏仓库
* areaIds : 2
* areaName :
* materialIds : null
* locationRange : null
* assigneeId : null
* assistantIds : null
* taskStatus : 3
* startTime : 2025-12-30
* endTime : null
* totalItems : 6
* countedItems : 6
* inventoryDevice : null
* materialIdList : []
* areaIdsList : [2]
*/
private Object createBy;
private String createTime;
private Object updateBy;
private String updateTime;
private String remark;
private int taskId;
private int planId;
private String taskNo;
private String taskName;
private int warehouseId;
private String warehouseName;
private String areaIds;
private String areaName;
private Object materialIds;
private Object locationRange;
private Object assigneeId;
private Object assistantIds;
private String taskStatus;
private String startTime;
private Object endTime;
private int totalItems;
private int countedItems;
private Object inventoryDevice;
private List<?> materialIdList;
private List<Integer> areaIdsList;
public Object getCreateBy() {
return createBy;
}
public void setCreateBy(Object createBy) {
this.createBy = createBy;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public Object getUpdateBy() {
return updateBy;
}
public void setUpdateBy(Object updateBy) {
this.updateBy = updateBy;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public int getTaskId() {
return taskId;
}
public void setTaskId(int taskId) {
this.taskId = taskId;
}
public int getPlanId() {
return planId;
}
public void setPlanId(int planId) {
this.planId = planId;
}
public String getTaskNo() {
return taskNo;
}
public void setTaskNo(String taskNo) {
this.taskNo = taskNo;
}
public String getTaskName() {
return taskName;
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
public int getWarehouseId() {
return warehouseId;
}
public void setWarehouseId(int warehouseId) {
this.warehouseId = warehouseId;
}
public String getWarehouseName() {
return warehouseName;
}
public void setWarehouseName(String warehouseName) {
this.warehouseName = warehouseName;
}
public String getAreaIds() {
return areaIds;
}
public void setAreaIds(String areaIds) {
this.areaIds = areaIds;
}
public String getAreaName() {
return areaName;
}
public void setAreaName(String areaName) {
this.areaName = areaName;
}
public Object getMaterialIds() {
return materialIds;
}
public void setMaterialIds(Object materialIds) {
this.materialIds = materialIds;
}
public Object getLocationRange() {
return locationRange;
}
public void setLocationRange(Object locationRange) {
this.locationRange = locationRange;
}
public Object getAssigneeId() {
return assigneeId;
}
public void setAssigneeId(Object assigneeId) {
this.assigneeId = assigneeId;
}
public Object getAssistantIds() {
return assistantIds;
}
public void setAssistantIds(Object assistantIds) {
this.assistantIds = assistantIds;
}
public String getTaskStatus() {
return taskStatus;
}
public void setTaskStatus(String taskStatus) {
this.taskStatus = taskStatus;
}
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public Object getEndTime() {
return endTime;
}
public void setEndTime(Object endTime) {
this.endTime = endTime;
}
public int getTotalItems() {
return totalItems;
}
public void setTotalItems(int totalItems) {
this.totalItems = totalItems;
}
public int getCountedItems() {
return countedItems;
}
public void setCountedItems(int countedItems) {
this.countedItems = countedItems;
}
public Object getInventoryDevice() {
return inventoryDevice;
}
public void setInventoryDevice(Object inventoryDevice) {
this.inventoryDevice = inventoryDevice;
}
public List<?> getMaterialIdList() {
return materialIdList;
}
public void setMaterialIdList(List<?> materialIdList) {
this.materialIdList = materialIdList;
}
public List<Integer> getAreaIdsList() {
return areaIdsList;
}
public void setAreaIdsList(List<Integer> areaIdsList) {
this.areaIdsList = areaIdsList;
}
}
}
package com.sxyz.rfid.presenter.model;
import java.util.List;
/**
* 主要功能:
*
* @Description:
* @Project: rfid-app
* @Package: com.sxyz.rfid.presenter.model
* @author: chunyuanwu
* @date: 2026年01月05日 13:53
* @version: 1.0.0
*/
public class ReviewResultModel {
/**
* total : 1
* rows : [{"createBy":"","createTime":"2025-12-29 11:58:25","updateBy":"","updateTime":"2026-01-04 16:15:57","remark":"","resultId":1,"taskId":2,"planId":2,"warehouseId":2,"warehouseName":"冷藏仓库","areaIds":"2","areaName":"","checkerId":1,"checkerName":"若依","startTime":"2025-12-29","endTime":"2026-01-04","totalItems":6,"countedItems":6,"surplusItems":1,"deficitItems":0,"totalSurplus":30,"totalDeficit":0,"totalDifferenceValue":30,"differenceRate":0.1667,"resultStatus":"1","auditStatus":"0","auditorId":null,"auditorName":"","auditTime":null,"auditOpinion":"","areaIdsList":[2]}]
* code : 200
* msg : 查询成功
*/
private int total;
private int code;
private String msg;
private List<RowsBean> rows;
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public List<RowsBean> getRows() {
return rows;
}
public void setRows(List<RowsBean> rows) {
this.rows = rows;
}
public static class RowsBean {
/**
* createBy :
* createTime : 2025-12-29 11:58:25
* updateBy :
* updateTime : 2026-01-04 16:15:57
* remark :
* resultId : 1
* taskId : 2
* planId : 2
* warehouseId : 2
* warehouseName : 冷藏仓库
* areaIds : 2
* areaName :
* checkerId : 1
* checkerName : 若依
* startTime : 2025-12-29
* endTime : 2026-01-04
* totalItems : 6
* countedItems : 6
* surplusItems : 1
* deficitItems : 0
* totalSurplus : 30.0
* totalDeficit : 0.0
* totalDifferenceValue : 30.0
* differenceRate : 0.1667
* resultStatus : 1
* auditStatus : 0
* auditorId : null
* auditorName :
* auditTime : null
* auditOpinion :
* areaIdsList : [2]
*/
private String createBy;
private String createTime;
private String updateBy;
private String updateTime;
private String remark;
private int resultId;
private int taskId;
private int planId;
private int warehouseId;
private String warehouseName;
private String areaIds;
private String areaName;
private int checkerId;
private String checkerName;
private String startTime;
private String endTime;
private int totalItems;
private int countedItems;
private int surplusItems;
private int deficitItems;
private double totalSurplus;
private double totalDeficit;
private double totalDifferenceValue;
private double differenceRate;
private String resultStatus;
private String auditStatus;
private Object auditorId;
private String auditorName;
private Object auditTime;
private String auditOpinion;
private List<Integer> areaIdsList;
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 String getUpdateBy() {
return updateBy;
}
public void setUpdateBy(String updateBy) {
this.updateBy = updateBy;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public int getResultId() {
return resultId;
}
public void setResultId(int resultId) {
this.resultId = resultId;
}
public int getTaskId() {
return taskId;
}
public void setTaskId(int taskId) {
this.taskId = taskId;
}
public int getPlanId() {
return planId;
}
public void setPlanId(int planId) {
this.planId = planId;
}
public int getWarehouseId() {
return warehouseId;
}
public void setWarehouseId(int warehouseId) {
this.warehouseId = warehouseId;
}
public String getWarehouseName() {
return warehouseName;
}
public void setWarehouseName(String warehouseName) {
this.warehouseName = warehouseName;
}
public String getAreaIds() {
return areaIds;
}
public void setAreaIds(String areaIds) {
this.areaIds = areaIds;
}
public String getAreaName() {
return areaName;
}
public void setAreaName(String areaName) {
this.areaName = areaName;
}
public int getCheckerId() {
return checkerId;
}
public void setCheckerId(int checkerId) {
this.checkerId = checkerId;
}
public String getCheckerName() {
return checkerName;
}
public void setCheckerName(String checkerName) {
this.checkerName = checkerName;
}
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public String getEndTime() {
return endTime;
}
public void setEndTime(String endTime) {
this.endTime = endTime;
}
public int getTotalItems() {
return totalItems;
}
public void setTotalItems(int totalItems) {
this.totalItems = totalItems;
}
public int getCountedItems() {
return countedItems;
}
public void setCountedItems(int countedItems) {
this.countedItems = countedItems;
}
public int getSurplusItems() {
return surplusItems;
}
public void setSurplusItems(int surplusItems) {
this.surplusItems = surplusItems;
}
public int getDeficitItems() {
return deficitItems;
}
public void setDeficitItems(int deficitItems) {
this.deficitItems = deficitItems;
}
public double getTotalSurplus() {
return totalSurplus;
}
public void setTotalSurplus(double totalSurplus) {
this.totalSurplus = totalSurplus;
}
public double getTotalDeficit() {
return totalDeficit;
}
public void setTotalDeficit(double totalDeficit) {
this.totalDeficit = totalDeficit;
}
public double getTotalDifferenceValue() {
return totalDifferenceValue;
}
public void setTotalDifferenceValue(double totalDifferenceValue) {
this.totalDifferenceValue = totalDifferenceValue;
}
public double getDifferenceRate() {
return differenceRate;
}
public void setDifferenceRate(double differenceRate) {
this.differenceRate = differenceRate;
}
public String getResultStatus() {
return resultStatus;
}
public void setResultStatus(String resultStatus) {
this.resultStatus = resultStatus;
}
public String getAuditStatus() {
return auditStatus;
}
public void setAuditStatus(String auditStatus) {
this.auditStatus = auditStatus;
}
public Object getAuditorId() {
return auditorId;
}
public void setAuditorId(Object auditorId) {
this.auditorId = auditorId;
}
public String getAuditorName() {
return auditorName;
}
public void setAuditorName(String auditorName) {
this.auditorName = auditorName;
}
public Object getAuditTime() {
return auditTime;
}
public void setAuditTime(Object auditTime) {
this.auditTime = auditTime;
}
public String getAuditOpinion() {
return auditOpinion;
}
public void setAuditOpinion(String auditOpinion) {
this.auditOpinion = auditOpinion;
}
public List<Integer> getAreaIdsList() {
return areaIdsList;
}
public void setAreaIdsList(List<Integer> areaIdsList) {
this.areaIdsList = areaIdsList;
}
}
}
package com.sxyz.rfid.presenter.model;
/**
* 主要功能:
*
* @Description:
* @Project: rfid-app
* @Package: com.sxyz.rfid.presenter.model
* @author: chunyuanwu
* @date: 2026年01月05日 15:14
* @version: 1.0.0
*/
public class ReviewRfidTaskCheckModel {
/**
* msg : 盘点成功
* code : 200
* data : {"taskId":10,"totalScanned":1,"validScanned":1,"invalidScanned":0,"surplusCount":0,"countedItems":2,"checkStatus":"2","totalItems":2,"progress":1,"deficitCount":0}
*/
private String msg;
private int code;
private DataBean data;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public DataBean getData() {
return data;
}
public void setData(DataBean data) {
this.data = data;
}
public static class DataBean {
/**
* taskId : 10
* totalScanned : 1
* validScanned : 1
* invalidScanned : 0
* surplusCount : 0
* countedItems : 2
* checkStatus : 2
* totalItems : 2
* progress : 1.0
* deficitCount : 0
*/
private int taskId;
private int totalScanned;
private int validScanned;
private int invalidScanned;
private int surplusCount;
private int countedItems;
private String checkStatus;
private int totalItems;
private double progress;
private int deficitCount;
public int getTaskId() {
return taskId;
}
public void setTaskId(int taskId) {
this.taskId = taskId;
}
public int getTotalScanned() {
return totalScanned;
}
public void setTotalScanned(int totalScanned) {
this.totalScanned = totalScanned;
}
public int getValidScanned() {
return validScanned;
}
public void setValidScanned(int validScanned) {
this.validScanned = validScanned;
}
public int getInvalidScanned() {
return invalidScanned;
}
public void setInvalidScanned(int invalidScanned) {
this.invalidScanned = invalidScanned;
}
public int getSurplusCount() {
return surplusCount;
}
public void setSurplusCount(int surplusCount) {
this.surplusCount = surplusCount;
}
public int getCountedItems() {
return countedItems;
}
public void setCountedItems(int countedItems) {
this.countedItems = countedItems;
}
public String getCheckStatus() {
return checkStatus;
}
public void setCheckStatus(String checkStatus) {
this.checkStatus = checkStatus;
}
public int getTotalItems() {
return totalItems;
}
public void setTotalItems(int totalItems) {
this.totalItems = totalItems;
}
public double getProgress() {
return progress;
}
public void setProgress(double progress) {
this.progress = progress;
}
public int getDeficitCount() {
return deficitCount;
}
public void setDeficitCount(int deficitCount) {
this.deficitCount = deficitCount;
}
}
}
package com.sxyz.rfid.presenter.model;
import java.util.List;
/**
* 主要功能:
*
* @Description:
* @Project: rfid-app
* @Package: com.sxyz.rfid.presenter.model
* @author: chunyuanwu
* @date: 2026年01月05日 09:36
* @version: 1.0.0
*/
public class ReviewTaskCheck {
/**
* taskId : 4
* checkerId : 1
* checkerName : 若依
* batchNoList : ["BATCH2026010414284490650026"]
*/
private int taskIds;
private int taskId;
private int checkerId;
private String checkerName;
private List<String> batchNoList;
private List<String> rfidList;
public ReviewTaskCheck() {
}
public ReviewTaskCheck(int taskIds) {
this.taskIds = taskIds;
}
public ReviewTaskCheck(int taskId, int checkerId) {
this.taskId = taskId;
this.checkerId = checkerId;
}
public List<String> getRfidList() {
return rfidList;
}
public void setRfidList(List<String> rfidList) {
this.rfidList = rfidList;
}
public int getTaskIds() {
return taskIds;
}
public void setTaskIds(int taskIds) {
this.taskIds = taskIds;
}
public int getTaskId() {
return taskId;
}
public void setTaskId(int taskId) {
this.taskId = taskId;
}
public int getCheckerId() {
return checkerId;
}
public void setCheckerId(int checkerId) {
this.checkerId = checkerId;
}
public String getCheckerName() {
return checkerName;
}
public void setCheckerName(String checkerName) {
this.checkerName = checkerName;
}
public List<String> getBatchNoList() {
return batchNoList;
}
public void setBatchNoList(List<String> batchNoList) {
this.batchNoList = batchNoList;
}
}
......@@ -6,11 +6,21 @@ import com.sxyz.rfid.presenter.model.LoginModel;
import com.sxyz.rfid.presenter.model.OperatorBean;
import com.sxyz.rfid.presenter.model.OutBoundDetailModel;
import com.sxyz.rfid.presenter.model.OutboundFlowingWaterModel;
import com.sxyz.rfid.presenter.model.OutboundFridModel;
import com.sxyz.rfid.presenter.model.OutboundModel;
import com.sxyz.rfid.presenter.model.ReviewDetailListModel;
import com.sxyz.rfid.presenter.model.ReviewDetailModel;
import com.sxyz.rfid.presenter.model.ReviewModel;
import com.sxyz.rfid.presenter.model.ReviewResultModel;
import com.sxyz.rfid.presenter.model.ReviewRfidTaskCheckModel;
import com.sxyz.rfid.presenter.model.ReviewTaskCheck;
import com.sxyz.rfid.presenter.model.ReviewTaskDetailList;
import com.sxyz.rfid.presenter.model.UserInfoModel;
import com.sxyz.rfid.ui.login.bean.UserBean;
import io.reactivex.Observable;
import retrofit2.http.Body;
import retrofit2.http.DELETE;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Path;
......@@ -26,13 +36,18 @@ public interface ApiService {
@POST("login")
Observable<LoginModel> getLogin(@Body UserBean userBean);
//登录
@GET("getInfo")
Observable<UserInfoModel> getUserInfo();
//字典列表
@GET("system/dict/data/list")
Observable<DictModel> getDict(@Query("pageSize") int pageSize, @Query("pageNum") int pageNum, @Query("dictType") String dictType);
//------------------------------------------ 出库 start ------------------------------------------
//出库列表http://192.168.19.22:8851/dev-api/ware/wmsOutboundOrder/cancelItem/1
@GET("ware/wmsOutboundOrder/list")
Observable<OutboundModel> getOutboundList(@Query("pageSize") int pageSize, @Query("pageNum") int pageNum);
Observable<OutboundModel> getOutboundList(@Query("pageSize") int pageSize, @Query("pageNum") int pageNum, @Query("orderNo") String orderNo);
//出库单明细
@GET("ware/wmsOutboundOrderItem/list")
......@@ -49,4 +64,51 @@ public interface ApiService {
//出库流水-撤销操作
@POST("ware/wmsOutboundOrder/cancelOutboundRelations/{relationId}")
Observable<Object> getCancelOutboundRelations(@Path("relationId") int relationId, @Body OperatorBean operatorId);
//出库流水-撤销操作
@GET("ware/wmsInventory/list")
Observable<OutboundFridModel> getOutboundFridList(@Query("rfidTag") String rfidTag);
//出库
@POST("ware/wmsOutboundOrder/rfidPicking")
Observable<Object> doOutBoundFrid(@Body OperatorBean operatorBean);
//------------------------------------------ 出库 end ------------------------------------------
//------------------------------------------ 盘点 start ------------------------------------------
//盘点列表 http://192.168.19.214:8851/dev-api/ware/wmsInventoryTask/list?pageNum=1&pageSize=10&taskNo=PLAN-807049194DA2
@GET("ware/wmsInventoryTask/list")
Observable<ReviewModel> getReviewList(@Query("pageSize") int pageSize, @Query("pageNum") int pageNum, @Query("taskNo") String taskNo);
//删除盘点任务 http://192.168.19.214:8851/dev-api/ware/wmsInventoryTask/3
@DELETE("ware/wmsInventoryTask/{taskIds}")
Observable<Object> deleteReviewTask(@Path("taskIds") int taskIds);
//盘点详情 http://192.168.19.214:8851/dev-api/ware/wmsInventoryTask/2
@GET("ware/wmsInventoryTask/{taskIds}")
Observable<ReviewDetailModel> getReviewDetail(@Path("taskIds") int taskIds);
//盘点详情列表 - 盘点任务明细信息 http://192.168.19.214:8851/dev-api/ware/wmsInventoryTaskDetail/list?pageNum=1&pageSize=1000&taskId=2
@GET("ware/wmsInventoryTaskDetail/list")
Observable<ReviewDetailListModel> getReviewDetailList(@Query("pageSize") int pageSize, @Query("pageNum") int pageNum, @Query("taskId") int taskId);
//盘点结果 http://192.168.19.214:8851/dev-api/ware/wmsInventoryResult/list?taskId=2
@GET("ware/wmsInventoryResult/list")
Observable<ReviewResultModel> getReviewResult(@Query("taskId") int taskId);
//执行盘点 - 二维码执行盘点 http://192.168.19.214:8851/dev-api/ware/inventoryCheck/checkToBatchNo
//{taskId: 4, checkerId: 1, checkerName: "若依", batchNoList: ["BATCH2026010414284490650026"]}
@POST("ware/inventoryCheck/checkToBatchNo")
Observable<ReviewRfidTaskCheckModel> doReviewScanTaskCheck(@Body ReviewTaskCheck reviewTaskCheck);
//执行盘点 - RFID执行盘点 http://192.168.19.214:8851/dev-api/ware/inventoryCheck/check
@POST("ware/inventoryCheck/check")
Observable<ReviewRfidTaskCheckModel> doReviewRfidTaskCheck(@Body ReviewTaskCheck reviewTaskCheck);
//结束盘点 http://192.168.19.214:8851/dev-api/ware/wmsInventoryTask/stop/2
@POST("ware/inventoryCheck/complete/{taskId}")
Observable<Object> doStopReviewTask(@Path("taskId") int taskId);
//------------------------------------------ 盘点 end------------------------------------------
}
......@@ -2,6 +2,7 @@ package com.sxyz.rfid.presenter.view;
import com.sxyz.rfid.presenter.model.LoginModel;
import com.sxyz.rfid.presenter.model.UserInfoModel;
/**
* @Description: java类作用描述
......@@ -11,4 +12,6 @@ import com.sxyz.rfid.presenter.model.LoginModel;
*/
public interface ILoginView {
void loginSuccess(LoginModel loginModel);
void getUserInfoSuccess(UserInfoModel userInfoModel);
}
......@@ -2,6 +2,7 @@ package com.sxyz.rfid.presenter.view;
import com.sxyz.rfid.presenter.model.OutBoundDetailModel;
import com.sxyz.rfid.presenter.model.OutboundFlowingWaterModel;
import com.sxyz.rfid.presenter.model.OutboundFridModel;
import com.sxyz.rfid.presenter.model.OutboundModel;
/**
......@@ -23,4 +24,8 @@ public interface IOutBoundView {
void outBoundDetailCancelSuccess();
void outBoundFridSuccess(OutboundFridModel model);
void outSubmitBoundFridSuccess();
}
package com.sxyz.rfid.presenter.view;
import com.sxyz.rfid.presenter.model.ReviewDetailListModel;
import com.sxyz.rfid.presenter.model.ReviewDetailModel;
import com.sxyz.rfid.presenter.model.ReviewModel;
import com.sxyz.rfid.presenter.model.ReviewResultModel;
import com.sxyz.rfid.presenter.model.ReviewRfidTaskCheckModel;
import com.sxyz.rfid.presenter.model.ReviewTaskCheck;
/**
* @Description: 盘点
* @Author: chunyuan.wu
* @CreateDate: 2024/11/11 17:53
* @Version: 1.0
*/
public interface IReviewView {
void reviewSuccess(ReviewModel model);
void reviewLoadMoreSuccess(ReviewModel model);
void reviewDetailSuccess(ReviewDetailModel model);
void reviewDetailListSuccess(ReviewDetailListModel model);
void reviewResultSuccess(ReviewResultModel model);
void deleteReviewTaskSuccess();
void reviewScanTaskCheckSuccess(ReviewRfidTaskCheckModel model);
void reviewRfidTaskCheckSuccess(ReviewRfidTaskCheckModel model);
//结束盘点成功
void stopReviewTaskSuccess();
}
package com.sxyz.courtai.retrofit.callback;
package com.sxyz.rfid.retrofit.callback;
import com.google.gson.JsonParseException;
import com.jakewharton.retrofit2.adapter.rxjava2.HttpException;
......
......@@ -59,7 +59,6 @@ public abstract class Object1Observer<T> implements Observer<T> {
onFailed(null);
ToastUtil.showShort(msg);
break;
}
} catch (JSONException e) {
e.printStackTrace();
......@@ -71,7 +70,7 @@ public abstract class Object1Observer<T> implements Observer<T> {
L.e("-->\n请求错误信息-->" + throwable.getMessage());
onFailed(throwable);
if (NetworkUtils.isConnected()) {
com.sxyz.courtai.retrofit.callback.NetErrorHandler.getErrorMessage(throwable);
NetErrorHandler.getErrorMessage(throwable);
} else {
ToastUtil.showShort(App.getContext().getResources().getString(R.string.tips_network_errors));
}
......
package com.sxyz.rfid.retrofit.callback;
import android.content.Intent;
import com.blankj.utilcode.util.NetworkUtils;
import com.google.gson.Gson;
import com.sxyz.rfid.App;
import com.sxyz.rfid.R;
import com.sxyz.rfid.ui.login.LoginActivity;
import com.sxyz.rfid.utils.L;
import com.sxyz.rfid.utils.LocalUtils;
import com.sxyz.rfid.utils.ToastUtil;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
/**
* @Description: 抽象的回调接口
* @Author: wuchunyuan
* @CreateDate: 2020/7/8 13:42
* @UpdateUser: wuchunyuan
* @UpdateDate: 2020/7/8 13:42
* @UpdateRemark: 更新说明:
* @Version: 1.0
*/
public abstract class Object2Observer<T extends Response1Base> implements Observer<T> {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(T response) {
String code = response.code;
String mMsg = response.msg;
switch (code) {
case "200"://获取成功
onSuccess(response);
L.e("接口返回json================================================>\n" + new Gson().toJson(response.body));
// L.i("返回的json===>" + new Gson().toJson(response.body));
break;
case "401"://重新登录
try {
LocalUtils.clearSp();
Intent intent = new Intent(App.getContext(), LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
App.getContext().startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
break;
default:
onFailed(null);
ToastUtil.showShort(mMsg);
break;
}
}
@Override
public void onError(Throwable throwable) {
L.e("-->\n请求错误信息-->" + throwable.getMessage());
onFailed(throwable);
if (NetworkUtils.isConnected()) {
NetErrorHandler.getErrorMessage(throwable);
} else {
ToastUtil.showShort(App.getContext().getResources().getString(R.string.tips_network_errors));
}
}
@Override
public void onComplete() {
}
/**
* @description Token 失效回调
* @author wuchunyuan
* @time 2024/11/22 11:07
*/
// public abstract void onTokenError(T response);
/**
* @description 成功回调
* @author wuchunyuan
* @time 2020/7/9 11:07
*/
public abstract void onSuccess(T response);
/**
* @description 失败回调
* @author wuchunyuan
* @time 2020/7/9 11:07
*/
public abstract void onFailed(Throwable throwable);
}
......@@ -58,7 +58,7 @@ public abstract class ObjectObserver<T extends ResponseBase> implements Observer
L.e("-->\n请求错误信息-->" + throwable.getMessage());
onFailed(throwable);
if (NetworkUtils.isConnected()) {
com.sxyz.courtai.retrofit.callback.NetErrorHandler.getErrorMessage(throwable);
NetErrorHandler.getErrorMessage(throwable);
} else {
ToastUtil.showShort(App.getContext().getResources().getString(R.string.tips_network_errors));
}
......
......@@ -15,6 +15,7 @@ import java.io.Serializable;
public class Response1Base<T> implements Serializable {
public String code;
public String msg;
public T body;
public String getCode() {
return code;
......@@ -31,4 +32,13 @@ public class Response1Base<T> implements Serializable {
public void setMsg(String msg) {
this.msg = msg;
}
public T getBody() {
return body;
}
public void setBody(T body) {
this.body = body;
}
}
......@@ -46,7 +46,7 @@ public abstract class StringObserver<T extends ResponseBase> implements Observer
@Override
public void onError(Throwable throwable) {
onFailed(throwable);
com.sxyz.courtai.retrofit.callback.NetErrorHandler.getErrorMessage(throwable);
NetErrorHandler.getErrorMessage(throwable);
}
@Override
......
package com.sxyz.rfid.retrofit.http;
import android.text.TextUtils;
import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import com.sxyz.rfid.App;
import com.sxyz.rfid.AppConfig;
import com.sxyz.rfid.presenter.service.ApiService;
import com.sxyz.rfid.retrofit.http.OkLogInterceptor;
import com.sxyz.rfid.utils.LocalUtils;
import java.io.File;
import java.util.HashMap;
......@@ -57,7 +58,8 @@ public class RetrofitUtils {
}
retrofit = new Retrofit.Builder()
.baseUrl(AppConfig.BASE_URL)
// .baseUrl(AppConfig.BASE_URL)
.baseUrl(TextUtils.isEmpty(App.ip) ? AppConfig.BASE_URL : LocalUtils.getIpPort())
.client(client)
//然后将下面的GsonConverterFactory.create()替换成我们自定义的ResponseConverterFactory.create()
// .addConverterFactory(ResponseConverterFactory.create())
......
......@@ -9,14 +9,20 @@ import androidx.fragment.app.FragmentTransaction;
import com.ashokvarma.bottomnavigation.BottomNavigationBar;
import com.ashokvarma.bottomnavigation.BottomNavigationItem;
import com.blankj.utilcode.util.SPUtils;
import com.sxyz.rfid.App;
import com.sxyz.rfid.R;
import com.sxyz.rfid.base.BaseActivity;
import com.sxyz.rfid.databinding.ActivityMainBinding;
import com.sxyz.rfid.presenter.ILoginPresenter;
import com.sxyz.rfid.presenter.imp.LoginPresenterImpl;
import com.sxyz.rfid.presenter.model.LoginModel;
import com.sxyz.rfid.presenter.model.UserInfoModel;
import com.sxyz.rfid.presenter.view.ILoginView;
import com.sxyz.rfid.ui.my.MyFragment;
import com.sxyz.rfid.ui.out.OutboundFragment;
import com.sxyz.rfid.ui.review.ReviewFragment;
import com.sxyz.rfid.utils.L;
import com.sxyz.rfid.utils.LocalUtils;
import com.ubx.usdk.RFIDSDKManager;
import com.ubx.usdk.USDKManager;
import com.ubx.usdk.rfid.RfidManager;
......@@ -32,7 +38,7 @@ import com.ubx.usdk.util.SoundTool;
* @date: 2025年12月29日 16:40
* @version: 1.0.0
*/
public class MainActivity extends BaseActivity<ActivityMainBinding> {
public class MainActivity extends BaseActivity<ActivityMainBinding> implements ILoginView {
private final int[] imageViewArray = {R.drawable.chuku_icon, R.drawable.pandian_icon, R.drawable.wode_icon};
private final String[] strings = {"出库", "盘点", "我的"};
FragmentTransaction transaction;
......@@ -40,6 +46,7 @@ public class MainActivity extends BaseActivity<ActivityMainBinding> {
public boolean RFID_INIT_STATUS = false;//RFID是否初始化成功
public RfidManager mRfidManager;//RFID实例
public int readerType = 0;//阅读器类型
private ILoginPresenter mILoginPresenter;
@Override
public void initParms(Bundle mBundle) {
......@@ -54,6 +61,8 @@ public class MainActivity extends BaseActivity<ActivityMainBinding> {
@Override
protected void initView() {
initRfid();
mILoginPresenter = new LoginPresenterImpl(this);
mILoginPresenter.doGetInfo(this);
//角标,如同QQ的红点
// final TextBadgeItem mBadgeItem = new TextBadgeItem().setBorderWidth(4).setAnimationDuration(200).setBackgroundColorResource(R.color.red).setHideOnSelect(false).setText("0");
// mBinding.bottombar.setMode(BottomNavigationBar.MODE_DEFAULT);
......@@ -119,22 +128,14 @@ public class MainActivity extends BaseActivity<ActivityMainBinding> {
//初始化SDK
// 在异步回调中拿到RFID实例
RFIDSDKManager.getInstance().power(true);
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
boolean connect = RFIDSDKManager.getInstance().connect();
if (connect) {
L.i("initRfid() success.");
RFID_INIT_STATUS = true;
readerType = RFIDSDKManager.getInstance().getRfidManager().getReaderType();//80为短距,其他为长距
mRfidManager = RFIDSDKManager.getInstance().getRfidManager();
String firmware = RFIDSDKManager.getInstance().getRfidManager().getFirmwareVersion();
L.i("initRfid: GetReaderType() = " + readerType);
} else {
L.i("initRfid fail.");
}
new Handler(Looper.getMainLooper()).postDelayed(() -> {
boolean connect = RFIDSDKManager.getInstance().connect();
if (connect) {
RFID_INIT_STATUS = true;
readerType = RFIDSDKManager.getInstance().getRfidManager().getReaderType();//80为短距,其他为长距
mRfidManager = RFIDSDKManager.getInstance().getRfidManager();
mRfidManager.setScanInterval(0);//设置扫描间隔,单位毫秒,默认1000ms
String firmware = RFIDSDKManager.getInstance().getRfidManager().getFirmwareVersion();
}
}, 1500);
}
......@@ -152,7 +153,6 @@ public class MainActivity extends BaseActivity<ActivityMainBinding> {
if (mRfidManager != null) {
mRfidManager.disConnect();
mRfidManager.release();
L.i("onDestroyView: rfid close");
}
SoundTool.getInstance(App.getContext()).release();
super.onDestroy();
......@@ -167,4 +167,18 @@ public class MainActivity extends BaseActivity<ActivityMainBinding> {
USDKManager.getInstance().release();
super.finish();
}
@Override
public void loginSuccess(LoginModel loginModel) {
}
@Override
public void getUserInfoSuccess(UserInfoModel userInfoModel) {
if (userInfoModel.getUser() != null) {
SPUtils.getInstance().put(LocalUtils.USER_ID, userInfoModel.getUser().getUserId());//保存账号
SPUtils.getInstance().put(LocalUtils.USER_NAME, userInfoModel.getUser().getUserName());//保存账号
SPUtils.getInstance().put(LocalUtils.NICK_NAME, userInfoModel.getUser().getNickName());//保存账号
}
}
}
\ No newline at end of file
package com.sxyz.rfid.ui.login;
import android.annotation.SuppressLint;
import android.app.Dialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
......@@ -10,7 +13,9 @@ import android.text.method.PasswordTransformationMethod;
import android.view.View;
import com.blankj.utilcode.util.SPUtils;
import com.blankj.utilcode.util.ToastUtils;
import com.orhanobut.hawk.Hawk;
import com.sxyz.rfid.App;
import com.sxyz.rfid.AppConfig;
import com.sxyz.rfid.R;
import com.sxyz.rfid.base.BaseActivity;
......@@ -18,11 +23,13 @@ import com.sxyz.rfid.databinding.ActivityLoginBinding;
import com.sxyz.rfid.presenter.ILoginPresenter;
import com.sxyz.rfid.presenter.imp.LoginPresenterImpl;
import com.sxyz.rfid.presenter.model.LoginModel;
import com.sxyz.rfid.presenter.model.UserInfoModel;
import com.sxyz.rfid.presenter.view.ILoginView;
import com.sxyz.rfid.ui.MainActivity;
import com.sxyz.rfid.ui.login.bean.UserBean;
import com.sxyz.rfid.utils.LocalUtils;
import com.sxyz.rfid.utils.ToastUtil;
import com.sxyz.rfid.widgets.DialogUtil;
/**
* @Description: 登录
......@@ -33,6 +40,10 @@ import com.sxyz.rfid.utils.ToastUtil;
public class LoginActivity extends BaseActivity<ActivityLoginBinding> implements View.OnClickListener, ILoginView {
private int eye = 0;
private ILoginPresenter mILoginPresenter;
private final static int COUNTS = 5;// 点击次数
private final static long DURATION = 1000;// 规定有效时间
private long[] mHits = new long[COUNTS];
private DialogUtil mDialogUtil;
@Override
public void initParms(Bundle mBundle) {
......@@ -46,6 +57,7 @@ public class LoginActivity extends BaseActivity<ActivityLoginBinding> implements
@Override
protected void initView() {
mDialogUtil = new DialogUtil();
}
@Override
......@@ -61,6 +73,7 @@ public class LoginActivity extends BaseActivity<ActivityLoginBinding> implements
mBinding.ivClear.setOnClickListener(this);
mBinding.ivEye.setOnClickListener(this);
mBinding.tvLogin.setOnClickListener(this);
mBinding.txtWellcome.setOnClickListener(this);
}
@Override
......@@ -102,6 +115,35 @@ public class LoginActivity extends BaseActivity<ActivityLoginBinding> implements
mILoginPresenter.doLogin(this, new UserBean(userName, password, "SXyz@192837."));
}
}
case R.id.txtWellcome: {//欢迎页
if (!AppConfig.DEBUG) {
continuousClick(COUNTS, DURATION);
}
break;
}
}
}
/**
* @description 点击5次数弹出切换ip弹窗
* @author wuchunyuan
* @time 2020/8/5 17:40
*/
private void continuousClick(int count, long time) {
//每次点击时,数组向前移动一位
System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
//为数组最后一位赋值
mHits[mHits.length - 1] = SystemClock.uptimeMillis();
if (mHits[0] >= (SystemClock.uptimeMillis() - DURATION)) {
mHits = new long[COUNTS];//重新初始化数组
Dialog mDialog = mDialogUtil.showIpDialog(this);
mDialogUtil.setOnSwitchItemClickListener((ip, port) -> {
Hawk.put(AppConfig.Ip.IP, ip);
Hawk.put(AppConfig.Ip.PORT, port);
ToastUtils.showLong(R.string.text_switch_ip_success_one_more_time_login_app);
new Handler().postDelayed(() -> App.getInstance().exit(), 1000);
mDialog.dismiss();
});
}
}
......@@ -118,6 +160,11 @@ public class LoginActivity extends BaseActivity<ActivityLoginBinding> implements
ToastUtil.showShort(R.string.login_success);
}
@Override
public void getUserInfoSuccess(UserInfoModel userInfoModel) {
}
private class EtPassWord implements TextWatcher {
@Override
......
......@@ -6,7 +6,9 @@ import androidx.fragment.app.Fragment;
import com.sxyz.rfid.base.BaseFragment;
import com.sxyz.rfid.databinding.FragmentMyBinding;
import com.sxyz.rfid.databinding.FragmentReviewBinding;
import com.sxyz.rfid.ui.login.LoginActivity;
import com.sxyz.rfid.utils.LocalUtils;
import com.sxyz.rfid.widgets.AlertDialogUtil;
/**
* 主要功能: 我的
......@@ -36,7 +38,19 @@ public class MyFragment extends BaseFragment<FragmentMyBinding> {
@Override
protected void initView() {
mBinding.tvName1.setText(LocalUtils.getNickName());
mBinding.tvName2.setText(LocalUtils.getUserName());
/**
* 退出登录
*/
mBinding.btnExit.setOnClickListener(v -> {
new AlertDialogUtil(mActivity).builder().setTitle("提示").setMsg("确定退出登录吗?").setNegativeButton("取消", v1 -> {
}).setPositiveButton("确定", v12 -> {
LocalUtils.clearSp();
startActivity(LoginActivity.class);
getActivity().finish();
}).show();
});
}
@Override
......
......@@ -17,6 +17,7 @@ import com.sxyz.rfid.presenter.IOutBoundPresenter;
import com.sxyz.rfid.presenter.imp.OutBoundPresenterImpl;
import com.sxyz.rfid.presenter.model.OutBoundDetailModel;
import com.sxyz.rfid.presenter.model.OutboundFlowingWaterModel;
import com.sxyz.rfid.presenter.model.OutboundFridModel;
import com.sxyz.rfid.presenter.model.OutboundModel;
import com.sxyz.rfid.presenter.view.IOutBoundView;
import com.sxyz.rfid.ui.out.adapter.OutBoundDetailAdapter;
......@@ -177,4 +178,14 @@ public class OutboundDetailActivity extends BaseActivity<ActivityOutboundDetailB
public void outBoundDetailCancelSuccess() {
}
@Override
public void outBoundFridSuccess(OutboundFridModel model) {
}
@Override
public void outSubmitBoundFridSuccess() {
}
}
......@@ -15,6 +15,7 @@ import com.sxyz.rfid.presenter.IOutBoundPresenter;
import com.sxyz.rfid.presenter.imp.OutBoundPresenterImpl;
import com.sxyz.rfid.presenter.model.OutBoundDetailModel;
import com.sxyz.rfid.presenter.model.OutboundFlowingWaterModel;
import com.sxyz.rfid.presenter.model.OutboundFridModel;
import com.sxyz.rfid.presenter.model.OutboundModel;
import com.sxyz.rfid.presenter.view.IOutBoundView;
import com.sxyz.rfid.ui.out.adapter.OutBoundDetailAdapter;
......@@ -155,4 +156,14 @@ public class OutboundDetailListActivity extends BaseActivity<ActivityOutboundDet
public void outBoundDetailCancelSuccess() {
}
@Override
public void outBoundFridSuccess(OutboundFridModel model) {
}
@Override
public void outSubmitBoundFridSuccess() {
}
}
package com.sxyz.rfid.ui.out;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import android.Manifest;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
......@@ -25,6 +31,7 @@ import com.sxyz.rfid.presenter.imp.OutBoundPresenterImpl;
import com.sxyz.rfid.presenter.model.DictModel;
import com.sxyz.rfid.presenter.model.OutBoundDetailModel;
import com.sxyz.rfid.presenter.model.OutboundFlowingWaterModel;
import com.sxyz.rfid.presenter.model.OutboundFridModel;
import com.sxyz.rfid.presenter.model.OutboundModel;
import com.sxyz.rfid.presenter.view.IDictView;
import com.sxyz.rfid.presenter.view.IOutBoundView;
......@@ -74,9 +81,8 @@ public class OutboundFragment extends BaseFragment<FragmentOutboundBinding> impl
@Override
protected void initView() {
initToolBarTitle("出库管理");
initToolBarTitle("出库单列表");
mPresenter = new OutBoundPresenterImpl(this);
mPresenter.doOutBoundList(this, 10, 1);
mBinding.recyclerView.setLayoutManager(new LinearLayoutManager(mActivity));
mOutBoundAdapter = new OutBoundAdapter(R.layout.item_outbound, list);
mOutBoundAdapter.getLoadMoreModule().setLoadMoreView(new CustomLoadMoreView());
......@@ -95,10 +101,10 @@ public class OutboundFragment extends BaseFragment<FragmentOutboundBinding> impl
// }
// });
Out model = new Out();
model.setName("111");
DaoSession daoSession = GreenDaoManager.getInstance().getDaoSession();
daoSession.insert(model);
// Out model = new Out();
// model.setName("111");
// DaoSession daoSession = GreenDaoManager.getInstance().getDaoSession();
// daoSession.insert(model);
// List<Out> listPage = daoSession.queryBuilder(Out.class).list();
// L.i("listPage = " + listPage);
......@@ -134,12 +140,44 @@ public class OutboundFragment extends BaseFragment<FragmentOutboundBinding> impl
StringUtil.copyToClipboard(mActivity, item.getOrderNo());
}
});
mBinding.searchEtInput.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.length() > 0) {
mBinding.ivSearch.setVisibility(VISIBLE);
} else {
mBinding.ivSearch.setVisibility(GONE);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
mBinding.ivSearch.setOnClickListener(v -> {
mBinding.searchEtInput.setText("");
mPresenter.doOutBoundList(this, 10, 1, "");
});
mBinding.searchEtInput.setOnEditorActionListener((v, actionId, event) -> {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
mPresenter.doOutBoundList(this, 10, 1, mBinding.searchEtInput.getText().toString());
return true;
}
return false;
});
}
@Override
protected void initData() {
page = 1;
mPresenter.doOutBoundList(this, 10, page);
mPresenter.doOutBoundList(this, 10, page, mBinding.searchEtInput.getText().toString());
}
@Override
......@@ -154,11 +192,11 @@ public class OutboundFragment extends BaseFragment<FragmentOutboundBinding> impl
} else {
mOutBoundAdapter.getLoadMoreModule().loadMoreComplete();
}
// if (model.getRows().isEmpty()) {
// mBinding.ivEmpty.setVisibility(View.VISIBLE);
// } else {
// mBinding.ivEmpty.setVisibility(View.GONE);
// }
if (model.getRows().isEmpty()) {
mBinding.includedNothing.llNothing.setVisibility(View.VISIBLE);
} else {
mBinding.includedNothing.llNothing.setVisibility(View.GONE);
}
}
@Override
......@@ -193,8 +231,18 @@ public class OutboundFragment extends BaseFragment<FragmentOutboundBinding> impl
}
@Override
public void outBoundFridSuccess(OutboundFridModel model) {
}
@Override
public void outSubmitBoundFridSuccess() {
}
@Override
public void onLoadMore() {
page++;
mPresenter.doOutBoundList(this, 10, page);
mPresenter.doOutBoundList(this, 10, page, mBinding.searchEtInput.getText().toString());
}
}
......@@ -15,6 +15,7 @@ import com.chad.library.adapter.base.module.LoadMoreModule;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.sxyz.rfid.R;
import com.sxyz.rfid.presenter.model.OutboundModel;
import com.sxyz.rfid.utils.ToastUtil;
import java.util.List;
......@@ -56,6 +57,7 @@ public class OutBoundAdapter extends BaseQuickAdapter<OutboundModel.RowsBean, Ba
baseViewHolder.setText(R.id.txt_outbound_type, "-");
break;
}
TextView outboundButton = baseViewHolder.getView(R.id.outbound_button);
//状态
TextView outboundStatus = baseViewHolder.getView(R.id.outbound_status);
switch (dataBean.getOrderStatus()) {
......@@ -63,21 +65,29 @@ public class OutBoundAdapter extends BaseQuickAdapter<OutboundModel.RowsBean, Ba
outboundStatus.setText("未出库");
outboundStatus.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.status_gray_bg));
outboundStatus.setTextColor(ContextCompat.getColor(getContext(), R.color.c_6666));
outboundButton.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.green_bg));
outboundButton.setTextColor(ContextCompat.getColor(getContext(), R.color.white));
break;
case "1":
outboundStatus.setText("拣货中");
outboundStatus.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.status_red_bg));
outboundStatus.setTextColor(ContextCompat.getColor(getContext(), R.color.red));
outboundButton.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.green_bg));
outboundButton.setTextColor(ContextCompat.getColor(getContext(), R.color.white));
break;
case "2":
outboundStatus.setText("已出库");
outboundStatus.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.status_green_bg));
outboundStatus.setTextColor(ContextCompat.getColor(getContext(), R.color.green));
outboundButton.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.status_gray_bg));
outboundButton.setTextColor(ContextCompat.getColor(getContext(), R.color.c_c1c1));
break;
default:
outboundStatus.setText("-");
outboundStatus.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.status_gray_bg));
outboundStatus.setTextColor(ContextCompat.getColor(getContext(), R.color.c_6666));
outboundButton.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.status_gray_bg));
outboundButton.setTextColor(ContextCompat.getColor(getContext(), R.color.gray2));
break;
}
//复制按钮
......@@ -94,9 +104,21 @@ public class OutBoundAdapter extends BaseQuickAdapter<OutboundModel.RowsBean, Ba
});
//出库按钮
baseViewHolder.getView(R.id.outbound_button).setOnClickListener(v -> {
if (mItemClickListener != null) {
mItemClickListener.onOutboundClick(baseViewHolder.getLayoutPosition(), dataBean);
switch (dataBean.getOrderStatus()) {
case "0":
case "1":
if (mItemClickListener != null) {
mItemClickListener.onOutboundClick(baseViewHolder.getLayoutPosition(), dataBean);
}
break;
case "2":
ToastUtil.showShort("已出库,无需再进行出库");
break;
default:
ToastUtil.showShort("状态异常,无法进行出库操作");
break;
}
});
}
......
package com.sxyz.rfid.ui.out.adapter;
import android.text.Editable;
import android.text.InputType;
import android.text.TextWatcher;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import com.blankj.utilcode.util.StringUtils;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.module.LoadMoreModule;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.sxyz.rfid.R;
import com.sxyz.rfid.presenter.model.OutboundFridModel;
import com.sxyz.rfid.presenter.model.OutboundModel;
import java.util.List;
/**
* 出库适配器
*
* @author chunyuanwu
* @version 1.0.0
* @date 2025年12月27日 16:40
*/
public class OutBoundMeauAdapter extends BaseQuickAdapter<OutboundFridModel.RowsBean, BaseViewHolder> implements LoadMoreModule {
public OutBoundMeauAdapter(int layoutResId, List<OutboundFridModel.RowsBean> data) {
super(layoutResId, data);
}
@Override
protected void convert(@NonNull BaseViewHolder baseViewHolder, OutboundFridModel.RowsBean dataBean) {
//批次号
baseViewHolder.setText(R.id.tv_batch_code, dataBean.getBatchNo());
String warehouseName = "-";
if (dataBean.getMaterial() != null && !StringUtils.isEmpty(dataBean.getMaterial().getMaterialName())) {
warehouseName = dataBean.getMaterial().getMaterialName();
}
if (dataBean.getMaterial() != null && !StringUtils.isEmpty(dataBean.getMaterial().getSpecification())) {
warehouseName += " / " + dataBean.getMaterial().getSpecification();
}
if (dataBean.getLocation() != null && !StringUtils.isEmpty(dataBean.getLocation().getLocationName())) {
warehouseName += " / " + dataBean.getLocation().getLocationName();
}
//有效期
baseViewHolder.setText(R.id.tv_cancel_time, StringUtils.isEmpty(dataBean.getExpirationDate()) ? "-" : dataBean.getExpirationDate());
//库存数量
int inventory = dataBean.getAvailableQuantity();
baseViewHolder.setText(R.id.tv_inventory, inventory + "");
//物资/规格型号/货架
baseViewHolder.setText(R.id.tv_warehouse, warehouseName);
//还需出库
baseViewHolder.getView(R.id.txt_need_quantityView_default);
double num;
//如果计划数量等于已出库数量,还需出库数量为0
if (dataBean.getPlanQuantity() == dataBean.getActualQuantity()) {
num = 0;
} else {
//否则,还需出库数量为计划数量减去已出库数量
num = dataBean.getPlanQuantity() - dataBean.getActualQuantity();
}
//如果还需出库数量为0,设置文本颜色为红色
EditText etQuantityViewDefault = baseViewHolder.getView(R.id.quantityView_default);
etQuantityViewDefault.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
baseViewHolder.setText(R.id.txt_need_quantityView_default, num + "");
//如果输入的出库数量大于还需出库数量,设置按钮为不可点击
TextView btnConfirmOut = baseViewHolder.getView(R.id.btn_confirm_out);
//如果库存数量大于还需出库数量,设置还需出库数量
if (inventory >= num) {
etQuantityViewDefault.setText(num + "");
}
String inputNum = etQuantityViewDefault.getText().toString();
//如果库存数量为0,设置按钮为不可点击
//如果输入的出库数量为空、为0.0或大于还需出库数量,设置按钮为不可点击
if (inputNum.isEmpty() || inputNum.equals("0.0") || inputNum.equals("0") || inventory == 0) {
btnConfirmOut.setEnabled(false);
btnConfirmOut.setBackgroundResource(R.drawable.gray_bg1);
etQuantityViewDefault.setText("0");
} else {
btnConfirmOut.setEnabled(true);
btnConfirmOut.setBackgroundResource(R.drawable.green_bg);
etQuantityViewDefault.setText(num + "");
}
etQuantityViewDefault.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String input = etQuantityViewDefault.getText().toString();
try {
if (input.isEmpty() || input.equals("0.0") || input.equals("0") || inventory == 0) {
btnConfirmOut.setEnabled(false);
btnConfirmOut.setBackgroundResource(R.drawable.gray_bg1);
return;
}
double inputValue = Double.parseDouble(input);
boolean isValid = inputValue > 0 && inputValue <= num;
btnConfirmOut.setEnabled(isValid);
btnConfirmOut.setBackgroundResource(isValid ? R.drawable.green_bg : R.drawable.gray_bg1);
} catch (NumberFormatException e) {
btnConfirmOut.setEnabled(false);
btnConfirmOut.setBackgroundResource(R.drawable.gray_bg1);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
//出库按钮
baseViewHolder.getView(R.id.btn_confirm_out).setOnClickListener(v -> {
if (mItemClickListener != null) {
mItemClickListener.onConfirmOutClick(baseViewHolder.getLayoutPosition(), dataBean, etQuantityViewDefault.getText().toString());
}
});
baseViewHolder.getView(R.id.btn_cancel_out).setOnClickListener(v -> {
if (mItemClickListener != null) {
mItemClickListener.onCancelOutClick(baseViewHolder.getLayoutPosition(), dataBean);
}
});
}
public interface OnItemClickListener {
void onItemClick(int position, OutboundFridModel.RowsBean item);
void onConfirmOutClick(int layoutPosition, OutboundFridModel.RowsBean dataBean, String inputNum);
void onCancelOutClick(int layoutPosition, OutboundFridModel.RowsBean dataBean);
}
private OnItemClickListener mItemClickListener;
public void setOnItemClickListener(OnItemClickListener mItemClickListener) {
this.mItemClickListener = mItemClickListener;
}
}
\ No newline at end of file
package com.sxyz.rfid.ui.out.adapter;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import com.blankj.utilcode.util.StringUtils;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.module.LoadMoreModule;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.sxyz.rfid.R;
import com.sxyz.rfid.presenter.model.OutBoundDetailModel;
import com.sxyz.rfid.presenter.model.ReviewDetailListModel;
import com.sxyz.rfid.presenter.model.ReviewModel;
import java.util.List;
/**
* 盘点详情 适配器
*
* @author chunyuanwu
* @version 1.0.0
* @date 2025年12月27日 16:40
*/
public class ReviewDetailAdapter extends BaseQuickAdapter<ReviewDetailListModel.RowsBean, BaseViewHolder> implements LoadMoreModule {
public ReviewDetailAdapter(int layoutResId, List<ReviewDetailListModel.RowsBean> data) {
super(layoutResId, data);
}
@Override
protected void convert(@NonNull BaseViewHolder baseViewHolder, ReviewDetailListModel.RowsBean dataBean) {
//批次号
baseViewHolder.setText(R.id.tv_batch_no, !StringUtils.isEmpty(dataBean.getBatchNo()) ? dataBean.getBatchNo() : "-");
//RFID标签
baseViewHolder.setText(R.id.tv_rfid_tag, !StringUtils.isEmpty(dataBean.getRfidTag()) ? dataBean.getRfidTag() : "-");
//仓库名称
baseViewHolder.setText(R.id.tv_warehouse_name, !StringUtils.isEmpty(dataBean.getWarehouseName()) ? dataBean.getWarehouseName() : "-");
//区域名称
baseViewHolder.setText(R.id.tv_area_name, !StringUtils.isEmpty(dataBean.getAreaName()) ? dataBean.getAreaName() : "-");
//位置名称
baseViewHolder.setText(R.id.tv_location_name, !StringUtils.isEmpty(dataBean.getLocationName()) ? dataBean.getLocationName() : "-");
//系统数量
baseViewHolder.setText(R.id.tv_system_quantity, !StringUtils.isEmpty(dataBean.getSystemQuantity() + "") ? dataBean.getSystemQuantity() + "" : "-");
//实际数量
baseViewHolder.setText(R.id.tv_actual_quantity, !StringUtils.isEmpty(dataBean.getActualQuantity() + "") ? dataBean.getActualQuantity() + "" : "-");
//检查人
baseViewHolder.setText(R.id.tv_checker_name, !StringUtils.isEmpty(dataBean.getCheckerName()) ? dataBean.getCheckerName() : "-");
//检查时间
baseViewHolder.setText(R.id.tv_check_time, !StringUtils.isEmpty(dataBean.getCheckTime()) ? dataBean.getCheckTime() : "-");
//差异数量
baseViewHolder.setText(R.id.tv_difference_quantity, !StringUtils.isEmpty(dataBean.getDifferenceQuantity() + "") ? dataBean.getDifferenceQuantity() + "" : "-");
//差异率
baseViewHolder.setText(R.id.tv_difference_rate, !StringUtils.isEmpty(dataBean.getDifferenceRate() + "") ? dataBean.getDifferenceRate() + "" : "-");
//备注
baseViewHolder.setText(R.id.tv_remark, !StringUtils.isEmpty(dataBean.getRemark()) ? dataBean.getRemark() : "-");
//拣货状态
TextView checkStatus = baseViewHolder.getView(R.id.tv_check_status);
switch (dataBean.getCheckStatus()) {
case "0":
checkStatus.setText("待盘点");
checkStatus.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.status_org_bg));
checkStatus.setTextColor(ContextCompat.getColor(getContext(), R.color.text_orange3));
break;
case "1":
checkStatus.setText("已盘点");
checkStatus.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.status_green_bg));
checkStatus.setTextColor(ContextCompat.getColor(getContext(), R.color.green));
break;
case "2":
checkStatus.setText("差异待确认");
checkStatus.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.status_red_bg));
checkStatus.setTextColor(ContextCompat.getColor(getContext(), R.color.red));
break;
default:
checkStatus.setText("-");
checkStatus.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.status_gray_bg));
checkStatus.setTextColor(ContextCompat.getColor(getContext(), R.color.c_6666));
break;
}
//差异原因
TextView tvDifferenceReason = baseViewHolder.getView(R.id.tv_difference_reason);
if (!StringUtils.isEmpty(dataBean.getDifferenceReason())) {
switch (dataBean.getDifferenceReason()) {
case "py":
tvDifferenceReason.setText("盘盈");
break;
case "pk":
tvDifferenceReason.setText("盘亏");
break;
case "wcy":
tvDifferenceReason.setText("无差异");
break;
default:
tvDifferenceReason.setText("-");
break;
}
} else {
tvDifferenceReason.setText("-");
}
LinearLayout ll1 = baseViewHolder.getView(R.id.ll1);
LinearLayout ll2 = baseViewHolder.getView(R.id.ll2);
TextView expandButton = baseViewHolder.getView(R.id.expand_button);
ImageView ivUp = baseViewHolder.getView(R.id.iv_up);
//展开收起按钮
baseViewHolder.getView(R.id.rl_up).setOnClickListener(v -> {
// 处理展开收起点击事件 切换展开收起状态
boolean isExpanded = dataBean.isExpanded();
if (!isExpanded) {
// 收起
ivUp.setRotation(180);
expandButton.setText("收起");
ll1.setVisibility(View.VISIBLE);
ll2.setVisibility(View.VISIBLE);
} else {
// 展开
ivUp.setRotation(0);
expandButton.setText("展开");
ll1.setVisibility(View.GONE);
ll2.setVisibility(View.GONE);
}
dataBean.setExpanded(!isExpanded);
});
//复制1按钮
baseViewHolder.getView(R.id.tv_batch_no).setOnClickListener(v -> {
if (mItemClickListener != null) {
mItemClickListener.onCopy1ItemClick(baseViewHolder.getAdapterPosition(), dataBean);
}
});
//复制2按钮
baseViewHolder.getView(R.id.tv_rfid_tag).setOnClickListener(v -> {
if (mItemClickListener != null) {
mItemClickListener.onCopy2ItemClick(baseViewHolder.getAdapterPosition(), dataBean);
}
});
}
public interface OnItemClickListener {
void onCopy1ItemClick(int position, ReviewDetailListModel.RowsBean item);
void onCopy2ItemClick(int position, ReviewDetailListModel.RowsBean item);
}
private OnItemClickListener mItemClickListener;
public void setOnItemClickListener(OnItemClickListener mItemClickListener) {
this.mItemClickListener = mItemClickListener;
}
}
\ No newline at end of file
package com.sxyz.courtai.ui.pojo;
import java.util.Arrays;
public class ManageFormInfo {
private byte btWordCnt;
private byte btWordAdd;
private byte btMemBank;
private byte[] btAryPassWord;
private byte[] btAryData;
public ManageFormInfo() {
}
public ManageFormInfo(byte btWordCnt, byte btWordAdd, byte btMemBank, byte[] btAryPassWord, byte[] btAryData) {
this.btWordCnt = btWordCnt;
this.btWordAdd = btWordAdd;
this.btMemBank = btMemBank;
this.btAryPassWord = btAryPassWord;
this.btAryData = btAryData;
}
public byte getBtWordCnt() {
return btWordCnt;
}
public void setBtWordCnt(byte btWordCnt) {
this.btWordCnt = btWordCnt;
}
public byte getBtWordAdd() {
return btWordAdd;
}
public void setBtWordAdd(byte btWordAdd) {
this.btWordAdd = btWordAdd;
}
public byte getBtMemBank() {
return btMemBank;
}
public void setBtMemBank(byte btMemBank) {
this.btMemBank = btMemBank;
}
public byte[] getBtAryPassWord() {
return btAryPassWord;
}
public void setBtAryPassWord(byte[] btAryPassWord) {
this.btAryPassWord = btAryPassWord;
}
public byte[] getBtAryData() {
return btAryData;
}
public void setBtAryData(byte[] btAryData) {
this.btAryData = btAryData;
}
@Override
public String toString() {
return "ManageFormInfo{" +
"btWordCnt=" + btWordCnt +
", btWordAdd=" + btWordAdd +
", btMemBank=" + btMemBank +
", btAryPassWord=" + Arrays.toString(btAryPassWord) +
", btAryData=" + Arrays.toString(btAryData) +
'}';
}
}
package com.sxyz.courtai.ui.pojo;
public class TagManage {
private String epc;
private String pc;
private String data;
private String crc;
private boolean click;
public TagManage() {
}
public TagManage(String epc, String pc, String data, String crc, boolean click) {
this.epc = epc;
this.pc = pc;
this.data = data;
this.crc = crc;
this.click = click;
}
public String getEpc() {
return epc;
}
public void setEpc(String epc) {
this.epc = epc;
}
public String getPc() {
return pc;
}
public void setPc(String pc) {
this.pc = pc;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public String getCrc() {
return crc;
}
public void setCrc(String crc) {
this.crc = crc;
}
public boolean isClick() {
return click;
}
public void setClick(boolean click) {
this.click = click;
}
@Override
public String toString() {
return "TagManage{" +
"epc='" + epc + '\'' +
", pc='" + pc + '\'' +
", data='" + data + '\'' +
", crc='" + crc + '\'' +
", click=" + click +
'}';
}
}
package com.sxyz.courtai.ui.pojo;
import java.util.Objects;
public class TagScan {
private String rssi;
private String epc;
private String tid;
private int count;
public TagScan() {
}
public TagScan(String epc,String tid, String rssi, int count) {
this.rssi = rssi;
this.epc = epc;
this.tid = tid;
this.count = count;
}
public String getRssi() {
return rssi;
}
public void setRssi(String rssi) {
this.rssi = rssi;
}
public String getEpc() {
return epc;
}
public void setEpc(String epc) {
this.epc = epc;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public String getTid() {
return tid;
}
public void setTid(String tid) {
this.tid = tid;
}
@Override
public String toString() {
return "TagScan{" +
"rssi='" + rssi + '\'' +
", epc='" + epc + '\'' +
", tid='" + tid + '\'' +
", count=" + count +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
TagScan tagScan = (TagScan) o;
return Objects.equals(epc, tagScan.epc);
}
@Override
public int hashCode() {
return Objects.hash(rssi, epc, count);
}
}
package com.sxyz.courtai.ui.pojo;
public class TempBean {
String epc="";
String tid="";
String rssi="";
boolean isGetTid;//判断是否获取过tid
int count=0;//盘到的次数;
public TempBean() {
}
public TempBean(String epc,String rssi){
this.epc=epc;
this.rssi=rssi;
}
public boolean isGetTid() {
return isGetTid;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public void setGetTid(boolean getTid) {
isGetTid = getTid;
}
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;
}
public String getRssi() {
return rssi;
}
public void setRssi(String rssi) {
this.rssi = rssi;
}
}
package com.sxyz.rfid.ui.review;
import android.os.Bundle;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.blankj.utilcode.util.StringUtils;
import com.sxyz.rfid.R;
import com.sxyz.rfid.base.BaseActivity;
import com.sxyz.rfid.databinding.ActivityOutboundDetailBinding;
import com.sxyz.rfid.databinding.ActivityReviewDetailBinding;
import com.sxyz.rfid.presenter.IOutBoundPresenter;
import com.sxyz.rfid.presenter.IReviewPresenter;
import com.sxyz.rfid.presenter.imp.OutBoundPresenterImpl;
import com.sxyz.rfid.presenter.imp.ReviewPresenterImpl;
import com.sxyz.rfid.presenter.model.OutBoundDetailModel;
import com.sxyz.rfid.presenter.model.OutboundFlowingWaterModel;
import com.sxyz.rfid.presenter.model.OutboundFridModel;
import com.sxyz.rfid.presenter.model.OutboundModel;
import com.sxyz.rfid.presenter.model.ReviewDetailListModel;
import com.sxyz.rfid.presenter.model.ReviewDetailModel;
import com.sxyz.rfid.presenter.model.ReviewModel;
import com.sxyz.rfid.presenter.model.ReviewResultModel;
import com.sxyz.rfid.presenter.model.ReviewRfidTaskCheckModel;
import com.sxyz.rfid.presenter.view.IOutBoundView;
import com.sxyz.rfid.presenter.view.IReviewView;
import com.sxyz.rfid.ui.out.OutboundDetailListActivity;
import com.sxyz.rfid.ui.out.adapter.OutBoundDetailAdapter;
import com.sxyz.rfid.ui.out.adapter.ReviewDetailAdapter;
import com.sxyz.rfid.utils.StringUtil;
import java.util.ArrayList;
import java.util.List;
/**
* 主要功能: 盘点详情 、 任务基础信息、任务明细信息
*
* @Description: 盘点详情 、 任务基础信息、任务明细信息
* @Project: rfid-app
* @Package: com.sxyz.rfid.ui.review
* @author: chunyuanwu
* @date: 2025年12月29日 18:18
* @version: 1.0.0
*/
public class ReviewDetailActivity extends BaseActivity<ActivityReviewDetailBinding> implements IReviewView {
private ReviewModel.RowsBean item;
private ReviewDetailAdapter mAdapter;
private List<ReviewDetailListModel.RowsBean> list = new ArrayList<>();
private IReviewPresenter mPresenter;
@Override
public void initParms(Bundle mBundle) {
item = (ReviewModel.RowsBean) mBundle.getSerializable("item");
}
@Override
protected ActivityReviewDetailBinding getViewBinding() {
return ActivityReviewDetailBinding.inflate(getLayoutInflater());
}
@Override
protected void initView() {
initToolBar("出库详情");
mPresenter = new ReviewPresenterImpl(this);
mPresenter.doReviewDetailList(this, item.getTaskId());
mBinding.rvOutboundDetails.setLayoutManager(new LinearLayoutManager(mActivity));
mAdapter = new ReviewDetailAdapter(R.layout.item_review_detail, list);
mBinding.rvOutboundDetails.setAdapter(mAdapter);
}
@Override
protected void setListener() {
//复制按钮点击事件
mBinding.tvTaskNo.setOnClickListener(v -> {
StringUtil.copyToClipboard(this, item.getTaskNo());
});
//出库明细点击事件
mAdapter.setOnItemClickListener(new ReviewDetailAdapter.OnItemClickListener() {
@Override
public void onCopy1ItemClick(int position, ReviewDetailListModel.RowsBean item) {
StringUtil.copyToClipboard(mActivity, item.getBatchNo());
}
@Override
public void onCopy2ItemClick(int position, ReviewDetailListModel.RowsBean item) {
StringUtil.copyToClipboard(mActivity, item.getRfidTag());
}
});
}
@Override
protected void initData() {
//任务编号
mBinding.tvTaskNo.setText(item.getTaskNo());
switch (item.getTaskStatus()) {
case "0":
mBinding.tvTaskStatus.setText("未完成");
mBinding.tvTaskStatus.setBackground(ContextCompat.getDrawable(this, R.drawable.status_red_bg));
mBinding.tvTaskStatus.setTextColor(ContextCompat.getColor(this, R.color.red));
break;
case "1":
mBinding.tvTaskStatus.setText("进行中");
mBinding.tvTaskStatus.setBackground(ContextCompat.getDrawable(this, R.drawable.status_org_bg));
mBinding.tvTaskStatus.setTextColor(ContextCompat.getColor(this, R.color.text_orange3));
break;
case "2":
mBinding.tvTaskStatus.setText("已完成");
mBinding.tvTaskStatus.setBackground(ContextCompat.getDrawable(this, R.drawable.status_green_bg));
mBinding.tvTaskStatus.setTextColor(ContextCompat.getColor(this, R.color.green));
break;
case "3":
mBinding.tvTaskStatus.setText("已结束");
mBinding.tvTaskStatus.setBackground(ContextCompat.getDrawable(this, R.drawable.status_gray_bg));
mBinding.tvTaskStatus.setTextColor(ContextCompat.getColor(this, R.color.c_6666));
break;
default:
mBinding.tvTaskStatus.setText("-");
mBinding.tvTaskStatus.setBackground(ContextCompat.getDrawable(this, R.drawable.status_gray_bg));
mBinding.tvTaskStatus.setTextColor(ContextCompat.getColor(this, R.color.c_6666));
break;
}
//任务名称
mBinding.tvTaskName.setText(!StringUtils.isEmpty(item.getTaskName()) ? item.getTaskName() : "-");
//仓库名称
mBinding.txtWarehouseName.setText(!StringUtils.isEmpty(item.getWarehouseName()) ? item.getWarehouseName() : "-");
//已盘数
mBinding.txtReviewNumber.setText(item.getCountedItems() + "");
//总盘点数
mBinding.txtTotalNumber.setText(item.getTotalItems() + "");
//出库人
mBinding.txtRemark.setText(!StringUtils.isEmpty(item.getRemark()) ? item.getRemark() : "-");
}
@Override
public void reviewSuccess(ReviewModel model) {
}
@Override
public void reviewLoadMoreSuccess(ReviewModel model) {
}
@Override
public void reviewDetailSuccess(ReviewDetailModel model) {
}
@Override
public void reviewDetailListSuccess(ReviewDetailListModel model) {
list.clear();
mAdapter.setList(model.getRows());
}
@Override
public void reviewResultSuccess(ReviewResultModel model) {
}
@Override
public void deleteReviewTaskSuccess() {
}
@Override
public void reviewScanTaskCheckSuccess(ReviewRfidTaskCheckModel model) {
}
@Override
public void reviewRfidTaskCheckSuccess(ReviewRfidTaskCheckModel model) {
}
@Override
public void stopReviewTaskSuccess() {
}
}
package com.sxyz.rfid.ui.review;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.chad.library.adapter.base.listener.OnLoadMoreListener;
import com.sxyz.rfid.R;
import com.sxyz.rfid.base.BaseFragment;
import com.sxyz.rfid.databinding.FragmentOutboundBinding;
import com.sxyz.rfid.databinding.FragmentReviewBinding;
import com.sxyz.rfid.presenter.IOutBoundPresenter;
import com.sxyz.rfid.presenter.IReviewPresenter;
import com.sxyz.rfid.presenter.imp.OutBoundPresenterImpl;
import com.sxyz.rfid.presenter.imp.ReviewPresenterImpl;
import com.sxyz.rfid.presenter.model.OutboundModel;
import com.sxyz.rfid.presenter.model.ReviewDetailListModel;
import com.sxyz.rfid.presenter.model.ReviewDetailModel;
import com.sxyz.rfid.presenter.model.ReviewModel;
import com.sxyz.rfid.presenter.model.ReviewResultModel;
import com.sxyz.rfid.presenter.model.ReviewRfidTaskCheckModel;
import com.sxyz.rfid.presenter.view.IReviewView;
import com.sxyz.rfid.ui.out.OutboundActivity;
import com.sxyz.rfid.ui.out.OutboundDetailActivity;
import com.sxyz.rfid.ui.out.adapter.OutBoundAdapter;
import com.sxyz.rfid.ui.review.adapter.ReviewAdapter;
import com.sxyz.rfid.utils.StringUtil;
import com.sxyz.rfid.utils.ToastUtil;
import com.sxyz.rfid.widgets.AlertDialogUtil;
import com.sxyz.rfid.widgets.CustomLoadMoreView;
import java.util.ArrayList;
import java.util.List;
/**
* 主要功能: 盘点
......@@ -18,7 +51,11 @@ import com.sxyz.rfid.databinding.FragmentReviewBinding;
* @date: 2025年12月29日 13:00
* @version: 1.0.0
*/
public class ReviewFragment extends BaseFragment<FragmentReviewBinding> {
public class ReviewFragment extends BaseFragment<FragmentReviewBinding> implements IReviewView, OnLoadMoreListener {
private ReviewAdapter mAdapter;
private List<ReviewModel.RowsBean> list = new ArrayList<>();
private int page = 1;
private IReviewPresenter mPresenter;
public static Fragment newInstance() {
return new ReviewFragment();
......@@ -36,16 +73,172 @@ public class ReviewFragment extends BaseFragment<FragmentReviewBinding> {
@Override
protected void initView() {
initToolBarTitle("盘点列表");
mPresenter = new ReviewPresenterImpl(this);
mBinding.recyclerView.setLayoutManager(new LinearLayoutManager(mActivity));
mAdapter = new ReviewAdapter(R.layout.item_review, list);
mAdapter.getLoadMoreModule().setLoadMoreView(new CustomLoadMoreView());
mBinding.recyclerView.setAdapter(mAdapter);
}
@Override
protected void setListener() {
mAdapter.getLoadMoreModule().setOnLoadMoreListener(this);
mAdapter.getLoadMoreModule().setAutoLoadMore(true);
// //当自动加载开启,同时数据不满一屏时,是否继续执行自动加载更多(默认为true)
mAdapter.getLoadMoreModule().setEnableLoadMoreIfNotFullPage(true);
mBinding.swipeRefreshLayout.setOnRefreshListener(this::initData);
mAdapter.setOnItemClickListener(new ReviewAdapter.OnItemClickListener() {
@Override
public void onDeleteClick(int position, ReviewModel.RowsBean item) {
//弹窗提示
new AlertDialog.Builder(mActivity).setTitle("提示").setMessage("确定删除该盘点任务吗?").setPositiveButton("确定", (dialog, which) -> {
mPresenter.doDeleteReviewTask(ReviewFragment.this, item.getTaskId());
}).setNegativeButton("取消", null).show();
}
@Override
public void onItemClick(int position, ReviewModel.RowsBean item) {
// 处理详情点击事件
Bundle bundle = new Bundle();
bundle.putSerializable("item", item);
startActivity(ReviewDetailActivity.class, bundle);
}
@Override
public void onCopyClick(int position, ReviewModel.RowsBean item) {
StringUtil.copyToClipboard(mActivity, item.getTaskNo());
}
@Override
public void onReviewTaskClick(int position, ReviewModel.RowsBean item) {
// 处理出库点击事件
Bundle bundle = new Bundle();
bundle.putSerializable("item", item);
startActivity(ReviewTaskActivity.class, bundle);
}
// 处理结束盘点点击事件
@Override
public void onStopTaskClick(int position, ReviewModel.RowsBean item) {
new AlertDialog.Builder(mActivity).setTitle("提示").setMessage("确定结束该盘点任务吗?").setPositiveButton("确定", (dialog, which) -> {
mPresenter.doStopReviewTask(ReviewFragment.this, item.getTaskId());
}).setNegativeButton("取消", null).show();
}
});
mBinding.searchEtInput.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.length() > 0) {
mBinding.ivSearch.setVisibility(VISIBLE);
} else {
mBinding.ivSearch.setVisibility(GONE);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
mBinding.ivSearch.setOnClickListener(v -> {
mBinding.searchEtInput.setText("");
initData();
});
mBinding.searchEtInput.setOnEditorActionListener((v, actionId, event) -> {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
initData();
return true;
}
return false;
});
}
@Override
protected void initData() {
page = 1;
mPresenter.doReviewList(this, 10, page, mBinding.searchEtInput.getText().toString());
}
@Override
public void reviewSuccess(ReviewModel model) {
list.clear();
mAdapter.setList(model.getRows());
mAdapter.getLoadMoreModule().setEnableLoadMore(true);
mBinding.swipeRefreshLayout.setRefreshing(false);
int totalPages = StringUtil.totalPage(model.getTotal(), 10);
if (totalPages == page) {
mAdapter.getLoadMoreModule().loadMoreEnd();
} else {
mAdapter.getLoadMoreModule().loadMoreComplete();
}
if (model.getRows().isEmpty()) {
mBinding.includedNothing.llNothing.setVisibility(View.VISIBLE);
} else {
mBinding.includedNothing.llNothing.setVisibility(View.GONE);
}
}
@Override
public void reviewLoadMoreSuccess(ReviewModel model) {
mAdapter.addData(model.getRows());
int totalPages = StringUtil.totalPage(model.getTotal(), 10);
if (totalPages == page) {
mAdapter.getLoadMoreModule().loadMoreEnd();
} else {
mAdapter.getLoadMoreModule().loadMoreComplete();
}
}
@Override
public void reviewDetailSuccess(ReviewDetailModel model) {
}
@Override
public void reviewDetailListSuccess(ReviewDetailListModel model) {
}
@Override
public void reviewResultSuccess(ReviewResultModel model) {
}
@Override
public void onLoadMore() {
page++;
mPresenter.doReviewList(this, 10, page, mBinding.searchEtInput.getText().toString());
}
@Override
public void deleteReviewTaskSuccess() {
ToastUtil.showShort("删除成功");
mPresenter.doReviewList(this, 10, page, mBinding.searchEtInput.getText().toString());
}
@Override
public void reviewScanTaskCheckSuccess(ReviewRfidTaskCheckModel model) {
}
@Override
public void reviewRfidTaskCheckSuccess(ReviewRfidTaskCheckModel model) {
}
/**
* 结束盘点成功
*/
@Override
public void stopReviewTaskSuccess() {
ToastUtil.showShort("结束盘点成功");
mPresenter.doReviewList(this, 10, page, mBinding.searchEtInput.getText().toString());
}
}
package com.sxyz.rfid.ui.review.adapter;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import com.blankj.utilcode.util.StringUtils;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.module.LoadMoreModule;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.sxyz.rfid.R;
import com.sxyz.rfid.presenter.model.OutboundModel;
import com.sxyz.rfid.presenter.model.ReviewModel;
import com.sxyz.rfid.utils.ToastUtil;
import java.util.List;
/**
* 盘点适配器
*
* @author chunyuanwu
* @version 1.0.0
* @date 2025年12月27日 16:40
*/
public class ReviewAdapter extends BaseQuickAdapter<ReviewModel.RowsBean, BaseViewHolder> implements LoadMoreModule {
public ReviewAdapter(int layoutResId, List<ReviewModel.RowsBean> data) {
super(layoutResId, data);
}
@Override
protected void convert(@NonNull BaseViewHolder baseViewHolder, ReviewModel.RowsBean dataBean) {
//出库单号
baseViewHolder.setText(R.id.tv_task_no, !StringUtils.isEmpty(dataBean.getTaskNo()) ? dataBean.getTaskNo() : "-");
//任务名称
baseViewHolder.setText(R.id.tv_task_name, !StringUtils.isEmpty(dataBean.getTaskName()) ? dataBean.getTaskName() : "-");
//仓库名称
baseViewHolder.setText(R.id.txt_warehouse_name, !StringUtils.isEmpty(dataBean.getWarehouseName()) ? dataBean.getWarehouseName() : "-");
//总盘点数
baseViewHolder.setText(R.id.txt_total_number, dataBean.getTotalItems() + "");
//已盘数
baseViewHolder.setText(R.id.txt_review_number, dataBean.getCountedItems() + "");
TextView reviewButton = baseViewHolder.getView(R.id.review_button);
TextView stopButton = baseViewHolder.getView(R.id.stop_button);
//任务状态
TextView taskStatus = baseViewHolder.getView(R.id.tv_task_status);
switch (dataBean.getTaskStatus()) {
case "0":
taskStatus.setText("未完成");
taskStatus.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.status_red_bg));
taskStatus.setTextColor(ContextCompat.getColor(getContext(), R.color.red));
reviewButton.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.green_bg));
reviewButton.setTextColor(ContextCompat.getColor(getContext(), R.color.white));
stopButton.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.status_gray_bg));
stopButton.setTextColor(ContextCompat.getColor(getContext(), R.color.c_c1c1));
break;
case "1":
taskStatus.setText("进行中");
taskStatus.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.status_org_bg));
taskStatus.setTextColor(ContextCompat.getColor(getContext(), R.color.text_orange3));
reviewButton.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.green_bg));
reviewButton.setTextColor(ContextCompat.getColor(getContext(), R.color.white));
stopButton.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.red_bg4));
stopButton.setTextColor(ContextCompat.getColor(getContext(), R.color.white));
break;
case "2":
taskStatus.setText("已完成");
taskStatus.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.status_green_bg));
taskStatus.setTextColor(ContextCompat.getColor(getContext(), R.color.green));
reviewButton.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.status_gray_bg));
reviewButton.setTextColor(ContextCompat.getColor(getContext(), R.color.c_c1c1));
stopButton.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.status_gray_bg));
stopButton.setTextColor(ContextCompat.getColor(getContext(), R.color.c_c1c1));
break;
// case "3":
// taskStatus.setText("已结束");
// taskStatus.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.status_gray_bg));
// taskStatus.setTextColor(ContextCompat.getColor(getContext(), R.color.c_6666));
// reviewButton.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.status_gray_bg));
// reviewButton.setTextColor(ContextCompat.getColor(getContext(), R.color.c_c1c1));
// stopButton.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.status_gray_bg));
// stopButton.setTextColor(ContextCompat.getColor(getContext(), R.color.c_c1c1));
// break;
default:
taskStatus.setText("-");
taskStatus.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.status_gray_bg));
taskStatus.setTextColor(ContextCompat.getColor(getContext(), R.color.c_6666));
reviewButton.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.status_gray_bg));
reviewButton.setTextColor(ContextCompat.getColor(getContext(), R.color.c_c1c1));
stopButton.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.status_gray_bg));
stopButton.setTextColor(ContextCompat.getColor(getContext(), R.color.c_c1c1));
break;
}
//复制按钮
baseViewHolder.getView(R.id.tv_task_no).setOnClickListener(v -> {
if (mItemClickListener != null) {
mItemClickListener.onCopyClick(baseViewHolder.getLayoutPosition(), dataBean);
}
});
//详情按钮
baseViewHolder.getView(R.id.detail_button).setOnClickListener(v -> {
if (mItemClickListener != null) {
mItemClickListener.onItemClick(baseViewHolder.getLayoutPosition(), dataBean);
}
});
//执行盘点
reviewButton.setOnClickListener(v -> {
switch (dataBean.getTaskStatus()) {
case "0":
case "1":
if (mItemClickListener != null) {
mItemClickListener.onReviewTaskClick(baseViewHolder.getLayoutPosition(), dataBean);
}
break;
case "2":
ToastUtil.showShort("盘点已完成,无需执行盘点");
break;
// case "3":
// ToastUtil.showShort("盘点已结束,无需执行盘点");
// break;
default:
ToastUtil.showShort("未知状态,无法执行盘点");
break;
}
});
//删除按钮
baseViewHolder.getView(R.id.delete_button).setOnClickListener(v -> {
if (mItemClickListener != null) {
mItemClickListener.onDeleteClick(baseViewHolder.getLayoutPosition(), dataBean);
}
});
//结束盘点
stopButton.setOnClickListener(v -> {
switch (dataBean.getTaskStatus()) {
case "0"://未开始
ToastUtil.showShort("盘点未开始,不能结束盘点");
break;
case "1"://已开始
if (mItemClickListener != null) {
mItemClickListener.onStopTaskClick(baseViewHolder.getLayoutPosition(), dataBean);
}
break;
case "2"://已完成
ToastUtil.showShort("盘点已完成,不能结束盘点");
break;
// case "3":
// ToastUtil.showShort("盘点已结束,不能结束盘点");
// break;
default:
ToastUtil.showShort("未知状态,无法结束盘点");
break;
}
});
}
public interface OnItemClickListener {
//删除
void onDeleteClick(int position, ReviewModel.RowsBean item);
//详情
void onItemClick(int position, ReviewModel.RowsBean item);
//复制按钮
void onCopyClick(int position, ReviewModel.RowsBean item);
//执行盘点
void onReviewTaskClick(int position, ReviewModel.RowsBean item);
//结束盘点
void onStopTaskClick(int position, ReviewModel.RowsBean item);
}
private OnItemClickListener mItemClickListener;
public void setOnItemClickListener(OnItemClickListener mItemClickListener) {
this.mItemClickListener = mItemClickListener;
}
}
\ No newline at end of file
......@@ -3,17 +3,15 @@ package com.sxyz.rfid.utils;
import android.text.TextUtils;
import com.blankj.utilcode.util.SPUtils;
import com.blankj.utilcode.util.StringUtils;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.orhanobut.hawk.Hawk;
import com.sxyz.rfid.App;
import com.sxyz.rfid.presenter.model.LoginModel;
import java.util.ArrayList;
import java.util.List;
public class LocalUtils {
public final static String AUTO_USER_NAME = "name";
public final static String USER_NAME = "userName";
public final static String NICK_NAME = "nickName";
public final static String USER_ID = "userId";
public final static String AUTO_PWD = "pwd";
public final static String TOKEN = "token";
public final static String LOGIN_MODEL = "loginModel";
......@@ -43,6 +41,26 @@ public class LocalUtils {
return userName == null ? "" : userName;
}
public static String getUserName1() {
String userName = SPUtils.getInstance().getString(USER_NAME);
return userName == null ? "" : userName;
}
public static String getNickName() {
String nickName = SPUtils.getInstance().getString(NICK_NAME);
return nickName == null ? "" : nickName;
}
/**
* @description 获取用户ID
* @author wuchunyuan
* @time 2020/7/22 13:16
*/
public static int getUserId() {
int userId = SPUtils.getInstance().getInt(USER_ID);
return userId == 0 ? -1 : userId;
}
public static String getToken() {
String accessToken = SPUtils.getInstance().getString(TOKEN);
return accessToken == null ? "" : accessToken;
......@@ -58,9 +76,23 @@ public class LocalUtils {
return loginModel;
}
// public static String getUrl(String path) {
// String ipPort = TextUtils.isEmpty(App.ip) ? AppConfig.BASE_URL : getIpPort();
// return ipPort + path;
// }
public static String getIpPort() {
return "http://" + App.ip + ":" + App.port + "/";
}
public static void clearSp() {
Hawk.deleteAll();
SPUtils.getInstance().put(TOKEN, "");
SPUtils.getInstance().put(AUTO_USER_NAME, "");
SPUtils.getInstance().put(AUTO_PWD, "");
SPUtils.getInstance().put(USER_ID, "");
SPUtils.getInstance().put(NICK_NAME, "");
SPUtils.getInstance().put(USER_NAME, "");
}
}
......@@ -60,7 +60,7 @@ public class AlertDialogUtil {
// 调整dialog背景大小
lLayout_bg.setLayoutParams(new FrameLayout.LayoutParams((int) (display
.getWidth() * 0.3), LayoutParams.WRAP_CONTENT));
.getWidth() * 0.8), LayoutParams.WRAP_CONTENT));
return this;
}
......
package com.sxyz.rfid.widgets;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.CycleInterpolator;
import android.view.animation.TranslateAnimation;
import androidx.appcompat.widget.AppCompatEditText;
import com.sxyz.rfid.R;
/**
* @说明: 自定义带删除按钮的EditText
*/
public class ClearEditText extends AppCompatEditText implements View.OnFocusChangeListener, TextWatcher {
/**
* 删除按钮的引用
*/
private Drawable mClearDrawable;
/**
* 控件是否有焦点
*/
private boolean hasFoucs;
public ClearEditText(Context context) {
this(context, null);
}
public ClearEditText(Context context, AttributeSet attrs) {
//这里构造方法也很重要,不加这个很多属性不能再XML里面定义
this(context, attrs, android.R.attr.editTextStyle);
}
public ClearEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
//获取EditText的DrawableRight,假如没有设置我们就使用默认的图片
mClearDrawable = getCompoundDrawables()[2];
if (mClearDrawable == null) {
mClearDrawable = getResources().getDrawable(R.mipmap.et_delete_icon);
}
mClearDrawable.setBounds(0, 0, mClearDrawable.getIntrinsicWidth(), mClearDrawable.getIntrinsicHeight());
//默认设置隐藏图标
setClearIconVisible(false);
//设置焦点改变的监听
setOnFocusChangeListener(this);
//设置输入框里面内容发生改变的监听
addTextChangedListener(this);
}
/**
* 因为我们不能直接给EditText设置点击事件,所以我们用记住我们按下的位置来模拟点击事件
* 当我们按下的位置 在 EditText的宽度 - 图标到控件右边的间距 - 图标的宽度 和
* EditText的宽度 - 图标到控件右边的间距之间我们就算点击了图标,竖直方向就没有考虑
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
if (getCompoundDrawables()[2] != null) {
boolean touchable = event.getX() > (getWidth() - getTotalPaddingRight())
&& (event.getX() < ((getWidth() - getPaddingRight())));
if (touchable) {
this.setText("");
}
}
}
return super.onTouchEvent(event);
}
/**
* 当ClearEditText焦点发生变化的时候,判断里面字符串长度设置清除图标的显示与隐藏
*/
@Override
public void onFocusChange(View v, boolean hasFocus) {
this.hasFoucs = hasFocus;
if (hasFocus) {
setClearIconVisible(getText().length() > 0);
} else {
setClearIconVisible(false);
}
}
/**
* 设置清除图标的显示与隐藏,调用setCompoundDrawables为EditText绘制上去
*
* @param visible
*/
protected void setClearIconVisible(boolean visible) {
Drawable right = visible ? mClearDrawable : null;
setCompoundDrawables(getCompoundDrawables()[0],
getCompoundDrawables()[1], right, getCompoundDrawables()[3]);
}
/**
* 当输入框里面内容发生变化的时候回调的方法
*/
@Override
public void onTextChanged(CharSequence s, int start, int count,
int after) {
if (hasFoucs) {
setClearIconVisible(s.length() > 0);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
/**
* 设置晃动动画
*/
public void setShakeAnimation() {
this.setAnimation(shakeAnimation(5));
}
/**
* 晃动动画
*
* @param counts 1秒钟晃动多少下
* @return
*/
public static Animation shakeAnimation(int counts) {
Animation translateAnimation = new TranslateAnimation(0, 10, 0, 0);
translateAnimation.setInterpolator(new CycleInterpolator(counts));
translateAnimation.setDuration(1000);
return translateAnimation;
}
}
\ No newline at end of file
package com.sxyz.rfid.widgets;
import com.sxyz.rfid.presenter.model.OutboundFridModel;
public abstract class DialogListener {
public abstract void onItemClick(int position, OutboundFridModel.RowsBean item);
}
package com.sxyz.rfid.widgets;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.text.TextUtils;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.blankj.utilcode.util.ToastUtils;
import com.sxyz.rfid.App;
import com.sxyz.rfid.AppConfig;
import com.sxyz.rfid.R;
import com.sxyz.rfid.utils.LocalUtils;
/**
* class :---
* author:York(wuchunyuan)
* time : 2018/4/4 16:54
*/
public class DialogUtil {
private static Dialog mDialog;
/**
* @description 投资对比选择公司弹窗
* @author wuchunyuan
* @time 2020/7/13 13:08
*/
public static Dialog showIpDialog(Activity activity) {
WindowManager windowManager = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
LayoutInflater inflater = LayoutInflater.from(activity);
mDialog = new Dialog(activity, R.style.AlertDialogStyle);
View layout = inflater.inflate(R.layout.dialog_ip_layout, null);
LinearLayout rlLayout = layout.findViewById(R.id.lLayout_bg);
TextView txtIp = layout.findViewById(R.id.txt_ip);
txtIp.setText("当前IP: " + (TextUtils.isEmpty(App.ip) ? AppConfig.BASE_URL : LocalUtils.getIpPort()));
ClearEditText etIp = layout.findViewById(R.id.et_ip);
ClearEditText etPort = layout.findViewById(R.id.et_port);
Button etOk = layout.findViewById(R.id.bt_ok);
Button btCancel = layout.findViewById(R.id.bt_cancel);
etOk.setOnClickListener(v -> {
if (TextUtils.isEmpty(etIp.getText().toString())) {
ToastUtils.showShort("请输入ip");
return;
}
if (TextUtils.isEmpty(etPort.getText().toString())) {
ToastUtils.showShort("请输入端口");
return;
}
if (mOnSwitchItemClickListener != null) {
mOnSwitchItemClickListener.onSwitchItemClick(etIp.getText().toString(), etPort.getText().toString());
}
});
btCancel.setOnClickListener(v -> mDialog.dismiss());
mDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
mDialog.addContentView(layout, new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
mDialog.setCanceledOnTouchOutside(false);
mDialog.setCancelable(true);
mDialog.setContentView(layout);
rlLayout.setLayoutParams(new FrameLayout.LayoutParams((int) (display
.getWidth() * 0.85), ViewGroup.LayoutParams.WRAP_CONTENT));
mDialog.show();
return mDialog;
}
public interface OnSwitchItemClickListener {
void onSwitchItemClick(String ip, String port);
}
private static OnSwitchItemClickListener mOnSwitchItemClickListener;
public void setOnSwitchItemClickListener(OnSwitchItemClickListener mOnSwitchItemClickListener) {
this.mOnSwitchItemClickListener = mOnSwitchItemClickListener;
}
}
......@@ -2,12 +2,14 @@ package com.sxyz.rfid.widgets;
import android.app.Dialog;
import android.content.Context;
import android.view.Display;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import androidx.annotation.NonNull;
......@@ -18,6 +20,7 @@ import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.sxyz.rfid.R;
import com.sxyz.rfid.presenter.model.OutboundFlowingWaterModel;
import com.sxyz.rfid.presenter.model.OutboundFridModel;
import java.util.List;
......@@ -27,37 +30,49 @@ import java.util.List;
* @CreateDate: 2025/12/31 16:39
* @Version: 1.0
*/
public class OutBoundPopupWindow extends Dialog {
public class OutBoundDialog extends Dialog {
private Context mContext;
private Display display;
public OutBoundPopupWindow(@NonNull Context context) {
public OutBoundDialog(@NonNull Context context) {
super(context);
mContext = context;
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
display = windowManager.getDefaultDisplay();
}
public OutBoundPopupWindow(@NonNull Context context, int themeResId) {
public OutBoundDialog(@NonNull Context context, int themeResId) {
super(context, themeResId);
mContext = context;
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
display = windowManager.getDefaultDisplay();
}
protected OutBoundPopupWindow(@NonNull Context context, boolean cancelable, OnCancelListener cancelListener) {
protected OutBoundDialog(@NonNull Context context, boolean cancelable, OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
mContext = context;
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
display = windowManager.getDefaultDisplay();
}
DialogAdapter adapter;
/**
* 基本列表弹窗
*
* @param datas 内容
* @param dialogListener 位置回调
*/
public void init(List<OutboundFlowingWaterModel.RowsBean> datas, final DialogListener dialogListener) {
public void init(List<OutboundFridModel.RowsBean> datas, final DialogListener dialogListener) {
View v = LayoutInflater.from(mContext).inflate(R.layout.popup_outbound, null);
this.setContentView(v);
this.setCancelable(true);
this.setCancelable(false);
LinearLayout lLayout_bg = v.findViewById(R.id.lLayout_bg);
// 调整dialog背景大小
lLayout_bg.setLayoutParams(new FrameLayout.LayoutParams((int) (display.getWidth() * 0.3), (int) (display.getHeight() * 0.9)));
RecyclerView rv = v.findViewById(R.id.rv);
DialogAdapter adapter = new DialogAdapter(R.layout.item_pop, datas);
adapter = new DialogAdapter(R.layout.item_pop, datas);
rv.setAdapter(adapter);
rv.setLayoutManager(new LinearLayoutManager(mContext));
//窗口位置
......@@ -71,13 +86,13 @@ public class OutBoundPopupWindow extends Dialog {
* @param dialogListener 位置回调
*/
public void init(List<OutboundFlowingWaterModel.RowsBean> datas, String title, final DialogListener dialogListener) {
public void init(List<OutboundFridModel.RowsBean> datas, String title, final DialogListener dialogListener) {
View v = LayoutInflater.from(mContext).inflate(R.layout.popup_outbound, null);
this.setContentView(v);
this.setCancelable(true);
//列表
RecyclerView rv = v.findViewById(R.id.rv);
DialogAdapter adapter = new DialogAdapter(R.layout.item_pop, datas);
adapter = new DialogAdapter(R.layout.item_pop, datas);
rv.setAdapter(adapter);
rv.setLayoutManager(new LinearLayoutManager(mContext));
//标题
......@@ -94,7 +109,7 @@ public class OutBoundPopupWindow extends Dialog {
* @param dialogListener
*/
public void init(List<OutboundFlowingWaterModel.RowsBean> datas, int viewId, final DialogListener dialogListener) {
public void init(List<OutboundFridModel.RowsBean> datas, int viewId, final DialogListener dialogListener) {
LinearLayout v = new LinearLayout(mContext);
v.setOrientation(LinearLayout.VERTICAL);
//自定义标题
......@@ -103,7 +118,7 @@ public class OutBoundPopupWindow extends Dialog {
v.addView(titleView, header_params);
//列表
RecyclerView rv = new RecyclerView(mContext);
DialogAdapter adapter = new DialogAdapter(R.layout.item_pop, datas);
adapter = new DialogAdapter(R.layout.item_pop, datas);
rv.setAdapter(adapter);
rv.setLayoutManager(new LinearLayoutManager(mContext));
rv.setId(R.id.rv);
......@@ -115,6 +130,10 @@ public class OutBoundPopupWindow extends Dialog {
setWindow(getWindow());
}
//添加数据
public void addData(List<OutboundFridModel.RowsBean> datas) {
adapter.addData(datas);
}
/**
* 设置窗口位置
......@@ -154,19 +173,14 @@ public class OutBoundPopupWindow extends Dialog {
}
}
class DialogListener {
public void onItemClick(int pos) {
}
}
class DialogAdapter extends BaseQuickAdapter<OutboundFlowingWaterModel.RowsBean, BaseViewHolder> {
class DialogAdapter extends BaseQuickAdapter<OutboundFridModel.RowsBean, BaseViewHolder> {
public DialogAdapter(int layoutResId, List<OutboundFlowingWaterModel.RowsBean> data) {
public DialogAdapter(int layoutResId, List<OutboundFridModel.RowsBean> data) {
super(layoutResId, data);
}
@Override
protected void convert(BaseViewHolder helper, OutboundFlowingWaterModel.RowsBean bean) {
protected void convert(BaseViewHolder helper, OutboundFridModel.RowsBean bean) {
// helper.setText(R.id.tv_item, item);
}
}
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/purple_200" android:state_focused="true"></item>
<item android:color="@color/purple_200" android:state_selected="true"></item>
<item android:color="@color/purple_200" android:state_pressed="true"></item>
<item android:color="@color/purple_200" android:state_checked="true"></item>
<item android:color="@color/black"></item>
</selector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="31.6dp"
android:viewportWidth="1036"
android:viewportHeight="1024">
<path
android:fillColor="@color/text_blue"
android:pathData="M516.5,0c282.8,0 512,229.2 512,512s-229.2,512 -512,512c-282.8,0 -512,-229.2 -512,-512s229.2,-512 512,-512zM525.6,259a26.8,26.8 0,0 0,-26.6 1.2l-224,134.3a27.4,27.4 0,0 0,-12.7 23.2l-1.7,323c0,15.1 12.1,27.3 27,27.3L518.4,768a25.1,25.1 0,0 0,25.1 -25.1l-0.1,-1.9a25.1,25.1 0,0 0,-25 -23.2L310.1,717.8l1.7,-285.1 201.5,-120.9 210.1,120.9v83.7l0.1,1.9a24.6,24.6 0,0 0,49.1 -1.9v-98.8c0,-9.4 -4.8,-18.2 -12.7,-23.2zM695.4,574.9a84.6,84.6 0,0 0,-115.9 30.1,84.9 84.9,0 0,0 30,116.1 84.6,84.6 0,0 0,86.4 -0.3l40.8,41 1.8,1.6a20.9,20.9 0,0 0,27.8 -1.5,21 21,0 0,0 0.2,-29.6l-41.1,-41.3 2,-3.6a84.9,84.9 0,0 0,-32 -112.5zM652.5,605.2a42.8,42.8 0,0 1,42.6 39.9l0.1,2.9 -0.1,2.9a42.9,42.9 0,0 1,-39.7 39.8l-2.9,0.1 -2.9,-0.1a42.8,42.8 0,0 1,-39.8 -42.7,42.8 42.8,0 0,1 42.8,-42.8zM399.8,633.3h-35.9c-12.4,0 -22.5,8.2 -22.5,18.4s10,18.4 22.5,18.4h35.9c12.4,0 22.5,-8.3 22.5,-18.4 0,-10.2 -10,-18.4 -22.5,-18.4zM399.8,565.9h-35.9c-12.4,0 -22.5,8.2 -22.5,18.4s10,18.4 22.5,18.4h35.9c12.4,0 22.5,-8.3 22.5,-18.4 0,-10.2 -10,-18.4 -22.5,-18.4zM399.8,498.5h-35.9c-12.4,0 -22.5,8.3 -22.5,18.4 0,10.2 10,18.4 22.5,18.4h35.9c12.4,0 22.5,-8.3 22.5,-18.4 0,-10.2 -10,-18.4 -22.5,-18.4z" />
</vector>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<corners android:radius="10dp" />
<solid android:color="@color/gray3" />
</shape>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="5dp" />
<solid android:color="@color/purple_200" />
</shape>
</clip>
</item>
</layer-list>
\ No newline at end of file
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:fillAlpha="0.2"
android:fillColor="@color/red"
android:pathData="M512,1024A512,512 0,1 1,512 0a512,512 0,0 1,0 1024z" />
<path
android:fillColor="@color/red"
android:pathData="M505.1,774.9a62,62 0,0 1,-32.2 -13.4l-18.7,-16.8 -149.6,-153.8 -3.7,-4.4a43.6,43.6 0,0 1,3.7 -55.9l4.3,-3.7 4.5,-2.9a41.3,41.3 0,0 1,50.4 6.7l107.1,109.1V291.3l0.4,-5.7c3.8,-22 21.1,-36.9 41.5,-36.9l5.6,0.4 4.8,1.1c19,5.6 31.5,21.9 31.5,41L554.6,637.8l105.2,-107.1 4.3,-3.7a41.8,41.8 0,0 1,54.9 3.7l3.5,4a43.2,43.2 0,0 1,-3.5 56.2L578.6,734l-28.5,28.2a62,62 0,0 1,-44.9 12.7z" />
</vector>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="5dp" />
<gradient
android:angle="0"
android:endColor="@color/gray1"
android:startColor="@color/gray1"
android:type="linear" />
</shape>
\ No newline at end of file
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:bottomLeftRadius="20dp"
android:bottomRightRadius="20dp"
android:topLeftRadius="0dp"
android:topRightRadius="0dp" />
<gradient
android:angle="0"
android:endColor="#62C465"
android:startColor="@color/purple_200"
android:type="linear" />
</shape>
\ No newline at end of file
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="5dp" />
<gradient
android:angle="0"
android:endColor="@color/purple_200"
android:startColor="@color/purple_200"
android:type="linear" />
</shape>
\ No newline at end of file
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="1106dp" />
<gradient
android:angle="90"
android:endColor="#e8f5e9"
android:startColor="#e8f5e9"
android:type="linear" />
</shape>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="1106dp" />
<gradient
android:angle="90"
android:endColor="#AFDBB1"
android:startColor="#AFDBB1"
android:type="linear" />
</shape>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="5dp" />
<gradient
android:angle="0"
android:endColor="#FADBB8"
android:startColor="#FADBB8"
android:type="linear" />
</shape>
\ No newline at end of file
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="5dp" />
<gradient
android:angle="0"
android:endColor="#ffebee"
android:startColor="#ffebee"
android:type="linear" />
</shape>
\ No newline at end of file
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="5dp" />
<gradient
android:angle="0"
android:endColor="#F68383"
android:startColor="@color/red1"
android:type="linear" />
</shape>
\ No newline at end of file
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="15dp"
android:height="15dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:fillColor="#228B3B"
android:pathData="M489.7,39.4c226.9,0 410.9,184 410.9,410.9 0,119.2 -50.8,226.6 -131.9,301.6l163.3,158.4a43.3,43.3 0,1 1,-60.6 62l-173.1,-167.9a409,409 0,0 1,-208.6 56.8C262.7,861.2 78.8,677.2 78.8,450.3S262.7,39.4 489.7,39.4zM489.7,126a324.3,324.3 0,1 0,0 648.5,324.3 324.3,0 0,0 0,-648.5zM543.5,228.6l4.3,0.5c42.7,8 78.8,26.2 107.6,54.5 28.9,28.4 47.3,64 54.9,105.8a31.5,31.5 0,0 1,-62 11.3c-5.4,-29.3 -17.6,-53 -37.1,-72.2 -19.6,-19.3 -44.3,-31.7 -75.1,-37.5a31.5,31.5 0,0 1,7.4 -62.5z" />
</vector>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="10dp" />
<gradient
android:angle="0"
android:endColor="#FFEBD4"
android:startColor="#FFEBD4"
android:type="linear" />
</shape>
\ No newline at end of file
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:fillAlpha="0.2"
android:fillColor="@color/text_orange3"
android:pathData="M512,512m-512,0a512,512 0,1 0,1024 0,512 512,0 1,0 -1024,0Z" />
<path
android:fillColor="@color/text_orange3"
android:pathData="M521.6,217.7l200.7,232.2a12.8,12.8 0,0 1,2 13.6,12.5 12.5,0 0,1 -11.5,7.4h-98.6a12.5,12.5 0,0 0,-12.4 10.9c-7.4,54.1 -52.1,293.2 -263.6,328.5a12.5,12.5 0,0 1,-13.8 -7.1,12.8 12.8,0 0,1 3.6,-15.2c36.3,-28.7 83.6,-84.3 96.9,-183.1 5.1,-40.1 7.6,-80.6 7.4,-121.1 0,-7 -5.5,-12.8 -12.6,-13h-108.4a12.5,12.5 0,0 1,-11.5 -7.5,12.8 12.8,0 0,1 2,-13.6l200.8,-232.1a12.5,12.5 0,0 1,18.9 0z" />
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="31.6dp"
android:viewportWidth="1036"
android:viewportHeight="1024">
<path
android:pathData="M516.5,0c282.8,0 512,229.2 512,512s-229.2,512 -512,512c-282.8,0 -512,-229.2 -512,-512s229.2,-512 512,-512zM672,243.2h-312.8c-7.6,0 -14.7,3.7 -19.2,9.9l-61.5,85.8a23.9,23.9 0,0 0,-4.4 11.8c-0.4,1.7 -0.7,3.4 -0.7,5.2v383.8c0,22.7 18.3,41.2 40.8,41.2h203.6c11.2,0 20.3,-9.2 20.3,-20.5 0,-11.3 -9.1,-20.5 -20.3,-20.5l-203.8,-0.2L314,376.8h403.3l1.8,125.5a20.4,20.4 0,0 0,20.3 20.2h0.3a20.4,20.4 0,0 0,20 -20.8l-2.2,-148.8a20.4,20.4 0,0 0,-1.7 -7.8,24.1 24.1,0 0,0 -3.1,-6.1l-61.5,-85.8a23.6,23.6 0,0 0,-19.2 -9.9zM695.4,574.9a84.6,84.6 0,0 0,-115.9 30.1,84.9 84.9,0 0,0 30,116.1 84.6,84.6 0,0 0,86.4 -0.3l40.8,41 1.8,1.6a20.9,20.9 0,0 0,27.8 -1.5,21 21,0 0,0 0.2,-29.6l-41.1,-41.3 2,-3.6a84.9,84.9 0,0 0,-32 -112.5zM652.5,605.2a42.8,42.8 0,0 1,42.6 39.9l0.1,2.9 -0.1,2.9a42.9,42.9 0,0 1,-39.7 39.8l-2.9,0.1 -2.9,-0.1a42.8,42.8 0,0 1,-39.8 -42.7,42.8 42.8,0 0,1 42.8,-42.8zM598.2,448L434.8,448a20.6,20.6 0,0 0,-20.7 20.5,20.6 20.6,0 0,0 20.7,20.5h163.4a20.6,20.6 0,0 0,20.7 -20.5A20.6,20.6 0,0 0,598.2 448zM663.3,284.2l37,51.6L330.8,335.8l37,-51.6L663.3,284.2z"
android:fillColor="#228B3B"/>
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M501.9,545.1c147.9,0 268.2,-118.5 268.2,-264.3 0,-145.7 -120.3,-264.3 -268.2,-264.3 -147.9,0 -268.2,118.6 -268.2,264.3 0,145.7 120.3,264.3 268.2,264.3zM612.5,570.5L411.5,570.5c-186.8,0 -338.7,149.6 -338.7,333.5v19.8c0,96.1 149.5,96.1 338.7,96.1h201c181.7,0 338.7,0 338.7,-96.1L951.2,904c-0,-183.9 -151.9,-333.5 -338.7,-333.5z"
android:fillColor="#228B3B"/>
</vector>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/white" />
<corners android:radius="10dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/white" />
<corners android:radius="15dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
style="@style/MatchMatch.Vertical">
<FrameLayout
......
......@@ -5,32 +5,127 @@
<include layout="@layout/toolbar_title_text" />
<!--rfid出库、扫码出库 按钮-->
<LinearLayout
android:id="@+id/llOutbound"
style="@style/MatchWrap.Horizontal"
android:paddingHorizontal="10dp">
<Button
android:id="@+id/btnRfidOutbound"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="rfid出库" />
<Button
android:id="@+id/btnScanOutbound"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_weight="1"
android:text="扫码出库" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
style="@style/RecyclerViewStyleMatchMatch"
tools:itemCount="2"
tools:listitem="@layout/item_outbound_details" />
</LinearLayout>
\ No newline at end of file
<RelativeLayout
android:id="@+id/ll_out_w"
style="@style/MatchMatch.Horizontal">
<!--rfid出库、扫码出库 按钮-->
<LinearLayout
android:id="@+id/llOutbound"
style="@style/MatchWrap.Horizontal"
android:paddingHorizontal="10dp">
<Button
android:id="@+id/btnRfidOutbound"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="rfid出库" />
<Button
android:id="@+id/btnScanOutbound"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_weight="1"
android:text="扫码出库" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
style="@style/RecyclerViewStyleMatchMatch"
android:layout_below="@+id/llOutbound"
tools:itemCount="2"
tools:listitem="@layout/item_outbound_details" />
<!-- 弹窗 背景不允许点击-->
<RelativeLayout
android:id="@+id/side_menu"
android:layout_width="330dp"
android:layout_height="match_parent"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:background="@drawable/alert_bg"
android:elevation="16dp"
android:translationX="-330dp">
<RelativeLayout
android:id="@+id/rl_title"
android:layout_width="match_parent"
android:layout_height="45dp"
android:elevation="10dp">
<TextView
android:id="@+id/tv_title"
style="@style/text_black16_ww"
android:layout_centerVertical="true"
android:layout_marginStart="10dp"
android:text="FRID 出库"
android:textStyle="bold" />
<TextView
android:id="@+id/tv_title2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginStart="10dp"
android:layout_toEndOf="@+id/tv_title"
android:background="@drawable/red_bg2"
android:paddingHorizontal="8dp"
android:paddingVertical="5dp"
android:text="请识别RFID进行出库"
android:textColor="@color/text_orange3"
android:textSize="10sp"
android:textStyle="bold" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_close"
android:layout_width="45dp"
android:layout_height="45dp"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:background="?actionBarItemBackground"
android:padding="13dp"
android:src="@drawable/login_clear_icon" />
</RelativeLayout>
<!--横线-->
<View
android:id="@+id/view_line"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_below="@+id/rl_title"
android:layout_marginBottom="5dp"
android:background="@color/c_f5f5" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_outBoundFrid"
style="@style/RecyclerViewStyleMatchMatch"
android:layout_below="@+id/view_line" />
<!--暂无数据-->
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/ll_nothing"
style="@style/WrapWrap.Vertical"
android:layout_centerInParent="true"
android:gravity="center">
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@mipmap/nothing_icon" />
<TextView
android:id="@+id/tv_no_data"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="请识别出库商品标签"
android:textColor="@color/c_999"
android:textSize="14sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
</RelativeLayout>
</RelativeLayout>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/lLayout_bg"
style="@style/MatchWrap.Vertical"
android:background="@drawable/dialog_bg">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@drawable/top_radius"
android:gravity="center_vertical"
android:orientation="vertical"
android:paddingStart="20dp">
<TextView
android:id="@+id/txt_title"
style="@style/text_white_18_ww"
android:text="@string/text_ip" />
</LinearLayout>
<TextView
android:id="@+id/txt_ip"
style="@style/text_black14_mw"
android:layout_marginStart="20dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="20dp"
android:gravity="center"
android:textStyle="bold" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_below="@+id/txt_ip"
android:layout_marginStart="20dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="20dp">
<com.sxyz.rfid.widgets.ClearEditText
android:id="@+id/et_ip"
style="@style/MatchMatch"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="0dp"
android:layout_marginTop="-2dp"
android:background="@null"
android:hint="请输入IP"
android:inputType="text"
android:maxLength="20"
android:paddingStart="10dp"
android:paddingEnd="15dp"
android:singleLine="true"
android:text="192.168.0.0"
android:textColor="@color/black"
android:textColorHint="@color/c_c1c1"
android:textSize="14sp" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_alignParentBottom="true"
android:background="@color/c_e7e7" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginStart="20dp"
android:layout_marginEnd="20dp">
<com.sxyz.rfid.widgets.ClearEditText
android:id="@+id/et_port"
style="@style/MatchMatch"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="0dp"
android:layout_marginTop="-2dp"
android:background="@null"
android:hint="请输入端口"
android:inputType="text"
android:maxLength="20"
android:paddingStart="10dp"
android:paddingEnd="15dp"
android:singleLine="true"
android:text="8080"
android:textColor="@color/black"
android:textColorHint="@color/c_c1c1"
android:textSize="14sp" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_alignParentBottom="true"
android:background="@color/c_e7e7" />
</RelativeLayout>
<LinearLayout
android:id="@+id/buttonGroup"
style="@style/MatchWrap.Horizontal"
android:layout_marginStart="20dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="20dp">
<Button
android:id="@+id/bt_cancel"
style="?android:attr/borderlessButtonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="取消"
android:textColor="@color/purple_200" />
<View
android:id="@+id/buttonVerticalDivider"
android:layout_width="1px"
android:layout_height="match_parent"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:background="@color/c_EEEE" />
<Button
android:id="@+id/bt_ok"
style="?android:attr/borderlessButtonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="切换"
android:textColor="@color/purple_200" />
</LinearLayout>
</LinearLayout>
\ No newline at end of file
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