排程进度

This commit is contained in:
fengjignqi
2026-07-06 16:48:39 +08:00
parent fa44e0edbd
commit 1cfc6f9d73
29 changed files with 419 additions and 16 deletions

View File

@@ -169,7 +169,7 @@ public class AddDeviceActivity extends BaseActivity<AddDeviceLayoutBinding, Devi
String deviceAddress = result.getDevice().getAddress();
// 去重:已存在的设备不再添加
if (discoveredMacSet.contains(deviceAddress)) {
if (discoveredMacSet.contains(deviceAddress)) {//dc:da:0c:fa:2b:3a
return;
}
discoveredMacSet.add(deviceAddress);
@@ -214,7 +214,7 @@ public class AddDeviceActivity extends BaseActivity<AddDeviceLayoutBinding, Devi
ToastUtil.showShort(mContext, "扫描失败,错误码: " + errorCode);
}
};
scanner.startScan(null, settings, mScanCallback);
scanner.startScan(filters, settings, mScanCallback);
}
/**
@@ -453,6 +453,11 @@ public class AddDeviceActivity extends BaseActivity<AddDeviceLayoutBinding, Devi
}
@Override
public void queryDeviceWorkTimeSuccess(WaterDeviceEntity bean) {
}
@Override
protected void onDestroy() {
super.onDestroy();

View File

@@ -307,4 +307,9 @@ public class DeviceConnectActivity extends BaseActivity<DeviceConnectLayoutBindi
public void queryDeviceBindStatusSuccess(WaterDeviceEntity bean) {
}
@Override
public void queryDeviceWorkTimeSuccess(WaterDeviceEntity bean) {
}
}

View File

@@ -59,7 +59,12 @@ public class DeviceControlActivity extends BaseActivity<DeviceControlLayoutBindi
mDeviceEntity = (WaterDeviceEntity) bundle.getSerializable("device_info");
if(mDeviceEntity != null){
showLoadingDialog();
//查询设备详情
mPresenter.getDeviceDetailInfo(mDeviceEntity.getDeviceNo());
//查询设备当前工作进度
if(mDeviceEntity.getWorkStatus().equals("1")){
mPresenter.getDeviceWorkProgress(mDeviceEntity.getDeviceNo());
}
viewBinding.includedTitle.tvTitle.setText(mDeviceEntity.getDeviceName());
updateDeviceStatus(mDeviceEntity);
@@ -399,6 +404,22 @@ public class DeviceControlActivity extends BaseActivity<DeviceControlLayoutBindi
ToastUtil.showShort(mContext,message);
}
/**
* 查询到设备目前的工作时间,控制进度条的展示
* @param bean
*/
@Override
public void queryDeviceWorkTimeSuccess(WaterDeviceEntity bean) {
//"startTime": "2026-07-06 16:35:00",
//"endTime": "2026-07-06 16:37:00"
//bean.getStartTime(),bean.getEndTime(),这两个字段。
//Todo 根据以上开始时间和结束时间以及当前时间计算进度条的进度viewBinding.progressWork,做到实时更新。
}
@Override
public void logOut(BaseBean bean) {
@@ -426,4 +447,6 @@ public class DeviceControlActivity extends BaseActivity<DeviceControlLayoutBindi
public void queryDeviceBindStatusSuccess(WaterDeviceEntity bean) {
}
}

View File

@@ -107,4 +107,9 @@ public class DeviceInfoActivity extends BaseActivity<DeviceInfoLayoutBinding, De
public void queryDeviceBindStatusSuccess(WaterDeviceEntity bean) {
}
@Override
public void queryDeviceWorkTimeSuccess(WaterDeviceEntity bean) {
}
}

View File

@@ -144,4 +144,9 @@ public class DeviceReNameActivity extends BaseActivity<SetDeviceNameLayoutBindin
public void queryDeviceBindStatusSuccess(WaterDeviceEntity bean) {
}
@Override
public void queryDeviceWorkTimeSuccess(WaterDeviceEntity bean) {
}
}

View File

@@ -229,4 +229,9 @@ public class DeviceSettingsActivity extends BaseActivity<DeviceSettingsLayoutBin
public void queryDeviceBindStatusSuccess(WaterDeviceEntity bean) {
}
@Override
public void queryDeviceWorkTimeSuccess(WaterDeviceEntity bean) {
}
}

