去除部分无用类

This commit is contained in:
fengjignqi
2026-06-24 10:05:39 +08:00
parent 133045fadd
commit a4f9d630df
34 changed files with 1009 additions and 5173 deletions

View File

@@ -21,7 +21,7 @@ import com.ckkj.water.device.mvp.DeviceImpl;
import com.ckkj.water.device.mvp.DevicePresenter; import com.ckkj.water.device.mvp.DevicePresenter;
import com.ckkj.water.index.entity.WaterDeviceEntity; import com.ckkj.water.index.entity.WaterDeviceEntity;
import com.ckkj.water.network.BaseBean; import com.ckkj.water.network.BaseBean;
import com.ckkj.water.utils.ClickUtils; import com.ckkj.water.utils.FastClickUtils;
import com.ckkj.water.utils.manager.PowerIconManage; import com.ckkj.water.utils.manager.PowerIconManage;
import com.ckkj.water.utils.manager.ThemeManager; import com.ckkj.water.utils.manager.ThemeManager;
import com.ckkj.water.utils.show.ToastUtil; import com.ckkj.water.utils.show.ToastUtil;
@@ -295,7 +295,7 @@ public class DeviceControlActivity extends BaseActivity<DeviceControlLayoutBindi
} }
// 防止快速点击 // 防止快速点击
if (!ClickUtils.onclickTimes()) { if (!FastClickUtils.onclickTimes()) {
return; return;
} }

View File

