diff --git a/app/build.gradle b/app/build.gradle index f614ad0..c103eb5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -49,5 +49,6 @@ dependencies { implementation 'com.google.code.gson:gson:2.13.1' implementation 'com.google.zxing:core:3.5.3' implementation 'com.journeyapps:zxing-android-embedded:4.3.0' - + implementation 'io.github.scwang90:refresh-layout-kernel:2.0.6' //核心必须依赖 + implementation 'io.github.scwang90:refresh-footer-classics:2.0.6' //经典加载 } \ No newline at end of file diff --git a/app/src/main/java/com/example/beijingnopowercon/adapter/DeviceListAdapter.java b/app/src/main/java/com/example/beijingnopowercon/adapter/DeviceListAdapter.java new file mode 100644 index 0000000..7845edd --- /dev/null +++ b/app/src/main/java/com/example/beijingnopowercon/adapter/DeviceListAdapter.java @@ -0,0 +1,59 @@ +package com.example.beijingnopowercon.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.databinding.DataBindingUtil; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.beijingnopowercon.BR; +import com.example.beijingnopowercon.R; +import com.example.beijingnopowercon.data.DeviceInfo; +import com.example.beijingnopowercon.data.RecordUse; +import com.example.beijingnopowercon.databinding.ItemDeviceBinding; +import com.example.beijingnopowercon.databinding.ItemRecordBinding; + +import java.util.List; + +public class DeviceListAdapter extends RecyclerView.Adapter { + private List list; + private Context context; + private LayoutInflater inflater; + + public DeviceListAdapter(Context context) { + this.context = context; + inflater = LayoutInflater.from(context); + } + + public void setList(List list) { + this.list = list; + } + + @NonNull + @Override + public MyViewHoder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + ItemDeviceBinding binding = DataBindingUtil.inflate(inflater, R.layout.item_device, parent, false); + return new MyViewHoder(binding); + } + + @Override + public void onBindViewHolder(@NonNull MyViewHoder holder, int position) { + holder.binding.setVariable(BR.data, list.get(position)); + } + + @Override + public int getItemCount() { + return list == null ? 0 : list.size(); + } + + public class MyViewHoder extends RecyclerView.ViewHolder { + private ItemDeviceBinding binding; + + public MyViewHoder(ItemDeviceBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + } +} diff --git a/app/src/main/java/com/example/beijingnopowercon/adapter/RecordListAdapter.java b/app/src/main/java/com/example/beijingnopowercon/adapter/RecordListAdapter.java new file mode 100644 index 0000000..b5d482f --- /dev/null +++ b/app/src/main/java/com/example/beijingnopowercon/adapter/RecordListAdapter.java @@ -0,0 +1,57 @@ +package com.example.beijingnopowercon.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.databinding.DataBindingUtil; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.beijingnopowercon.BR; +import com.example.beijingnopowercon.R; +import com.example.beijingnopowercon.data.RecordUse; +import com.example.beijingnopowercon.databinding.ItemRecordBinding; + +import java.util.List; + +public class RecordListAdapter extends RecyclerView.Adapter { + private List list; + private Context context; + private LayoutInflater inflater; + + public RecordListAdapter(Context context) { + this.context = context; + inflater = LayoutInflater.from(context); + } + + public void setList(List list) { + this.list = list; + } + + @NonNull + @Override + public MyViewHoder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + ItemRecordBinding binding = DataBindingUtil.inflate(inflater, R.layout.item_record, parent, false); + return new MyViewHoder(binding); + } + + @Override + public void onBindViewHolder(@NonNull MyViewHoder holder, int position) { + holder.binding.setVariable(BR.data, list.get(position)); + } + + @Override + public int getItemCount() { + return list == null ? 0 : list.size(); + } + + public class MyViewHoder extends RecyclerView.ViewHolder { + private ItemRecordBinding binding; + + public MyViewHoder(ItemRecordBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + } +} diff --git a/app/src/main/java/com/example/beijingnopowercon/base/MyApplication.java b/app/src/main/java/com/example/beijingnopowercon/base/MyApplication.java index 4344558..5c9543c 100644 --- a/app/src/main/java/com/example/beijingnopowercon/base/MyApplication.java +++ b/app/src/main/java/com/example/beijingnopowercon/base/MyApplication.java @@ -29,7 +29,8 @@ public class MyApplication extends Application { public static MyApplication getApplication() { return application; } - public static String url="http://192.168.137.1:8091/api"; + // public static String url="http://192.168.137.1:8091/api"; + public static String url="http://119.45.202.115:8091/api"; @Override public void onCreate() { super.onCreate(); diff --git a/app/src/main/java/com/example/beijingnopowercon/data/DeviceInfo.java b/app/src/main/java/com/example/beijingnopowercon/data/DeviceInfo.java index 20ec1c2..eb43bee 100644 --- a/app/src/main/java/com/example/beijingnopowercon/data/DeviceInfo.java +++ b/app/src/main/java/com/example/beijingnopowercon/data/DeviceInfo.java @@ -164,8 +164,16 @@ public class DeviceInfo { return deviceState; } + private String useStateName; private String deviceStateName; + public String getUseStateName() { + if (useState.equals("1")){ + return "使用中"; + } + return "空闲"; + } + public String getDeviceStateName() { if (useState.equals("1")){ return "使用中"; diff --git a/app/src/main/java/com/example/beijingnopowercon/data/RecordUse.java b/app/src/main/java/com/example/beijingnopowercon/data/RecordUse.java new file mode 100644 index 0000000..49cd5b6 --- /dev/null +++ b/app/src/main/java/com/example/beijingnopowercon/data/RecordUse.java @@ -0,0 +1,137 @@ +package com.example.beijingnopowercon.data; + +import java.util.Date; + +/** + * 使用记录对象 device_record_use + * + * @author ruoyi + * @date 2025-05-19 + */ +public class RecordUse { + + + private String deviceId; + + /** + * 设备编码 + */ + + private String deviceCode; + + /** + * 设备名称 + */ + + private String deviceName; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 开锁时间 + */ + private String openTime; + + /** + * 关锁时间 + */ + private String closeTime; + + /** + * 使用时间(小时) + */ + private double useTime; + + /** + * 使用状态 + */ + private String useState; + private String useStateName; + + public String getUseStateName() { + if (useState.equals("1")){ + return "使用中"; + } + return "已完成"; + } + + /** + * 借用人 + */ + private String useUser; + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceCode() { + return deviceCode; + } + + public void setDeviceCode(String deviceCode) { + this.deviceCode = deviceCode; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getOpenTime() { + return openTime; + } + + public void setOpenTime(String openTime) { + this.openTime = openTime; + } + + public String getCloseTime() { + return closeTime; + } + + public void setCloseTime(String closeTime) { + this.closeTime = closeTime; + } + + public double getUseTime() { + return useTime; + } + + public void setUseTime(double useTime) { + this.useTime = useTime; + } + + public String getUseState() { + return useState; + } + + public void setUseState(String useState) { + this.useState = useState; + } + + public String getUseUser() { + return useUser; + } + + public void setUseUser(String useUser) { + this.useUser = useUser; + } +} diff --git a/app/src/main/java/com/example/beijingnopowercon/ui/gallery/GalleryFragment.java b/app/src/main/java/com/example/beijingnopowercon/ui/gallery/GalleryFragment.java index 223418f..19264ae 100644 --- a/app/src/main/java/com/example/beijingnopowercon/ui/gallery/GalleryFragment.java +++ b/app/src/main/java/com/example/beijingnopowercon/ui/gallery/GalleryFragment.java @@ -5,28 +5,61 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; +import com.example.beijingnopowercon.adapter.RecordListAdapter; +import com.example.beijingnopowercon.base.BaseFragment; +import com.example.beijingnopowercon.data.RecordUse; import com.example.beijingnopowercon.databinding.FragmentGalleryBinding; +import com.example.beijingnopowercon.okgo.MyRecultCall; +import com.example.beijingnopowercon.okgo.MyResult; +import com.google.gson.reflect.TypeToken; +import com.lzy.okgo.OkGo; +import com.lzy.okgo.model.Response; -public class GalleryFragment extends Fragment { +import java.util.List; + +import okhttp3.MediaType; +import okhttp3.RequestBody; + +public class GalleryFragment extends BaseFragment { private FragmentGalleryBinding binding; - + private RecordListAdapter adapter; public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { GalleryViewModel galleryViewModel = new ViewModelProvider(this).get(GalleryViewModel.class); - binding = FragmentGalleryBinding.inflate(inflater, container, false); - View root = binding.getRoot(); + adapter=new RecordListAdapter(context); + binding.recordRecycler.setAdapter(adapter); + initRequest(); + return binding.getRoot(); + } + + private void initRequest() { + OkGo.post(url + "/record/selectUseList") + .execute(new MyRecultCall(dialog, context) { + @Override + public void onSuccess(Response response) { + super.onSuccess(response); + MyResult body = response.body(); + if (body.getCode()==0){ + List list=gson.fromJson(body.getDataJson(),new TypeToken>(){}.getType()); + adapter.setList(list); + adapter.notifyDataSetChanged(); + + + return; + } + Toast.makeText(context, body.getMsg(), Toast.LENGTH_LONG).show(); + } + }); - final TextView textView = binding.textGallery; - galleryViewModel.getText().observe(getViewLifecycleOwner(), textView::setText); - return root; } @Override diff --git a/app/src/main/java/com/example/beijingnopowercon/ui/home/HomeFragment.java b/app/src/main/java/com/example/beijingnopowercon/ui/home/HomeFragment.java index 4f9fedc..c0f58db 100644 --- a/app/src/main/java/com/example/beijingnopowercon/ui/home/HomeFragment.java +++ b/app/src/main/java/com/example/beijingnopowercon/ui/home/HomeFragment.java @@ -11,6 +11,7 @@ import android.widget.Toast; import androidx.annotation.NonNull; import com.example.beijingnopowercon.CustomScannerActivity; +import com.example.beijingnopowercon.adapter.DeviceListAdapter; import com.example.beijingnopowercon.base.BaseFragment; import com.example.beijingnopowercon.data.DeviceInfo; import com.example.beijingnopowercon.databinding.FragmentHomeBinding; @@ -19,33 +20,67 @@ import com.example.beijingnopowercon.okgo.MyRecultCall; import com.example.beijingnopowercon.okgo.MyResult; import com.example.beijingnopowercon.uitls.SharedPreferencesUtils; import com.google.android.material.snackbar.Snackbar; -import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; import com.google.zxing.integration.android.IntentIntegrator; import com.google.zxing.integration.android.IntentResult; import com.lzy.okgo.OkGo; import com.lzy.okgo.model.Response; +import com.scwang.smart.refresh.layout.SmartRefreshLayout; + +import java.util.List; import okhttp3.MediaType; import okhttp3.RequestBody; -public class HomeFragment extends BaseFragment implements SanInfoDialog.SanInfoDialogCall{ +public class HomeFragment extends BaseFragment implements SanInfoDialog.SanInfoDialogCall { private View root; private FragmentHomeBinding binding; private SanInfoDialog infoDialog; + private DeviceListAdapter adapter; public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = FragmentHomeBinding.inflate(inflater, container, false); root = binding.getRoot(); binding.homeSan.setOnClickListener(v -> { Intent intent = new Intent(getActivity(), CustomScannerActivity.class); - startActivityForResult(intent, IntentIntegrator.REQUEST_CODE); + startActivityForResult(intent, IntentIntegrator.REQUEST_CODE); }); - infoDialog=new SanInfoDialog(context); + infoDialog = new SanInfoDialog(context); infoDialog.setCall(this); + adapter = new DeviceListAdapter(context); + binding.homeRcyler.setAdapter(adapter); + SmartRefreshLayout inventoryCreateRefresh = binding.inventoryCreateRefresh; + inventoryCreateRefresh.setEnableRefresh(true); + // 设置下拉刷新监听器 + inventoryCreateRefresh.setOnRefreshListener(refreshLayout -> { + // 执行刷新操作,例如重新加载数据 + initRequest(); + // 刷新完成后调用此方法 + refreshLayout.finishRefresh(); + }); + initRequest(); Log.e("TAG", "onCreateView:"); return root; } + private void initRequest() { + OkGo.post(url + "/home/selectDeviceInfoList").execute(new MyRecultCall(dialog, context) { + @Override + public void onSuccess(Response response) { + super.onSuccess(response); + MyResult body = response.body(); + if (body.getCode() == 0) { + List list = gson.fromJson(body.getDataJson(), new TypeToken>() { + }.getType()); + adapter.setList(list); + adapter.notifyDataSetChanged(); + return; + } + Toast.makeText(context, body.getMsg(), Toast.LENGTH_SHORT).show(); + } + }); + } + @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); @@ -64,22 +99,21 @@ public class HomeFragment extends BaseFragment implements SanInfoDialog.SanInfoD // 查询设备 private void selectDeviceInfo(String code) { - OkGo.post(url + "/home/selectDeviceInfo").params("code", code) - .execute(new MyRecultCall(dialog, context) { - @Override - public void onSuccess(Response response) { - super.onSuccess(response); - MyResult body = response.body(); - if (body.getCode()==0){ - DeviceInfo deviceInfo= gson.fromJson(body.getDataJson(), DeviceInfo.class); - Log.e("TAG", "onSuccess:请求成功" ); - infoDialog.setDeviceInfo(deviceInfo); - infoDialog.show(); - return; - } - Toast.makeText(context, body.getMsg(), Toast.LENGTH_SHORT).show(); - } - }); + OkGo.post(url + "/home/selectDeviceInfo").params("code", code).execute(new MyRecultCall(dialog, context) { + @Override + public void onSuccess(Response response) { + super.onSuccess(response); + MyResult body = response.body(); + if (body.getCode() == 0) { + DeviceInfo deviceInfo = gson.fromJson(body.getDataJson(), DeviceInfo.class); + Log.e("TAG", "onSuccess:请求成功"); + infoDialog.setDeviceInfo(deviceInfo); + infoDialog.show(); + return; + } + Toast.makeText(context, body.getMsg(), Toast.LENGTH_SHORT).show(); + } + }); } @@ -92,24 +126,22 @@ public class HomeFragment extends BaseFragment implements SanInfoDialog.SanInfoD @Override public void openDeviceLockRequest(DeviceInfo deviceInfo) { - deviceInfo.setUserId(SharedPreferencesUtils.getLong("userId",0L)); - deviceInfo.setDeptId(SharedPreferencesUtils.getLong("deptId",0L)); - deviceInfo.setUseUser(SharedPreferencesUtils.getstring("user",null)); - OkGo.post(url + "/home/openDeviceLock") - .upRequestBody(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), - gson.toJson(deviceInfo))) - .execute(new MyRecultCall(dialog, context) { - @Override - public void onSuccess(Response response) { - super.onSuccess(response); - MyResult body = response.body(); - if (body.getCode()==0){ - Toast.makeText(context, "开锁成功", Toast.LENGTH_SHORT).show(); - infoDialog.dismiss(); - return; - } - Toast.makeText(context, body.getMsg(), Toast.LENGTH_LONG).show(); - } - }); + deviceInfo.setUserId(SharedPreferencesUtils.getLong("userId", 0L)); + deviceInfo.setDeptId(SharedPreferencesUtils.getLong("deptId", 0L)); + deviceInfo.setUseUser(SharedPreferencesUtils.getstring("user", null)); + OkGo.post(url + "/home/openDeviceLock").upRequestBody(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), gson.toJson(deviceInfo))).execute(new MyRecultCall(dialog, context) { + @Override + public void onSuccess(Response response) { + super.onSuccess(response); + MyResult body = response.body(); + if (body.getCode() == 0) { + Toast.makeText(context, "开锁成功", Toast.LENGTH_SHORT).show(); + infoDialog.dismiss(); + initRequest(); + return; + } + Toast.makeText(context, body.getMsg(), Toast.LENGTH_LONG).show(); + } + }); } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_item.xml b/app/src/main/res/drawable/bg_item.xml new file mode 100644 index 0000000..9d3f332 --- /dev/null +++ b/app/src/main/res/drawable/bg_item.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/item_state_0.xml b/app/src/main/res/drawable/item_state_0.xml new file mode 100644 index 0000000..2a89a43 --- /dev/null +++ b/app/src/main/res/drawable/item_state_0.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/item_state_1.xml b/app/src/main/res/drawable/item_state_1.xml new file mode 100644 index 0000000..dcdde42 --- /dev/null +++ b/app/src/main/res/drawable/item_state_1.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_gallery.xml b/app/src/main/res/layout/fragment_gallery.xml index 643fe25..c4a42d8 100644 --- a/app/src/main/res/layout/fragment_gallery.xml +++ b/app/src/main/res/layout/fragment_gallery.xml @@ -1,22 +1,21 @@ - + xmlns:tools="http://schemas.android.com/tools"> - - \ No newline at end of file + android:layout_height="match_parent" + tools:context=".ui.gallery.GalleryFragment" + android:background="#F1F1F1"> + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 16cf5dd..7537238 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -1,16 +1,100 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/item_device.xml b/app/src/main/res/layout/item_device.xml new file mode 100644 index 0000000..3d0068e --- /dev/null +++ b/app/src/main/res/layout/item_device.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_record.xml b/app/src/main/res/layout/item_record.xml new file mode 100644 index 0000000..231efb7 --- /dev/null +++ b/app/src/main/res/layout/item_record.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml index a2f0e79..c8356a3 100644 --- a/app/src/main/res/menu/activity_main_drawer.xml +++ b/app/src/main/res/menu/activity_main_drawer.xml @@ -12,9 +12,9 @@ android:id="@+id/nav_gallery" android:icon="@drawable/ic_menu_record" android:title="@string/menu_gallery" /> - + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fcb1052..a8e0cac 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -8,7 +8,7 @@ Settings Home - 借用历史 + 借用记录 Slideshow LoginActivity Email diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index c95c4c8..9aafa35 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -54,12 +54,25 @@ 2dp 1 + + +