新增排程接口

This commit is contained in:
fengjignqi
2026-05-25 15:43:34 +08:00
parent e6e3f755d0
commit 6c6d211701
12 changed files with 388 additions and 51 deletions

View File

@@ -9,10 +9,12 @@ import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
import com.ckkj.water.plan.mvp.WaterPlanContract;
import com.ckkj.water.plan.mvp.WaterPlanPresenter;
import java.util.List;
/**
* @author fengxiaoyang
* @date 2026/5/16
* @description TODO: 描述该类的作用
* @description TODO: 统计界面
*/
public class StatisticFragment extends BaseFragment<WaterCountFragmentLayoutBinding, WaterPlanPresenter>
implements WaterPlanContract.WaterPlanView {
@@ -41,8 +43,18 @@ public class StatisticFragment extends BaseFragment<WaterCountFragmentLayoutBind
}
@Override
public void getWaterConfigListSuccess(List<WaterPlanWeekEntity> list,int total) {
}
@Override
public void saveConfigSuccess(WaterPlanWeekEntity entity) {
}
@Override
public void updateConfigSuccess(WaterPlanWeekEntity entity) {
}
}

View File

@@ -65,10 +65,20 @@ public interface Request {
@PUT("app/v1/updataPassword")
Observable<BaseBean> updatePasswordByOld(@HeaderMap Map<String, String> headMap, @Body RequestBody requestBody);
//查询排程列表
@GET("app/v1/schedulelist")
Observable<BaseBean<List<WaterPlanWeekEntity>>> scheduleList(@HeaderMap Map<String, String> headMap);
//添加排程信息
@POST("app/v1/addschedule")
Observable<BaseBean<WaterPlanWeekEntity>> addSchedule(@HeaderMap Map<String, String> headMap, @Body RequestBody requestBody);
//编辑排程,更新
@PUT("app/v1/updataschedule")
Observable<BaseBean<WaterPlanWeekEntity>> updateSchedule(@HeaderMap Map<String, String> headMap, @Body RequestBody requestBody);
//解绑信息
// 示例:ids array[string]
//["2052921001527869441"]

View File

@@ -101,7 +101,7 @@ public class AddWaterPlanActivity extends BaseActivity<AddWaterPlanLayoutBinding
ToastUtil.showShort(mContext, "请完成配置");
return;
}else{
if(!configFragment.isConfigSave){
if(!configFragment.isConfigSave || configFragment.isConfigChanged()){
showDialogtext(mContext.getResources().getDrawable(R.mipmap.img_location), false, false,true,
"提示", "关联设备需要保存排程配置,是否继续?",
"取消", "继续", new BaseFragment.OnDialogClick() {
@@ -152,9 +152,19 @@ public class AddWaterPlanActivity extends BaseActivity<AddWaterPlanLayoutBinding
}
@Override
public void getWaterConfigListSuccess(List<WaterPlanWeekEntity> list,int total) {
}
@Override
public void saveConfigSuccess(WaterPlanWeekEntity entity) {
}
@Override
public void updateConfigSuccess(WaterPlanWeekEntity entity) {
}
}

View File

@@ -80,8 +80,18 @@ public class BindDeviceFragment extends BaseFragment<PlanBindDeviceLayoutBinding
}
@Override
public void getWaterConfigListSuccess(List<WaterPlanWeekEntity> list,int total) {
}
@Override
public void saveConfigSuccess(WaterPlanWeekEntity entity) {
}
@Override
public void updateConfigSuccess(WaterPlanWeekEntity entity) {
}
}

View File

@@ -16,6 +16,8 @@ import com.ckkj.water.plan.mvp.WaterPlanPresenter;
import com.google.gson.Gson;
import com.gyf.immersionbar.ImmersionBar;
import java.util.List;
/**
* 排程详情页面
*/
@@ -79,8 +81,18 @@ public class PlanDetailActivity extends BaseActivity<WaterPlanDetailLayoutBindin
}
@Override
public void getWaterConfigListSuccess(List<WaterPlanWeekEntity> list,int total) {
}
@Override
public void saveConfigSuccess(WaterPlanWeekEntity entity) {
}
@Override
public void updateConfigSuccess(WaterPlanWeekEntity entity) {
}
}

View File