@@ -201,7 +201,7 @@ public class SelectWifiActivity extends BaseActivity<DeviceResetWifiBinding, Dev
initEspProvision(); initEspProvision();
} }
if (mBleDeviceEntity == null) { if (mBleDeviceEntity == null) {
ToastUtil.showShort(mContext, "\u8bbe\u5907\u8fde\u63a5\u672a\u521d\u59cb\u5316"); ToastUtil.showShort(mContext, getString(R.string.device_not_initialized));
return; return;
} }
isBleConnected = espProvisionManager != null && espProvisionManager.isConnected(); isBleConnected = espProvisionManager != null && espProvisionManager.isConnected();
@@ -209,7 +209,7 @@ public class SelectWifiActivity extends BaseActivity<DeviceResetWifiBinding, Dev
if (!isBleConnecting) { if (!isBleConnecting) {
scheduleBleConnect(); scheduleBleConnect();
} }
ToastUtil.showShort(mContext, "\u8bbe\u5907\u8fde\u63a5\u4e2d\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5"); ToastUtil.showShort(mContext, getString(R.string.device_connecting_please_wait));
return; return;
} }
@@ -239,7 +239,7 @@ public class SelectWifiActivity extends BaseActivity<DeviceResetWifiBinding, Dev
isBleConnected = true; isBleConnected = true;
Log.i("TEST","onConnected设备连接成功"); Log.i("TEST","onConnected设备连接成功");
stopConnectAnimation(); stopConnectAnimation();
ToastUtil.showShort(mContext, "设备连接成功"); ToastUtil.showShort(mContext, getString(R.string.device_connected_success));
//Tips 蓝牙扫描添加的设备不同于二维码扫描连接的设备由于无法拿到deviceNo所以需要请求接口获取 //Tips 蓝牙扫描添加的设备不同于二维码扫描连接的设备由于无法拿到deviceNo所以需要请求接口获取
mPresenter.bindDeviceStatus(mBleDeviceEntity); mPresenter.bindDeviceStatus(mBleDeviceEntity);
} }
@@ -253,7 +253,7 @@ public class SelectWifiActivity extends BaseActivity<DeviceResetWifiBinding, Dev
@Override @Override
public void onSuccess(String deviceName, String deviceType) { public void onSuccess(String deviceName, String deviceType) {
Log.i("TEST","deviceName" + deviceName + "连接成功"); Log.i("TEST","deviceName" + deviceName + "连接成功");
ToastUtil.showShort(mContext, deviceName + "连接成功"); ToastUtil.showShort(mContext, getString(R.string.connection_success));
new Handler().postDelayed(new Runnable() { new Handler().postDelayed(new Runnable() {
@Override @Override
public void run() { public void run() {
@@ -280,7 +280,7 @@ public class SelectWifiActivity extends BaseActivity<DeviceResetWifiBinding, Dev
isBleConnected = false; isBleConnected = false;
stopConnectAnimation(); stopConnectAnimation();
Log.i("TEST","onDisconnected"); Log.i("TEST","onDisconnected");
ToastUtil.showShort(mContext, "设备已断开"); ToastUtil.showShort(mContext, getString(R.string.device_disconnected));
} }
@Override @Override
@@ -329,7 +329,7 @@ public class SelectWifiActivity extends BaseActivity<DeviceResetWifiBinding, Dev
viewBinding.tvNext.setVisibility(View.GONE); viewBinding.tvNext.setVisibility(View.GONE);
if (espProvisionManager == null || !espProvisionManager.isConnected()) { if (espProvisionManager == null || !espProvisionManager.isConnected()) {
ToastUtil.showShort(mContext, "设备未连接,请稍后重试"); ToastUtil.showShort(mContext, getString(R.string.device_not_connected_retry));
hideDialogLoading(); hideDialogLoading();
return; return;
} }
@@ -344,7 +344,7 @@ public class SelectWifiActivity extends BaseActivity<DeviceResetWifiBinding, Dev
@Override @Override
public void onWiFiScanFailed(Exception e) { public void onWiFiScanFailed(Exception e) {
runOnUiThread(() -> { runOnUiThread(() -> {
ToastUtil.showShort(mContext, "扫描失败: " + e.getMessage()); ToastUtil.showShort(mContext, getString(R.string.scan_failed) + e.getMessage());
hideDialogLoading(); hideDialogLoading();
}); });
} }

View File

@@ -15,9 +15,7 @@ import com.ckkj.water.history.entity.WateringRecord;
import com.ckkj.water.history.mvp.HistoryContract; import com.ckkj.water.history.mvp.HistoryContract;
import com.ckkj.water.history.mvp.HistoryPresenter; import com.ckkj.water.history.mvp.HistoryPresenter;
import com.ckkj.water.network.BaseBean; import com.ckkj.water.network.BaseBean;
import com.ckkj.water.plan.BindDeviceFragment; import com.ckkj.water.plan.adapter.ViewPagerAdapter;
import com.ckkj.water.plan.WaterConfigFragment;
import com.ckkj.water.plate.adapter.ViewPagerAdapter;
import com.ckkj.water.utils.manager.ThemeManager; import com.ckkj.water.utils.manager.ThemeManager;
import com.gyf.immersionbar.ImmersionBar; import com.gyf.immersionbar.ImmersionBar;

View File

@@ -28,19 +28,19 @@ public class HistoryPresenter extends BasePresenter<HistoryContract.HistoryView>
public void getWaterHistoryList(int mCurrentPage, String mFilterStartTime, String mFilterEndTime, int mFilterType) { public void getWaterHistoryList(int mCurrentPage, String mFilterStartTime, String mFilterEndTime, int mFilterType) {
Map<String,String> map = new HashMap<>(); Map<String,String> map = new HashMap<>();
map.put("pageNum",mCurrentPage+""); map.put("pageNum",mCurrentPage+"");
if(!TextUtils.isEmpty(mFilterStartTime)){ if(!TextUtils.isEmpty(mFilterStartTime)){
// map.put("beginTime",mFilterStartTime);
map.put("params[beginTime]", mFilterStartTime); map.put("params[beginTime]", mFilterStartTime);
} }
if(!TextUtils.isEmpty(mFilterStartTime)){ if(!TextUtils.isEmpty(mFilterStartTime)){
// map.put("endTime",mFilterEndTime);
map.put("params[endTime]", mFilterEndTime); map.put("params[endTime]", mFilterEndTime);
} }
if(mFilterType != -1){ if(mFilterType != -1){
map.put("triggerType",mFilterType+""); map.put("triggerType",mFilterType+"");
} }
impl.getHistoryList(map, new HistoryContract.CallBack<List<WateringRecord>>() { impl.getHistoryList(map, new HistoryContract.CallBack<List<WateringRecord>>() {
@Override @Override
public void success(List<WateringRecord> list,int total) { public void success(List<WateringRecord> list,int total) {

View File

@@ -77,5 +77,6 @@ public class WaterDeviceEntity implements Serializable {
private Object deviceImgX; private Object deviceImgX;
private String powerLevelUpdatatimeX; private String powerLevelUpdatatimeX;
private Object expirationTimeX; private Object expirationTimeX;
private String checkStatus = "0";
} }
} }

View File

@@ -13,6 +13,7 @@ import com.ckkj.water.login.mvp.LoginContract;
import com.ckkj.water.login.mvp.LoginImpl; import com.ckkj.water.login.mvp.LoginImpl;
import com.ckkj.water.login.mvp.LoginPresenter; import com.ckkj.water.login.mvp.LoginPresenter;
import com.ckkj.water.network.BaseBean; import com.ckkj.water.network.BaseBean;
import com.ckkj.water.utils.FastClickUtils;
import com.ckkj.water.utils.manager.ThemeManager; import com.ckkj.water.utils.manager.ThemeManager;
import com.ckkj.water.utils.number.PhoneNumberUtils; import com.ckkj.water.utils.number.PhoneNumberUtils;
import com.ckkj.water.utils.show.ToastUtil; import com.ckkj.water.utils.show.ToastUtil;
@@ -61,6 +62,11 @@ public class RegisterActivity extends BaseActivity<RegisterLayoutBinding, LoginP
break; break;
case R.id.tv_get_verifi_code: case R.id.tv_get_verifi_code:
// 防止快速点击
if (!FastClickUtils.onclickTimes()) {
return;
}
if (TextUtils.isEmpty(viewBinding.etAccount.getText().toString())) { if (TextUtils.isEmpty(viewBinding.etAccount.getText().toString())) {
ToastUtil.showShort(mContext, getString(R.string.login_error_phone_empty)); ToastUtil.showShort(mContext, getString(R.string.login_error_phone_empty));
return; return;
@@ -76,6 +82,11 @@ public class RegisterActivity extends BaseActivity<RegisterLayoutBinding, LoginP
break; break;
case R.id.tv_commit: case R.id.tv_commit:
// 防止快速点击
if (!FastClickUtils.onclickTimes()) {
return;
}
if (TextUtils.isEmpty(viewBinding.etAccount.getText().toString())) { if (TextUtils.isEmpty(viewBinding.etAccount.getText().toString())) {
ToastUtil.showShort(mContext, getString(R.string.login_error_phone_empty)); ToastUtil.showShort(mContext, getString(R.string.login_error_phone_empty));
return; return;

View File

@@ -19,7 +19,7 @@ import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
import com.ckkj.water.plan.mvp.WaterPlanContract; import com.ckkj.water.plan.mvp.WaterPlanContract;
import com.ckkj.water.plan.mvp.WaterPlanImpl; import com.ckkj.water.plan.mvp.WaterPlanImpl;
import com.ckkj.water.plan.mvp.WaterPlanPresenter; import com.ckkj.water.plan.mvp.WaterPlanPresenter;
import com.ckkj.water.plate.adapter.ViewPagerAdapter; import com.ckkj.water.plan.adapter.ViewPagerAdapter;
import com.ckkj.water.utils.manager.ThemeManager; import com.ckkj.water.utils.manager.ThemeManager;
import com.ckkj.water.utils.show.ToastUtil; import com.ckkj.water.utils.show.ToastUtil;
import com.gyf.immersionbar.ImmersionBar; import com.gyf.immersionbar.ImmersionBar;
@@ -76,7 +76,7 @@ public class AddWaterPlanActivity extends BaseActivity<AddWaterPlanLayoutBinding
viewBinding.includedTitle.tvTitle.setText(R.string.add_water_plan_title); viewBinding.includedTitle.tvTitle.setText(R.string.add_water_plan_title);
viewBinding.tvBound.setVisibility(GONE); viewBinding.tvBound.setVisibility(GONE);
} }
mFragmentList.add(new WaterConfigFragment_copy()); mFragmentList.add(new WaterConfigFragment());
mFragmentList.add(new PlanBoundDeviceFragment()); mFragmentList.add(new PlanBoundDeviceFragment());
mFragmentList.add(new BindDeviceFragment()); mFragmentList.add(new BindDeviceFragment());
ViewPagerAdapter adapter = new ViewPagerAdapter(mContext, mFragmentList); ViewPagerAdapter adapter = new ViewPagerAdapter(mContext, mFragmentList);
@@ -92,7 +92,7 @@ public class AddWaterPlanActivity extends BaseActivity<AddWaterPlanLayoutBinding
// 编辑模式下,延迟传递数据给 WaterConfigFragment等 viewBinding 初始化完成后调用 // 编辑模式下,延迟传递数据给 WaterConfigFragment等 viewBinding 初始化完成后调用
if (mIsEditMode && mEditEntity != null) { if (mIsEditMode && mEditEntity != null) {
viewBinding.viewpage.post(() -> { viewBinding.viewpage.post(() -> {
WaterConfigFragment_copy configFragment = (WaterConfigFragment_copy) mFragmentList.get(0); WaterConfigFragment configFragment = (WaterConfigFragment) mFragmentList.get(0);
configFragment.setEditEntity(mEditEntity); configFragment.setEditEntity(mEditEntity);
PlanBoundDeviceFragment boundDeviceFragment = (PlanBoundDeviceFragment) mFragmentList.get(1); PlanBoundDeviceFragment boundDeviceFragment = (PlanBoundDeviceFragment) mFragmentList.get(1);
@@ -137,7 +137,7 @@ public class AddWaterPlanActivity extends BaseActivity<AddWaterPlanLayoutBinding
break; break;
case R.id.tv_bind: case R.id.tv_bind:
WaterConfigFragment_copy configFragment = (WaterConfigFragment_copy) mFragmentList.get(0); WaterConfigFragment configFragment = (WaterConfigFragment) mFragmentList.get(0);
// 检查是否有未保存的数据变更 // 检查是否有未保存的数据变更
if (configFragment.hasDataChanged()) { if (configFragment.hasDataChanged()) {
@@ -221,7 +221,7 @@ public class AddWaterPlanActivity extends BaseActivity<AddWaterPlanLayoutBinding
* 切换到绑定设备页面 * 切换到绑定设备页面
*/ */
private void proceedToBindDevice() { private void proceedToBindDevice() {
WaterConfigFragment_copy configFragment = (WaterConfigFragment_copy) mFragmentList.get(0); WaterConfigFragment configFragment = (WaterConfigFragment) mFragmentList.get(0);
WaterPlanWeekEntity entity = mIsEditMode ? mEditEntity : mNewAddEntity; WaterPlanWeekEntity entity = mIsEditMode ? mEditEntity : mNewAddEntity;
if (entity == null) { if (entity == null) {
entity = configFragment.getRemoteEntity(); entity = configFragment.getRemoteEntity();

View File

@@ -42,10 +42,10 @@ public class BindDeviceFragment extends BaseFragment<PlanBindDeviceLayoutBinding
@Override @Override
public void onItemClick(BaseQuickAdapter adapter, View view, int position) { public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
mAdapter.toggleSelection(position); mAdapter.toggleSelection(position);
if(mDeviceList.get(position).getStatus().equals("0")){ if(mDeviceList.get(position).getCheckStatus().equals("0")){
mDeviceList.get(position).setStatus("1"); mDeviceList.get(position).setCheckStatus("1");
}else{ }else{
mDeviceList.get(position).setStatus("0"); mDeviceList.get(position).setCheckStatus("0");
} }
} }
}); });
@@ -71,7 +71,7 @@ public class BindDeviceFragment extends BaseFragment<PlanBindDeviceLayoutBinding
boolean isSelected = false; boolean isSelected = false;
List<String> selected = new ArrayList<>(); List<String> selected = new ArrayList<>();
for(WaterDeviceEntity.DeviceListBean bean : mDeviceList){ for(WaterDeviceEntity.DeviceListBean bean : mDeviceList){
if(bean.getStatus().equals("1")){ if(bean.getCheckStatus().equals("1")){
isSelected = true; isSelected = true;
selected.add(bean.getDeviceNo()); selected.add(bean.getDeviceNo());
} }

View File

@@ -5,6 +5,9 @@ import android.text.Editable;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import androidx.recyclerview.widget.RecyclerView;
import com.bigkoo.pickerview.builder.TimePickerBuilder; import com.bigkoo.pickerview.builder.TimePickerBuilder;
import com.bigkoo.pickerview.listener.OnTimeSelectListener; import com.bigkoo.pickerview.listener.OnTimeSelectListener;
@@ -13,55 +16,234 @@ import com.chad.library.adapter.base.BaseQuickAdapter;
import com.ckkj.water.R; import com.ckkj.water.R;
import com.ckkj.water.base.BaseActivity; import com.ckkj.water.base.BaseActivity;
import com.ckkj.water.base.BaseFragment; import com.ckkj.water.base.BaseFragment;
import com.ckkj.water.databinding.WaterConfigFragmentLayoutBinding; import com.ckkj.water.databinding.WaterConfigFragmentLayoutCopyBinding;
import com.ckkj.water.index.entity.WaterDeviceEntity; import com.ckkj.water.index.entity.WaterDeviceEntity;
import com.ckkj.water.network.BaseBean; import com.ckkj.water.network.BaseBean;
import com.ckkj.water.plan.adapter.WaterPlanWeekAdapter; import com.ckkj.water.plan.adapter.WaterPlanTimeDataAdapter;
import com.ckkj.water.plan.adapter.WaterPlanWeekAdapter_copy;
import com.ckkj.water.plan.entity.WaterPlanWeekEntity; import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
import com.ckkj.water.plan.mvp.WaterPlanContract; import com.ckkj.water.plan.mvp.WaterPlanContract;
import com.ckkj.water.plan.mvp.WaterPlanImpl; import com.ckkj.water.plan.mvp.WaterPlanImpl;
import com.ckkj.water.plan.mvp.WaterPlanPresenter; import com.ckkj.water.plan.mvp.WaterPlanPresenter;
import com.ckkj.water.utils.FastClickUtils;
import com.ckkj.water.utils.show.ToastUtil; import com.ckkj.water.utils.show.ToastUtil;
import com.ckkj.water.utils.time.ZYTimeUtils; import com.ckkj.water.utils.time.ZYTimeUtils;
import com.yanzhenjie.recyclerview.OnItemMenuClickListener;
import com.yanzhenjie.recyclerview.SwipeMenu;
import com.yanzhenjie.recyclerview.SwipeMenuBridge;
import com.yanzhenjie.recyclerview.SwipeMenuCreator;
import com.yanzhenjie.recyclerview.SwipeMenuItem;
import com.yanzhenjie.recyclerview.SwipeRecyclerView;
import com.yanzhenjie.recyclerview.widget.DefaultItemDecoration;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale;
/** public class WaterConfigFragment extends BaseFragment<WaterConfigFragmentLayoutCopyBinding, WaterPlanPresenter>
* 配置信息页面
*/
public class WaterConfigFragment extends BaseFragment<WaterConfigFragmentLayoutBinding, WaterPlanPresenter>
implements WaterPlanContract.WaterPlanView { implements WaterPlanContract.WaterPlanView {
private List<WaterPlanWeekEntity.DetailsBean> mConfigList = new ArrayList<>(); //本地新增排程时的实体
//用户本地操作排程时的数据 private WaterPlanWeekEntity mLocalEntity;
private WaterPlanWeekEntity mConfigEntity; //新增之后返回的实体
//排程接口新增成功之后,接口返回的该排程在远端的数据信息 private WaterPlanWeekEntity mRemoteEntity;
private WaterPlanWeekEntity mRemoteConfigEntity; private List<WaterPlanWeekEntity.DetailsBean> weekList = new ArrayList<>();
private WaterPlanWeekAdapter mWeekAdapter; private List<WaterPlanWeekEntity.TimeDataBean> timeList = new ArrayList<>();
private String mPlanName = ""; private WaterPlanWeekAdapter_copy mWeekAdapter;
public static boolean isConfigSave; private WaterPlanTimeDataAdapter mTimeAdapter;
private RecyclerView.ItemDecoration itemDecoration;
private boolean isConfigSubmitted = false;
//当下是否编辑模式 //当下是否编辑模式
private boolean mIsEditMode = false; private boolean mIsEditMode = false;
@Override @Override
public void initData(Bundle state) { public void initData(Bundle state) {
mConfigEntity = new WaterPlanWeekEntity(); // 设置菜单创建器。
viewBinding.rvTimes.setSwipeMenuCreator(mSwipeMenuCreator);
viewBinding.rvTimes.setOnItemMenuClickListener(mItemMenuClickListener);
itemDecoration = new DefaultItemDecoration
(mContext.getColor(R.color.transparent),20,40);
viewBinding.rvTimes.addItemDecoration(itemDecoration);
List<WaterPlanWeekEntity.DetailsBean> list = new ArrayList<>(); List<WaterPlanWeekEntity.DetailsBean> list = new ArrayList<>();
for(int i = 0; i < 7; i++){ for(int i = 0; i < 7; i++){
WaterPlanWeekEntity.DetailsBean bean = new WaterPlanWeekEntity.DetailsBean(); WaterPlanWeekEntity.DetailsBean bean = new WaterPlanWeekEntity.DetailsBean();
WaterPlanWeekEntity.TimeDataBean timeData = new WaterPlanWeekEntity.TimeDataBean();
List<WaterPlanWeekEntity.TimeDataBean> timeDataList = new ArrayList<>();
timeDataList.add(timeData);
bean.setTimeData(timeDataList);
bean.setWeekday(i + 1); bean.setWeekday(i + 1);
bean.setStatus("0"); bean.setStatus("1");
bean.setWeekName(ZYTimeUtils.getWeekName(i,mContext)); bean.setWeekName(ZYTimeUtils.getWeekName(i,mContext));
bean.setTriggerType("0");
list.add(bean); list.add(bean);
} }
mConfigEntity.setDetails(list); weekList = list;
mWeekAdapter = new WaterPlanWeekAdapter(mContext,R.layout.plan_week_config_item, mConfigEntity.getDetails()); //这里先处理新增,后面再处理编辑
viewBinding.rvWeekConfig.setAdapter(mWeekAdapter); mLocalEntity = new WaterPlanWeekEntity();
mLocalEntity.setStatus("1");
mLocalEntity.setDetails(weekList);
//顶部周一、周二。。。。。
mWeekAdapter = new WaterPlanWeekAdapter_copy(mContext, R.layout.plan_period_item,list);
viewBinding.rvWeek.setAdapter(mWeekAdapter);
//周期对应的 时间配置
List<WaterPlanWeekEntity.TimeDataBean> timeList = weekList.get(0).getTimeData();
mTimeAdapter = new WaterPlanTimeDataAdapter(mContext,R.layout.include_plan_time_item_layout,timeList);
viewBinding.rvTimes.setAdapter(mTimeAdapter);
initListener(); initListener();
} }
private void initListener() {
setClick(viewBinding.tvCommit);
setClick(viewBinding.imgAdd);
setClick(viewBinding.switchButton);
//头部 周一~周日
mWeekAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
@Override
public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
mWeekAdapter.setSelPos(position);
List<WaterPlanWeekEntity.TimeDataBean> timeList = weekList.get(position).getTimeData();
mTimeAdapter.setNewData(timeList);
viewBinding.switchButton.setChecked(weekList.get(position).getStatus().equals("1"));
}
});
//周期对应的 时间配置
mTimeAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
@Override
public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
switch (view.getId()){
case R.id.tv_select_time:
selectStartTime(position);
break;
case R.id.tv_plan_duration:
inputDuration(position);
break;
}
}
});
//输入框监听
viewBinding.editPlanName.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) {}
@Override
public void afterTextChanged(Editable s) {
String planName = "";
if(!TextUtils.isEmpty(s.toString())){
planName = s.toString();
}
mLocalEntity.setName(planName);
}
});
}
private void setClick(View view) {
view.setOnClickListener(this::onClick);
}
public void onClick(View v){
int selPos = mWeekAdapter.getmPos();
switch (v.getId()){
case R.id.img_add:
isConfigSubmitted = false;
WaterPlanWeekEntity.TimeDataBean timeDataAdd = new WaterPlanWeekEntity.TimeDataBean();
weekList.get(selPos).getTimeData().add(timeDataAdd);
mTimeAdapter.notifyItemInserted(weekList.get(selPos).getTimeData().size() - 1);
break;
case R.id.switch_button:
if(weekList.get(selPos).getStatus().equals("0")){
weekList.get(selPos).setStatus("1");
viewBinding.switchButton.setChecked(true);
}else{
weekList.get(selPos).setStatus("0");
viewBinding.switchButton.setChecked(false);
}
break;
case R.id.tv_commit:
// 防止快速点击
if (!FastClickUtils.onclickTimes()) {
return;
}
// 如果已经保存过mRemoteEntity 不为空),则走更新逻辑;否则走新增逻辑
if (mRemoteEntity != null) {
updateConfig();
} else {
validateAndSave();
}
break;
}
}
public boolean isConfigSubmitted() {
return isConfigSubmitted;
}
/**
* 获取当前排程名称
* @return 排程名称
*/
public String getPlanName() {
if (mLocalEntity != null) {
return mLocalEntity.getName();
}
return "";
}
/**
* 检查是否至少配置了一天的时间
* @return true表示有时间配置false表示没有配置任何时间
*/
public boolean hasTimeConfig() {
for (WaterPlanWeekEntity.DetailsBean dayBean : weekList) {
List<WaterPlanWeekEntity.TimeDataBean> timeDataList = dayBean.getTimeData();
if (timeDataList != null && !timeDataList.isEmpty()) {
for (WaterPlanWeekEntity.TimeDataBean timeData : timeDataList) {
if (!TextUtils.isEmpty(timeData.getStartTime()) && timeData.getDurationMin() > 0) {
return true;
}
}
}
}
return false;
}
/**
* 校验并保存配置(供外部调用)
* @return true表示校验通过并已提交保存false表示校验失败
*/
public boolean commitConfig() {
return validateAndSave();
}
/**
* 更新配置(用于数据变更后调用)
* @return true表示校验通过并已提交更新false表示校验失败
*/
public boolean updateConfig() {
if (!validateConfig()) {
return false;
}
// 调用更新接口
if(mLocalEntity != null){
mPresenter.updateConfig(mLocalEntity);
}
return true;
}
/** /**
* 设置编辑模式的排程数据 * 设置编辑模式的排程数据
* @param entity 从详情页传来的排程数据 * @param entity 从详情页传来的排程数据
@@ -72,18 +254,18 @@ public class WaterConfigFragment extends BaseFragment<WaterConfigFragmentLayoutB
} }
mIsEditMode = true; mIsEditMode = true;
// 深拷贝数据到 mConfigEntity用于本地编辑 // 深拷贝数据到 mConfigEntity用于本地编辑
mConfigEntity = cloneEntity(entity); mLocalEntity = cloneEntity(entity);
// 保存远程原始数据,用于后续变化检测 // 保存远程原始数据,用于后续变化检测
mRemoteConfigEntity = entity; mRemoteEntity = entity;
isConfigSave = true; isConfigSubmitted = true;
// 初始化 UI // 初始化 UI
viewBinding.etPlanName.setText(entity.getName()); viewBinding.editPlanName.setText(entity.getName());
mPlanName = entity.getName();
// 更新周配置列表的显示,使用 mConfigEntity.getDetails() 保证数据一致 // 更新周配置列表的显示,使用 mConfigEntity.getDetails() 保证数据一致
if (mConfigEntity.getDetails() != null) { if (mLocalEntity.getDetails() != null) {
mWeekAdapter.setNewData(mConfigEntity.getDetails()); weekList = mLocalEntity.getDetails();
mWeekAdapter.setNewData(mLocalEntity.getDetails());
mTimeAdapter.setNewData(weekList.get(mWeekAdapter.getmPos()).getTimeData());
} }
} }
@@ -103,12 +285,18 @@ public class WaterConfigFragment extends BaseFragment<WaterConfigFragmentLayoutB
List<WaterPlanWeekEntity.DetailsBean> detailsList = new ArrayList<>(); List<WaterPlanWeekEntity.DetailsBean> detailsList = new ArrayList<>();
for (WaterPlanWeekEntity.DetailsBean bean : source.getDetails()) { for (WaterPlanWeekEntity.DetailsBean bean : source.getDetails()) {
WaterPlanWeekEntity.DetailsBean newBean = new WaterPlanWeekEntity.DetailsBean(); WaterPlanWeekEntity.DetailsBean newBean = new WaterPlanWeekEntity.DetailsBean();
List<WaterPlanWeekEntity.TimeDataBean> timeDataList = new ArrayList<>();
for(WaterPlanWeekEntity.TimeDataBean timeDataBean : bean.getTimeData()){
WaterPlanWeekEntity.TimeDataBean newTimeDataBean = new WaterPlanWeekEntity.TimeDataBean();
newTimeDataBean.setStartTime(ZYTimeUtils.formatHHmm(timeDataBean.getStartTime()));
newTimeDataBean.setDurationMin(timeDataBean.getDurationMin());
timeDataList.add(newTimeDataBean);
}
newBean.setTimeData(timeDataList);
newBean.setId(bean.getId()); newBean.setId(bean.getId());
newBean.setWeekday(bean.getWeekday()); newBean.setWeekday(bean.getWeekday());
newBean.setWeekName(ZYTimeUtils.getWeekName(bean.getWeekday() - 1,mContext)); newBean.setWeekName(ZYTimeUtils.getWeekName(bean.getWeekday() - 1,mContext));
newBean.setStatus(bean.getStatus()); newBean.setStatus(bean.getStatus());
newBean.setStartTime(ZYTimeUtils.formatHHmm(bean.getStartTime()));
newBean.setDurationMin(bean.getDurationMin());
detailsList.add(newBean); detailsList.add(newBean);
} }
target.setDetails(detailsList); target.setDetails(detailsList);
@@ -117,112 +305,218 @@ public class WaterConfigFragment extends BaseFragment<WaterConfigFragmentLayoutB
return target; return target;
} }
private void initListener() {
setClick(viewBinding.tvCommit);
mWeekAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
@Override
public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
switch (view.getId()){
case R.id.linear_week://选中
case R.id.checkbox:
if(mConfigEntity.getDetails().get(position).getStatus().equals("1")){
mConfigEntity.getDetails().get(position).setStatus("0");
}else{
mConfigEntity.getDetails().get(position).setStatus("1");
}
mWeekAdapter.notifyItemChanged(position);
break;
case R.id.tv_select_time: /**
selectStartTime(position); * 校验配置
break; * @return true表示校验通过false表示校验失败
*/
case R.id.tv_plan_duration: private boolean validateConfig() {
inputDuration(position); if(TextUtils.isEmpty(viewBinding.editPlanName.getText().toString())){
ToastUtil.showShort(mContext,getString(R.string.plan_name_text_empty_hint));
return false;
}
// 检查七天的所有时间配置是否全部为空
boolean allTimeEmpty = true;
for (WaterPlanWeekEntity.DetailsBean dayBean : weekList) {
List<WaterPlanWeekEntity.TimeDataBean> timeDataList = dayBean.getTimeData();
if (timeDataList != null && !timeDataList.isEmpty()) {
for (WaterPlanWeekEntity.TimeDataBean timeData : timeDataList) {
if (!TextUtils.isEmpty(timeData.getStartTime()) && timeData.getDurationMin() > 0) {
allTimeEmpty = false;
break; break;
}
} }
} }
}); if (!allTimeEmpty) break;
}
if (allTimeEmpty) {
ToastUtil.showShort(mContext, getString(R.string.schedule_select_at_least_one_day));
return false;
}
// 校验每一天内的时间是否有冲突
String conflictMsg = checkTimeConflict();
if (conflictMsg != null) {
ToastUtil.showShort(mContext, conflictMsg);
return false;
}
return true;
}
viewBinding.etPlanName.addTextChangedListener(new TextWatcher() { /**
@Override * 校验配置并保存(新增)
public void beforeTextChanged(CharSequence s, int start, int count, int after) {} * @return true表示校验通过并已提交保存false表示校验失败
*/
private boolean validateAndSave() {
if (!validateConfig()) {
return false;
}
if(mLocalEntity != null){
mPresenter.saveConfig(mLocalEntity);
return true;
}
return false;
}
@Override /**
public void onTextChanged(CharSequence s, int start, int before, int count) {} * 获取远程实体用于AddWaterPlanActivity比对
* @return mRemoteEntity
*/
public WaterPlanWeekEntity getRemoteEntity() {
return mRemoteEntity;
}
@Override /**
public void afterTextChanged(Editable s) { * 获取本地实体用于AddWaterPlanActivity比对
if(!TextUtils.isEmpty(s.toString())){ * @return mLocalEntity
mPlanName = s.toString(); */
mConfigEntity.setName(s.toString()); public WaterPlanWeekEntity getLocalEntity() {
return mLocalEntity;
}
/**
* 检查本地数据是否与远程数据有变更
* @return true表示有变更false表示无变更
*/
public boolean hasDataChanged() {
if (mRemoteEntity == null || mLocalEntity == null) {
return false;
}
// 比对排程名称
String localName = mLocalEntity.getName();
String remoteName = mRemoteEntity.getName();
if (!TextUtils.isEmpty(localName) && !localName.equals(remoteName)) {
return true;
}
// 比对排程状态
String localStatus = mLocalEntity.getStatus();
String remoteStatus = mRemoteEntity.getStatus();
if (!TextUtils.isEmpty(localStatus) && !localStatus.equals(remoteStatus)) {
return true;
}
// 比对 details 列表
List<WaterPlanWeekEntity.DetailsBean> localDetails = mLocalEntity.getDetails();
List<WaterPlanWeekEntity.DetailsBean> remoteDetails = mRemoteEntity.getDetails();
if (localDetails == null && remoteDetails == null) {
return false;
}
if (localDetails == null || remoteDetails == null) {
return true;
}
if (localDetails.size() != remoteDetails.size()) {
return true;
}
// 逐个比对每个 DetailsBean
for (int i = 0; i < localDetails.size(); i++) {
WaterPlanWeekEntity.DetailsBean localDetail = localDetails.get(i);
WaterPlanWeekEntity.DetailsBean remoteDetail = remoteDetails.get(i);
// 比对 status
String localDetailStatus = localDetail.getStatus();
String remoteDetailStatus = remoteDetail.getStatus();
if (!TextUtils.isEmpty(localDetailStatus) && !localDetailStatus.equals(remoteDetailStatus)) {
return true;
}
// 比对 triggerType
String localTriggerType = localDetail.getTriggerType();
String remoteTriggerType = remoteDetail.getTriggerType();
if (!TextUtils.isEmpty(localTriggerType) && !localTriggerType.equals(remoteTriggerType)) {
return true;
}
// 比对 timeData 列表
List<WaterPlanWeekEntity.TimeDataBean> localTimeData = localDetail.getTimeData();
List<WaterPlanWeekEntity.TimeDataBean> remoteTimeData = remoteDetail.getTimeData();
if (localTimeData == null && remoteTimeData == null) {
continue;
}
if (localTimeData == null || remoteTimeData == null) {
return true;
}
if (localTimeData.size() != remoteTimeData.size()) {
return true;
}
// 逐个比对 TimeDataBean
for (int j = 0; j < localTimeData.size(); j++) {
WaterPlanWeekEntity.TimeDataBean localTime = localTimeData.get(j);
WaterPlanWeekEntity.TimeDataBean remoteTime = remoteTimeData.get(j);
// 比对 startTime
String localStartTime = localTime.getStartTime();
String remoteStartTime = remoteTime.getStartTime();
if (!TextUtils.isEmpty(localStartTime) && !localStartTime.equals(remoteStartTime)) {
return true;
}
// 比对 durationMin
if (localTime.getDurationMin() != remoteTime.getDurationMin()) {
return true;
} }
} }
}); }
return false;
} }
public void onClick(View v){ /**
switch (v.getId()){ * 校验每一天内的时间配置是否有冲突
case R.id.tv_commit: * @return null表示无冲突返回具体提示信息表示有冲突
commitConfig(); */
break; private String checkTimeConflict() {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm", Locale.getDefault());
for (int dayIndex = 0; dayIndex < weekList.size(); dayIndex++) {
WaterPlanWeekEntity.DetailsBean dayBean = weekList.get(dayIndex);
List<WaterPlanWeekEntity.TimeDataBean> timeDataList = dayBean.getTimeData();
if (timeDataList == null || timeDataList.isEmpty()) {
continue;
}
// 收集该天所有有效的时间段(开始时间 + 结束时间)
List<long[]> periods = new ArrayList<>();
for (WaterPlanWeekEntity.TimeDataBean timeData : timeDataList) {
if (TextUtils.isEmpty(timeData.getStartTime()) || timeData.getDurationMin() <= 0) {
continue;
}
try {
Date startDate = sdf.parse(timeData.getStartTime());
long startMinutes = startDate.getHours() * 60 + startDate.getMinutes();
long endMinutes = startMinutes + timeData.getDurationMin();
periods.add(new long[]{startMinutes, endMinutes});
} catch (Exception e) {
e.printStackTrace();
}
}
// 检查是否有冲突
for (int i = 0; i < periods.size(); i++) {
for (int j = i + 1; j < periods.size(); j++) {
long[] p1 = periods.get(i);
long[] p2 = periods.get(j);
// 冲突条件:一个段的开始时间在另一个段的结束时间之前(即有重叠)
// 不冲突p1.end <= p2.start 或 p2.end <= p1.start
if (!(p1[1] <= p2[0] || p2[1] <= p1[0])) {
String dayName = dayBean.getWeekName();
return dayName + getString(R.string.schedule_time_conflict);
}
}
}
} }
return null;
} }
/**
public void commitConfig(){ * 选择开始时间
if (!checkConfigFinish()) { * @param position
return; */
}
// mRemoteConfigEntity 为空,说明是新增场景
if (mRemoteConfigEntity == null) {
mPresenter.saveConfig(mConfigEntity);
return;
}
// mRemoteConfigEntity 不为空,说明是更新场景
if (isConfigChanged()) {
// TODO: 触发更新接口,调用 mPresenter.updateConfig(mConfigEntity)
mPresenter.updateConfig(mConfigEntity);
} else {
ToastUtil.showShort(mContext, "配置没有变化,无需保存");
}
}
private void inputDuration(int position) {
showEditDialog(getString(R.string.device_work_times_title),
getString(R.string.input_water_plan_time),
mConfigEntity.getDetails().get(position).getDurationMin() == 0 ?
"" : mConfigEntity.getDetails().get(position).getDurationMin() + "",
true,
getString(R.string.cancel_text),
getString(R.string.confirm_text),
BaseFragment.INPUT_TYPE_NUMBER,
new BaseActivity.OnDialogClick() {
@Override
public void onCancelClick() {
}
@Override
public void onConfirmClisk() {
}
@Override
public void onConfirmClisk(String content) {
if(Integer.parseInt(content) <= 0){
ToastUtil.showShort(mContext, getString(R.string.input_water_plan_time_error));
return;
}
mConfigEntity.getDetails().get(position).setDurationMin(Integer.parseInt(content));
mWeekAdapter.notifyItemChanged(position);
}
@Override
public void onView1Click() {
}
});
}
private void selectStartTime(int position) { private void selectStartTime(int position) {
boolean times[] = {false, false, false, true, true, false}; boolean times[] = {false, false, false, true, true, false};
//时间选择器 //时间选择器
@@ -230,8 +524,9 @@ public class WaterConfigFragment extends BaseFragment<WaterConfigFragmentLayoutB
@Override @Override
public void onTimeSelect(Date date, View v) { public void onTimeSelect(Date date, View v) {
//用于提交接口 //用于提交接口
mConfigEntity.getDetails().get(position).setStartTime(ZYTimeUtils.getStrTimeData_H_M(date)); weekList.get(mWeekAdapter.getmPos()).getTimeData().get(position).
mWeekAdapter.notifyItemChanged(position); setStartTime(ZYTimeUtils.getStrTimeData_H_M(date));
mTimeAdapter.notifyItemChanged(position);
} }
}).setType(times) }).setType(times)
.setCancelColor(mContext.getColor(R.color.color_999999)) .setCancelColor(mContext.getColor(R.color.color_999999))
@@ -241,120 +536,151 @@ public class WaterConfigFragment extends BaseFragment<WaterConfigFragmentLayoutB
pvTime.show(); pvTime.show();
} }
private void setClick(View view) {
view.setOnClickListener(this::onClick);
}
/** /**
* 比较本地配置和远程配置是否有变化 * 输入浇水时间
* @return true 表示有变化false 表示无变化 * @param position
*/ */
public boolean isConfigChanged() { private void inputDuration(int position) {
if (mRemoteConfigEntity == null || mRemoteConfigEntity.getDetails() == null) { WaterPlanWeekEntity.TimeDataBean timeData = weekList.get(mWeekAdapter.getmPos()).getTimeData().get(position);
return true; showEditDialog(getString(R.string.device_work_times_title),
} getString(R.string.input_water_plan_time),
// 比对排程名称 timeData.getDurationMin() == 0 ? "" : timeData.getDurationMin() + "",
if (!equalsString(mConfigEntity.getName(), mRemoteConfigEntity.getName())) { true,
return true; getString(R.string.cancel_text),
} getString(R.string.confirm_text),
List<WaterPlanWeekEntity.DetailsBean> localDetails = mConfigEntity.getDetails(); BaseFragment.INPUT_TYPE_NUMBER,
List<WaterPlanWeekEntity.DetailsBean> remoteDetails = mRemoteConfigEntity.getDetails(); new BaseActivity.OnDialogClick() {
for (int i = 0; i < localDetails.size(); i++) { @Override
WaterPlanWeekEntity.DetailsBean local = localDetails.get(i); public void onCancelClick() {}
WaterPlanWeekEntity.DetailsBean remote = remoteDetails.get(i);
// 勾选状态下对比状态、时间、时长 @Override
if ("1".equals(local.getStatus())) { public void onConfirmClisk() {}
if (!equalsString(local.getStatus(), remote.getStatus())
|| !equalsString(local.getStartTime(), ZYTimeUtils.formatHHmm(remote.getStartTime())) @Override
|| local.getDurationMin() != remote.getDurationMin()) { public void onConfirmClisk(String content) {
return true; if (Integer.parseInt(content) <= 0) {
} ToastUtil.showShort(mContext, getString(R.string.input_water_plan_time_error));
} else { return;
// 未勾选状态下只对比勾选状态,不关心时间/时长 }
if (!equalsString(local.getStatus(), remote.getStatus())) { timeData.setDurationMin(Integer.parseInt(content));
return true; mTimeAdapter.notifyItemChanged(position);
} }
}
} @Override
return false; public void onView1Click() {
}
});
} }
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);
}
/** /**
* 检查配置信息是否完成 * 侧滑相关
* @return
*/ */
public boolean checkConfigFinish() { // 创建菜单:
if(TextUtils.isEmpty(viewBinding.etPlanName.getText().toString())){ SwipeMenuCreator mSwipeMenuCreator = new SwipeMenuCreator() {
ToastUtil.showShort(mContext,getString(R.string.plan_name_text_empty_hint)); @Override
return false; public void onCreateMenu(SwipeMenu leftMenu, SwipeMenu rightMenu, int position) {
SwipeMenuItem deleteItem = new SwipeMenuItem(mContext);
deleteItem.setBackground(mContext.getResources().getDrawable(R.drawable.shape_item_delete_bg));
deleteItem.setText(getString(R.string.button_delete));
deleteItem.setTextColor(mContext.getResources().getColor(R.color.white));
deleteItem.setHeight(ViewGroup.LayoutParams.MATCH_PARENT);
deleteItem.setWidth((int) mContext.getResources().getDimension(R.dimen.dp_90));
// 各种文字和图标属性设置。
rightMenu.addMenuItem(deleteItem); // 在Item右侧添加一个菜单。
} }
List<WaterPlanWeekEntity.DetailsBean> list = mConfigEntity.getDetails(); };
//是否勾选了排程日期
boolean isSelectOne = false; // 菜单点击监听。
if(list != null){ OnItemMenuClickListener mItemMenuClickListener = new OnItemMenuClickListener() {
for(WaterPlanWeekEntity.DetailsBean bean : list){ @Override
if(bean.getStatus().equals("1")){ public void onItemClick(SwipeMenuBridge menuBridge, int position) {
isSelectOne = true; // 先关闭菜单
} menuBridge.closeMenu();
} // 左/右菜单
} int direction = menuBridge.getDirection();
if(!isSelectOne){ // 点击的是第几个菜单
ToastUtil.showShort(mContext,getString(R.string.plan_week_empty_hint)); int menuPosition = menuBridge.getPosition();
return false; // 只处理右侧菜单
} if (direction == SwipeRecyclerView.RIGHT_DIRECTION) {
//是否配置了排程日期的时间 if (menuPosition == 0) {
boolean isPlanConfig = false; weekList.get(mWeekAdapter.getmPos()).getTimeData().remove(position);
for(WaterPlanWeekEntity.DetailsBean bean : list){ if(mTimeAdapter != null){
if(bean.getStatus().equals("1")){ mTimeAdapter.notifyItemRemoved(position);
if((TextUtils.isEmpty(bean.getStartTime()) || }
bean.getDurationMin() == 0)){
ToastUtil.showShort(mContext,"请完成" + bean.getWeekName() + "的时间配置");
return false;
} }
} }
} }
};
return true; /**
} * 新增
* @param entity
@Override */
public void getWaterConfigListSuccess(List<WaterPlanWeekEntity> list,int total) {
}
@Override @Override
public void saveConfigSuccess(WaterPlanWeekEntity entity) { public void saveConfigSuccess(WaterPlanWeekEntity entity) {
ToastUtil.showShort(mContext, "排程新增成功"); ToastUtil.showShort(mContext, getString(R.string.schedule_add_success));
isConfigSave = true; isConfigSubmitted = true;
// 把接口返回的 ID 设置到 mConfigEntity便于后续更新操作 // 把接口返回的 ID 设置到 mConfigEntity便于后续更新操作
mConfigEntity.setId(entity.getId()); mLocalEntity.setId(entity.getId());
// 把 details 中每个 bean 的 id 也设置到 mConfigEntity便于后续更新操作 // 把 details 中每个 bean 的 id 也设置到 mConfigEntity便于后续更新操作
if (entity.getDetails() != null && mConfigEntity.getDetails() != null) { if (entity.getDetails() != null && mLocalEntity.getDetails() != null) {
for (int i = 0; i < entity.getDetails().size() && i < mConfigEntity.getDetails().size(); i++) { for (int i = 0; i < entity.getDetails().size() && i < mLocalEntity.getDetails().size(); i++) {
mConfigEntity.getDetails().get(i).setId(entity.getDetails().get(i).getId()); mLocalEntity.getDetails().get(i).setId(entity.getDetails().get(i).getId());
mLocalEntity.getDetails().get(i).setStatus(entity.getDetails().get(i).getStatus());
} }
} }
//接口请求之后返回的数据,方便后面做对比 //接口请求之后返回的数据,方便后面做对比
mRemoteConfigEntity = entity; mRemoteEntity = entity;
if (getActivity() instanceof AddWaterPlanActivity) { if (getActivity() instanceof AddWaterPlanActivity) {
((AddWaterPlanActivity) getActivity()).onConfigSaved(entity); ((AddWaterPlanActivity) getActivity()).onConfigSaved(entity);
} }
} }
/** /**
* 更新排程成功 * 更新
* @param entity * @param entity
*/ */
@Override @Override
public void updateConfigSuccess(WaterPlanWeekEntity entity) { public void updateConfigSuccess(WaterPlanWeekEntity entity) {
ToastUtil.showShort(mContext, "排程更新成功"); ToastUtil.showShort(mContext, getString(R.string.schedule_update_success));
mRemoteConfigEntity = entity; mRemoteEntity = entity;
}
// private List<WaterPlanWeekEntity.DeviceEntity> getSelectedDevices() {
// if (getActivity() instanceof AddWaterPlanActivity) {
// return ((AddWaterPlanActivity) getActivity()).getSelectedDevices();
// }
// return new ArrayList<>();
// }
@Override
public WaterPlanPresenter createPresenter() {
return new WaterPlanPresenter(new WaterPlanImpl());
}
@Override
public void onNetChange(int netModel) {
}
@Override
public void showError(String message) {
}
@Override
public void logOut(BaseBean bean) {
}
@Override
public void getWaterConfigListSuccess(List<WaterPlanWeekEntity> list, int total) {
} }
@Override @Override
@@ -388,25 +714,4 @@ public class WaterConfigFragment extends BaseFragment<WaterConfigFragmentLayoutB
} }
@Override
public WaterPlanPresenter createPresenter() {
return new WaterPlanPresenter(new WaterPlanImpl());
}
@Override
public void onNetChange(int netModel) {
}
@Override
public void showError(String message) {
}
@Override
public void logOut(BaseBean bean) {
}
} }