View File

@@ -382,6 +382,11 @@ public class SelectWifiActivity extends BaseActivity<DeviceResetWifiBinding, Dev
mBleDeviceEntity = bean.getBindDevice();
}
@Override
public void queryDeviceWorkTimeSuccess(WaterDeviceEntity bean) {
}
@Override
public void addDeviceSuccess(WaterDeviceEntity bean) {

View File

@@ -349,6 +349,11 @@ public class SelectWifiActivity_copy extends BaseActivity<DeviceResetWifiBinding
}
@Override
public void queryDeviceWorkTimeSuccess(WaterDeviceEntity bean) {
}
private class WifiScanReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {

View File

@@ -29,6 +29,9 @@ public class DeviceContract {
//手动开启关闭设备
void turnOnOffDevice(JSONObject json, IndexContract.CallBack callBack);
//设备当前工作的开始时间和结束时间
void queryDeviceWorkTime(Map<String,String> map , IndexContract.CallBack callBack);
}
public interface DeviceView extends IView {
@@ -40,5 +43,7 @@ public class DeviceContract {
void turnOnOffDeviceSuccess(BaseBean bean, String status);
void queryDeviceBindStatusSuccess(WaterDeviceEntity bean);
//查询设备目前工作状态
void queryDeviceWorkTimeSuccess(WaterDeviceEntity bean);
}
}

View File

@@ -4,9 +4,11 @@ import com.ckkj.water.index.entity.WaterDeviceEntity;
import com.ckkj.water.index.mvp.IndexContract;
import com.ckkj.water.network.BaseBean;
import com.ckkj.water.network.NetWorkManager;
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
import org.json.JSONObject;
import java.util.List;
import java.util.Map;
import io.reactivex.Observer;
@@ -205,4 +207,38 @@ public class DeviceImpl implements DeviceContract.DataModel{
e.printStackTrace();
}
}
/**
* 查询设备工作时间
* @param map
* @param callBack
*/
@Override
public void queryDeviceWorkTime(Map<String, String> map, IndexContract.CallBack callBack) {
NetWorkManager.getRequest().queryDeviceWorkTime(NetWorkManager.getToken(),map)
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<BaseBean<WaterDeviceEntity>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull BaseBean<WaterDeviceEntity> bean) {
if (bean.getCode() == 200) {
callBack.success(bean.getData(),0);
}
}
@Override
public void onError(@NonNull Throwable e) {
callBack.fail(e.getMessage());
}
@Override
public void onComplete() {
}
});
}
}

View File