@@ -35,8 +35,9 @@ import java.util.List;
public class WaterConfigFragment extends BaseFragment<WaterConfigFragmentLayoutBinding, WaterPlanPresenter>
implements WaterPlanContract.WaterPlanView {
private List<WaterPlanWeekEntity.DetailsBean> mConfigList = new ArrayList<>();
//用户本地操作排程时的数据
private WaterPlanWeekEntity mConfigEntity;
//排程接口新增成功之后,接口返回的该排程在远端的数据信息
private WaterPlanWeekEntity mRemoteConfigEntity;
private WaterPlanWeekAdapter mWeekAdapter;
private String mPlanName = "";
@@ -114,8 +115,20 @@ public class WaterConfigFragment extends BaseFragment<WaterConfigFragmentLayoutB
public void commitConfig(){
if(checkConfigFinish()){
if (!checkConfigFinish()) {
return;
}
// mRemoteConfigEntity 为空,说明是新增场景
if (mRemoteConfigEntity == null) {
mPresenter.saveConfig(mConfigEntity);
return;
}
// mRemoteConfigEntity 不为空,说明是更新场景
if (isConfigChanged()) {
// TODO: 触发更新接口,调用 mPresenter.updateConfig(mConfigEntity)
mPresenter.updateConfig(mConfigEntity);
} else {
ToastUtil.showShort(mContext, "配置没有变化,无需保存");
}
}
@@ -176,7 +189,40 @@ public class WaterConfigFragment extends BaseFragment<WaterConfigFragmentLayoutB
view.setOnClickListener(this::onClick);
}
/**
* 比较本地配置和远程配置是否有变化
* @return true 表示有变化false 表示无变化
*/
public boolean isConfigChanged() {
if (mRemoteConfigEntity == null || mRemoteConfigEntity.getDetails() == null) {
return true;
}
// 比对排程名称
if (!equalsString(mConfigEntity.getName(), mRemoteConfigEntity.getName())) {
return true;
}
List<WaterPlanWeekEntity.DetailsBean> localDetails = mConfigEntity.getDetails();
List<WaterPlanWeekEntity.DetailsBean> remoteDetails = mRemoteConfigEntity.getDetails();
if (localDetails == null || localDetails.size() != remoteDetails.size()) {
return true;
}
for (int i = 0; i < localDetails.size(); i++) {
WaterPlanWeekEntity.DetailsBean local = localDetails.get(i);
WaterPlanWeekEntity.DetailsBean remote = remoteDetails.get(i);
if (!equalsString(local.getStatus(), remote.getStatus())
|| !equalsString(local.getStartTime(),ZYTimeUtils.timeWithoutMillis(remote.getStartTime()))
|| local.getDurationMin() != remote.getDurationMin()) {
return true;
}
}
return false;
}
private boolean equalsString(String s1, String s2) {
if (s1 == null && s2 == null) return true;
if (s1 == null || s2 == null) return false;
return s1.equals(s2);
}
/**
* 检查配置信息是否完成
@@ -216,10 +262,23 @@ public class WaterConfigFragment extends BaseFragment<WaterConfigFragmentLayoutB
return true;
}
@Override
public void getWaterConfigListSuccess(List<WaterPlanWeekEntity> list,int total) {
}
@Override
public void saveConfigSuccess(WaterPlanWeekEntity entity) {
ToastUtil.showShort(mContext, "排程新增成功");
isConfigSave = true;
// 把接口返回的 ID 设置到 mConfigEntity便于后续更新操作
mConfigEntity.setId(entity.getId());
// 把 details 中每个 bean 的 id 也设置到 mConfigEntity便于后续更新操作
if (entity.getDetails() != null && mConfigEntity.getDetails() != null) {
for (int i = 0; i < entity.getDetails().size() && i < mConfigEntity.getDetails().size(); i++) {
mConfigEntity.getDetails().get(i).setId(entity.getDetails().get(i).getId());
}
}
//接口请求之后返回的数据,方便后面做对比
mRemoteConfigEntity = entity;
if (getActivity() instanceof AddWaterPlanActivity) {
@@ -227,6 +286,11 @@ public class WaterConfigFragment extends BaseFragment<WaterConfigFragmentLayoutB
}
}
@Override
public void updateConfigSuccess(WaterPlanWeekEntity entity) {
}
@Override
public WaterPlanPresenter createPresenter() {

View File

@@ -12,11 +12,13 @@ import com.ckkj.water.databinding.WaterPlanFragmentBinding;
import com.ckkj.water.main.activity.MainActivity;
import com.ckkj.water.network.BaseBean;
//import com.ckkj.water.plan.adapter.WaterPlanListAdapter;
import com.ckkj.water.plan.adapter.WaterPlanListAdapter;
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
import com.ckkj.water.plan.mvp.WaterPlanContract;
import com.ckkj.water.plan.mvp.WaterPlanImpl;
import com.ckkj.water.plan.mvp.WaterPlanPresenter;
import com.ckkj.water.utils.manager.ThemeManager;
import com.ckkj.water.utils.show.ToastUtil;
import com.google.gson.Gson;
import com.gyf.immersionbar.ImmersionBar;
@@ -25,8 +27,8 @@ import java.util.List;
public class WaterPlanFragment extends BaseFragment<WaterPlanFragmentBinding, WaterPlanPresenter>
implements WaterPlanContract.WaterPlanView {
// private List<WaterPlanWeekEntity.DeviceEntity> mDevList = new ArrayList<>();
// private WaterPlanListAdapter mAdapter;
private List<WaterPlanWeekEntity> mPlanList = new ArrayList<>();
private WaterPlanListAdapter mAdapter;
@Override
public void initData(Bundle state) {
@@ -43,14 +45,16 @@ public class WaterPlanFragment extends BaseFragment<WaterPlanFragmentBinding, Wa
viewBinding.includedTitle.tvTitle.setText(getString(R.string.plan_title));
initListener();
// mAdapter = new WaterPlanListAdapter(mContext,R.layout.water_plan_list_item,mDevList);
// viewBinding.rvPlans.setAdapter(mAdapter);
// mAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
// @Override
// public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
// goTo(mContext, PlanDetailActivity.class,null);
// }
// });
mAdapter = new WaterPlanListAdapter(mContext,R.layout.water_plan_list_item,mPlanList);
viewBinding.rvPlans.setAdapter(mAdapter);
mAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
@Override
public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
goTo(mContext, PlanDetailActivity.class,null);
}
});
showLoadingDialog();
mPresenter.getWaterPlanList();
}
@@ -70,6 +74,14 @@ public class WaterPlanFragment extends BaseFragment<WaterPlanFragmentBinding, Wa
}
}
@Override
public void getWaterConfigListSuccess(List<WaterPlanWeekEntity> list,int total) {
hideDialogLoading();
mPlanList = list;
mAdapter.setNewData(list);
}
@Override
public WaterPlanPresenter createPresenter() {
return new WaterPlanPresenter(new WaterPlanImpl());
@@ -82,7 +94,8 @@ public class WaterPlanFragment extends BaseFragment<WaterPlanFragmentBinding, Wa
@Override
public void showError(String message) {
hideDialogLoading();
ToastUtil.showShort(mContext,message);
}
@Override
@@ -90,8 +103,15 @@ public class WaterPlanFragment extends BaseFragment<WaterPlanFragmentBinding, Wa
}
@Override
public void saveConfigSuccess(WaterPlanWeekEntity entity) {
}
@Override
public void updateConfigSuccess(WaterPlanWeekEntity entity) {
}
}

View File

@@ -1,33 +1,33 @@
//package com.ckkj.water.plan.adapter;
//
//import android.content.Context;
//import android.widget.CheckBox;
//
//import androidx.annotation.Nullable;
//
//import com.chad.library.adapter.base.BaseQuickAdapter;
//import com.chad.library.adapter.base.BaseViewHolder;
//import com.ckkj.water.R;
//import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
//
//import java.util.HashSet;
//import java.util.List;
//import java.util.Set;
//
//public class WaterPlanListAdapter extends BaseQuickAdapter<WaterPlanWeekEntity.DeviceEntity, BaseViewHolder> {
// private Context mContext;
//
// public WaterPlanListAdapter(Context context, int layoutResId, @Nullable List<WaterPlanWeekEntity.DeviceEntity> data) {
// super(layoutResId, data);
// this.mContext = context;
// }
//
// @Override
// protected void convert(BaseViewHolder helper, WaterPlanWeekEntity.DeviceEntity item) {
// helper.setText(R.id.tv_device_name, item.getDeviceName());
// helper.setText(R.id.tv_device_serial, item.getDeviceCode());
// }
//
//
//
//}
package com.ckkj.water.plan.adapter;
import android.content.Context;
import android.widget.CheckBox;
import androidx.annotation.Nullable;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.ckkj.water.R;
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class WaterPlanListAdapter extends BaseQuickAdapter<WaterPlanWeekEntity, BaseViewHolder> {
private Context mContext;
public WaterPlanListAdapter(Context context, int layoutResId, @Nullable List<WaterPlanWeekEntity> data) {
super(layoutResId, data);
this.mContext = context;
}
@Override
protected void convert(BaseViewHolder helper, WaterPlanWeekEntity item) {
helper.setText(R.id.tv_device_name, item.getName());
helper.setText(R.id.tv_device_serial, item.getId());
}
}

View File

@@ -5,18 +5,29 @@ import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
import org.json.JSONObject;
import java.util.List;
import java.util.Map;
public class WaterPlanContract {
public interface CallBack<T> {
void success(T msg);
void success(T msg,int total);
void fail(String msg);
}
public interface DataModel{
//查询排程列表
void getWaterConfigList(Map<String, String> map,CallBack callBack);
//新增排程
void saveConfig(JSONObject json,CallBack callBack);
void updateConfig(JSONObject json,CallBack callBack);
}
public interface WaterPlanView extends IView {
//查询排程列表成功
void getWaterConfigListSuccess(List<WaterPlanWeekEntity> list,int total);
//排程保存成功g
void saveConfigSuccess(WaterPlanWeekEntity entity);
//排程更新成功
void updateConfigSuccess(WaterPlanWeekEntity entity);
}
}

View File

@@ -1,6 +1,7 @@
package com.ckkj.water.plan.mvp;
import com.ckkj.water.device.mvp.DeviceContract;
import com.ckkj.water.index.entity.IndexDeviceEntity;
import com.ckkj.water.network.BaseBean;
import com.ckkj.water.network.LoginStateManager;
import com.ckkj.water.network.NetWorkManager;
@@ -8,6 +9,9 @@ import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
import org.json.JSONObject;
import java.util.List;
import java.util.Map;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
@@ -16,6 +20,40 @@ import io.reactivex.schedulers.Schedulers;
public class WaterPlanImpl implements WaterPlanContract.DataModel{
/**
* 查询排程列表
* @param map
* @param callBack
*/
@Override
public void getWaterConfigList(Map<String, String> map, WaterPlanContract.CallBack callBack) {
NetWorkManager.getRequest().scheduleList(NetWorkManager.getToken())
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<BaseBean<List<WaterPlanWeekEntity>>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull BaseBean<List<WaterPlanWeekEntity>> bean) {
if (bean.getCode() == 200) {
callBack.success(bean.getRows(),bean.getTotal());
}
}
@Override
public void onError(@NonNull Throwable e) {
callBack.fail(e.getMessage());
}
@Override
public void onComplete() {
}
});
}
/**
* 新增排程
* @param json
@@ -36,7 +74,47 @@ public class WaterPlanImpl implements WaterPlanContract.DataModel{
@Override
public void onNext(@NonNull BaseBean<WaterPlanWeekEntity> bean) {
if (bean.getCode() == 200) {
callBack.success(bean.getData());
callBack.success(bean.getData(),0);
} 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
* @param callBack
*/
@Override
public void updateConfig(JSONObject json, WaterPlanContract.CallBack callBack) {
try {
NetWorkManager.getRequest().updateSchedule(NetWorkManager.getToken(),NetWorkManager.toRequestBody(json))
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<BaseBean<WaterPlanWeekEntity>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull BaseBean<WaterPlanWeekEntity> bean) {
if (bean.getCode() == 200) {
callBack.success(bean.getData(),0);
} else {
callBack.fail(bean.getMessage());
}

View File

@@ -2,10 +2,13 @@ package com.ckkj.water.plan.mvp;
import com.ckkj.water.AppConfig;
import com.ckkj.water.base.BasePresenter;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.device.mvp.DeviceContract;
import com.ckkj.water.device.mvp.DeviceImpl;
import com.ckkj.water.login.mvp.LoginContract;
import com.ckkj.water.login.mvp.LoginPresenter;
import com.ckkj.water.mine.mvp.MineContract;
import com.ckkj.water.mine.mvp.MinePresenter;
import com.ckkj.water.network.BaseBean;
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
@@ -13,6 +16,10 @@ import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class WaterPlanPresenter extends BasePresenter<WaterPlanContract.WaterPlanView> {
private WaterPlanImpl impl;
@@ -20,6 +27,30 @@ public class WaterPlanPresenter extends BasePresenter<WaterPlanContract.WaterPla
this.impl = impl;
}
/**
* 获取排程信息
*/
public void getWaterPlanList() {
Map<String,String> map = new HashMap<>();
impl.getWaterConfigList(map, new WaterPlanContract.CallBack<List<WaterPlanWeekEntity>>() {
@Override
public void success(List<WaterPlanWeekEntity> List, int total) {
if(WaterPlanPresenter.this.getView() != null){
WaterPlanPresenter.this.getView().getWaterConfigListSuccess(List, total);
}
}
@Override
public void fail(String msg) {
if(WaterPlanPresenter.this.getView() != null){
WaterPlanPresenter.this.getView().showError(msg);
}
}
});
}
/**
* 保存排程信息
* @param entity
@@ -41,8 +72,9 @@ public class WaterPlanPresenter extends BasePresenter<WaterPlanContract.WaterPla
}
json.put("details", array);
impl.saveConfig(json, new WaterPlanContract.CallBack<WaterPlanWeekEntity>() {
@Override
public void success(WaterPlanWeekEntity bean) {
public void success(WaterPlanWeekEntity bean, int total) {
if(WaterPlanPresenter.this.getView() != null){
WaterPlanPresenter.this.getView().saveConfigSuccess(bean);
}
@@ -60,4 +92,50 @@ public class WaterPlanPresenter extends BasePresenter<WaterPlanContract.WaterPla
throw new RuntimeException(e);
}
}
/**
* 更新排程信息
* @param entity
*/
public void updateConfig(WaterPlanWeekEntity entity) {
try {
JSONObject json = new JSONObject();
json.put("id", entity.getId());
json.put("name", entity.getName());
json.put("status", entity.getStatus());
JSONArray array = new JSONArray();
for(WaterPlanWeekEntity.DetailsBean detailsBean : entity.getDetails()){
JSONObject jsonDetails = new JSONObject();
jsonDetails.put("id", detailsBean.getId());
jsonDetails.put("weekday", detailsBean.getWeekday());
jsonDetails.put("startTime", detailsBean.getStartTime());
jsonDetails.put("durationMin", detailsBean.getDurationMin());
jsonDetails.put("triggerType", detailsBean.getTriggerType());
jsonDetails.put("status", detailsBean.getStatus());
array.put(jsonDetails);
}
json.put("details", array);
impl.updateConfig(json, new WaterPlanContract.CallBack<WaterPlanWeekEntity>() {
@Override
public void success(WaterPlanWeekEntity bean, int total) {
if(WaterPlanPresenter.this.getView() != null){
WaterPlanPresenter.this.getView().updateConfigSuccess(bean);
}
}
@Override
public void fail(String msg) {
if(WaterPlanPresenter.this.getView() != null){
WaterPlanPresenter.this.getView().showError(msg);
}
}
});
} catch (JSONException e) {
throw new RuntimeException(e);
}
}
}

View File

@@ -257,6 +257,38 @@ public class ZYTimeUtils {
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
/**
* yyyy-MM-dd HH:mm:ss 转换成 yyyy-MM-dd HH:mm
* @param time
* @return
*/
public static String timeWithoutMillis(String time) {
if (TextUtils.isEmpty(time)) {
return null;
}
try {
SimpleDateFormat sourceFormat =
new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss",
Locale.getDefault());
SimpleDateFormat targetFormat =
new SimpleDateFormat(
"yyyy-MM-dd HH:mm",
Locale.getDefault());
Date date = sourceFormat.parse(time);
return date == null ? "" : targetFormat.format(date);
} catch (Exception e) {
e.printStackTrace();
}
return "";
}