View File

@@ -0,0 +1,412 @@
package com.ckkj.water.plan;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import com.bigkoo.pickerview.builder.TimePickerBuilder;
import com.bigkoo.pickerview.listener.OnTimeSelectListener;
import com.bigkoo.pickerview.view.TimePickerView;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.ckkj.water.R;
import com.ckkj.water.base.BaseActivity;
import com.ckkj.water.base.BaseFragment;
import com.ckkj.water.databinding.WaterConfigFragmentLayoutBinding;
import com.ckkj.water.index.entity.WaterDeviceEntity;
import com.ckkj.water.network.BaseBean;
import com.ckkj.water.plan.adapter.WaterPlanWeekAdapter;
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.show.ToastUtil;
import com.ckkj.water.utils.time.ZYTimeUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 配置信息页面
*/
public class WaterConfigFragment2 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 = "";
public static boolean isConfigSave;
//当下是否编辑模式
private boolean mIsEditMode = false;
@Override
public void initData(Bundle state) {
mConfigEntity = new WaterPlanWeekEntity();
List<WaterPlanWeekEntity.DetailsBean> list = new ArrayList<>();
for(int i = 0; i < 7; i++){
WaterPlanWeekEntity.DetailsBean bean = new WaterPlanWeekEntity.DetailsBean();
bean.setWeekday(i + 1);
bean.setStatus("0");
bean.setWeekName(ZYTimeUtils.getWeekName(i,mContext));
list.add(bean);
}
mConfigEntity.setDetails(list);
mWeekAdapter = new WaterPlanWeekAdapter(mContext,R.layout.plan_week_config_item, mConfigEntity.getDetails());
viewBinding.rvWeekConfig.setAdapter(mWeekAdapter);
initListener();
}
/**
* 设置编辑模式的排程数据
* @param entity 从详情页传来的排程数据
*/
public void setEditEntity(WaterPlanWeekEntity entity) {
if (entity == null) {
return;
}
mIsEditMode = true;
// 深拷贝数据到 mConfigEntity用于本地编辑
mConfigEntity = cloneEntity(entity);
// 保存远程原始数据,用于后续变化检测
mRemoteConfigEntity = entity;
isConfigSave = true;
// 初始化 UI
viewBinding.etPlanName.setText(entity.getName());
mPlanName = entity.getName();
// 更新周配置列表的显示,使用 mConfigEntity.getDetails() 保证数据一致
if (mConfigEntity.getDetails() != null) {
mWeekAdapter.setNewData(mConfigEntity.getDetails());
}
}
/**
* 深拷贝 WaterPlanWeekEntity
*/
private WaterPlanWeekEntity cloneEntity(WaterPlanWeekEntity source) {
if (source == null) {
return null;
}
WaterPlanWeekEntity target = new WaterPlanWeekEntity();
target.setId(source.getId());
target.setName(source.getName());
target.setStatus(source.getStatus());
if (source.getDetails() != null) {
List<WaterPlanWeekEntity.DetailsBean> detailsList = new ArrayList<>();
for (WaterPlanWeekEntity.DetailsBean bean : source.getDetails()) {
WaterPlanWeekEntity.DetailsBean newBean = new WaterPlanWeekEntity.DetailsBean();
newBean.setId(bean.getId());
newBean.setWeekday(bean.getWeekday());
newBean.setWeekName(ZYTimeUtils.getWeekName(bean.getWeekday() - 1,mContext));
newBean.setStatus(bean.getStatus());
newBean.setStartTime(ZYTimeUtils.formatHHmm(bean.getStartTime()));
newBean.setDurationMin(bean.getDurationMin());
detailsList.add(newBean);
}
target.setDetails(detailsList);
}
return target;
}
private void initListener() {
setClick(viewBinding.tvCommit);
mWeekAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
@Override
public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
switch (view.getId()){
case R.id.linear_week://选中
case R.id.checkbox:
if(mConfigEntity.getDetails().get(position).getStatus().equals("1")){
mConfigEntity.getDetails().get(position).setStatus("0");
}else{
mConfigEntity.getDetails().get(position).setStatus("1");
}
mWeekAdapter.notifyItemChanged(position);
break;
case R.id.tv_select_time:
selectStartTime(position);
break;
case R.id.tv_plan_duration:
inputDuration(position);
break;
}
}
});
viewBinding.etPlanName.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) {}
@Override
public void afterTextChanged(Editable s) {
if(!TextUtils.isEmpty(s.toString())){
mPlanName = s.toString();
mConfigEntity.setName(s.toString());
}
}
});
}
public void onClick(View v){
switch (v.getId()){
case R.id.tv_commit:
commitConfig();
break;
}
}
public void commitConfig(){
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, "配置没有变化,无需保存");
}
}
private void inputDuration(int position) {
showEditDialog(getString(R.string.device_work_times_title),
getString(R.string.input_water_plan_time),
mConfigEntity.getDetails().get(position).getDurationMin() == 0 ?
"" : mConfigEntity.getDetails().get(position).getDurationMin() + "",
true,
getString(R.string.cancel_text),
getString(R.string.confirm_text),
BaseFragment.INPUT_TYPE_NUMBER,
new BaseActivity.OnDialogClick() {
@Override
public void onCancelClick() {
}
@Override
public void onConfirmClisk() {
}
@Override
public void onConfirmClisk(String content) {
if(Integer.parseInt(content) <= 0){
ToastUtil.showShort(mContext, getString(R.string.input_water_plan_time_error));
return;
}
mConfigEntity.getDetails().get(position).setDurationMin(Integer.parseInt(content));
mWeekAdapter.notifyItemChanged(position);
}
@Override
public void onView1Click() {
}
});
}
private void selectStartTime(int position) {
boolean times[] = {false, false, false, true, true, false};
//时间选择器
TimePickerView pvTime = new TimePickerBuilder(mContext, new OnTimeSelectListener() {
@Override
public void onTimeSelect(Date date, View v) {
//用于提交接口
mConfigEntity.getDetails().get(position).setStartTime(ZYTimeUtils.getStrTimeData_H_M(date));
mWeekAdapter.notifyItemChanged(position);
}
}).setType(times)
.setCancelColor(mContext.getColor(R.color.color_999999))
.setSubmitColor(mContext.getColor(R.color.color_zhu))
.setTextColorCenter(mContext.getColor(R.color.color_zhu))
.build();
pvTime.show();
}
private void setClick(View view) {
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();
for (int i = 0; i < localDetails.size(); i++) {
WaterPlanWeekEntity.DetailsBean local = localDetails.get(i);
WaterPlanWeekEntity.DetailsBean remote = remoteDetails.get(i);
// 勾选状态下对比状态、时间、时长
if ("1".equals(local.getStatus())) {
if (!equalsString(local.getStatus(), remote.getStatus())
|| !equalsString(local.getStartTime(), ZYTimeUtils.formatHHmm(remote.getStartTime()))
|| local.getDurationMin() != remote.getDurationMin()) {
return true;
}
} else {
// 未勾选状态下只对比勾选状态,不关心时间/时长
if (!equalsString(local.getStatus(), remote.getStatus())) {
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);
}
/**
* 检查配置信息是否完成
* @return
*/
public boolean checkConfigFinish() {
if(TextUtils.isEmpty(viewBinding.etPlanName.getText().toString())){
ToastUtil.showShort(mContext,getString(R.string.plan_name_text_empty_hint));
return false;
}
List<WaterPlanWeekEntity.DetailsBean> list = mConfigEntity.getDetails();
//是否勾选了排程日期
boolean isSelectOne = false;
if(list != null){
for(WaterPlanWeekEntity.DetailsBean bean : list){
if(bean.getStatus().equals("1")){
isSelectOne = true;
}
}
}
if(!isSelectOne){
ToastUtil.showShort(mContext,getString(R.string.plan_week_empty_hint));
return false;
}
//是否配置了排程日期的时间
boolean isPlanConfig = false;
for(WaterPlanWeekEntity.DetailsBean bean : list){
if(bean.getStatus().equals("1")){
if((TextUtils.isEmpty(bean.getStartTime()) ||
bean.getDurationMin() == 0)){
ToastUtil.showShort(mContext,"请完成" + bean.getWeekName() + "的时间配置");
return false;
}
}
}
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) {
((AddWaterPlanActivity) getActivity()).onConfigSaved(entity);
}
}
/**
* 更新排程成功
* @param entity
*/
@Override
public void updateConfigSuccess(WaterPlanWeekEntity entity) {
ToastUtil.showShort(mContext, "排程更新成功");
mRemoteConfigEntity = entity;
}
@Override
public void updatePlanStatusSuccess(BaseBean bean, String status) {
}
@Override
public void getPlanDetailInfo(WaterPlanWeekEntity entity) {
}
@Override
public void getPlanBindDeviceList(WaterDeviceEntity bean) {
}
@Override
public void planBindDeviceSuccess(BaseBean bean) {
}
@Override
public void deletePlanSuccess(BaseBean bean) {
}
@Override
public void planUnbindDeviceSuccess(BaseBean bean, int position) {
}
@Override
public WaterPlanPresenter createPresenter() {
return new WaterPlanPresenter(new WaterPlanImpl());
}
@Override
public void onNetChange(int netModel) {
}
@Override
public void showError(String message) {
}
@Override
public void logOut(BaseBean bean) {
}
}

View File