@@ -175,7 +175,8 @@ public class DevicePresenter extends BasePresenter<DeviceContract.DeviceView> {
public void bindDeviceStatus(WaterDeviceEntity entity) {
try {
JSONObject json = new JSONObject();
json.put("macAddress",entity.getMacAddress());
json.put("macAddress",
entity.getMacAddress() == null ? "" : entity.getMacAddress().toLowerCase());
new IndexImpl().queryDeviceBindStatus(json, new IndexContract.CallBack<WaterDeviceEntity>() {
@Override
public void success(WaterDeviceEntity bean, int total) {
@@ -198,4 +199,28 @@ public class DevicePresenter extends BasePresenter<DeviceContract.DeviceView> {
}
}
/**
* 查询设备工作的开始时间和结束时间,计算进度
* @param deviceNo
*/
public void getDeviceWorkProgress(String deviceNo) {
Map<String,String> map = new HashMap<>();
map.put("deviceNo",deviceNo);
impl.queryDeviceWorkTime(map, new IndexContract.CallBack<WaterDeviceEntity>() {
@Override
public void success(WaterDeviceEntity bean, int total) {
if(DevicePresenter.this.getView() != null){
DevicePresenter.this.getView().queryDeviceWorkTimeSuccess(bean);
}
}
@Override
public void fail(String msg) {
if(DevicePresenter.this.getView() != null){
DevicePresenter.this.getView().showError( msg);
}
}
});
}
}

View File

@@ -272,7 +272,6 @@ public class IndexFragment extends BaseFragment<IndexFragmentLayoutBinding, Inde
// 这是一台没有在mqtt中注册的设备需要通过蓝牙连接配网,(可理解为新设备,走蓝牙,配网)
// 先检查蓝牙权限和开启状态
checkBluetoothAndProceed();
break;

View File

@@ -48,6 +48,8 @@ public class WaterDeviceEntity implements Serializable {
private int bindDeviceStatus;
private String bindDeviceStatusName;
private WaterDeviceEntity bindDevice;
private String startTime;
private String endTime;
@Data
@NoArgsConstructor

View File

@@ -47,7 +47,8 @@ public class IndexPresenter extends BasePresenter<IndexContract.IndexView>{
public void bindDeviceStatus(WaterDeviceEntity entity) {
try {
JSONObject json = new JSONObject();
json.put("macAddress",entity.getMacAddress());
json.put("macAddress",
entity.getMacAddress() == null ? "" : entity.getMacAddress().toLowerCase());
mImpl.queryDeviceBindStatus(json, new IndexContract.CallBack<WaterDeviceEntity>() {
@Override
public void success(WaterDeviceEntity bean, int total) {

View File

@@ -22,7 +22,6 @@ public class LoginContract {
public interface DataModel{
//手机验证码登录
void register(JSONObject json, CallBack callBack);
//获取手机验证码
void getPhoneCode(Map<String,Object> map, CallBack callBack);
//手机验证码登录
@@ -31,6 +30,10 @@ public class LoginContract {
void updatePsdByVerifyCode(JSONObject json, CallBack callBack);
//退出登录
void logout(JSONObject json, CallBack callBack);
//注销账号--发送验证码
void logoffAccountCode(Map<String,Object> map, CallBack callBack);
//注销账号--确认注销
void logoffAccount(Map<String,String> map, CallBack callBack);
}
public interface LoginView extends IView{

View File

@@ -105,6 +105,88 @@ public class LoginImpl implements LoginContract.DataModel {
}
}
/**
* 注销账号--发送验证码
* @param map
* @param callBack
*/
@Override
public void logoffAccountCode(Map<String, Object> map, LoginContract.CallBack callBack) {
try {
NetWorkManager.getRequest().logoffAccountCode(NetWorkManager.getToken())
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<BaseBean>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull BaseBean bean) {
if (bean.getCode() == 200) {
callBack.success(bean);
} else {
callBack.fail(bean.getMessage());
}
}
@Override
public void onError(@NonNull Throwable e) {
callBack.fail(e.getMessage());
}
@Override
public void onComplete() {
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 注销账号--确认
* @param map
* @param callBack
*/
@Override
public void logoffAccount(Map<String,String> map, LoginContract.CallBack callBack) {
try {
NetWorkManager.getRequest().confirmLogiffAccount(NetWorkManager.getToken(), map)
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<BaseBean>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull BaseBean bean) {
if (bean.getCode() == 200) {
callBack.success(bean);
} else {
callBack.fail(bean.getMessage());
}
}
@Override
public void onError(@NonNull Throwable e) {
callBack.fail(e.getMessage());
}
@Override
public void onComplete() {
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 使用验证码登录
* @param json
@@ -226,4 +308,6 @@ public class LoginImpl implements LoginContract.DataModel {
e.printStackTrace();
}
}
}

View File

@@ -133,4 +133,14 @@ public class AppThemActivity extends BaseActivity<AppThemeChangeLayoutBinding, M
public void getAppVersionSuccess(CheckVersionEntity bean) {
}
@Override
public void getAccountLogoffCodeSuccess(BaseBean bean) {
}
@Override
public void confirmAccountLogoffCodeSuccess(BaseBean bean) {
}
}

View File

@@ -161,4 +161,14 @@ public class ChangePhoneActivity extends BaseActivity<ChangePhoneActivityBinding
public void getAppVersionSuccess(CheckVersionEntity bean) {
}
@Override
public void getAccountLogoffCodeSuccess(BaseBean bean) {
}
@Override
public void confirmAccountLogoffCodeSuccess(BaseBean bean) {
}
}

View File

@@ -183,6 +183,16 @@ public class MineCenterFragment extends BaseFragment<MineFragmentLayoutBinding,
}
@Override
public void getAccountLogoffCodeSuccess(BaseBean bean) {
}
@Override
public void confirmAccountLogoffCodeSuccess(BaseBean bean) {
}
@Override
public void updateUserInfoSuccess(BaseBean bean) {

View File

@@ -231,6 +231,16 @@ public class MineInfomationActivity extends BaseActivity<MineInformationLayoutBi
}
@Override
public void getAccountLogoffCodeSuccess(BaseBean bean) {
}
@Override
public void confirmAccountLogoffCodeSuccess(BaseBean bean) {
}
private void getCompressFile(File file) {
LubanCompressUtil.getInstance().getCompressFile(mContext, file, new LubanCompressUtil.CompressCallback() {

View File

@@ -112,4 +112,14 @@ public class PsdManageActivity extends BaseActivity<PasswordManLayoutBinding, Mi
public void getAppVersionSuccess(CheckVersionEntity bean) {
}
@Override
public void getAccountLogoffCodeSuccess(BaseBean bean) {
}
@Override
public void confirmAccountLogoffCodeSuccess(BaseBean bean) {
}
}

View File

@@ -107,6 +107,16 @@ public class ResetPsdActivity extends BaseActivity<ResetPsdLayoutBinding, MinePr
}
@Override
public void getAccountLogoffCodeSuccess(BaseBean bean) {
}
@Override
public void confirmAccountLogoffCodeSuccess(BaseBean bean) {
}
@Override
public MinePresenter createPresenter() {
return new MinePresenter(new MineImpl());

View File

@@ -281,6 +281,16 @@ public class SettingsActivity extends BaseActivity<ActivitySettingsLayoutBinding
}
}
@Override
public void getAccountLogoffCodeSuccess(BaseBean bean) {
}
@Override
public void confirmAccountLogoffCodeSuccess(BaseBean bean) {
}
@Override
public void activationVipSuccess(BaseBean bean) {

View File

@@ -5,8 +5,11 @@ import android.os.CountDownTimer;
import android.text.TextUtils;
import android.view.View;
import com.ckkj.water.base.BaseFragment;
import com.ckkj.water.login.LoginActivity;
import com.ckkj.water.main.entity.CheckVersionEntity;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.utils.manager.ActivityManager;
import com.ckkj.water.utils.manager.WaterUserInfoManager;
import com.gyf.immersionbar.ImmersionBar;
import com.ckkj.water.AppConfig;
@@ -48,12 +51,25 @@ public class UserLogOffAccountActivity extends BaseActivity<UserLogOffActivityBi
.titleBar(viewBinding.rlTitle)
.init();
viewBinding.includeTitle.tvTitle.setText("注销账号");
viewBinding.includeTitle.imgBack.setOnClickListener(c -> finish());
if(AppConfig.USER_LOGIN){
String phoneNum = WaterUserInfoManager.getInstance().getUserInfo().getUser().getPhonenumber();
if(!TextUtils.isEmpty(phoneNum)){
viewBinding.tvUserPhone.setText(phoneNum);
String userAccount = (!TextUtils.isEmpty(WaterUserInfoManager.getInstance().getUserInfo().getUser().getPhonenumber()) ?
WaterUserInfoManager.getInstance().getUserInfo().getUser().getPhonenumber() :
WaterUserInfoManager.getInstance().getUserInfo().getUser().getEmail());
if(!TextUtils.isEmpty(userAccount)){
viewBinding.tvUserPhone.setText(userAccount);
}
}
initListener();
}
private void initListener() {
setClick(viewBinding.tvGetCode);
setClick(viewBinding.tvCommit);
}
private void setClick(View view) {
view.setOnClickListener(this::onClick);
}
@@ -65,22 +81,60 @@ public class UserLogOffAccountActivity extends BaseActivity<UserLogOffActivityBi
case R.id.tv_get_code:
showLoadingDialog();
mPresenter.getAccountLogoffCode();
break;
case R.id.tv_commit:
if(TextUtils.isEmpty(viewBinding.edVerCode.getText().toString().trim())){
ToastUtil.showShort(mContext,"请填写验证码");
ToastUtil.showShort(mContext, getString(R.string.login_error_code_empty));
return;
}
if(viewBinding.edVerCode.getText().toString().trim().length() < 6){
ToastUtil.showShort(mContext,"请填写6位验证码");
ToastUtil.showShort(mContext,getString(R.string.login_error_code_invalid));
return;
}
showDialogtext(null, false, false, true,
getString(R.string.tip_text),
"该操作将会注销此账号",
getString(R.string.cancel_text),
getString(R.string.confirm_text),
new BaseFragment.OnDialogClick() {
@Override
public void onCancelClick() {
}
@Override
public void onConfirmClick() {
mPresenter.confirmAccountLogoff(viewBinding.edVerCode.getText().toString().trim());
}
});
break;
}
}
/**
* 获取账号注销验证码成功
* @param bean
*/
@Override
public void getAccountLogoffCodeSuccess(BaseBean bean) {
hideDialogLoading();
ToastUtil.showShort(mContext,"验证码已发送至该账户");
}
/**
* 确认账号注销成功
* @param bean
*/
@Override
public void confirmAccountLogoffCodeSuccess(BaseBean bean) {
WaterUserInfoManager.getInstance().clearUser(mContext);
ActivityManager.removeAllActivity();
goTo(mContext, LoginActivity.class,null);
}
private CountDownTimer cdTimer = new CountDownTimer(60000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
@@ -141,4 +195,6 @@ public class UserLogOffAccountActivity extends BaseActivity<UserLogOffActivityBi
public void getAppVersionSuccess(CheckVersionEntity bean) {
}
}

View File

@@ -45,8 +45,12 @@ public class MineContract {
void logOutSuccess(BaseBean bean);
//上传图片成功
void uploadImageSuccess(MineUserInfoBean bean);
//获取新版本信息成功
void getAppVersionSuccess(CheckVersionEntity bean);
//获取注销账号验证码成功
void getAccountLogoffCodeSuccess(BaseBean bean);
//确认注销账号成功
void confirmAccountLogoffCodeSuccess(BaseBean bean);
}
public interface RecommendModel{

View File

@@ -195,4 +195,49 @@ public class MinePresenter extends BasePresenter<MineContract.MineView> {
}
});
}
/**
* 获取注销账号验证码
*/
public void getAccountLogoffCode() {
new LoginImpl().logoffAccountCode(null, new LoginContract.CallBack<BaseBean>() {
@Override
public void success(BaseBean bean) {
if(MinePresenter.this.getView() != null){
MinePresenter.this.getView().getAccountLogoffCodeSuccess(bean);
}
}
@Override
public void fail(String msg) {
if(MinePresenter.this.getView() != null){
MinePresenter.this.getView().showError(msg);
}
}
});
}
/**
* 确认注销账号
* @param verCode
*/
public void confirmAccountLogoff(String verCode) {
Map<String,String> map = new HashMap<>();
map.put("code",verCode);
new LoginImpl().logoffAccount(map, new LoginContract.CallBack<BaseBean>() {
@Override
public void success(BaseBean bean) {
if(MinePresenter.this.getView() != null){
MinePresenter.this.getView().confirmAccountLogoffCodeSuccess(bean);
}
}
@Override
public void fail(String msg) {
if(MinePresenter.this.getView() != null){
MinePresenter.this.getView().showError(msg);
}
}
});
}
}

View File

@@ -36,6 +36,16 @@ public interface Request {
//发送验证码
@GET("resource/code")
Observable<BaseBean> sendPhoneCode(@HeaderMap Map<String, String> headMap,@QueryMap Map<String, Object> map);
//注销使用--发送验证码
@GET("resource/account/cancel/code")
Observable<BaseBean> logoffAccountCode(@HeaderMap Map<String, String> headMap);
//排程解绑设备
@DELETE("app/v1/account")
Observable<BaseBean> confirmLogiffAccount(@HeaderMap Map<String,String> headMap,@QueryMap Map<String, String> map);
//注册
@POST("auth/register")
Observable<BaseBean> register(@Body RequestBody requestBody);
@@ -81,6 +91,11 @@ public interface Request {
@PUT("app/v1/switchDevice")
Observable<BaseBean<WaterPlanWeekEntity>> switchDevice(@HeaderMap Map<String, String> headMap, @Body RequestBody requestBody);
//查询设备工作开始时间和结束时间
@GET("app/v1/latestWaterLog")
Observable<BaseBean<WaterDeviceEntity>> queryDeviceWorkTime(@HeaderMap Map<String, String> headMap,@QueryMap Map<String, String> map);
//修改更新设备信息
@PUT("app/v1/updateDeviceInfo")
Observable<BaseBean> updateDeviceInfo(@HeaderMap Map<String, String> headMap, @Body RequestBody requestBody);