@@ -1,715 +0,0 @@
package com.ckkj.water.plan;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.view.ViewGroup;
import androidx.recyclerview.widget.RecyclerView;
import com.bigkoo.pickerview.builder.TimePickerBuilder;
import com.bigkoo.pickerview.listener.OnTimeSelectListener;
import com.bigkoo.pickerview.view.TimePickerView;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.ckkj.water.R;
import com.ckkj.water.base.BaseActivity;
import com.ckkj.water.base.BaseFragment;
import com.ckkj.water.databinding.WaterConfigFragmentLayoutBinding;
import com.ckkj.water.databinding.WaterConfigFragmentLayoutCopyBinding;
import com.ckkj.water.index.entity.WaterDeviceEntity;
import com.ckkj.water.network.BaseBean;
import com.ckkj.water.plan.adapter.WaterPlanTimeDataAdapter;
import com.ckkj.water.plan.adapter.WaterPlanWeekAdapter;
import com.ckkj.water.plan.adapter.WaterPlanWeekAdapter_copy;
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.show.ToastUtil;
import com.ckkj.water.utils.time.ZYTimeUtils;
import com.google.gson.Gson;
import com.yanzhenjie.recyclerview.OnItemMenuClickListener;
import com.yanzhenjie.recyclerview.SwipeMenu;
import com.yanzhenjie.recyclerview.SwipeMenuBridge;
import com.yanzhenjie.recyclerview.SwipeMenuCreator;
import com.yanzhenjie.recyclerview.SwipeMenuItem;
import com.yanzhenjie.recyclerview.SwipeRecyclerView;
import com.yanzhenjie.recyclerview.widget.DefaultItemDecoration;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
public class WaterConfigFragment_copy extends BaseFragment<WaterConfigFragmentLayoutCopyBinding, WaterPlanPresenter>
implements WaterPlanContract.WaterPlanView {
//本地新增排程时的实体
private WaterPlanWeekEntity mLocalEntity;
//新增之后返回的实体
private WaterPlanWeekEntity mRemoteEntity;
private List<WaterPlanWeekEntity.DetailsBean> weekList = new ArrayList<>();
private List<WaterPlanWeekEntity.TimeDataBean> timeList = new ArrayList<>();
private WaterPlanWeekAdapter_copy mWeekAdapter;
private WaterPlanTimeDataAdapter mTimeAdapter;
private RecyclerView.ItemDecoration itemDecoration;
private boolean isConfigSubmitted = false;
//当下是否编辑模式
private boolean mIsEditMode = false;
@Override
public void initData(Bundle state) {
// 设置菜单创建器。
viewBinding.rvTimes.setSwipeMenuCreator(mSwipeMenuCreator);
viewBinding.rvTimes.setOnItemMenuClickListener(mItemMenuClickListener);
itemDecoration = new DefaultItemDecoration
(mContext.getColor(R.color.transparent),20,40);
viewBinding.rvTimes.addItemDecoration(itemDecoration);
List<WaterPlanWeekEntity.DetailsBean> list = new ArrayList<>();
for(int i = 0; i < 7; i++){
WaterPlanWeekEntity.DetailsBean bean = new WaterPlanWeekEntity.DetailsBean();
WaterPlanWeekEntity.TimeDataBean timeData = new WaterPlanWeekEntity.TimeDataBean();
List<WaterPlanWeekEntity.TimeDataBean> timeDataList = new ArrayList<>();
timeDataList.add(timeData);
bean.setTimeData(timeDataList);
bean.setWeekday(i + 1);
bean.setStatus("1");
bean.setWeekName(ZYTimeUtils.getWeekName(i,mContext));
bean.setTriggerType("0");
list.add(bean);
}
weekList = list;
//这里先处理新增,后面再处理编辑
mLocalEntity = new WaterPlanWeekEntity();
mLocalEntity.setStatus("1");
mLocalEntity.setDetails(weekList);
//顶部周一、周二。。。。。
mWeekAdapter = new WaterPlanWeekAdapter_copy(mContext, R.layout.plan_period_item,list);
viewBinding.rvWeek.setAdapter(mWeekAdapter);
//周期对应的 时间配置
List<WaterPlanWeekEntity.TimeDataBean> timeList = weekList.get(0).getTimeData();
mTimeAdapter = new WaterPlanTimeDataAdapter(mContext,R.layout.include_plan_time_item_layout,timeList);
viewBinding.rvTimes.setAdapter(mTimeAdapter);
initListener();
}
private void initListener() {
setClick(viewBinding.tvCommit);
setClick(viewBinding.imgAdd);
setClick(viewBinding.switchButton);
//头部 周一~周日
mWeekAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
@Override
public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
mWeekAdapter.setSelPos(position);
List<WaterPlanWeekEntity.TimeDataBean> timeList = weekList.get(position).getTimeData();
mTimeAdapter.setNewData(timeList);
viewBinding.switchButton.setChecked(weekList.get(position).getStatus().equals("1"));
}
});
//周期对应的 时间配置
mTimeAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
@Override
public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
switch (view.getId()){
case R.id.tv_select_time:
selectStartTime(position);
break;
case R.id.tv_plan_duration:
inputDuration(position);
break;
}
}
});
//输入框监听
viewBinding.editPlanName.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) {}
@Override
public void afterTextChanged(Editable s) {
String planName = "";
if(!TextUtils.isEmpty(s.toString())){
planName = s.toString();
}
mLocalEntity.setName(planName);
}
});
}
private void setClick(View view) {
view.setOnClickListener(this::onClick);
}
public void onClick(View v){
int selPos = mWeekAdapter.getmPos();
switch (v.getId()){
case R.id.img_add:
isConfigSubmitted = false;
WaterPlanWeekEntity.TimeDataBean timeDataAdd = new WaterPlanWeekEntity.TimeDataBean();
weekList.get(selPos).getTimeData().add(timeDataAdd);
mTimeAdapter.notifyItemInserted(weekList.get(selPos).getTimeData().size() - 1);
break;
case R.id.switch_button:
if(weekList.get(selPos).getStatus().equals("0")){
weekList.get(selPos).setStatus("1");
viewBinding.switchButton.setChecked(true);
}else{
weekList.get(selPos).setStatus("0");
viewBinding.switchButton.setChecked(false);
}
break;
case R.id.tv_commit:
// 如果已经保存过mRemoteEntity 不为空),则走更新逻辑;否则走新增逻辑
if (mRemoteEntity != null) {
updateConfig();
} else {
validateAndSave();
}
break;
}
}
public boolean isConfigSubmitted() {
return isConfigSubmitted;
}
/**
* 获取当前排程名称
* @return 排程名称
*/
public String getPlanName() {
if (mLocalEntity != null) {
return mLocalEntity.getName();
}
return "";
}
/**
* 检查是否至少配置了一天的时间
* @return true表示有时间配置false表示没有配置任何时间
*/
public boolean hasTimeConfig() {
for (WaterPlanWeekEntity.DetailsBean dayBean : weekList) {
List<WaterPlanWeekEntity.TimeDataBean> timeDataList = dayBean.getTimeData();
if (timeDataList != null && !timeDataList.isEmpty()) {
for (WaterPlanWeekEntity.TimeDataBean timeData : timeDataList) {
if (!TextUtils.isEmpty(timeData.getStartTime()) && timeData.getDurationMin() > 0) {
return true;
}
}
}
}
return false;
}
/**
* 校验并保存配置(供外部调用)
* @return true表示校验通过并已提交保存false表示校验失败
*/
public boolean commitConfig() {
return validateAndSave();
}
/**
* 更新配置(用于数据变更后调用)
* @return true表示校验通过并已提交更新false表示校验失败
*/
public boolean updateConfig() {
if (!validateConfig()) {
return false;
}
// 调用更新接口
if(mLocalEntity != null){
mPresenter.updateConfig(mLocalEntity);
}
return true;
}
/**
* 设置编辑模式的排程数据
* @param entity 从详情页传来的排程数据
*/
public void setEditEntity(WaterPlanWeekEntity entity) {
if (entity == null) {
return;
}
mIsEditMode = true;
// 深拷贝数据到 mConfigEntity用于本地编辑
mLocalEntity = cloneEntity(entity);
// 保存远程原始数据,用于后续变化检测
mRemoteEntity = entity;
isConfigSubmitted = true;
// 初始化 UI
viewBinding.editPlanName.setText(entity.getName());
// 更新周配置列表的显示,使用 mConfigEntity.getDetails() 保证数据一致
if (mLocalEntity.getDetails() != null) {
weekList = mLocalEntity.getDetails();
mWeekAdapter.setNewData(mLocalEntity.getDetails());
mTimeAdapter.setNewData(weekList.get(mWeekAdapter.getmPos()).getTimeData());
}
}
/**
* 深拷贝 WaterPlanWeekEntity
*/
private WaterPlanWeekEntity cloneEntity(WaterPlanWeekEntity source) {
if (source == null) {
return null;
}
WaterPlanWeekEntity target = new WaterPlanWeekEntity();
target.setId(source.getId());
target.setName(source.getName());
target.setStatus(source.getStatus());
if (source.getDetails() != null) {
List<WaterPlanWeekEntity.DetailsBean> detailsList = new ArrayList<>();
for (WaterPlanWeekEntity.DetailsBean bean : source.getDetails()) {
WaterPlanWeekEntity.DetailsBean newBean = new WaterPlanWeekEntity.DetailsBean();
List<WaterPlanWeekEntity.TimeDataBean> timeDataList = new ArrayList<>();
for(WaterPlanWeekEntity.TimeDataBean timeDataBean : bean.getTimeData()){
WaterPlanWeekEntity.TimeDataBean newTimeDataBean = new WaterPlanWeekEntity.TimeDataBean();
newTimeDataBean.setStartTime(ZYTimeUtils.formatHHmm(timeDataBean.getStartTime()));
newTimeDataBean.setDurationMin(timeDataBean.getDurationMin());
timeDataList.add(newTimeDataBean);
}
newBean.setTimeData(timeDataList);
newBean.setId(bean.getId());
newBean.setWeekday(bean.getWeekday());
newBean.setWeekName(ZYTimeUtils.getWeekName(bean.getWeekday() - 1,mContext));
newBean.setStatus(bean.getStatus());
detailsList.add(newBean);
}
target.setDetails(detailsList);
}
return target;
}
/**
* 校验配置
* @return true表示校验通过false表示校验失败
*/
private boolean validateConfig() {
if(TextUtils.isEmpty(viewBinding.editPlanName.getText().toString())){
ToastUtil.showShort(mContext,getString(R.string.plan_name_text_empty_hint));
return false;
}
// 检查七天的所有时间配置是否全部为空
boolean allTimeEmpty = true;
for (WaterPlanWeekEntity.DetailsBean dayBean : weekList) {
List<WaterPlanWeekEntity.TimeDataBean> timeDataList = dayBean.getTimeData();
if (timeDataList != null && !timeDataList.isEmpty()) {
for (WaterPlanWeekEntity.TimeDataBean timeData : timeDataList) {
if (!TextUtils.isEmpty(timeData.getStartTime()) && timeData.getDurationMin() > 0) {
allTimeEmpty = false;
break;
}
}
}
if (!allTimeEmpty) break;
}
if (allTimeEmpty) {
ToastUtil.showShort(mContext, getString(R.string.schedule_select_at_least_one_day));
return false;
}
// 校验每一天内的时间是否有冲突
String conflictMsg = checkTimeConflict();
if (conflictMsg != null) {
ToastUtil.showShort(mContext, conflictMsg);
return false;
}
return true;
}
/**
* 校验配置并保存(新增)
* @return true表示校验通过并已提交保存false表示校验失败
*/
private boolean validateAndSave() {
if (!validateConfig()) {
return false;
}
if(mLocalEntity != null){
mPresenter.saveConfig(mLocalEntity);
return true;
}
return false;
}
/**
* 获取远程实体用于AddWaterPlanActivity比对
* @return mRemoteEntity
*/
public WaterPlanWeekEntity getRemoteEntity() {
return mRemoteEntity;
}
/**
* 获取本地实体用于AddWaterPlanActivity比对
* @return mLocalEntity
*/
public WaterPlanWeekEntity getLocalEntity() {
return mLocalEntity;
}
/**
* 检查本地数据是否与远程数据有变更
* @return true表示有变更false表示无变更
*/
public boolean hasDataChanged() {
if (mRemoteEntity == null || mLocalEntity == null) {
return false;
}
// 比对排程名称
String localName = mLocalEntity.getName();
String remoteName = mRemoteEntity.getName();
if (!TextUtils.isEmpty(localName) && !localName.equals(remoteName)) {
return true;
}
// 比对排程状态
String localStatus = mLocalEntity.getStatus();
String remoteStatus = mRemoteEntity.getStatus();
if (!TextUtils.isEmpty(localStatus) && !localStatus.equals(remoteStatus)) {
return true;
}
// 比对 details 列表
List<WaterPlanWeekEntity.DetailsBean> localDetails = mLocalEntity.getDetails();
List<WaterPlanWeekEntity.DetailsBean> remoteDetails = mRemoteEntity.getDetails();
if (localDetails == null && remoteDetails == null) {
return false;
}
if (localDetails == null || remoteDetails == null) {
return true;
}
if (localDetails.size() != remoteDetails.size()) {
return true;
}
// 逐个比对每个 DetailsBean
for (int i = 0; i < localDetails.size(); i++) {
WaterPlanWeekEntity.DetailsBean localDetail = localDetails.get(i);
WaterPlanWeekEntity.DetailsBean remoteDetail = remoteDetails.get(i);
// 比对 status
String localDetailStatus = localDetail.getStatus();
String remoteDetailStatus = remoteDetail.getStatus();
if (!TextUtils.isEmpty(localDetailStatus) && !localDetailStatus.equals(remoteDetailStatus)) {
return true;
}
// 比对 triggerType
String localTriggerType = localDetail.getTriggerType();
String remoteTriggerType = remoteDetail.getTriggerType();
if (!TextUtils.isEmpty(localTriggerType) && !localTriggerType.equals(remoteTriggerType)) {
return true;
}
// 比对 timeData 列表
List<WaterPlanWeekEntity.TimeDataBean> localTimeData = localDetail.getTimeData();
List<WaterPlanWeekEntity.TimeDataBean> remoteTimeData = remoteDetail.getTimeData();
if (localTimeData == null && remoteTimeData == null) {
continue;
}
if (localTimeData == null || remoteTimeData == null) {
return true;
}
if (localTimeData.size() != remoteTimeData.size()) {
return true;
}
// 逐个比对 TimeDataBean
for (int j = 0; j < localTimeData.size(); j++) {
WaterPlanWeekEntity.TimeDataBean localTime = localTimeData.get(j);
WaterPlanWeekEntity.TimeDataBean remoteTime = remoteTimeData.get(j);
// 比对 startTime
String localStartTime = localTime.getStartTime();
String remoteStartTime = remoteTime.getStartTime();
if (!TextUtils.isEmpty(localStartTime) && !localStartTime.equals(remoteStartTime)) {
return true;
}
// 比对 durationMin
if (localTime.getDurationMin() != remoteTime.getDurationMin()) {
return true;
}
}
}
return false;
}
/**
* 校验每一天内的时间配置是否有冲突
* @return null表示无冲突返回具体提示信息表示有冲突
*/
private String checkTimeConflict() {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm", Locale.getDefault());
for (int dayIndex = 0; dayIndex < weekList.size(); dayIndex++) {
WaterPlanWeekEntity.DetailsBean dayBean = weekList.get(dayIndex);
List<WaterPlanWeekEntity.TimeDataBean> timeDataList = dayBean.getTimeData();
if (timeDataList == null || timeDataList.isEmpty()) {
continue;
}
// 收集该天所有有效的时间段(开始时间 + 结束时间)
List<long[]> periods = new ArrayList<>();
for (WaterPlanWeekEntity.TimeDataBean timeData : timeDataList) {
if (TextUtils.isEmpty(timeData.getStartTime()) || timeData.getDurationMin() <= 0) {
continue;
}
try {
Date startDate = sdf.parse(timeData.getStartTime());
long startMinutes = startDate.getHours() * 60 + startDate.getMinutes();
long endMinutes = startMinutes + timeData.getDurationMin();
periods.add(new long[]{startMinutes, endMinutes});
} catch (Exception e) {
e.printStackTrace();
}
}
// 检查是否有冲突
for (int i = 0; i < periods.size(); i++) {
for (int j = i + 1; j < periods.size(); j++) {
long[] p1 = periods.get(i);
long[] p2 = periods.get(j);
// 冲突条件:一个段的开始时间在另一个段的结束时间之前(即有重叠)
// 不冲突p1.end <= p2.start 或 p2.end <= p1.start
if (!(p1[1] <= p2[0] || p2[1] <= p1[0])) {
String dayName = dayBean.getWeekName();
return dayName + getString(R.string.schedule_time_conflict);
}
}
}
}
return null;
}
/**
* 选择开始时间
* @param position
*/
private void selectStartTime(int position) {
boolean times[] = {false, false, false, true, true, false};
//时间选择器
TimePickerView pvTime = new TimePickerBuilder(mContext, new OnTimeSelectListener() {
@Override
public void onTimeSelect(Date date, View v) {
//用于提交接口
weekList.get(mWeekAdapter.getmPos()).getTimeData().get(position).
setStartTime(ZYTimeUtils.getStrTimeData_H_M(date));
mTimeAdapter.notifyItemChanged(position);
}
}).setType(times)
.setCancelColor(mContext.getColor(R.color.color_999999))
.setSubmitColor(mContext.getColor(R.color.color_zhu))
.setTextColorCenter(mContext.getColor(R.color.color_zhu))
.build();
pvTime.show();
}
/**
* 输入浇水时间
* @param position
*/
private void inputDuration(int position) {
WaterPlanWeekEntity.TimeDataBean timeData = weekList.get(mWeekAdapter.getmPos()).getTimeData().get(position);
showEditDialog(getString(R.string.device_work_times_title),
getString(R.string.input_water_plan_time),
timeData.getDurationMin() == 0 ? "" : timeData.getDurationMin() + "",
true,
getString(R.string.cancel_text),
getString(R.string.confirm_text),
BaseFragment.INPUT_TYPE_NUMBER,
new BaseActivity.OnDialogClick() {
@Override
public void onCancelClick() {}
@Override
public void onConfirmClisk() {}
@Override
public void onConfirmClisk(String content) {
if (Integer.parseInt(content) <= 0) {
ToastUtil.showShort(mContext, getString(R.string.input_water_plan_time_error));
return;
}
timeData.setDurationMin(Integer.parseInt(content));
mTimeAdapter.notifyItemChanged(position);
}
@Override
public void onView1Click() {
}
});
}
/**
* 侧滑相关
*/
// 创建菜单:
SwipeMenuCreator mSwipeMenuCreator = new SwipeMenuCreator() {
@Override
public void onCreateMenu(SwipeMenu leftMenu, SwipeMenu rightMenu, int position) {
SwipeMenuItem deleteItem = new SwipeMenuItem(mContext);
deleteItem.setBackground(mContext.getResources().getDrawable(R.drawable.shape_item_delete_bg));
deleteItem.setText(getString(R.string.button_delete));
deleteItem.setTextColor(mContext.getResources().getColor(R.color.white));
deleteItem.setHeight(ViewGroup.LayoutParams.MATCH_PARENT);
deleteItem.setWidth((int) mContext.getResources().getDimension(R.dimen.dp_90));
// 各种文字和图标属性设置。
rightMenu.addMenuItem(deleteItem); // 在Item右侧添加一个菜单。
}
};
// 菜单点击监听。
OnItemMenuClickListener mItemMenuClickListener = new OnItemMenuClickListener() {
@Override
public void onItemClick(SwipeMenuBridge menuBridge, int position) {
// 先关闭菜单
menuBridge.closeMenu();
// 左/右菜单
int direction = menuBridge.getDirection();
// 点击的是第几个菜单
int menuPosition = menuBridge.getPosition();
// 只处理右侧菜单
if (direction == SwipeRecyclerView.RIGHT_DIRECTION) {
if (menuPosition == 0) {
weekList.get(mWeekAdapter.getmPos()).getTimeData().remove(position);
if(mTimeAdapter != null){
mTimeAdapter.notifyItemRemoved(position);
}
}
}
}
};
/**
* 新增
* @param entity
*/
@Override
public void saveConfigSuccess(WaterPlanWeekEntity entity) {
ToastUtil.showShort(mContext, getString(R.string.schedule_add_success));
isConfigSubmitted = true;
// 把接口返回的 ID 设置到 mConfigEntity便于后续更新操作
mLocalEntity.setId(entity.getId());
// 把 details 中每个 bean 的 id 也设置到 mConfigEntity便于后续更新操作
if (entity.getDetails() != null && mLocalEntity.getDetails() != null) {
for (int i = 0; i < entity.getDetails().size() && i < mLocalEntity.getDetails().size(); i++) {
mLocalEntity.getDetails().get(i).setId(entity.getDetails().get(i).getId());
mLocalEntity.getDetails().get(i).setStatus(entity.getDetails().get(i).getStatus());
}
}
//接口请求之后返回的数据,方便后面做对比
mRemoteEntity = entity;
if (getActivity() instanceof AddWaterPlanActivity) {
((AddWaterPlanActivity) getActivity()).onConfigSaved(entity);
}
}
/**
* 更新
* @param entity
*/
@Override
public void updateConfigSuccess(WaterPlanWeekEntity entity) {
ToastUtil.showShort(mContext, getString(R.string.schedule_update_success));
mRemoteEntity = entity;
}
// private List<WaterPlanWeekEntity.DeviceEntity> getSelectedDevices() {
// if (getActivity() instanceof AddWaterPlanActivity) {
// return ((AddWaterPlanActivity) getActivity()).getSelectedDevices();
// }
// return new ArrayList<>();
// }
@Override
public WaterPlanPresenter createPresenter() {
return new WaterPlanPresenter(new WaterPlanImpl());
}
@Override
public void onNetChange(int netModel) {
}
@Override
public void showError(String message) {
}
@Override
public void logOut(BaseBean bean) {
}
@Override
public void getWaterConfigListSuccess(List<WaterPlanWeekEntity> list, int total) {
}
@Override
public void updatePlanStatusSuccess(BaseBean bean, String status) {
}
@Override
public void getPlanDetailInfo(WaterPlanWeekEntity entity) {
}
@Override
public void getPlanBindDeviceList(WaterDeviceEntity bean) {
}
@Override
public void planBindDeviceSuccess(BaseBean bean) {
}
@Override
public void deletePlanSuccess(BaseBean bean) {
}
@Override
public void planUnbindDeviceSuccess(BaseBean bean, int position) {
}
}

View File

@@ -1,6 +1,4 @@
package com.ckkj.water.plate.adapter; package com.ckkj.water.plan.adapter;
import android.content.Context;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;

View File

@@ -1,114 +0,0 @@
//package com.ckkj.water.plate;
//
//import android.os.Bundle;
//import android.view.View;
//
//import androidx.annotation.NonNull;
//import androidx.fragment.app.Fragment;
//
//import com.ckkj.water.AppConfig;
//import com.ckkj.water.R;
//import com.ckkj.water.base.BaseFragment;
//import com.ckkj.water.databinding.PlateFragmentBinding;
//import com.ckkj.water.login.LoginActivity;
//import com.ckkj.water.network.BaseBean;
//import com.ckkj.water.plate.adapter.ViewPagerAdapter;
//import com.ckkj.water.plate.entity.BaziResultBean;
//import com.ckkj.water.plate.entity.BaziSaveSuccessEntity;
//import com.ckkj.water.plate.entity.PaipanHistoryEntity;
//import com.ckkj.water.plate.mvp.PlateContract;
//import com.ckkj.water.plate.mvp.PlateImpl;
//import com.ckkj.water.plate.mvp.PlatePresenter;
//
//import java.util.ArrayList;
//import java.util.List;
//
//
///**
// * @author fengxiaoyang
// * @date 2025/7/30
// * @description TODO: 排盘页面
// */
//
//public class PlateFragment extends BaseFragment<PlateFragmentBinding, PlatePresenter>
// implements PlateContract.PlateView {
// private List<Fragment> mFragmentList = new ArrayList<>();
//
// @Override
// public PlatePresenter createPresenter() {
// return new PlatePresenter(new PlateImpl());
// }
//
// @Override
// public void initData(Bundle state) {
// viewBinding.includedTitle.imgBack.setVisibility(View.GONE);
// viewBinding.includedTitle.tvTitle.setText("信息录入");
// ViewPagerAdapter adapter = new ViewPagerAdapter(this, mFragmentList);
// viewBinding.viewpage.setAdapter(adapter);
// viewBinding.tvPaipan.setSelected(true);
// viewBinding.viewpage.setCurrentItem(0);
// //viewpage2 特有的 api禁止滑动
// viewBinding.viewpage.setUserInputEnabled(false);
// }
//
//
// @Override
// public void onNetChange(int netModel) {
//
// }
//
// @Override
// public void showError(String message) {
//
// }
//
// @Override
// public void logOut(BaseBean bean) {
//
// }
//
// @Override
// public void getPaipanResult(BaziResultBean bean) {
//
// }
//
// @Override
// public void saveBaziResultSuccess(BaziSaveSuccessEntity bean) {
//
// }
//
// @Override
// public void getHistorySuccess(PaipanHistoryEntity entity) {
//
// }
//
// @Override
// public void deletePaipanHistorySuccess(int pos) {
//
// }
//
// @Override
// public void onStreamMessageReceived(String messageChunk) {
//
// }
//
// @Override
// public void onStreamComplete(String complateMsg) {
//
// }
//
// @Override
// public void commitReportSuccess(BaseBean bean) {
//
// }
//
// @Override
// public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) {
//
// }
//
// @Override
// public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
//
// }
//}

View File

@@ -1,40 +0,0 @@
package com.ckkj.water.plate.adapter;
import android.content.Context;
import android.graphics.Color;
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.utils.helper.FiveElementsHelper;
import java.util.List;
/**
* @author fengxiaoyang
* @date 2025/8/6
* @description TODO: 描述该类的作用
*/
public class CangGanAdapter extends BaseQuickAdapter<String, BaseViewHolder> {
private Context mContext;
private List<String> mDzGodList;
public CangGanAdapter(Context context, int layoutResId, @Nullable List<String> data,List<String> dzGodList) {
super(layoutResId, data);
this.mContext = context;
this.mDzGodList = dzGodList;
}
public void setmDzGodList(List<String> mDzGodList) {
this.mDzGodList = mDzGodList;
}
@Override
protected void convert(BaseViewHolder holder, String item) {
holder.setText(R.id.tv_cg_gan,item);
holder.setTextColor(R.id.tv_cg_gan, Color.parseColor(FiveElementsHelper.getElementInfo(item).get("color")));
holder.setText(R.id.tv_cg_shishen,mDzGodList.get(holder.getLayoutPosition()));
}
}

View File

@@ -1,76 +0,0 @@
package com.ckkj.water.plate.adapter;
import android.content.Context;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.ckkj.water.R;
import com.ckkj.water.plate.entity.BaziResultBean;
import com.ckkj.water.utils.helper.ShiShenCalculator;
import java.util.List;
/**
* @author fengxiaoyang
* @date 2025/8/5
* @description TODO: 描述该类的作用
*/
public class DayunAdapter extends BaseQuickAdapter<BaziResultBean.DetailInfoDTO.DayunInfoDTO, BaseViewHolder> {
private Context mContext;
private int mSelPos = -1;
public DayunAdapter(Context context,int layoutResId, @Nullable List<BaziResultBean.DetailInfoDTO.DayunInfoDTO> data,
BaziResultBean.DetailInfoDTO.SizhuInfoDTO sizhuInfoDTO) {
super(layoutResId, data);
this.mContext = context;
}
public int getmSelPos() {
return mSelPos;
}
@Override
protected void convert(BaseViewHolder holder, BaziResultBean.DetailInfoDTO.DayunInfoDTO item) {
holder.setText(R.id.tv_year,item.getDayunStartYear() + "");
if(holder.getLayoutPosition() != 0){
holder.setText(R.id.tv_age,item.getDayunStartAge() + "");
holder.setText(R.id.tv_gan_value,ShiShenCalculator.getAbbreviation(item.getDayunShishen()));
holder.setText(R.id.tv_zhi_value,ShiShenCalculator.getAbbreviation(item.getDayunYearDzGod().get(0)));
holder.setGone(R.id.tv_gan_value,true);
holder.setGone(R.id.tv_zhi_value,true);
holder.setGone(R.id.tv_zhi_key,true);
holder.setText(R.id.tv_gan_key,item.getDayunYearTg());
holder.setText(R.id.tv_zhi_key,item.getDayunYearDz());
}else{
int dyStart = item.getDayunStartYear();
int dyEnd = item.getDayunEndYear();
if(dyStart > dyEnd){
holder.setText(R.id.tv_age,"0岁");
}else if(dyStart == dyEnd){
holder.setText(R.id.tv_age,"1岁");
}else{
holder.setText(R.id.tv_age,item.getDayunStartAge() + "-" + item.getDayunEndAge() + "");
}
holder.setGone(R.id.tv_gan_value,false);
holder.setGone(R.id.tv_zhi_value,false);
holder.setText(R.id.tv_gan_key,item.getDayunTongxian());
holder.setGone(R.id.tv_zhi_key,false);
holder.setGone(R.id.tv_zhi_value,false);
}
if(holder.getLayoutPosition() == mSelPos){
holder.setBackgroundColor(R.id.ll_item, ContextCompat.getColor(mContext,R.color.divider));
}else{
holder.setBackgroundColor(R.id.ll_item, ContextCompat.getColor(mContext,R.color.white));
}
}
public void setSelPostion(int pos){
this.mSelPos = pos;
notifyDataSetChanged();
}
}

View File

@@ -1,167 +0,0 @@
package com.ckkj.water.plate.adapter;
import android.content.Context;
import android.graphics.Color;
import android.text.TextUtils;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.ckkj.water.R;
import com.ckkj.water.plate.entity.BaziResultBean;
import com.ckkj.water.utils.helper.FiveElementsHelper;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @author fengxiaoyang
* @date 2025/8/6
* @description 大运、流年、流月柱状图适配器
*/
public class DayunColumnAdapter extends BaseQuickAdapter<BaziResultBean.DetailInfoDTO.DayunInfoDTO, BaseViewHolder> {
private Context mContext;
private int mDayunTypeCode = 100;
private CangGanAdapter mCangganAdapter;
private ShenshaAdapter mShenshaAdapter;
private int mSelectXiaoyunPos = -1;
public DayunColumnAdapter(Context context, int layoutResId,
@Nullable List<BaziResultBean.DetailInfoDTO.DayunInfoDTO> data,
int typeCode) {
super(layoutResId, data);
this.mContext = context;
this.mDayunTypeCode = typeCode;
}
@Override
protected void convert(BaseViewHolder holder, BaziResultBean.DetailInfoDTO.DayunInfoDTO item) {
RecyclerView rvDatas = holder.getView(R.id.rv_canggan);
RecyclerView rvShenShaData = holder.getView(R.id.rv_shensha_data);
holder.setGone(R.id.viewline,true);
switch (mDayunTypeCode) {
case 100: // 大运
// 第一个itembornBean童限 的特殊处理
holder.setText(R.id.tv_shishen, item.isTongXian() ?
item.getXiaoyunInfo().get(0).getXiaoyunShishen() : item.getDayunShishen());
holder.setText(R.id.tv_tg, item.isTongXian() ?
item.getXiaoyunInfo().get(0).getXiaoyunYearTg() : item.getDayunYearTg());
holder.setText(R.id.tv_dz, item.isTongXian() ?
item.getXiaoyunInfo().get(0).getXiaoyunYearDz() : item.getDayunYearDz());
holder.setTextColor(R.id.tv_tg, Color.parseColor(FiveElementsHelper.getElementInfo
(item.isTongXian() ?
item.getXiaoyunInfo().get(0).getXiaoyunYearTg() : item.getDayunYearTg()).get("color")));
holder.setTextColor(R.id.tv_dz, Color.parseColor(FiveElementsHelper.getElementInfo
(item.isTongXian() ?
item.getXiaoyunInfo().get(0).getXiaoyunYearTg() : item.getDayunYearTg()).get("color")));
holder.setText(R.id.tv_xingyun, item.isTongXian() ?
item.getXiaoyunInfo().get(0).getXiaoyunDzStarCs() : item.getDayunDzStarCs());
holder.setText(R.id.tv_zizuo, item.isTongXian() ?
item.getXiaoyunInfo().get(0).getXiaoyunDzSelfCs() : item.getDayunDzSelfCs());
holder.setText(R.id.tv_kongwang, item.isTongXian() ?
item.getXiaoyunInfo().get(0).getXiaoyunKongwang() : item.getDayunKongwang());
holder.setText(R.id.tv_nayin, item.isTongXian() ?
item.getXiaoyunInfo().get(0).getXiaoyunNayin() : item.getDayunNayin());
// bornBean可能没有藏干和神煞数据需要特殊处理
if (mCangganAdapter == null) {
mCangganAdapter = new CangGanAdapter(mContext,
R.layout.paipan_canggan_item,
item.isTongXian() ? item.getXiaoyunInfo().get(0).getXiaoyunYearCg() : item.getDayunYearCg(),
item.isTongXian() ? item.getXiaoyunInfo().get(0).getXiaoyunDzGod() : item.getDayunYearDzGod());
rvDatas.setAdapter(mCangganAdapter);
} else {
mCangganAdapter.setNewData(item.isTongXian() ?
item.getXiaoyunInfo().get(0).getXiaoyunYearCg() : item.getDayunYearCg());
mCangganAdapter.setmDzGodList(item.isTongXian() ?
item.getXiaoyunInfo().get(0).getXiaoyunDzGod() : item.getDayunYearDzGod());
}
List<String> shenshaList = new ArrayList<>();
if (item.isTongXian()) {
String shensha = item.getXiaoyunInfo().get(0).getXiaoyunShensha();
if (!TextUtils.isEmpty(shensha)) {
shenshaList = Arrays.asList(shensha.split(" "));
}
} else {
String shensha = item.getDayunShensha();
if (!TextUtils.isEmpty(shensha)) {
shenshaList = Arrays.asList(shensha.split(" "));
}
}
if (mShenshaAdapter == null) {
mShenshaAdapter = new ShenshaAdapter(mContext, R.layout.paipan_shensha_item, shenshaList);
rvShenShaData.setAdapter(mShenshaAdapter);
} else {
mShenshaAdapter.setNewData(shenshaList);
}
break;
case 200: // 流年
BaziResultBean.DetailInfoDTO.DayunInfoDTO.XiaoyunInfoDTO xiaoyunEntity = item.getXiaoyunInfo().get(mSelectXiaoyunPos);
// 第一个itembornBean的特殊处理
holder.setText(R.id.tv_shishen, xiaoyunEntity.getXiaoyunShishen());
holder.setText(R.id.tv_tg, xiaoyunEntity.getXiaoyunYearTg());
holder.setText(R.id.tv_dz, xiaoyunEntity.getXiaoyunYearDz());
holder.setTextColor(R.id.tv_tg, Color.parseColor(FiveElementsHelper.getElementInfo(xiaoyunEntity.getXiaoyunYearTg()).get("color")));
holder.setTextColor(R.id.tv_dz, Color.parseColor(FiveElementsHelper.getElementInfo(xiaoyunEntity.getXiaoyunYearDz()).get("color")));
holder.setText(R.id.tv_xingyun, xiaoyunEntity.getXiaoyunDzStarCs());
holder.setText(R.id.tv_zizuo, xiaoyunEntity.getXiaoyunDzSelfCs());
holder.setText(R.id.tv_kongwang, xiaoyunEntity.getXiaoyunKongwang());
holder.setText(R.id.tv_nayin, xiaoyunEntity.getXiaoyunNayin());
// bornBean的流年数据可能为空需要特殊处理
if (mCangganAdapter == null) {
mCangganAdapter = new CangGanAdapter(mContext, R.layout.paipan_canggan_item,
xiaoyunEntity.getXiaoyunYearCg(), xiaoyunEntity.getXiaoyunDzGod());
rvDatas.setAdapter(mCangganAdapter);
}else{
mCangganAdapter.setNewData(xiaoyunEntity.getXiaoyunYearCg());
mCangganAdapter.setmDzGodList(xiaoyunEntity.getXiaoyunDzGod());
}
if (mShenshaAdapter == null) {
String shensha = xiaoyunEntity.getXiaoyunShensha();
mShenshaAdapter = new ShenshaAdapter(mContext, R.layout.paipan_shensha_item, Arrays.asList(shensha.split(" ")));
rvShenShaData.setAdapter(mShenshaAdapter);
}else{
String shensha = xiaoyunEntity.getXiaoyunShensha();
mShenshaAdapter.setNewData(Arrays.asList(shensha.split(" ")));
}
break;
case 300: // 流月
// 第一个itembornBean的特殊处理
holder.setText(R.id.tv_shishen, "小运");
holder.setText(R.id.tv_tg, item.getDayunYearTg());
holder.setText(R.id.tv_dz, item.getDayunYearDz());
holder.setTextColor(R.id.tv_tg, Color.parseColor(FiveElementsHelper.getElementInfo(item.getDayunYearTg()).get("color")));
holder.setTextColor(R.id.tv_dz, Color.parseColor(FiveElementsHelper.getElementInfo(item.getDayunYearDz()).get("color")));
holder.setText(R.id.tv_xingyun, "");
holder.setText(R.id.tv_zizuo, "");
holder.setText(R.id.tv_kongwang, "");
holder.setText(R.id.tv_nayin, "");
// bornBean的流月数据可能为空需要特殊处理
if (mCangganAdapter == null) {
mCangganAdapter = new CangGanAdapter(mContext, R.layout.paipan_canggan_item,
Arrays.asList(), Arrays.asList());
rvDatas.setAdapter(mCangganAdapter);
}
if (mShenshaAdapter == null) {
mShenshaAdapter = new ShenshaAdapter(mContext, R.layout.paipan_shensha_item, Arrays.asList());
rvShenShaData.setAdapter(mShenshaAdapter);
}
break;
}
}
public void setColumnCode(int code,int xiaoyunPos) {
mDayunTypeCode = code;
mSelectXiaoyunPos = xiaoyunPos;
notifyDataSetChanged();
}
}

View File

@@ -1,77 +0,0 @@
package com.ckkj.water.plate.adapter;
import android.content.Context;
import android.graphics.Color;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.ckkj.water.R;
import com.ckkj.water.plate.entity.BaziResultBean;
import com.ckkj.water.utils.helper.FiveElementsHelper;
import java.util.Arrays;
import java.util.List;
/**
* @author fengxiaoyang
* @date 2025/8/7
* @description TODO: 描述该类的作用
*/
public class LiuNianColumnAdapter extends BaseQuickAdapter
<BaziResultBean.DetailInfoDTO.DayunInfoDTO.LiunianInfoDTO, BaseViewHolder> {
private CangGanAdapter mCangganAdapter;
private ShenshaAdapter mShenshaAdapter;
private Context mContext;
private List<BaziResultBean.DetailInfoDTO.DayunInfoDTO.XiaoyunInfoDTO> xiaoyunInfo;
public LiuNianColumnAdapter(Context context, int layoutResId,
@Nullable List<BaziResultBean.DetailInfoDTO.DayunInfoDTO.LiunianInfoDTO> data,
List<BaziResultBean.DetailInfoDTO.DayunInfoDTO.XiaoyunInfoDTO> xiaoyunInfo) {
super(layoutResId, data);
this.mContext = context;
this.xiaoyunInfo = xiaoyunInfo;
}
@Override
protected void convert(BaseViewHolder holder, BaziResultBean.DetailInfoDTO.DayunInfoDTO.LiunianInfoDTO item) {
RecyclerView rvDatas = holder.getView(R.id.rv_canggan);
RecyclerView rvShenShaData = holder.getView(R.id.rv_shensha_data);
// 第一个itembornBean的特殊处理
holder.setText(R.id.tv_shishen, item.getLiunianShishen());
holder.setText(R.id.tv_tg, item.getLiunianYearTg());
holder.setText(R.id.tv_dz, item.getLiunianYearDz());
holder.setTextColor(R.id.tv_tg, Color.parseColor(FiveElementsHelper.getElementInfo(item.getLiunianYearTg()).get("color")));
holder.setTextColor(R.id.tv_dz, Color.parseColor(FiveElementsHelper.getElementInfo(item.getLiunianYearDz()).get("color")));
holder.setText(R.id.tv_xingyun, item.getLiunianDzStarCs());
holder.setText(R.id.tv_zizuo, item.getLiunianDzSelfCs());
holder.setText(R.id.tv_kongwang, item.getLiunianKongwang());
holder.setText(R.id.tv_nayin, item.getLiunianNayin());
// bornBean的流年数据可能为空需要特殊处理
if (mCangganAdapter == null) {
mCangganAdapter = new CangGanAdapter(mContext, R.layout.paipan_canggan_item,
item.getLiunianYearCg(), item.getLiunianDzGod());
rvDatas.setAdapter(mCangganAdapter);
}else{
mCangganAdapter.setNewData(item.getLiunianYearCg());
mCangganAdapter.setmDzGodList(item.getLiunianDzGod());
}
if (mShenshaAdapter == null) {
mShenshaAdapter = new ShenshaAdapter(mContext, R.layout.paipan_shensha_item, Arrays.asList(item.getLiunianShensha().split(" ")));
rvShenShaData.setAdapter(mShenshaAdapter);
}else{
String shensha = item.getLiunianShensha();
mShenshaAdapter.setNewData(Arrays.asList(shensha.split(" ")));
}
}
public void setXiaoyunDatas(List<BaziResultBean.DetailInfoDTO.DayunInfoDTO.XiaoyunInfoDTO> xiaoyunInfoDTOList) {
this.xiaoyunInfo = xiaoyunInfoDTOList;
}
}

View File

@@ -1,75 +0,0 @@
package com.ckkj.water.plate.adapter;
import android.content.Context;
import android.graphics.Color;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.ckkj.water.R;
import com.ckkj.water.plate.entity.BaziResultBean;
import com.ckkj.water.utils.helper.FiveElementsHelper;
import java.util.Arrays;
import java.util.List;
/**
* @author fengxiaoyang
* @date 2025/8/7
* @description TODO: 描述该类的作用
*/
public class LiuYueColumnAdapter extends BaseQuickAdapter
<BaziResultBean.DetailInfoDTO.DayunInfoDTO.LiunianInfoDTO.LiuyueInfoDTO, BaseViewHolder> {
private CangGanAdapter mCangganAdapter;
private ShenshaAdapter mShenshaAdapter;
private Context mContext;
private List<BaziResultBean.DetailInfoDTO.DayunInfoDTO.XiaoyunInfoDTO> xiaoyunInfo;
public LiuYueColumnAdapter(Context context, int layoutResId,
@Nullable List<BaziResultBean.DetailInfoDTO.DayunInfoDTO.LiunianInfoDTO.LiuyueInfoDTO> data) {
super(layoutResId, data);
this.mContext = context;
}
@Override
protected void convert(BaseViewHolder holder, BaziResultBean.DetailInfoDTO.DayunInfoDTO.LiunianInfoDTO.LiuyueInfoDTO item) {
RecyclerView rvDatas = holder.getView(R.id.rv_canggan);
RecyclerView rvShenShaData = holder.getView(R.id.rv_shensha_data);
// 第一个itembornBean的特殊处理
holder.setText(R.id.tv_shishen, item.getLiuyueShishen());
holder.setText(R.id.tv_tg, item.getLiuyueMonthTg());
holder.setText(R.id.tv_dz, item.getLiuyueMonthDz());
holder.setTextColor(R.id.tv_tg, Color.parseColor(FiveElementsHelper.getElementInfo(item.getLiuyueMonthTg()).get("color")));
holder.setTextColor(R.id.tv_dz, Color.parseColor(FiveElementsHelper.getElementInfo(item.getLiuyueMonthDz()).get("color")));
holder.setText(R.id.tv_xingyun, item.getLiuyueDzStarCs());
holder.setText(R.id.tv_zizuo, item.getLiuyueDzSelfCs());
holder.setText(R.id.tv_kongwang, item.getLiuyueKongwang());
holder.setText(R.id.tv_nayin, item.getLiuyueNayin());
// bornBean的流年数据可能为空需要特殊处理
if (mCangganAdapter == null) {
mCangganAdapter = new CangGanAdapter(mContext, R.layout.paipan_canggan_item,
item.getLiuyueMonthCg(), item.getLiuyueMonthDzGod());
rvDatas.setAdapter(mCangganAdapter);
}else{
mCangganAdapter.setNewData(item.getLiuyueMonthCg());
mCangganAdapter.setmDzGodList(item.getLiuyueMonthDzGod());
}
if (mShenshaAdapter == null) {
mShenshaAdapter = new ShenshaAdapter(mContext, R.layout.paipan_shensha_item, Arrays.asList(item.getLiuyueShensha().split(" ")));
rvShenShaData.setAdapter(mShenshaAdapter);
}else{
String shensha = item.getLiuyueShensha();
mShenshaAdapter.setNewData(Arrays.asList(shensha.split(" ")));
}
}
// public void setXiaoyunDatas(List<BaziResultBean.DetailInfoDTO.DayunInfoDTO.XiaoyunInfoDTO> xiaoyunInfoDTOList) {
// this.xiaoyunInfo = xiaoyunInfoDTOList;
// }
}

View File

@@ -1,63 +0,0 @@
package com.ckkj.water.plate.adapter;
import android.content.Context;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.ckkj.water.R;
import com.ckkj.water.plate.entity.BaziResultBean;
import com.ckkj.water.utils.helper.ShiShenCalculator;
import java.util.ArrayList;
import java.util.List;
/**
* @author fengxiaoyang
* @date 2025/8/6
* @description TODO: 描述该类的作用
*/
public class LiunianAdapter extends BaseQuickAdapter<BaziResultBean.DetailInfoDTO.DayunInfoDTO.LiunianInfoDTO, BaseViewHolder> {
private Context mContext;
private int mSelPos = -1;
private List<BaziResultBean.DetailInfoDTO.DayunInfoDTO.XiaoyunInfoDTO> xiaoyunList =
new ArrayList<>();
public LiunianAdapter(Context context, int layoutResId,
@Nullable List<BaziResultBean.DetailInfoDTO.DayunInfoDTO.LiunianInfoDTO> data,
List<BaziResultBean.DetailInfoDTO.DayunInfoDTO.XiaoyunInfoDTO> xiaoyunInfo) {
super(layoutResId, data);
this.mContext = context;
this.xiaoyunList = xiaoyunInfo;
}
@Override
protected void convert(BaseViewHolder holder, BaziResultBean.DetailInfoDTO.DayunInfoDTO.LiunianInfoDTO item) {
holder.setText(R.id.tv_year,item.getLiunianYear() + "");
holder.setGone(R.id.tv_age,false);
holder.setText(R.id.tv_gan_value, ShiShenCalculator.getAbbreviation(item.getLiunianTgGod()));
holder.setText(R.id.tv_zhi_value,ShiShenCalculator.getAbbreviation(item.getLiunianDzGod().get(0)));
holder.setText(R.id.tv_gan_key,item.getLiunianYearTg());
holder.setText(R.id.tv_zhi_key,item.getLiunianYearDz());
holder.setGone(R.id.tv_xiaoyun,true);
holder.setText(R.id.tv_xiaoyun,xiaoyunList.get(holder.getLayoutPosition()).getXiaoyunGanzhi());
if(holder.getLayoutPosition() == mSelPos){
holder.setBackgroundColor(R.id.ll_item, ContextCompat.getColor(mContext,R.color.divider));
}else{
holder.setBackgroundColor(R.id.ll_item, ContextCompat.getColor(mContext,R.color.white));
}
}
public void setSelPostion(int pos){
this.mSelPos = pos;
notifyDataSetChanged();
}
public int getmSelPos() {
return mSelPos;
}
}

View File

@@ -1,64 +0,0 @@
package com.ckkj.water.plate.adapter;
import android.content.Context;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.ckkj.water.R;
import com.ckkj.water.plate.entity.BaziResultBean;
import com.ckkj.water.utils.helper.ShiShenCalculator;
import com.ckkj.water.utils.time.ZYTimeUtils;
import java.util.ArrayList;
import java.util.List;
/**
* @author fengxiaoyang
* @date 2025/8/6
* @description TODO: 描述该类的作用
*/
public class LiuyueAdapter extends BaseQuickAdapter<BaziResultBean.DetailInfoDTO.DayunInfoDTO.
LiunianInfoDTO.LiuyueInfoDTO, BaseViewHolder> {
private Context mContext;
private int mSelPos = -1;
private List<BaziResultBean.DetailInfoDTO.DayunInfoDTO.LiunianInfoDTO.LiunianJieqiDTO> jieqiList =
new ArrayList<>();
public LiuyueAdapter(Context context,int layoutResId, @Nullable List<BaziResultBean.DetailInfoDTO.DayunInfoDTO.LiunianInfoDTO.LiuyueInfoDTO> data,
List<BaziResultBean.DetailInfoDTO.DayunInfoDTO.LiunianInfoDTO.LiunianJieqiDTO> jieqiList) {
super(layoutResId, data);
this.mContext = context;
this.jieqiList = jieqiList;
}
@Override
protected void convert(BaseViewHolder holder, BaziResultBean.DetailInfoDTO.DayunInfoDTO.LiunianInfoDTO.LiuyueInfoDTO item) {
holder.setText(R.id.tv_year,jieqiList.get(holder.getLayoutPosition()).getJieqiName());
holder.setGone(R.id.tv_age,true);
//节气日期转换
String jieqiDate = ZYTimeUtils.formatToMonthDay(jieqiList.get(holder.getLayoutPosition()).getJieqiSolarYmdhms());
holder.setText(R.id.tv_age, jieqiDate);
holder.setText(R.id.tv_gan_value, ShiShenCalculator.getAbbreviation(item.getLiuyueMonthTgGod()));
holder.setText(R.id.tv_zhi_value,ShiShenCalculator.getAbbreviation(item.getLiuyueMonthDzGod().get(0)));
holder.setText(R.id.tv_gan_key,item.getLiuyueMonthTg());
holder.setText(R.id.tv_zhi_key,item.getLiuyueMonthDz());
holder.setGone(R.id.tv_xiaoyun,false);
if(holder.getLayoutPosition() == mSelPos){
holder.setBackgroundColor(R.id.ll_item, ContextCompat.getColor(mContext,R.color.divider));
}else{
holder.setBackgroundColor(R.id.ll_item, ContextCompat.getColor(mContext,R.color.white));
}
}
public void setSelPostion(int pos){
this.mSelPos = pos;
notifyDataSetChanged();
}
public int getmSelPos() {
return mSelPos;
}
}

View File

@@ -1,60 +0,0 @@
package com.ckkj.water.plate.adapter;
import android.content.Context;
import android.graphics.Color;
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.plate.entity.PaipanHistoryEntity;
import com.ckkj.water.utils.click.ClickUtil;
import com.ckkj.water.utils.helper.FiveElementsHelper;
import java.util.List;
/**
* @author fengxiaoyang
* @date 2025/8/9
* @description TODO: 描述该类的作用
*/
public class PaipanHistoryAdapter extends BaseQuickAdapter<PaipanHistoryEntity.RecordsDTO, BaseViewHolder> {
private Context mContext;
public PaipanHistoryAdapter(Context context,int layoutResId, @Nullable List<PaipanHistoryEntity.RecordsDTO> data) {
super(layoutResId, data);
this.mContext = context;
}
@Override
protected void convert(BaseViewHolder holder, PaipanHistoryEntity.RecordsDTO item) {
String []nianArr = item.getNianZhu().split(",");
String []yueArr = item.getYueZhu().split(",");
String []riArr = item.getRiZhu().split(",");
String []shiArr = item.getShiZhu().split(",");
holder.setText(R.id.tv_nian_tg,nianArr[0]);
holder.setText(R.id.tv_nian_dz,nianArr[1]);
holder.setText(R.id.tv_yue_tg,yueArr[0]);
holder.setText(R.id.tv_yue_dz,yueArr[1]);
holder.setText(R.id.tv_ri_tg,riArr[0]);
holder.setText(R.id.tv_ri_dz,riArr[1]);
holder.setText(R.id.tv_shi_tg,shiArr[0]);
holder.setText(R.id.tv_shi_dz,shiArr[1]);
holder.setTextColor(R.id.tv_nian_tg, Color.parseColor(FiveElementsHelper.getElementInfo(nianArr[0]).get("color")));
holder.setTextColor(R.id.tv_nian_dz, Color.parseColor(FiveElementsHelper.getElementInfo(nianArr[1]).get("color")));
holder.setTextColor(R.id.tv_yue_tg, Color.parseColor(FiveElementsHelper.getElementInfo(yueArr[0]).get("color")));
holder.setTextColor(R.id.tv_yue_dz, Color.parseColor(FiveElementsHelper.getElementInfo(yueArr[1]).get("color")));
holder.setTextColor(R.id.tv_ri_tg, Color.parseColor(FiveElementsHelper.getElementInfo(riArr[0]).get("color")));
holder.setTextColor(R.id.tv_ri_dz, Color.parseColor(FiveElementsHelper.getElementInfo(riArr[1]).get("color")));
holder.setTextColor(R.id.tv_shi_tg, Color.parseColor(FiveElementsHelper.getElementInfo(shiArr[0]).get("color")));
holder.setTextColor(R.id.tv_shi_dz, Color.parseColor(FiveElementsHelper.getElementInfo(shiArr[1]).get("color")));
holder.setText(R.id.tv_user_name,item.getName());
holder.setText(R.id.tv_user_sex,Integer.parseInt(item.getGender()) == 0 ? "":"");
holder.setText(R.id.tv_user_birthtime,Integer.parseInt(item.getBirthType()) == 1 ?
"公历:" + item.getYangLiBirthTime():
"农历:" + item.getYinLiBirthTime());
ClickUtil.addClickPart(holder.getView(R.id.img_delete),80);
holder.addOnClickListener(R.id.img_delete);
}
}

View File

@@ -1,30 +0,0 @@
package com.ckkj.water.plate.adapter;
import android.content.Context;
import androidx.annotation.Nullable;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.ckkj.water.R;
import java.util.List;
/**
* @author fengxiaoyang
* @date 2025/8/6
* @description TODO: 描述该类的作用
*/
public class ShenshaAdapter extends BaseQuickAdapter<String, BaseViewHolder> {
private Context mContext;
public ShenshaAdapter(Context context,int layoutResId, @Nullable List<String> data) {
super(layoutResId, data);
this.mContext = context;
}
@Override
protected void convert(BaseViewHolder helper, String item) {
helper.setText(R.id.tv_shensha_value,item);
}
}

View File

@@ -1,128 +0,0 @@
package com.ckkj.water.plate.adapter;
import android.content.Context;
import android.graphics.Color;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.ckkj.water.R;
import com.ckkj.water.plate.entity.BaziResultBean;
import com.ckkj.water.utils.helper.FiveElementsHelper;
import java.util.Arrays;
import java.util.List;
/**
* @author fengxiaoyang
* @date 2025/8/6
* @description TODO: 描述该类的作用
*/
public class SizhuAdapter extends BaseQuickAdapter<BaziResultBean.DetailInfoDTO.SizhuInfoDTO, BaseViewHolder> {
private Context mContext;
private int mSizhuTypeCode = 100;
private CangGanAdapter mCangganAdapter;
private ShenshaAdapter mShenshaAdapter;
public SizhuAdapter(Context context,int layoutResId,
@Nullable List<BaziResultBean.DetailInfoDTO.SizhuInfoDTO> data,
int typeCode) {
super(layoutResId, data);
this.mContext = context;
this.mSizhuTypeCode = typeCode;
}
@Override
protected void convert(BaseViewHolder holder, BaziResultBean.DetailInfoDTO.SizhuInfoDTO item) {
RecyclerView rvDatas = holder.getView(R.id.rv_canggan);
RecyclerView rvShenShaData = holder.getView(R.id.rv_shensha_data);
switch (mSizhuTypeCode){
case 100: // 年柱
holder.setText(R.id.tv_shishen,item.getYear().getTgGod());
holder.setText(R.id.tv_tg,item.getYear().getTg());
holder.setText(R.id.tv_dz,item.getYear().getDz());
holder.setTextColor(R.id.tv_tg, Color.parseColor(FiveElementsHelper.getElementInfo(item.getYear().getTg()).get("color")));
holder.setTextColor(R.id.tv_dz, Color.parseColor(FiveElementsHelper.getElementInfo(item.getYear().getDz()).get("color")));
holder.setText(R.id.tv_xingyun,item.getYear().getDzStarCs());
holder.setText(R.id.tv_zizuo,item.getYear().getDzSelfCs());
holder.setText(R.id.tv_kongwang,item.getYear().getKw());
holder.setText(R.id.tv_nayin,item.getYear().getNy());
if(mCangganAdapter == null){
mCangganAdapter = new CangGanAdapter(mContext,R.layout.paipan_canggan_item,
item.getYear().getCg(), item.getYear().getDzGod());
rvDatas.setAdapter(mCangganAdapter);
}
if(mShenshaAdapter == null){
List<String> shenshaList = Arrays.asList(item.getYear().getShensha().split(" "));
mShenshaAdapter = new ShenshaAdapter(mContext,R.layout.paipan_shensha_item,shenshaList);
rvShenShaData.setAdapter(mShenshaAdapter);
}
break;
case 200: // 月柱
holder.setText(R.id.tv_shishen,item.getMonth().getTgGod());
holder.setText(R.id.tv_tg,item.getMonth().getTg());
holder.setText(R.id.tv_dz,item.getMonth().getDz());
holder.setTextColor(R.id.tv_tg, Color.parseColor(FiveElementsHelper.getElementInfo(item.getMonth().getTg()).get("color")));
holder.setTextColor(R.id.tv_dz, Color.parseColor(FiveElementsHelper.getElementInfo(item.getMonth().getDz()).get("color")));
holder.setText(R.id.tv_xingyun,item.getMonth().getDzStarCs());
holder.setText(R.id.tv_zizuo,item.getMonth().getDzSelfCs());
holder.setText(R.id.tv_kongwang,item.getMonth().getKw());
holder.setText(R.id.tv_nayin,item.getMonth().getNy());
if(mCangganAdapter == null){
mCangganAdapter = new CangGanAdapter(mContext,R.layout.paipan_canggan_item,
item.getMonth().getCg(), item.getMonth().getDzGod());
rvDatas.setAdapter(mCangganAdapter);
}
if(mShenshaAdapter == null){
List<String> shenshaList = Arrays.asList(item.getMonth().getShensha().split(" "));
mShenshaAdapter = new ShenshaAdapter(mContext,R.layout.paipan_shensha_item,shenshaList);
rvShenShaData.setAdapter(mShenshaAdapter);
}
break;
case 300: // 日柱
holder.setText(R.id.tv_shishen,item.getDay().getTgGod());
holder.setText(R.id.tv_tg,item.getDay().getTg());
holder.setText(R.id.tv_dz,item.getDay().getDz());
holder.setTextColor(R.id.tv_tg, Color.parseColor(FiveElementsHelper.getElementInfo(item.getDay().getTg()).get("color")));
holder.setTextColor(R.id.tv_dz, Color.parseColor(FiveElementsHelper.getElementInfo(item.getDay().getDz()).get("color")));
holder.setText(R.id.tv_xingyun,item.getDay().getDzStarCs());
holder.setText(R.id.tv_zizuo,item.getDay().getDzSelfCs());
holder.setText(R.id.tv_kongwang,item.getDay().getKw());
holder.setText(R.id.tv_nayin,item.getDay().getNy());
if(mCangganAdapter == null){
mCangganAdapter = new CangGanAdapter(mContext,R.layout.paipan_canggan_item,
item.getDay().getCg(), item.getDay().getDzGod());
rvDatas.setAdapter(mCangganAdapter);
}
if(mShenshaAdapter == null){
List<String> shenshaList = Arrays.asList(item.getDay().getShensha().split(" "));
mShenshaAdapter = new ShenshaAdapter(mContext,R.layout.paipan_shensha_item,shenshaList);
rvShenShaData.setAdapter(mShenshaAdapter);
}
break;
case 400: // 时柱
holder.setText(R.id.tv_shishen,item.getHour().getTgGod());
holder.setText(R.id.tv_tg,item.getHour().getTg());
holder.setText(R.id.tv_dz,item.getHour().getDz());
holder.setTextColor(R.id.tv_tg, Color.parseColor(FiveElementsHelper.getElementInfo(item.getHour().getTg()).get("color")));
holder.setTextColor(R.id.tv_dz, Color.parseColor(FiveElementsHelper.getElementInfo(item.getHour().getDz()).get("color")));
holder.setText(R.id.tv_xingyun,item.getHour().getDzStarCs());
holder.setText(R.id.tv_zizuo,item.getHour().getDzSelfCs());
holder.setText(R.id.tv_kongwang,item.getHour().getKw());
holder.setText(R.id.tv_nayin,item.getHour().getNy());
if(mCangganAdapter == null){
mCangganAdapter = new CangGanAdapter(mContext,R.layout.paipan_canggan_item,
item.getHour().getCg(), item.getHour().getDzGod());
rvDatas.setAdapter(mCangganAdapter);
}
if(mShenshaAdapter == null){
List<String> shenshaList = Arrays.asList(item.getHour().getShensha().split(" "));
mShenshaAdapter = new ShenshaAdapter(mContext,R.layout.paipan_shensha_item,shenshaList);
rvShenShaData.setAdapter(mShenshaAdapter);
}
break;
}
}
}

View File

@@ -1,661 +0,0 @@
package com.ckkj.water.plate.entity;
import com.google.gson.annotations.SerializedName;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author fengxiaoyang
* @date 2025/8/5
* @description TODO: 描述该类的作用
*/
@NoArgsConstructor
@Data
public class BaziResultBean implements Serializable {
@SerializedName("base_info")
private BaseInfoDTO baseInfo;
@SerializedName("detail_info")
private DetailInfoDTO detailInfo;
@NoArgsConstructor
@Data
public static class BaseInfoDTO implements Serializable {
@SerializedName("sex")
private String sex;
@SerializedName("name")
private String name;
@SerializedName("gongli")
private String gongli;
@SerializedName("nongli")
private String nongli;
@SerializedName("qiyun")
private String qiyun;
@SerializedName("jiaoyun")
private String jiaoyun;
@SerializedName("taiyuan")
private String taiyuan;
@SerializedName("taiyuan_nayin")
private String taiyuanNayin;
@SerializedName("taixi")
private String taixi;
@SerializedName("taixi_nayin")
private String taixiNayin;
@SerializedName("minggong")
private String minggong;
@SerializedName("minggong_nayin")
private String minggongNayin;
@SerializedName("shengong")
private String shengong;
@SerializedName("shengong_nayin")
private String shengongNayin;
@SerializedName("shengxiao")
private String shengxiao;
@SerializedName("xingzuo")
private String xingzuo;
@SerializedName("siling")
private String siling;
@SerializedName("jiaoyun_mang")
private String jiaoyunMang;
@SerializedName("xingxiu")
private String xingxiu;
@SerializedName("minggua")
private MingguaDTO minggua;
@SerializedName("wuxing_wangdu")
private String wuxingWangdu;
@SerializedName("tiangan_liuyi")
private String tianganLiuyi;
@SerializedName("dizhi_liuyi")
private String dizhiLiuyi;
@SerializedName("zhengge")
private String zhengge;
@SerializedName("xiyongshen")
private XiyongshenDTO xiyongshen;
@SerializedName("wuxing_xiji")
private String wuxingXiji;
@NoArgsConstructor
@Data
public static class MingguaDTO implements Serializable {
@SerializedName("minggua_name")
private String mingguaName;
@SerializedName("minggua_fangwei")
private String mingguaFangwei;
}
@NoArgsConstructor
@Data
public static class XiyongshenDTO implements Serializable {
@SerializedName("qiangruo")
private String qiangruo;
@SerializedName("xiyongshen")
private String xiyongshen;
@SerializedName("jishen")
private String jishen;
@SerializedName("xiyongshen_desc")
private String xiyongshenDesc;
@SerializedName("jin_number")
private Integer jinNumber;
@SerializedName("mu_number")
private Integer muNumber;
@SerializedName("shui_number")
private Integer shuiNumber;
@SerializedName("huo_number")
private Integer huoNumber;
@SerializedName("tu_number")
private Integer tuNumber;
@SerializedName("zidang")
private Integer zidang;
@SerializedName("yidang")
private Integer yidang;
@SerializedName("zidang_percent")
private String zidangPercent;
@SerializedName("yidang_percent")
private String yidangPercent;
@SerializedName("tonglei")
private String tonglei;
@SerializedName("yilei")
private String yilei;
@SerializedName("rizhu_tiangan")
private String rizhuTiangan;
@SerializedName("jin_score")
private Integer jinScore;
@SerializedName("mu_score")
private Integer muScore;
@SerializedName("shui_score")
private Integer shuiScore;
@SerializedName("huo_score")
private Integer huoScore;
@SerializedName("tu_score")
private Integer tuScore;
@SerializedName("jin_score_percent")
private String jinScorePercent;
@SerializedName("mu_score_percent")
private String muScorePercent;
@SerializedName("shui_score_percent")
private String shuiScorePercent;
@SerializedName("huo_score_percent")
private String huoScorePercent;
@SerializedName("tu_score_percent")
private String tuScorePercent;
@SerializedName("yinyang")
private String yinyang;
}
}
@NoArgsConstructor
@Data
public static class DetailInfoDTO implements Serializable {
@SerializedName("dayun_info")
private List<DayunInfoDTO> dayunInfo;
@SerializedName("dayun_born_info")
private DayunInfoDTO dayunBornInfo;
@SerializedName("sizhu_info")
private SizhuInfoDTO sizhuInfo;
@SerializedName("taishen_info")
private TaishenInfoDTO taishenInfo;
@NoArgsConstructor
@Data
public static class SizhuInfoDTO implements Serializable {
@SerializedName("year")
private YearDTO year;
@SerializedName("month")
private MonthDTO month;
@SerializedName("day")
private DayDTO day;
@SerializedName("hour")
private HourDTO hour;
@NoArgsConstructor
@Data
public static class YearDTO implements Serializable {
@SerializedName("tg_god")
private String tgGod;
@SerializedName("tg")
private String tg;
@SerializedName("dz")
private String dz;
@SerializedName("cg")
private List<String> cg;
@SerializedName("dz_god")
private List<String> dzGod;
@SerializedName("dz_star_cs")
private String dzStarCs;
@SerializedName("dz_self_cs")
private String dzSelfCs;
@SerializedName("kw")
private String kw;
@SerializedName("ny")
private String ny;
@SerializedName("wx")
private String wx;
@SerializedName("xun")
private String xun;
@SerializedName("shensha")
private String shensha;
}
@NoArgsConstructor
@Data
public static class MonthDTO implements Serializable {
@SerializedName("tg_god")
private String tgGod;
@SerializedName("tg")
private String tg;
@SerializedName("dz")
private String dz;
@SerializedName("cg")
private List<String> cg;
@SerializedName("dz_god")
private List<String> dzGod;
@SerializedName("dz_star_cs")
private String dzStarCs;
@SerializedName("dz_self_cs")
private String dzSelfCs;
@SerializedName("kw")
private String kw;
@SerializedName("ny")
private String ny;
@SerializedName("wx")
private String wx;
@SerializedName("xun")
private String xun;
@SerializedName("shensha")
private String shensha;
}
@NoArgsConstructor
@Data
public static class DayDTO implements Serializable {
@SerializedName("tg_god")
private String tgGod;
@SerializedName("tg")
private String tg;
@SerializedName("dz")
private String dz;
@SerializedName("cg")
private List<String> cg;
@SerializedName("dz_god")
private List<String> dzGod;
@SerializedName("dz_star_cs")
private String dzStarCs;
@SerializedName("dz_self_cs")
private String dzSelfCs;
@SerializedName("kw")
private String kw;
@SerializedName("ny")
private String ny;
@SerializedName("wx")
private String wx;
@SerializedName("xun")
private String xun;
@SerializedName("shensha")
private String shensha;
}
@NoArgsConstructor
@Data
public static class HourDTO implements Serializable {
@SerializedName("tg_god")
private String tgGod;
@SerializedName("tg")
private String tg;
@SerializedName("dz")
private String dz;
@SerializedName("cg")
private List<String> cg;
@SerializedName("dz_god")
private List<String> dzGod;
@SerializedName("dz_star_cs")
private String dzStarCs;
@SerializedName("dz_self_cs")
private String dzSelfCs;
@SerializedName("kw")
private String kw;
@SerializedName("ny")
private String ny;
@SerializedName("wx")
private String wx;
@SerializedName("xun")
private String xun;
@SerializedName("shensha")
private String shensha;
}
}
@NoArgsConstructor
@Data
public static class TaishenInfoDTO implements Serializable {
@SerializedName("taiyuan")
private TaiyuanDTO taiyuan;
@SerializedName("taixi")
private TaixiDTO taixi;
@SerializedName("minggong")
private MinggongDTO minggong;
@SerializedName("shengong")
private ShengongDTO shengong;
@NoArgsConstructor
@Data
public static class TaiyuanDTO implements Serializable {
@SerializedName("ganzhi")
private String ganzhi;
@SerializedName("xun")
private String xun;
@SerializedName("kongwang")
private String kongwang;
@SerializedName("changsheng")
private String changsheng;
@SerializedName("gan")
private String gan;
@SerializedName("zhi")
private String zhi;
@SerializedName("dz_cg")
private List<String> dzCg;
@SerializedName("tg_god")
private String tgGod;
@SerializedName("dz_god")
private List<String> dzGod;
@SerializedName("dz_star_cs")
private String dzStarCs;
@SerializedName("dz_self_cs")
private String dzSelfCs;
@SerializedName("nayin")
private String nayin;
@SerializedName("wuxing")
private String wuxing;
@SerializedName("tg_liuyi")
private String tgLiuyi;
@SerializedName("dz_liuyi")
private String dzLiuyi;
@SerializedName("shensha")
private String shensha;
}
@NoArgsConstructor
@Data
public static class TaixiDTO implements Serializable {
@SerializedName("ganzhi")
private String ganzhi;
@SerializedName("xun")
private String xun;
@SerializedName("kongwang")
private String kongwang;
@SerializedName("changsheng")
private String changsheng;
@SerializedName("gan")
private String gan;
@SerializedName("zhi")
private String zhi;
@SerializedName("dz_cg")
private List<String> dzCg;
@SerializedName("tg_god")
private String tgGod;
@SerializedName("dz_god")
private List<String> dzGod;
@SerializedName("dz_star_cs")
private String dzStarCs;
@SerializedName("dz_self_cs")
private String dzSelfCs;
@SerializedName("nayin")
private String nayin;
@SerializedName("wuxing")
private String wuxing;
@SerializedName("tg_liuyi")
private String tgLiuyi;
@SerializedName("dz_liuyi")
private String dzLiuyi;
@SerializedName("shensha")
private String shensha;
}
@NoArgsConstructor
@Data
public static class MinggongDTO implements Serializable {
@SerializedName("ganzhi")
private String ganzhi;
@SerializedName("xun")
private String xun;
@SerializedName("kongwang")
private String kongwang;
@SerializedName("changsheng")
private String changsheng;
@SerializedName("gan")
private String gan;
@SerializedName("zhi")
private String zhi;
@SerializedName("dz_cg")
private List<String> dzCg;
@SerializedName("tg_god")
private String tgGod;
@SerializedName("dz_god")
private List<String> dzGod;
@SerializedName("dz_star_cs")
private String dzStarCs;
@SerializedName("dz_self_cs")
private String dzSelfCs;
@SerializedName("nayin")
private String nayin;
@SerializedName("wuxing")
private String wuxing;
@SerializedName("tg_liuyi")
private String tgLiuyi;
@SerializedName("dz_liuyi")
private String dzLiuyi;
@SerializedName("shensha")
private String shensha;
}
@NoArgsConstructor
@Data
public static class ShengongDTO implements Serializable {
@SerializedName("ganzhi")
private String ganzhi;
@SerializedName("xun")
private String xun;
@SerializedName("kongwang")
private String kongwang;
@SerializedName("changsheng")
private String changsheng;
@SerializedName("gan")
private String gan;
@SerializedName("zhi")
private String zhi;
@SerializedName("dz_cg")
private List<String> dzCg;
@SerializedName("tg_god")
private String tgGod;
@SerializedName("dz_god")
private List<String> dzGod;
@SerializedName("dz_star_cs")
private String dzStarCs;
@SerializedName("dz_self_cs")
private String dzSelfCs;
@SerializedName("nayin")
private String nayin;
@SerializedName("wuxing")
private String wuxing;
@SerializedName("tg_liuyi")
private String tgLiuyi;
@SerializedName("dz_liuyi")
private String dzLiuyi;
@SerializedName("shensha")
private String shensha;
}
}
@NoArgsConstructor
@Data
public static class DayunInfoDTO implements Serializable {
@SerializedName("dayun_is_tongxian")
private boolean isTongXian = false;
@SerializedName("dayun_tongxian")
private String dayunTongxian;
@SerializedName("dayun_index")
private Integer dayunIndex;
@SerializedName("dayun_start_year")
private Integer dayunStartYear;
@SerializedName("dayun_start_age")
private Integer dayunStartAge;
@SerializedName("dayun_end_year")
private Integer dayunEndYear;
@SerializedName("dayun_end_age")
private Integer dayunEndAge;
@SerializedName("dayun_start_ganzhi")
private String dayunStartGanzhi;
@SerializedName("dayun_xun")
private String dayunXun;
@SerializedName("dayun_kongwang")
private String dayunKongwang;
@SerializedName("dayun_shishen")
private String dayunShishen;
@SerializedName("dayun_changsheng")
private String dayunChangsheng;
@SerializedName("dayun_year_tg")
private String dayunYearTg;
@SerializedName("dayun_year_dz")
private String dayunYearDz;
@SerializedName("dayun_year_cg")
private List<String> dayunYearCg;
@SerializedName("dayun_year_tg_god")
private String dayunYearTgGod;
@SerializedName("dayun_year_dz_god")
private List<String> dayunYearDzGod;
@SerializedName("dayun_dz_star_cs")
private String dayunDzStarCs;
@SerializedName("dayun_dz_self_cs")
private String dayunDzSelfCs;
@SerializedName("dayun_nayin")
private String dayunNayin;
@SerializedName("dayun_wuxing")
private String dayunWuxing;
@SerializedName("dayun_tg_liuyi")
private String dayunTgLiuyi;
@SerializedName("dayun_dz_liuyi")
private String dayunDzLiuyi;
@SerializedName("liunian_info")
private List<LiunianInfoDTO> liunianInfo;
@SerializedName("xiaoyun_info")
private List<XiaoyunInfoDTO> xiaoyunInfo;
@SerializedName("dayun_shensha")
private String dayunShensha;
@NoArgsConstructor
@Data
public static class LiunianInfoDTO implements Serializable {
@SerializedName("liunian_index")
private Integer liunianIndex;
@SerializedName("liunian_year")
private Integer liunianYear;
@SerializedName("liunian_age")
private Integer liunianAge;
@SerializedName("liunian_ganzhi")
private String liunianGanzhi;
@SerializedName("liunian_xun")
private String liunianXun;
@SerializedName("liunian_kongwang")
private String liunianKongwang;
@SerializedName("liunian_shishen")
private String liunianShishen;
@SerializedName("liunian_changsheng")
private String liunianChangsheng;
@SerializedName("liunian_jieqi")
private List<LiunianJieqiDTO> liunianJieqi;
@SerializedName("liunian_year_tg")
private String liunianYearTg;
@SerializedName("liunian_year_dz")
private String liunianYearDz;
@SerializedName("liunian_year_cg")
private List<String> liunianYearCg;
@SerializedName("liunian_tg_god")
private String liunianTgGod;
@SerializedName("liunian_dz_god")
private List<String> liunianDzGod;
@SerializedName("liunian_dz_star_cs")
private String liunianDzStarCs;
@SerializedName("liunian_dz_self_cs")
private String liunianDzSelfCs;
@SerializedName("liunian_nayin")
private String liunianNayin;
@SerializedName("liunian_wuxing")
private String liunianWuxing;
@SerializedName("liunian_tg_liuyi")
private String liunianTgLiuyi;
@SerializedName("liunian_dz_liuyi")
private String liunianDzLiuyi;
@SerializedName("liunian_shensha")
private String liunianShensha;
@SerializedName("liuyue_info")
private List<LiuyueInfoDTO> liuyueInfo;
@NoArgsConstructor
@Data
public static class LiunianJieqiDTO implements Serializable {
@SerializedName("jieqi_name")
private String jieqiName;
@SerializedName("jieqi_solar_ymdhms")
private String jieqiSolarYmdhms;
@SerializedName("jieqi_lunar_ymdhms_isleap")
private String jieqiLunarYmdhmsIsleap;
@SerializedName("jieqi_lunar_ymdhms")
private String jieqiLunarYmdhms;
}
@NoArgsConstructor
@Data
public static class LiuyueInfoDTO implements Serializable {
@SerializedName("liuyue_index")
private Integer liuyueIndex;
@SerializedName("liuyue_month")
private String liuyueMonth;
@SerializedName("liuyue_ganzhi")
private String liuyueGanzhi;
@SerializedName("liuyue_xun")
private String liuyueXun;
@SerializedName("liuyue_kongwang")
private String liuyueKongwang;
@SerializedName("liuyue_shishen")
private String liuyueShishen;
@SerializedName("liuyue_changsheng")
private String liuyueChangsheng;
@SerializedName("liuyue_month_tg")
private String liuyueMonthTg;
@SerializedName("liuyue_month_dz")
private String liuyueMonthDz;
@SerializedName("liuyue_month_cg")
private List<String> liuyueMonthCg;
@SerializedName("liuyue_month_tg_god")
private String liuyueMonthTgGod;
@SerializedName("liuyue_month_dz_god")
private List<String> liuyueMonthDzGod;
@SerializedName("liuyue_dz_star_cs")
private String liuyueDzStarCs;
@SerializedName("liuyue_dz_self_cs")
private String liuyueDzSelfCs;
@SerializedName("liuyue_nayin")
private String liuyueNayin;
@SerializedName("liuyue_wuxing")
private String liuyueWuxing;
@SerializedName("liuyue_tg_liuyi")
private String liuyueTgLiuyi;
@SerializedName("liuyue_dz_liuyi")
private String liuyueDzLiuyi;
@SerializedName("liuyue_shensha")
private String liuyueShensha;
}
}
@NoArgsConstructor
@Data
public static class XiaoyunInfoDTO implements Serializable {
@SerializedName("xiaoyun_index")
private Integer xiaoyunIndex;
@SerializedName("xiaoyun_year")
private Integer xiaoyunYear;
@SerializedName("xiaoyun_age")
private Integer xiaoyunAge;
@SerializedName("xiaoyun_ganzhi")
private String xiaoyunGanzhi;
@SerializedName("xiaoyun_xun")
private String xiaoyunXun;
@SerializedName("xiaoyun_kongwang")
private String xiaoyunKongwang;
@SerializedName("xiaoyun_shishen")
private String xiaoyunShishen;
@SerializedName("xiaoyun_changsheng")
private String xiaoyunChangsheng;
@SerializedName("xiaoyun_year_tg")
private String xiaoyunYearTg;
@SerializedName("xiaoyun_year_dz")
private String xiaoyunYearDz;
@SerializedName("xiaoyun_year_cg")
private List<String> xiaoyunYearCg;
@SerializedName("xiaoyun_tg_god")
private String xiaoyunTgGod;
@SerializedName("xiaoyun_dz_god")
private List<String> xiaoyunDzGod;
@SerializedName("xiaoyun_dz_star_cs")
private String xiaoyunDzStarCs;
@SerializedName("xiaoyun_dz_self_cs")
private String xiaoyunDzSelfCs;
@SerializedName("xiaoyun_nayin")
private String xiaoyunNayin;
@SerializedName("xiaoyun_wuxing")
private String xiaoyunWuxing;
@SerializedName("xiaoyun_tg_liuyi")
private String xiaoyunTgLiuyi;
@SerializedName("xiaoyun_dz_liuyi")
private String xiaoyunDzLiuyi;
@SerializedName("xiaoyun_shensha")
private String xiaoyunShensha;
}
}
}
}

View File

@@ -1,62 +0,0 @@
package com.ckkj.water.plate.entity;
import com.google.gson.annotations.SerializedName;
import java.io.Serializable;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author fengxiaoyang
* @date 2025/8/11
* @description TODO: 描述该类的作用
*/
@NoArgsConstructor
@Data
public class BaziSaveSuccessEntity implements Serializable {
@SerializedName("recordId")
private String recordId;
@SerializedName("savedData")
private SavedDataDTO savedData;
@SerializedName("message")
private String message;
@SerializedName("saveTime")
private String saveTime;
@NoArgsConstructor
@Data
public static class SavedDataDTO {
@SerializedName("recordId")
private String recordId;
@SerializedName("birthPlace")
private String birthPlace;
@SerializedName("gender")
private String gender;
@SerializedName("yinLiBirthTime")
private String yinLiBirthTime;
@SerializedName("siZhu")
private SiZhuDTO siZhu;
@SerializedName("name")
private String name;
@SerializedName("yangLiBirthTime")
private String yangLiBirthTime;
@SerializedName("openSolarTime")
private String openSolarTime;
@NoArgsConstructor
@Data
public static class SiZhuDTO {
@SerializedName("yueZhu")
private String yueZhu;
@SerializedName("shiZhu")
private String shiZhu;
@SerializedName("riZhu")
private String riZhu;
@SerializedName("nianZhu")
private String nianZhu;
}
}
}

View File

@@ -1,17 +0,0 @@
package com.ckkj.water.plate.entity;
public class PaipanCache {
private static BaziResultBean cachedResult;
public static void set(BaziResultBean result) {
cachedResult = result;
}
public static BaziResultBean get() {
return cachedResult;
}
public static void clear() {
cachedResult = null;
}
}

View File

@@ -1,76 +0,0 @@
package com.ckkj.water.plate.entity;
import com.google.gson.annotations.SerializedName;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author fengxiaoyang
* @date 2025/8/9
* @description TODO: 描述该类的作用
*/
@NoArgsConstructor
@Data
public class PaipanHistoryEntity implements Serializable {
@SerializedName("total")
private Integer total;
@SerializedName("pages")
private Integer pages;
@SerializedName("records")
private List<RecordsDTO> records;
@SerializedName("hasNextPage")
private Boolean hasNextPage;
@SerializedName("pageSize")
private Integer pageSize;
@SerializedName("hasPreviousPage")
private Boolean hasPreviousPage;
@SerializedName("userId")
private Long userId;
@SerializedName("pageNum")
private Integer pageNum;
@NoArgsConstructor
@Data
public static class RecordsDTO implements Serializable{
@SerializedName("id")
private String id;
@SerializedName("userId")
private Long userId;
@SerializedName("name")
private String name;
@SerializedName("gender")
private String gender;
@SerializedName("birthType")
private String birthType;
@SerializedName("yangLiBirthTime")
private String yangLiBirthTime;
@SerializedName("yinLiBirthTime")
private String yinLiBirthTime;
@SerializedName("birthPlace")
private String birthPlace;
@SerializedName("openSolarTime")
private String openSolarTime;
@SerializedName("nianZhu")
private String nianZhu;
@SerializedName("yueZhu")
private String yueZhu;
@SerializedName("riZhu")
private String riZhu;
@SerializedName("shiZhu")
private String shiZhu;
@SerializedName("apiStatus")
private Integer apiStatus;
@SerializedName("apiMessage")
private String apiMessage;
@SerializedName("requestIp")
private String requestIp;
@SerializedName("remark")
private Object remark;
}
}

View File

@@ -1,63 +0,0 @@
package com.ckkj.water.plate.mvp;
import com.ckkj.water.base.IView;
import com.ckkj.water.network.BaseBean;
import com.ckkj.water.plate.entity.BaziResultBean;
import com.ckkj.water.plate.entity.BaziSaveSuccessEntity;
import com.ckkj.water.plate.entity.PaipanHistoryEntity;
import org.json.JSONObject;
import java.util.Map;
/**
* @author fengxiaoyang
* @date 2025/7/30
* @description TODO: 描述该类的作用
*/
public class PlateContract {
public interface CallBack<T> {
void success(T msg);
void fail(String msg);
}
public interface DataModel{
//保存八字排盘结果
void saveUserBirthInfo(JSONObject json, CallBack callBack);
//开始排盘
void startPaiPanByYfjApi(Map<String,Object> map , CallBack callBack);
//获取排盘结果
void getPaipanHistoryList(Map<String,Object> map, CallBack callBack);
//删除记录
void deleteRecordByID(Map<String,Object> map, CallBack callBack);
//根据八字排盘结果ai 解析
void aiParseBaziResult(JSONObject json, CallBack callBack);
//发送消息给 AI
void sendMsgToAi(JSONObject json, AiStreamCallback callBack);
}
public interface AiStreamCallback {
void onMessage(String messageChunk); // 每次返回一段内容
void onError(String error);
void onComplete(String complateContent); // 结束
void onSessionReceived(String sessionId); // 新增接收sessionId
void loginLost();
}
public interface PlateView extends IView {
//排盘成功
void getPaipanResult(BaziResultBean bean);
//保存八字成功
void saveBaziResultSuccess(BaziSaveSuccessEntity bean);
//历史记录
void getHistorySuccess(PaipanHistoryEntity entity);
//删除成功
void deletePaipanHistorySuccess(int pos);
// 新增流式回调方法
void onStreamMessageReceived(String messageChunk);
//完成
void onStreamComplete(String complateMsg);
//提交举报完成
void commitReportSuccess(BaseBean bean);
}
}

View File

@@ -1,424 +0,0 @@
package com.ckkj.water.plate.mvp;
import static android.content.ContentValues.TAG;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import com.ckkj.water.AppConfig;
import com.ckkj.water.network.BaseBean;
import com.ckkj.water.network.BaseYfjApiBean;
import com.ckkj.water.network.NetWorkManager;
import com.ckkj.water.plate.entity.BaziResultBean;
import com.ckkj.water.plate.entity.BaziSaveSuccessEntity;
import com.ckkj.water.plate.entity.PaipanHistoryEntity;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Map;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.json.JSONException;
/**
* @author fengxiaoyang
* @date 2025/7/30
* @description TODO: 描述该类的作用
*/
public class PlateImpl implements PlateContract.DataModel{
/**
* 保存八字排盘记录
* @param json
* @param callBack
*/
@Override
public void saveUserBirthInfo(JSONObject json, PlateContract.CallBack callBack) {
try {
NetWorkManager.getRequest().startPaipan(NetWorkManager.getToken(), NetWorkManager.toRequestBody(json))
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<BaseBean<BaziSaveSuccessEntity>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull BaseBean<BaziSaveSuccessEntity> bean) {
if (bean.getCode() == 200) {
callBack.success(bean.getData());
} 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();
}
}
/**
* 排盘数据,调用三方 api
* @param map
* @param callBack
*/
@Override
public void startPaiPanByYfjApi(Map<String, Object> map, PlateContract.CallBack callBack) {
try {
// 使用getNoBaseUrlRequest()调用第三方API因为API URL是完整的
NetWorkManager.getNoBaseUrlRequest().startPaipanByYfj(NetWorkManager.getToken(), map)
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<BaseYfjApiBean<BaziResultBean>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull BaseYfjApiBean<BaziResultBean> bean) {
if (bean.getErrcode() == 0) {
// 成功返回数据
callBack.success(bean.getData());
} else {
// API返回错误
callBack.fail(bean.getErrmsg());
}
}
@Override
public void onError(@NonNull Throwable e) {
callBack.fail(e.getMessage());
}
@Override
public void onComplete() {
}
});
} catch (Exception e) {
e.printStackTrace();
callBack.fail(e.getMessage());
}
}
/**
* 排盘历史记录
* @param map
* @param callBack
*/
@Override
public void getPaipanHistoryList(Map<String, Object> map, PlateContract.CallBack callBack) {
try {
NetWorkManager.getRequest().getPaipanHistoryList(NetWorkManager.getToken())
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<BaseBean<PaipanHistoryEntity>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull BaseBean<PaipanHistoryEntity> bean) {
if(bean.getCode() == 200){
callBack.success(bean.getData());
}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 deleteRecordByID(Map<String, Object> map, PlateContract.CallBack callBack) {
try {
NetWorkManager.getRequest().deletePaipanRecordById(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) {
throw new RuntimeException(e);
}
}
/**
* 八字排盘结果AI 解析
* @param json
* @param callBack
*/
@Override
public void aiParseBaziResult(JSONObject json, PlateContract.CallBack callBack) {
try {
NetWorkManager.getRequest().aiParesBaziResult(NetWorkManager.getToken(), NetWorkManager.toRequestBody(json))
.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.getData());
} 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();
}
}
/**
* AI解盘
* @param json
* @param callBack
*/
private final OkHttpClient client = new OkHttpClient();
private Call currentCall = null; // 新增保存当前请求的Call对象
private volatile boolean isRequestStopped = false; // 新增:标记是否已停止请求
@Override
public void sendMsgToAi(JSONObject json, PlateContract.AiStreamCallback callBack) {
try {
String finalUrl = AppConfig.BASE_URL + "mobile/paiPan/ai";
Log.d(TAG, "Request URL: " + finalUrl);
Request request = new Request.Builder()
.addHeader("Authorization", "Bearer " + AppConfig.USER_TOKEN)
.post(NetWorkManager.toRequestBody(json))
.url(finalUrl)
.build();
currentCall = client.newCall(request);
isRequestStopped = false;
currentCall.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
if (isRequestStopped) return; // 如果已停止,不处理失败回调
new Handler(Looper.getMainLooper()).post(() -> {
if (callBack != null) callBack.onError(e.getMessage());
});
}
@Override
public void onResponse(Call call, Response response) {
if (isRequestStopped) return;
if (!response.isSuccessful()) {
new Handler(Looper.getMainLooper()).post(() -> {
if (callBack != null) callBack.onError("请求失败: " + response.code());
});
return;
}
InputStream inputStream = response.body().byteStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
try {
// 处理SSE流式数据
handleSSEStream(reader, callBack);
} catch (Exception e) {
new Handler(Looper.getMainLooper()).post(() -> {
if (callBack != null) callBack.onError("解析异常: " + e.getMessage());
});
} finally {
try {
reader.close();
response.close();
} catch (IOException ignored) {}
}
}
});
} catch (Exception e) {
new Handler(Looper.getMainLooper()).post(() -> {
if (callBack != null) callBack.onError("请求异常: " + e.getMessage());
});
}
}
/**
* 处理SSE流式数据
*/
private void handleSSEStream(BufferedReader reader, PlateContract.AiStreamCallback callBack) throws IOException {
String line;
StringBuilder currentEvent = new StringBuilder();
String currentEventType = null;
while ((line = reader.readLine()) != null && !isRequestStopped) {
if (line.trim().isEmpty()) {
// 空行表示一个事件结束,处理当前事件
if (currentEventType != null && currentEvent.length() > 0) {
processEvent(currentEventType, currentEvent.toString(), callBack);
currentEvent.setLength(0);
currentEventType = null;
}
} else if (line.startsWith("event:")) {
// 事件类型
currentEventType = line.substring(6).trim();
} else if (line.startsWith("data:")) {
// 事件数据
String data = line.substring(5).trim();
currentEvent.append(data);
}
}
// 处理最后一个事件
if (currentEventType != null && currentEvent.length() > 0) {
processEvent(currentEventType, currentEvent.toString(), callBack);
}
}
/**
* 处理单个事件
*/
private void processEvent(String eventType, String data, PlateContract.AiStreamCallback callBack) {
new Handler(Looper.getMainLooper()).post(() -> {
try {
switch (eventType) {
case "start":
// 开始事件,可以在这里做一些初始化
Log.d(TAG, "AI解盘开始: " + data);
break;
case "paiPanInfo":
// 排盘信息事件
Log.d(TAG, "排盘信息: " + data);
break;
case "api-info":
// API信息事件
Log.d(TAG, "API信息: " + data);
break;
case "chunk":
// 内容块事件,这是主要的文本内容
try {
JSONObject chunkData = new JSONObject(data);
String content = chunkData.optString("content", "");
boolean hasNewline = chunkData.optBoolean("hasNewline", false);
boolean isMarkdown = chunkData.optBoolean("isMarkdown", false);
// 发送内容块到回调
if (callBack != null && !content.isEmpty()) {
callBack.onMessage(content);
}
} catch (JSONException e) {
Log.e(TAG, "解析chunk数据失败: " + e.getMessage());
}
break;
case "request-id":
// 请求ID事件
Log.d(TAG, "请求ID: " + data);
break;
case "complete":
// 完成事件
Log.d(TAG, "AI解盘完成: " + data);
if (callBack != null) {
callBack.onComplete(data);
}
break;
default:
Log.d(TAG, "未知事件类型: " + eventType + ", 数据: " + data);
break;
}
} catch (Exception e) {
Log.e(TAG, "处理事件失败: " + e.getMessage());
}
});
}
/**
* 停止当前请求
*/
public void stopCurrentRequest() {
isRequestStopped = true;
if (currentCall != null && !currentCall.isCanceled()) {
currentCall.cancel();
currentCall = null;
}
}
}

View File

@@ -1,225 +0,0 @@
//package com.ckkj.water.plate.mvp;
//
//import com.ckkj.water.base.BasePresenter;
//import com.ckkj.water.network.BaseBean;
//import com.ckkj.water.plate.entity.BaziResultBean;
//import com.ckkj.water.plate.entity.BaziSaveSuccessEntity;
//import com.ckkj.water.plate.entity.PaipanHistoryEntity;
//
//import org.json.JSONException;
//import org.json.JSONObject;
//
//import java.util.HashMap;
//import java.util.Map;
//
///**
// * @author fengxiaoyang
// * @date 2025/7/30
// * @description TODO: 描述该类的作用
// */
//
//public class PlatePresenter extends BasePresenter<PlateContract.PlateView> {
// private PlateImpl impl;
//
// public PlatePresenter(PlateImpl impl) {
// this.impl = impl;
// }
//
// /**
// * 排盘,直接调用缘份居 Api
// * @param map
// */
// public void startPaiPan(Map<String, Object> map) {
// impl.startPaiPanByYfjApi(map, new PlateContract.CallBack<BaziResultBean>() {
// @Override
// public void success(BaziResultBean entity) {
// if(PlatePresenter.this.getView() != null){
// if(PlatePresenter.this.getView() != null){
// PlatePresenter.this.getView().getPaipanResult(entity);
// }
// }
// }
//
// @Override
// public void fail(String msg) {
// if(PlatePresenter.this.getView() != null){
// PlatePresenter.this.getView().showError(msg);
// }
// }
// });
// }
//
// /**
// * 上传八字结果
// *
// * @param result
// * @param cityData
// * @param timeType
// */
// public void uploadBaziResult(BaziResultBean result, CityDataEntity cityData, int timeType) {
// try {
// BaziResultBean.BaseInfoDTO baseInfoDTO = result.getBaseInfo();
// BaziResultBean.DetailInfoDTO.SizhuInfoDTO sizhuInfoDTO = result.getDetailInfo().getSizhuInfo();
// JSONObject json = new JSONObject();
// json.put("name",baseInfoDTO.getName());
// json.put("gender",baseInfoDTO.getSex().equals("乾造")? "0" : "1");
// json.put("birthType",timeType == 2001 ? "1":"0");
// json.put("yangLiBirthTime",baseInfoDTO.getGongli());
// json.put("yinLiBirthTime",baseInfoDTO.getNongli());
// json.put("birthPlace",cityData == null ? "北京市": cityData.getCityName());
// json.put("province",cityData == null ? "北京市": cityData.getProvinceName());
// json.put("city",cityData == null ? "北京": cityData.getCityName());
// json.put("openSolarTime","2");
// json.put("nianZhu",sizhuInfoDTO.getYear().getTg() + "," + sizhuInfoDTO.getYear().getDz());
// json.put("yueZhu",sizhuInfoDTO.getMonth().getTg() + "," + sizhuInfoDTO.getMonth().getDz());
// json.put("riZhu",sizhuInfoDTO.getDay().getTg() + "," + sizhuInfoDTO.getDay().getDz());
// json.put("shiZhu",sizhuInfoDTO.getHour().getTg() + "," + sizhuInfoDTO.getHour().getDz());
// impl.saveUserBirthInfo(json, new PlateContract.CallBack<BaziSaveSuccessEntity>() {
// @Override
// public void success(BaziSaveSuccessEntity bean) {
// if(PlatePresenter.this.getView() != null){
// if(PlatePresenter.this.getView() != null){
// PlatePresenter.this.getView().saveBaziResultSuccess(bean);
// }
// }
// }
//
// @Override
// public void fail(String msg) {
// if(PlatePresenter.this.getView() != null){
// if(PlatePresenter.this.getView() != null){
// PlatePresenter.this.getView().showError(msg);
// }
// }
// }
// });
// } catch (JSONException e) {
// throw new RuntimeException(e);
// }
// }
//
// /**
// * 获取历史运势
// * @param page
// */
// public void getHistoryDatas(int page) {
// Map<String, Object> map = new HashMap<>();
// map.put("pageNum", page);
// map.put("pageSize", 10);
// impl.getPaipanHistoryList(map, new PlateContract.CallBack<PaipanHistoryEntity>() {
//
// @Override
// public void success(PaipanHistoryEntity entity) {
// if(PlatePresenter.this.getView() != null){
// PlatePresenter.this.getView().getHistorySuccess(entity);
// }
// }
//
// @Override
// public void fail(String msg) {
// if(PlatePresenter.this.getView() != null){
// PlatePresenter.this.getView().showError(msg);
// }
// }
// });
// }
//
// /**
// * 删除记录
// * @param id
// */
// public void deleteRecordByID(String id,int pos) {
// Map<String, Object> map = new HashMap<>();
// map.put("recordId", id);
// impl.deleteRecordByID(map, new PlateContract.CallBack<BaseBean>() {
// @Override
// public void success(BaseBean bean) {
// if(PlatePresenter.this.getView() != null){
// PlatePresenter.this.getView().deletePaipanHistorySuccess(pos);
// }
// }
//
// @Override
// public void fail(String msg) {
// if(PlatePresenter.this.getView() != null){
// PlatePresenter.this.getView().showError(msg);
// }
// }
// });
// }
//
// /**
// * ai 分析八字
// * @param mSaveEntity
// */
// public void AiParseBaziResult(BaziSaveSuccessEntity mSaveEntity) {
// try {
// JSONObject json = new JSONObject();
// json.put("resultId", mSaveEntity.getRecordId());
// impl.sendMsgToAi(json, new PlateContract.AiStreamCallback() {
// @Override
// public void onMessage(String messageChunk) {
// if (PlatePresenter.this.getView() != null) {
// PlatePresenter.this.getView().onStreamMessageReceived(messageChunk);
// }
// }
//
// @Override
// public void onError(String error) {
// if (PlatePresenter.this.getView() != null) {
// PlatePresenter.this.getView().showError(error);
// }
// }
//
// @Override
// public void onComplete(String complateContent) {
// if (PlatePresenter.this.getView() != null) {
// PlatePresenter.this.getView().onStreamComplete(complateContent);
// }
// }
//
// @Override
// public void onSessionReceived(String sessionId) {
// // 这个回调在当前场景下可能不需要,但保留接口一致性
// // Log.d("PlatePresenter", "Session received: " + sessionId);
// }
//
// @Override
// public void loginLost() {
// if (PlatePresenter.this.getView() != null) {
// // 处理登录失效的情况
// // 这里可以根据需要跳转到登录页面
// // Log.w("PlatePresenter", "Login lost");
// }
// }
// });
// } catch (JSONException e) {
// throw new RuntimeException(e);
// }
// }
//
//
// /**
// * 举报
// * @param reason
// */
// public void commitReport(String reason) {
// Map<String, Object> map = new HashMap<>();
// map.put("content", reason);
// new IndexImpl().commitReport(map, new IndexContract.CallBack<BaseBean>() {
// @Override
// public void success(BaseBean bean) {
// if (PlatePresenter.this.getView() != null) {
// PlatePresenter.this.getView().commitReportSuccess(bean);
// }
// }
//
// @Override
// public void fail(String msg) {
// if (PlatePresenter.this.getView() != null) {
// PlatePresenter.this.getView().showError(msg);
// }
// }
// });
// }
//}

View File

@@ -2,7 +2,7 @@ package com.ckkj.water.utils;
import android.util.Log; import android.util.Log;
public class ClickUtils { public class FastClickUtils {
/** /**
* Android优雅地处理按钮重复点击的几种方法 * Android优雅地处理按钮重复点击的几种方法

View File

@@ -243,6 +243,20 @@
<string name="avatar_update_success">Avatar updated successfully</string> <string name="avatar_update_success">Avatar updated successfully</string>
<string name="file_not_exist">File does not exist</string> <string name="file_not_exist">File does not exist</string>
<string name="device_connected_success">Device connected successfully</string>
<string name="connection_success">Connection successful</string>
<string name="device_disconnected">Device disconnected</string>
<string name="device_not_initialized">Device connection is not initialized</string>
<string name="device_connecting_please_wait">Device is connecting, please try again later</string>
<string name="device_not_connected_retry">Device is not connected, please try again</string>
<string name="scan_failed">Scan failed: %1$s</string>
<!-- End --> <!-- End -->

View File

@@ -229,6 +229,20 @@
<string name="avatar_update_success">头像修改成功</string> <string name="avatar_update_success">头像修改成功</string>
<string name="file_not_exist">文件不存在</string> <string name="file_not_exist">文件不存在</string>
<string name="device_connected_success">设备连接成功</string>
<string name="connection_success">连接成功</string>
<string name="device_disconnected">设备已断开</string>
<string name="device_not_initialized">设备连接未初始化</string>
<string name="device_connecting_please_wait">设备连接中,请稍后再试</string>
<string name="device_not_connected_retry">设备未连接,请稍后重试</string>
<string name="scan_failed">扫描失败: %1$s</string>
<!--结束--> <!--结束-->