diff --git a/baselib/src/main/java/com/tenlionsoft/baselib/constant/PathConfig.java b/baselib/src/main/java/com/tenlionsoft/baselib/constant/PathConfig.java index 3d85085..28cb262 100755 --- a/baselib/src/main/java/com/tenlionsoft/baselib/constant/PathConfig.java +++ b/baselib/src/main/java/com/tenlionsoft/baselib/constant/PathConfig.java @@ -235,4 +235,9 @@ public class PathConfig { public static final String PATH_MODULE_PAD_OA_FRAGMENT_ROUTINE_WORK_DETAIL = "/oamodule/fragment/routineWorkDetail";//日常工作详情 public static final String PATH_MODULE_PAD_OA_FRAGMENT_ROUTINE_WORK_TRANSACT = "/oamodule/fragment/routineWorkTransact";//完成日常工作 + public static final String PATH_MODULE_PAD_OA_FRAGMENT_WORK_REPORT_ADD = "/oamodule/fragment/workReportAdd";//添加工作报告 + public static final String PATH_MODULE_PAD_OA_FRAGMENT_WORK_REPORT_EDIT = "/oamodule/fragment/workReportEdit";//编辑工作报告 + public static final String PATH_MODULE_PAD_OA_FRAGMENT_WORK_REPORT_DETAIL = "/oamodule/fragment/workReportDetail";//工作报告详情 + public static final String PATH_MODULE_PAD_OA_FRAGMENT_WORK_REPORT = "/oamodule/fragment/workReport";//工作报告 + } diff --git a/baselib/src/main/res/anim/slide_left_in.xml b/baselib/src/main/res/anim/slide_left_in.xml new file mode 100644 index 0000000..e332701 --- /dev/null +++ b/baselib/src/main/res/anim/slide_left_in.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/baselib/src/main/res/anim/slide_left_out.xml b/baselib/src/main/res/anim/slide_left_out.xml new file mode 100644 index 0000000..3dfe9a5 --- /dev/null +++ b/baselib/src/main/res/anim/slide_left_out.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/baselib/src/main/res/anim/slide_right_in.xml b/baselib/src/main/res/anim/slide_right_in.xml new file mode 100644 index 0000000..f650791 --- /dev/null +++ b/baselib/src/main/res/anim/slide_right_in.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/baselib/src/main/res/anim/slide_right_out.xml b/baselib/src/main/res/anim/slide_right_out.xml new file mode 100644 index 0000000..5033f3c --- /dev/null +++ b/baselib/src/main/res/anim/slide_right_out.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/baselib/src/main/res/drawable-xhdpi/ic_step_start.9.png b/baselib/src/main/res/drawable-xhdpi/ic_step_start.9.png new file mode 100644 index 0000000..eb87e71 Binary files /dev/null and b/baselib/src/main/res/drawable-xhdpi/ic_step_start.9.png differ diff --git a/baselib/src/main/res/drawable-xhdpi/ic_step_start.png b/baselib/src/main/res/drawable-xhdpi/ic_step_start.png deleted file mode 100644 index 798bd16..0000000 Binary files a/baselib/src/main/res/drawable-xhdpi/ic_step_start.png and /dev/null differ diff --git a/oamodule/src/main/java/com/tenlionsoft/oamodule/activity/workreports/EditWorkReportActivity.java b/oamodule/src/main/java/com/tenlionsoft/oamodule/activity/workreports/EditWorkReportActivity.java index a00a39a..d6e50d8 100644 --- a/oamodule/src/main/java/com/tenlionsoft/oamodule/activity/workreports/EditWorkReportActivity.java +++ b/oamodule/src/main/java/com/tenlionsoft/oamodule/activity/workreports/EditWorkReportActivity.java @@ -128,7 +128,7 @@ public class EditWorkReportActivity extends BaseActivity { @Override public void onError(@NonNull Throwable e) { - refreshView(STATE_LOAD_EMPTY); + refreshView(STATE_LOAD_ERROR); ExceptionHandler.handleException(e); } diff --git a/oamodule/src/main/java/com/tenlionsoft/oamodule/pad/activitys/home/PadMainActivity.java b/oamodule/src/main/java/com/tenlionsoft/oamodule/pad/activitys/home/PadMainActivity.java index d665008..81d3d9f 100644 --- a/oamodule/src/main/java/com/tenlionsoft/oamodule/pad/activitys/home/PadMainActivity.java +++ b/oamodule/src/main/java/com/tenlionsoft/oamodule/pad/activitys/home/PadMainActivity.java @@ -27,7 +27,6 @@ import com.tenlionsoft.baselib.core.widget.base.BaseActivity; import com.tenlionsoft.baselib.core.widget.base.BaseFragment; import com.tenlionsoft.baselib.core.widget.base.FragmentUtils; import com.tenlionsoft.baselib.utils.KeyBoardListener; -import com.tenlionsoft.baselib.utils.LogUtils; import com.tenlionsoft.baselib.utils.UserLgUtils; import com.tenlionsoft.oamodule.R; import com.tenlionsoft.oamodule.R2; @@ -325,16 +324,24 @@ public class PadMainActivity extends BaseActivity { //隐藏上一个fragment if (mPreFragment != null) { fragmentTransaction.hide(mPreFragment) - .setCustomAnimations(R.anim.anim_fade_in, R.anim.anim_fade_out); - LogUtils.e("上一个fragment=========" + mPreFragment); + .setCustomAnimations(R.anim.slide_right_in, + R.anim.slide_left_out, + R.anim.slide_left_in, + R.anim.slide_right_out); } if (fragment.isAdded()) { fragmentTransaction.show(fragment) - .setCustomAnimations(R.anim.anim_fade_in, R.anim.anim_fade_out) + .setCustomAnimations(R.anim.slide_right_in, + R.anim.slide_left_out, + R.anim.slide_left_in, + R.anim.slide_right_out) .commit(); } else { fragmentTransaction.add(R.id.fl_content, fragment, tag) - .setCustomAnimations(R.anim.anim_fade_in, R.anim.anim_fade_out) + .setCustomAnimations(R.anim.slide_right_in, + R.anim.slide_left_out, + R.anim.slide_left_in, + R.anim.slide_right_out) .commit(); } mPreFragment = fragment; diff --git a/oamodule/src/main/java/com/tenlionsoft/oamodule/pad/fragments/home/workreports/WorkReportAddFragment.java b/oamodule/src/main/java/com/tenlionsoft/oamodule/pad/fragments/home/workreports/WorkReportAddFragment.java new file mode 100644 index 0000000..d8007d7 --- /dev/null +++ b/oamodule/src/main/java/com/tenlionsoft/oamodule/pad/fragments/home/workreports/WorkReportAddFragment.java @@ -0,0 +1,389 @@ +package com.tenlionsoft.oamodule.pad.fragments.home.workreports; + +import android.app.ProgressDialog; +import android.content.Context; +import android.content.Intent; +import android.graphics.Color; +import android.text.TextUtils; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.bigkoo.pickerview.builder.OptionsPickerBuilder; +import com.bigkoo.pickerview.view.OptionsPickerView; +import com.google.gson.Gson; +import com.hjq.toast.ToastUtils; +import com.leon.lfilepickerlibrary.LFilePicker; +import com.leon.lfilepickerlibrary.utils.Constant; +import com.tenlionsoft.baselib.constant.LionActions; +import com.tenlionsoft.baselib.constant.PathConfig; +import com.tenlionsoft.baselib.core.beans.AddFileBean; +import com.tenlionsoft.baselib.core.beans.BaseSuccessBean; +import com.tenlionsoft.baselib.core.beans.DicBean; +import com.tenlionsoft.baselib.core.retrofit_net.BaseUrlApi; +import com.tenlionsoft.baselib.core.retrofit_net.RetrofitManager; +import com.tenlionsoft.baselib.core.retrofit_net.api.BaseApiService; +import com.tenlionsoft.baselib.core.retrofit_net.conver.RxTransformer; +import com.tenlionsoft.baselib.core.widget.base.AddFileAdapter; +import com.tenlionsoft.baselib.core.widget.base.BaseFragment; +import com.tenlionsoft.baselib.utils.ExceptionHandler; +import com.tenlionsoft.baselib.utils.LogUtils; +import com.tenlionsoft.baselib.utils.UIUtil; +import com.tenlionsoft.oamodule.R; +import com.tenlionsoft.oamodule.R2; +import com.tenlionsoft.oamodule.beans.SaveWorkReportBean; +import com.tenlionsoft.oamodule.net.OAApi; +import com.tenlionsoft.oamodule.pad.activitys.home.PadMainActivity; + +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import butterknife.BindView; +import butterknife.ButterKnife; +import io.reactivex.rxjava3.annotations.NonNull; +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; + +/** + * 作者: adam + * 日期: 2022/5/10 - 14:13 + * 邮箱: itgaojian@163.com + * 描述: 工作报告 + */ +@Route(path = PathConfig.PATH_MODULE_PAD_OA_FRAGMENT_WORK_REPORT_ADD) +public class WorkReportAddFragment extends BaseFragment { + @BindView(R2.id.et_name) + EditText mEtName; + @BindView(R2.id.tv_type) + TextView mTvType; + @BindView(R2.id.et_out) + EditText mEtOut; + @BindView(R2.id.et_content) + EditText mEtContent; + @BindView(R2.id.rlv_files) + RecyclerView mRlvFiles; + @BindView(R2.id.btn_confirm) + Button mBtnConfirm; + private List mFileBeans = new ArrayList<>(); + private AddFileAdapter mAddFileAdapter; + private String[] fileFilter = new String[]{".doc", ".docx", ".xls", ".xlsx", ".pptx", ".ppt", ".txt", ".pdf"}; + private int mFileMax = 9; + private OptionsPickerView mTypePicker; + private List mTyps; + private DicBean mSelType; + private PadMainActivity mMainActivity; + private ActivityResultLauncher mFileLauncher; + + @Override + protected int getContentViewId() { + return R.layout.fragment_work_report_add; + } + + @Override + protected void setDataToView(View dataView) { + ButterKnife.bind(this, dataView); + setTitleView(true); + mTvFragmentTitle.setText("工作报告新增"); + mIvFragmentBack.setOnClickListener(v->mMainActivity.backFragment(1,this)); + setStateView(STATE_SUCCESS); + mSrlView.setEnableLoadMore(false); + mSrlView.setEnableRefresh(false); + initViews(); + } + + private void initViews() { + mTyps = new ArrayList<>(); +// 工作日报 1 +// 工作月报 2 +// 工作年报 3 + DicBean type1 = new DicBean(); + type1.setDataId("1"); + type1.setDataName("工作日报"); + + DicBean type2 = new DicBean(); + type2.setDataId("2"); + type2.setDataName("工作月报"); + + DicBean type3 = new DicBean(); + type3.setDataId("3"); + type3.setDataName("工作年报"); + + mTyps.add(type1); + mTyps.add(type2); + mTyps.add(type3); + + mTvType.setOnClickListener(v -> onShowType()); + mFileBeans.add(new AddFileBean()); + mAddFileAdapter = new AddFileAdapter(mActivity, mFileBeans); + mAddFileAdapter.addOnItemClickListener(addFileBean -> { + LogUtils.e("添加文件"); + if (TextUtils.isEmpty(addFileBean.getId())) { + checkManagePermission(); + } else { + //TODO 预览 + } + }); + //删除上传的文件 + mAddFileAdapter.addOnDeleteListener((bean, i) -> { + //删除list中的某个数据 + mFileBeans.remove(i); + mAddFileAdapter.notifyDataSetChanged(); + ++mFileMax; + }); + mRlvFiles.setLayoutManager(new LinearLayoutManager(mActivity)); + mRlvFiles.setAdapter(mAddFileAdapter); + mBtnConfirm.setOnClickListener(v -> doConfirm()); + } + + @Override + public void onAttach(@androidx.annotation.NonNull @NotNull Context context) { + super.onAttach(context); + mMainActivity = (PadMainActivity) getActivity(); + mFileLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + Intent data = result.getData(); + //文件 + if (data != null) { + ArrayList paths = data.getStringArrayListExtra(Constant.RESULT_INFO); + if (paths != null && paths.size() > 0) { + doUploadFiles(paths); + } else { + ToastUtils.show("未选择文件"); + } + } else { + ToastUtils.show("路径有误,请稍后重试"); + } + }); + } + + @Override + protected void hasManageFileManage() { + if (mFileMax == 0) { + ToastUtils.show("超过最大上传数量限制"); + } else { + new LFilePicker() + .withFragment(this) + .withFragmentLauncher(mFileLauncher) + .withRequestCode(LionActions.REQUEST_CODE_AC) + .withTitle("文件选择") + .withMaxNum(mFileMax) + .withFileFilter(fileFilter) + .start(); + } + } + + /** + * 显示类型 + */ + private void onShowType() { + mActivity.hideSoftKeyboard(); + if (mTyps != null && mTyps.size() > 0) { + if (mTypePicker == null) { + mTypePicker = new OptionsPickerBuilder(mActivity, (o1, o2, o3, v) -> { + mSelType = mTyps.get(o1); + mTvType.setText(mSelType.getDataName()); + }) + .setTitleText("请选择") + .setCancelColor(Color.parseColor("#1189FF")) + .setSubmitColor(Color.parseColor("#1189FF")) + .setTitleColor(Color.parseColor("#1189FF")) + .build(); + mTypePicker.setPicker(mTyps); + } + mTypePicker.show(); + } else { + ToastUtils.show("数据有误,请重新打开页面"); + } + } + + + /** + * 上传文件 + * + * @param paths + */ + private int mUploadCount = 0; + + private void doUploadFiles(ArrayList paths) { + LogUtils.e(paths); + + ProgressDialog progressDialog = UIUtil.initDialog(mActivity, "上传中..."); + progressDialog.show(); + List requests = new ArrayList<>(); + List fileNames = new ArrayList<>(); + for (int i = 0; i < paths.size(); i++) { + File file = new File(paths.get(i)); + Observable observable = createObservable(file); + fileNames.add(file.getName()); + if (observable == null) return; + requests.add(observable); + } + Observable[] observables1 = requests.toArray(new Observable[requests.size()]); + + Observable.mergeArrayDelayError(observables1) + .compose(RxTransformer.getTransformer()) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + + } + + @Override + public void onNext(@NotNull Object o) { + ++mUploadCount; + if (o instanceof BaseSuccessBean) { + --mFileMax; + //刷新文件 + BaseSuccessBean bean = (BaseSuccessBean) o; + AddFileBean fileBean = new AddFileBean(); + fileBean.setId(bean.getData()); + fileBean.setPath(BaseUrlApi.BASE_IMG_URL + bean.getData()); + fileBean.setFileType(1); + fileBean.setFileName(fileNames.get(mUploadCount - 1)); + mFileBeans.add(0, fileBean); + } + mAddFileAdapter.notifyDataSetChanged(); + if (mUploadCount == paths.size()) { + mUploadCount = 0; + if (progressDialog.isShowing()) { + progressDialog.dismiss(); + } + } + } + + @Override + public void onError(@NonNull Throwable e) { + e.printStackTrace(); + mUploadCount = 0; + if (progressDialog.isShowing()) { + progressDialog.dismiss(); + } + ToastUtils.show("上传失败,请稍后重试."); + } + + @Override + public void onComplete() { + + } + }); + } + + private Observable createObservable(File file) { + LogUtils.e(file.exists()); + RequestBody requestFile = RequestBody.create(file, MediaType.parse("multipart/form-data")); + MultipartBody.Part body; + body = MultipartBody.Part.createFormData("file", file.getName(), requestFile); + return RetrofitManager.getInstance() + .create(BaseApiService.class) + .uploadFile(body) + .compose(RxTransformer.getTransformer()); + } + + + private RequestBody buildParams() { + SaveWorkReportBean bean = new SaveWorkReportBean(); + String name = mEtName.getText().toString().trim(); + bean.setReportTitle(name); + String out = mEtOut.getText().toString().trim(); + if (!TextUtils.isEmpty(out)) { + bean.setReportEgress(out); + } + String content = mEtContent.getText().toString().trim(); + bean.setReportContent(content); + bean.setReportType(mSelType.getDataId()); + if (mFileBeans.size() >= 2) { + StringBuilder fileId = new StringBuilder(); + for (AddFileBean fileBean : mFileBeans) { + if (!TextUtils.isEmpty(fileBean.getId())) { + fileId.append(fileBean.getId()).append(","); + } + } + if (fileId.toString().endsWith(",")) { + fileId = new StringBuilder(fileId.substring(0, fileId.length() - 1)); + } + bean.setReportFiles(fileId.toString().trim()); + } + return RequestBody.create(new Gson().toJson(bean), MediaType.parse("application/json; charset=utf-8")); + } + + private boolean checkParams() { + String name = mEtName.getText().toString().trim(); + if (TextUtils.isEmpty(name)) { + ToastUtils.show("请输入上报标题"); + return false; + } + if (mSelType == null) { + ToastUtils.show("请选择上报类型"); + return false; + } + String content = mEtContent.getText().toString().trim(); + if (TextUtils.isEmpty(content)) { + ToastUtils.show("请输入工作内容"); + return false; + } + return true; + } + + + private void doConfirm() { + if (checkParams()) { + ProgressDialog dialog = UIUtil.initDialog(mActivity, "保存中..."); + dialog.show(); + RequestBody body = buildParams(); + RetrofitManager.getInstance() + .create(OAApi.class) + .doSaveWorkReport(body) + .compose(RxTransformer.getTransformer()) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + + } + + @Override + public void onNext(@NonNull BaseSuccessBean baseSuccessBean) { + if (dialog.isShowing()) dialog.dismiss(); + ToastUtils.show("保存成功"); + BaseFragment preFragment = mMainActivity.getPreFragment(); + if (preFragment != null) { + preFragment.mIsRefresh = true; + } + mMainActivity.backFragment(1, WorkReportAddFragment.this); + } + + @Override + public void onError(@NonNull Throwable e) { + if (dialog.isShowing()) dialog.dismiss(); + ExceptionHandler.handleException(e); + } + + @Override + public void onComplete() { + + } + }); + } + } + + @Override + protected void refreshView() { + + } + + @Override + protected void loadMoreData() { + + } +} diff --git a/oamodule/src/main/java/com/tenlionsoft/oamodule/pad/fragments/home/workreports/WorkReportDetailFragment.java b/oamodule/src/main/java/com/tenlionsoft/oamodule/pad/fragments/home/workreports/WorkReportDetailFragment.java new file mode 100644 index 0000000..f9e30f8 --- /dev/null +++ b/oamodule/src/main/java/com/tenlionsoft/oamodule/pad/fragments/home/workreports/WorkReportDetailFragment.java @@ -0,0 +1,328 @@ +package com.tenlionsoft.oamodule.pad.fragments.home.workreports; + +import android.app.AlertDialog; +import android.app.ProgressDialog; +import android.content.Context; +import android.os.Bundle; +import android.text.Html; +import android.text.TextUtils; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.alibaba.android.arouter.launcher.ARouter; +import com.hjq.toast.ToastUtils; +import com.tenlionsoft.baselib.constant.PathConfig; +import com.tenlionsoft.baselib.core.beans.AddFileBean; +import com.tenlionsoft.baselib.core.beans.BaseSuccessBean; +import com.tenlionsoft.baselib.core.retrofit_net.BaseUrlApi; +import com.tenlionsoft.baselib.core.retrofit_net.RetrofitManager; +import com.tenlionsoft.baselib.core.retrofit_net.api.BaseApiService; +import com.tenlionsoft.baselib.core.retrofit_net.bean.FileInfoBean; +import com.tenlionsoft.baselib.core.retrofit_net.conver.RxTransformer; +import com.tenlionsoft.baselib.core.widget.base.AddFileAdapter; +import com.tenlionsoft.baselib.core.widget.base.BaseFragment; +import com.tenlionsoft.baselib.core.widget.base.FragmentUtils; +import com.tenlionsoft.baselib.utils.ExceptionHandler; +import com.tenlionsoft.baselib.utils.FileUtils; +import com.tenlionsoft.baselib.utils.UIUtil; +import com.tenlionsoft.oamodule.R; +import com.tenlionsoft.oamodule.R2; +import com.tenlionsoft.oamodule.beans.WorkReportDetailBean; +import com.tenlionsoft.oamodule.net.OAApi; +import com.tenlionsoft.oamodule.pad.activitys.home.PadMainActivity; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import butterknife.BindView; +import butterknife.ButterKnife; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; + +import static com.tenlionsoft.baselib.core.widget.PhotoActivity.TAG_IMGURL; + +/** + * 作者: adam + * 日期: 2022/5/10 - 14:16 + * 邮箱: itgaojian@163.com + * 描述: + */ +@Route(path = PathConfig.PATH_MODULE_PAD_OA_FRAGMENT_WORK_REPORT_DETAIL) +public class WorkReportDetailFragment extends BaseFragment { + @BindView(R2.id.tv_name) + TextView mTvName; + @BindView(R2.id.tv_type) + TextView mTvType; + @BindView(R2.id.et_out) + TextView mEtOut; + @BindView(R2.id.tv_content) + TextView mTvContent; + @BindView(R2.id.rlv_files) + RecyclerView mRlvFiles; + @BindView(R2.id.tv_file_hint) + TextView mTvFileHint; + @BindView(R2.id.btn_del) + Button mBtnDel; + private PadMainActivity mMainActivity; + private String mId; + + @Override + protected int getContentViewId() { + return R.layout.fragment_work_report_detail; + } + + @Override + protected void setDataToView(View dataView) { + ButterKnife.bind(this, dataView); + setTitleView(true); + mTvFragmentTitle.setText("报告详情"); + mTvFragmentOption.setText("编辑"); + mIvFragmentBack.setOnClickListener(v -> mMainActivity.backFragment(1, this)); + mTvFragmentOption.setOnClickListener(v -> { + BaseFragment fragment = FragmentUtils.getFragmentOne(PathConfig.PATH_MODULE_PAD_OA_FRAGMENT_WORK_REPORT_EDIT, "id", mId); + mMainActivity.addFragment(1, fragment); + }); + Bundle bundle = getArguments(); + if (bundle != null) { + mId = bundle.getString("id"); + } + if (TextUtils.isEmpty(mId)) { + ToastUtils.show("数据有误"); + mMainActivity.backFragment(1, this); + } else { + getDetailById(); + } + mBtnDel.setOnClickListener(v -> showDelConfirm()); + } + + + private void showDelConfirm() { + new AlertDialog.Builder(mActivity) + .setTitle("提示") + .setMessage("确定要删除该报告吗?") + .setPositiveButton("确定", (dialog, which) -> { + dialog.dismiss(); + doDel(); + }) + .setNegativeButton("取消", (dialog, which) -> dialog.dismiss()) + .create() + .show(); + } + + private void doDel() { + ProgressDialog dialog = UIUtil.initDialog(mActivity, "删除中..."); + dialog.show(); + RetrofitManager.getInstance() + .create(OAApi.class) + .doDelWorkReport(mId) + .compose(RxTransformer.getTransformer()) + .subscribe(new Observer() { + @Override + public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) { + + } + + @Override + public void onNext(@io.reactivex.rxjava3.annotations.NonNull BaseSuccessBean baseSuccessBean) { + if (dialog.isShowing()) dialog.dismiss(); + ToastUtils.show("删除成功"); + BaseFragment preFragment = mMainActivity.getPreFragment(); + if (preFragment != null) { + preFragment.mIsRefresh = true; + } + mMainActivity.backFragment(1, WorkReportDetailFragment.this); + } + + @Override + public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) { + if (dialog.isShowing()) dialog.dismiss(); + ExceptionHandler.handleException(e); + } + + @Override + public void onComplete() { + + } + }); + } + + private void getDetailById() { + RetrofitManager.getInstance() + .create(OAApi.class) + .getWorkReportDetail(mId) + .compose(RxTransformer.getTransformer()) + .subscribe(new Observer() { + @Override + public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) { + + } + + @Override + public void onNext(@io.reactivex.rxjava3.annotations.NonNull WorkReportDetailBean workReportDetailBean) { + setDataToView(workReportDetailBean); + } + + @Override + public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) { + setStateView(STATE_ERROR); + ExceptionHandler.handleException(e); + } + + @Override + public void onComplete() { + + } + }); + } + + private void setDataToView(WorkReportDetailBean bean) { + setStateView(STATE_SUCCESS); + mSrlView.setEnableRefresh(false); + mSrlView.setEnableLoadMore(false); + mTvName.setText(bean.getReportTitle()); + switch (bean.getReportType()) { + case "1": + mTvType.setText("工作日报"); + break; + case "2": + mTvType.setText("工作周报"); + break; + case "3": + mTvType.setText("工作月报"); + break; + } + mEtOut.setText(Html.fromHtml(bean.getReportEgress())); + mTvContent.setText(Html.fromHtml(bean.getReportContent())); + //文件 + if (!TextUtils.isEmpty(bean.getReportFiles())) { + mRlvFiles.setVisibility(View.VISIBLE); + mTvFileHint.setVisibility(View.GONE); + doGetFileInfo(bean.getReportFiles()); + } else { + mRlvFiles.setVisibility(View.GONE); + mTvFileHint.setVisibility(View.VISIBLE); + } + } + + /** + * 获取文件名称等信息 + */ + private void doGetFileInfo(String fileId) { + ProgressDialog dialog = UIUtil.initDialog(mActivity, "获取中..."); + dialog.show(); + RetrofitManager.getInstance() + .create(BaseApiService.class) + .getFileInfoList(fileId) + .compose(RxTransformer.getTransformer()) + .subscribe(new Observer>() { + + + @Override + public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) { + + } + + @Override + public void onNext(@io.reactivex.rxjava3.annotations.NonNull List fileInfoBeans) { + if (dialog.isShowing()) dialog.dismiss(); + if (fileInfoBeans.size() > 0) { + List mFiles = new ArrayList<>(); + for (int i = 0; i < fileInfoBeans.size(); i++) { + FileInfoBean infoBean = fileInfoBeans.get(i); + AddFileBean bean = new AddFileBean(); + bean.setId(infoBean.getFileId()); + bean.setPath(BaseUrlApi.BASE_IMG_URL + infoBean.getFileId()); + bean.setFileType(FileUtils.getFileType(infoBean.getFileName())); + bean.setFileName(infoBean.getFileName()); + mFiles.add(bean); + } + AddFileAdapter adapter = new AddFileAdapter(mActivity, mFiles); + mRlvFiles.setLayoutManager(new LinearLayoutManager(mActivity)); + mRlvFiles.setAdapter(adapter); + adapter.addOnItemClickListener(addFileBean -> previewFile(addFileBean, mFiles)); + } else { + ToastUtils.show("未找到文档信息"); + } + } + + @Override + public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) { + if (dialog.isShowing()) dialog.dismiss(); + ExceptionHandler.handleException(e); + } + + @Override + public void onComplete() { + + } + }); + } + + /** + * 预览文件 + */ + private void previewFile(AddFileBean addFileBean, List mFiles) { + if (addFileBean.getFileType() == 1) { + //文档 + ARouter.getInstance() + .build(PathConfig.PATH_MODULE_BASELIB_ACTIVITY_PREVIEW_FILE) + .withString("fileName", addFileBean.getFileName()) + .withString("fileId", addFileBean.getId()) + .navigation(); + } else if (2 == addFileBean.getFileType()) { + //图片预览 + //遍历文件获取所有图片文件 + ArrayList imgUrls = new ArrayList<>(); + for (int i = 0; i < mFiles.size(); i++) { + if (mFiles.get(i).getFileType() == 2) { + AddFileBean fileBean = mFiles.get(i); + String url = BaseUrlApi.BASE_IMG_URL + fileBean.getId(); + imgUrls.add(url); + } + } + ARouter.getInstance() + .build(PathConfig.PATH_MODULE_BASELIB_SHOW_IMG) + .withStringArrayList(TAG_IMGURL, imgUrls) + .navigation(); + } else if (3 == addFileBean.getFileType() || 4 == addFileBean.getFileType()) { + //TODO 视频或音频预览 + } + } + + + @Override + public void onHiddenChanged(boolean hidden) { + super.onHiddenChanged(hidden); + if (!hidden) { + if (mIsRefresh) { + mIsRefresh = false; + setStateView(STATE_LOAD); + getDetailById(); + } + } + } + + @Override + public void onAttach(@NonNull @NotNull Context context) { + super.onAttach(context); + mMainActivity = (PadMainActivity) getActivity(); + } + + @Override + protected void refreshView() { + setStateView(STATE_LOAD); + getDetailById(); + } + + @Override + protected void loadMoreData() { + + } +} diff --git a/oamodule/src/main/java/com/tenlionsoft/oamodule/pad/fragments/home/workreports/WorkReportEditFragment.java b/oamodule/src/main/java/com/tenlionsoft/oamodule/pad/fragments/home/workreports/WorkReportEditFragment.java new file mode 100644 index 0000000..4c5f5a2 --- /dev/null +++ b/oamodule/src/main/java/com/tenlionsoft/oamodule/pad/fragments/home/workreports/WorkReportEditFragment.java @@ -0,0 +1,503 @@ +package com.tenlionsoft.oamodule.pad.fragments.home.workreports; + +import android.app.ProgressDialog; +import android.content.Context; +import android.content.Intent; +import android.graphics.Color; +import android.os.Bundle; +import android.text.Html; +import android.text.TextUtils; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.bigkoo.pickerview.builder.OptionsPickerBuilder; +import com.bigkoo.pickerview.view.OptionsPickerView; +import com.google.gson.Gson; +import com.hjq.toast.ToastUtils; +import com.leon.lfilepickerlibrary.LFilePicker; +import com.leon.lfilepickerlibrary.utils.Constant; +import com.tenlionsoft.baselib.constant.LionActions; +import com.tenlionsoft.baselib.constant.PathConfig; +import com.tenlionsoft.baselib.core.beans.AddFileBean; +import com.tenlionsoft.baselib.core.beans.BaseSuccessBean; +import com.tenlionsoft.baselib.core.beans.DicBean; +import com.tenlionsoft.baselib.core.retrofit_net.BaseUrlApi; +import com.tenlionsoft.baselib.core.retrofit_net.RetrofitManager; +import com.tenlionsoft.baselib.core.retrofit_net.api.BaseApiService; +import com.tenlionsoft.baselib.core.retrofit_net.bean.FileInfoBean; +import com.tenlionsoft.baselib.core.retrofit_net.conver.RxTransformer; +import com.tenlionsoft.baselib.core.widget.base.AddFileAdapter; +import com.tenlionsoft.baselib.core.widget.base.BaseFragment; +import com.tenlionsoft.baselib.utils.ExceptionHandler; +import com.tenlionsoft.baselib.utils.FileUtils; +import com.tenlionsoft.baselib.utils.LogUtils; +import com.tenlionsoft.baselib.utils.UIUtil; +import com.tenlionsoft.oamodule.R; +import com.tenlionsoft.oamodule.R2; +import com.tenlionsoft.oamodule.beans.SaveWorkReportBean; +import com.tenlionsoft.oamodule.beans.WorkReportDetailBean; +import com.tenlionsoft.oamodule.net.OAApi; +import com.tenlionsoft.oamodule.pad.activitys.home.PadMainActivity; + +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import butterknife.BindView; +import butterknife.ButterKnife; +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; + +/** + * 作者: adam + * 日期: 2022/5/10 - 14:16 + * 邮箱: itgaojian@163.com + * 描述: + */ +@Route(path = PathConfig.PATH_MODULE_PAD_OA_FRAGMENT_WORK_REPORT_EDIT) +public class WorkReportEditFragment extends BaseFragment { + + @BindView(R2.id.et_name) + EditText mEtName; + @BindView(R2.id.tv_type) + TextView mTvType; + @BindView(R2.id.et_out) + EditText mEtOut; + @BindView(R2.id.et_content) + EditText mEtContent; + @BindView(R2.id.rlv_files) + RecyclerView mRlvFiles; + @BindView(R2.id.btn_confirm) + Button mBtnConfirm; + private PadMainActivity mMainActivity; + private List mFileBeans = new ArrayList<>(); + private AddFileAdapter mAddFileAdapter; + private String[] fileFilter = new String[]{".doc", ".docx", ".xls", ".xlsx", ".pptx", ".ppt", ".txt", ".pdf"}; + private int mFileMax = 9; + + + private OptionsPickerView mTypePicker; + private List mTyps; + private DicBean mSelType; + private String mId; + private ActivityResultLauncher mFileLauncher; + + @Override + protected int getContentViewId() { + return R.layout.fragment_work_report_edit; + } + + @Override + protected void setDataToView(View dataView) { + ButterKnife.bind(this, dataView); + setTitleView(true); + mTvFragmentTitle.setText("报告编辑"); + mIvFragmentBack.setOnClickListener(v -> mMainActivity.backFragment(1, this)); + initViews(); + Bundle arguments = getArguments(); + if (arguments != null) { + mId = arguments.getString("id"); + } + if (TextUtils.isEmpty(mId)) { + ToastUtils.show("数据有误"); + mMainActivity.backFragment(1, this); + } else { + getDetailById(); + } + } + + @Override + public void onAttach(@NonNull @NotNull Context context) { + super.onAttach(context); + mMainActivity = (PadMainActivity) getActivity(); + mFileLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + Intent data = result.getData(); + //文件 + if (data != null) { + ArrayList paths = data.getStringArrayListExtra(Constant.RESULT_INFO); + if (paths != null && paths.size() > 0) { + doUploadFiles(paths); + } else { + ToastUtils.show("未选择文件"); + } + } else { + ToastUtils.show("路径有误,请稍后重试"); + } + }); + } + + private void getDetailById() { + RetrofitManager.getInstance() + .create(OAApi.class) + .getWorkReportDetail(mId) + .compose(RxTransformer.getTransformer()) + .subscribe(new Observer() { + @Override + public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) { + + } + + @Override + public void onNext(@io.reactivex.rxjava3.annotations.NonNull WorkReportDetailBean workReportDetailBean) { + setDataToView(workReportDetailBean); + } + + @Override + public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) { + setStateView(STATE_ERROR); + ExceptionHandler.handleException(e); + } + + @Override + public void onComplete() { + + } + }); + } + + private void setDataToView(WorkReportDetailBean bean) { + setStateView(STATE_SUCCESS); + mSrlView.setEnableLoadMore(false); + mSrlView.setEnableRefresh(false); + mEtName.setText(bean.getReportTitle()); + for (DicBean typ : mTyps) { + if (typ.getDataId().equals(bean.getReportType())) { + mSelType = typ; + break; + } + } + mTvType.setText(mSelType.getDataName()); + mEtOut.setText(Html.fromHtml(bean.getReportEgress())); + mEtContent.setText(Html.fromHtml(bean.getReportContent())); + if (!TextUtils.isEmpty(bean.getReportFiles())) { + mFileBeans.clear(); + doGetFileInfo(bean.getReportFiles()); + + } + } + + /** + * 获取文件名称等信息 + */ + private void doGetFileInfo(String fileId) { + ProgressDialog dialog = UIUtil.initDialog(mActivity, "获取中..."); + dialog.show(); + RetrofitManager.getInstance() + .create(BaseApiService.class) + .getFileInfoList(fileId) + .compose(RxTransformer.getTransformer()) + .subscribe(new Observer>() { + + + @Override + public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) { + + } + + @Override + public void onNext(@io.reactivex.rxjava3.annotations.NonNull List fileInfoBeans) { + if (dialog.isShowing()) dialog.dismiss(); + if (fileInfoBeans.size() > 0) { + for (int i = 0; i < fileInfoBeans.size(); i++) { + FileInfoBean infoBean = fileInfoBeans.get(i); + AddFileBean bean = new AddFileBean(); + bean.setId(infoBean.getFileId()); + bean.setPath(BaseUrlApi.BASE_IMG_URL + infoBean.getFileId()); + bean.setFileType(FileUtils.getFileType(infoBean.getFileName())); + bean.setFileName(infoBean.getFileName()); + mFileBeans.add(0, bean); + --mFileMax; + } + mAddFileAdapter.setData(mFileBeans); + } else { + ToastUtils.show("未找到文档信息"); + } + } + + @Override + public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) { + if (dialog.isShowing()) dialog.dismiss(); + ExceptionHandler.handleException(e); + } + + @Override + public void onComplete() { + + } + }); + } + + private void initViews() { + mTyps = new ArrayList<>(); + DicBean type1 = new DicBean(); + type1.setDataId("1"); + type1.setDataName("工作日报"); + + DicBean type2 = new DicBean(); + type2.setDataId("2"); + type2.setDataName("工作月报"); + + DicBean type3 = new DicBean(); + type3.setDataId("3"); + type3.setDataName("工作年报"); + + mTyps.add(type1); + mTyps.add(type2); + mTyps.add(type3); + + mTvType.setOnClickListener(v -> onShowType()); + mFileBeans.add(new AddFileBean()); + mAddFileAdapter = new AddFileAdapter(mActivity, mFileBeans); + mAddFileAdapter.addOnItemClickListener(addFileBean -> { + LogUtils.e("添加文件"); + if (TextUtils.isEmpty(addFileBean.getId())) { + checkManagePermission(); + } else { + //TODO 预览 + } + }); + //删除上传的文件 + mAddFileAdapter.addOnDeleteListener((bean, i) -> { + //删除list中的某个数据 + mFileBeans.remove(i); + mAddFileAdapter.notifyDataSetChanged(); + ++mFileMax; + }); + mRlvFiles.setLayoutManager(new LinearLayoutManager(mActivity)); + mRlvFiles.setAdapter(mAddFileAdapter); + mBtnConfirm.setOnClickListener(v -> doConfirm()); + } + + @Override + protected void hasManageFileManage() { + if (mFileMax == 0) { + ToastUtils.show("超过最大上传数量限制"); + } else { + new LFilePicker() + .withFragment(this) + .withFragmentLauncher(mFileLauncher) + .withRequestCode(LionActions.REQUEST_CODE_AC) + .withTitle("文件选择") + .withMaxNum(mFileMax) + .withFileFilter(fileFilter) + .start(); + } + } + + /** + * 显示类型 + */ + private void onShowType() { + mActivity.hideSoftKeyboard(); + if (mTyps != null && mTyps.size() > 0) { + if (mTypePicker == null) { + mTypePicker = new OptionsPickerBuilder(mActivity, (o1, o2, o3, v) -> { + mSelType = mTyps.get(o1); + mTvType.setText(mSelType.getDataName()); + }) + .setTitleText("请选择") + .setCancelColor(Color.parseColor("#1189FF")) + .setSubmitColor(Color.parseColor("#1189FF")) + .setTitleColor(Color.parseColor("#1189FF")) + .build(); + mTypePicker.setPicker(mTyps); + } + mTypePicker.show(); + } else { + ToastUtils.show("数据有误,请重新打开页面"); + } + } + + + /** + * 上传文件 + * + * @param paths + */ + private int mUploadCount = 0; + + private void doUploadFiles(ArrayList paths) { + ProgressDialog progressDialog = UIUtil.initDialog(mActivity, "上传中..."); + progressDialog.show(); + List> requests = new ArrayList<>(); + List fileNames = new ArrayList<>(); + for (int i = 0; i < paths.size(); i++) { + File file = new File(paths.get(i)); + Observable observable = createObservable(file); + fileNames.add(file.getName()); + if (observable == null) return; + requests.add(observable); + } + Observable[] observables1 = requests.toArray(new Observable[requests.size()]); + + Observable.mergeArrayDelayError(observables1) + .compose(RxTransformer.getTransformer()) + .subscribe(new Observer() { + @Override + public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) { + + } + + @Override + public void onNext(@NotNull Object o) { + ++mUploadCount; + if (o instanceof BaseSuccessBean) { + --mFileMax; + //刷新文件 + BaseSuccessBean bean = (BaseSuccessBean) o; + AddFileBean fileBean = new AddFileBean(); + fileBean.setId(bean.getData()); + fileBean.setPath(BaseUrlApi.BASE_IMG_URL + bean.getData()); + fileBean.setFileType(1); + fileBean.setFileName(fileNames.get(mUploadCount - 1)); + mFileBeans.add(0, fileBean); + } + mAddFileAdapter.notifyDataSetChanged(); + if (mUploadCount == paths.size()) { + mUploadCount = 0; + if (progressDialog.isShowing()) { + progressDialog.dismiss(); + } + } + } + + @Override + public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) { + e.printStackTrace(); + mUploadCount = 0; + if (progressDialog.isShowing()) { + progressDialog.dismiss(); + } + ToastUtils.show("上传失败,请稍后重试."); + } + + @Override + public void onComplete() { + + } + }); + } + + private Observable createObservable(File file) { + LogUtils.e(file.exists()); + RequestBody requestFile = RequestBody.create(file, MediaType.parse("multipart/form-data")); + MultipartBody.Part body; + body = MultipartBody.Part.createFormData("file", file.getName(), requestFile); + return RetrofitManager.getInstance() + .create(BaseApiService.class) + .uploadFile(body) + .compose(RxTransformer.getTransformer()); + } + + + private RequestBody buildParams() { + SaveWorkReportBean bean = new SaveWorkReportBean(); + String name = mEtName.getText().toString().trim(); + bean.setReportTitle(name); + String out = mEtOut.getText().toString().trim(); + bean.setReportEgress(out); + String content = mEtContent.getText().toString().trim(); + bean.setReportContent(content); + bean.setReportType(mSelType.getDataId()); + if (mFileBeans.size() >= 2) { + StringBuilder fileId = new StringBuilder(); + for (AddFileBean fileBean : mFileBeans) { + if (!TextUtils.isEmpty(fileBean.getId())) { + fileId.append(fileBean.getId()).append(","); + } + } + if (fileId.toString().endsWith(",")) { + fileId = new StringBuilder(fileId.substring(0, fileId.length() - 1)); + } + bean.setReportFiles(fileId.toString().trim()); + } else { + bean.setReportFiles(""); + } + return RequestBody.create(new Gson().toJson(bean), MediaType.parse("application/json; charset=utf-8")); + } + + private boolean checkParams() { + String name = mEtName.getText().toString().trim(); + if (TextUtils.isEmpty(name)) { + ToastUtils.show("请输入上报标题"); + return false; + } + if (mSelType == null) { + ToastUtils.show("请选择上报类型"); + return false; + } + String content = mEtContent.getText().toString().trim(); + if (TextUtils.isEmpty(content)) { + ToastUtils.show("请输入工作内容"); + return false; + } + return true; + } + + + private void doConfirm() { + if (checkParams()) { + ProgressDialog dialog = UIUtil.initDialog(mActivity, "保存中..."); + dialog.show(); + RequestBody body = buildParams(); + RetrofitManager.getInstance() + .create(OAApi.class) + .doEditWorkReport(mId, body) + .compose(RxTransformer.getTransformer()) + .subscribe(new Observer() { + @Override + public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) { + + } + + @Override + public void onNext(@io.reactivex.rxjava3.annotations.NonNull BaseSuccessBean baseSuccessBean) { + if (dialog.isShowing()) dialog.dismiss(); + ToastUtils.show("保存成功"); + BaseFragment preFragment = mMainActivity.getPreFragment(); + if (preFragment != null) { + preFragment.mIsRefresh = true; + } + mMainActivity.backFragment(1, WorkReportEditFragment.this); + } + + @Override + public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) { + if (dialog.isShowing()) dialog.dismiss(); + ExceptionHandler.handleException(e); + } + + @Override + public void onComplete() { + + } + }); + } + } + + @Override + protected void refreshView() { + setStateView(STATE_LOAD); + getDetailById(); + } + + @Override + protected void loadMoreData() { + mSrlView.finishRefresh(); + mSrlView.setNoMoreData(false); + } +} diff --git a/oamodule/src/main/java/com/tenlionsoft/oamodule/pad/fragments/home/workreports/WorkReportFragment.java b/oamodule/src/main/java/com/tenlionsoft/oamodule/pad/fragments/home/workreports/WorkReportFragment.java new file mode 100644 index 0000000..f8fbb50 --- /dev/null +++ b/oamodule/src/main/java/com/tenlionsoft/oamodule/pad/fragments/home/workreports/WorkReportFragment.java @@ -0,0 +1,220 @@ +package com.tenlionsoft.oamodule.pad.fragments.home.workreports; + +import android.content.Context; +import android.text.TextUtils; +import android.view.View; +import android.view.inputmethod.EditorInfo; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.hjq.toast.ToastUtils; +import com.scwang.smart.refresh.layout.SmartRefreshLayout; +import com.tenlionsoft.baselib.constant.PathConfig; +import com.tenlionsoft.baselib.core.retrofit_net.RetrofitManager; +import com.tenlionsoft.baselib.core.retrofit_net.conver.RxTransformer; +import com.tenlionsoft.baselib.core.widget.base.BaseFragment; +import com.tenlionsoft.baselib.core.widget.base.FragmentUtils; +import com.tenlionsoft.baselib.core.widget.views.CustomStateView; +import com.tenlionsoft.baselib.utils.ExceptionHandler; +import com.tenlionsoft.baselib.utils.LogUtils; +import com.tenlionsoft.oamodule.R; +import com.tenlionsoft.oamodule.R2; +import com.tenlionsoft.oamodule.adapter.WorkReportAdapter; +import com.tenlionsoft.oamodule.beans.WorkReportDetailBean; +import com.tenlionsoft.oamodule.beans.WorkReportListBean; +import com.tenlionsoft.oamodule.net.OAApi; +import com.tenlionsoft.oamodule.pad.activitys.home.PadMainActivity; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import butterknife.BindView; +import butterknife.ButterKnife; +import io.reactivex.rxjava3.annotations.NonNull; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; + +/** + * 作者: adam + * 日期: 2022/5/10 - 14:15 + * 邮箱: itgaojian@163.com + * 描述: 工作报告 + */ +@Route(path = PathConfig.PATH_MODULE_PAD_OA_FRAGMENT_WORK_REPORT) +public class WorkReportFragment extends BaseFragment { + @BindView(R2.id.et_base_search_cancel) + EditText mEtBaseSearchCancel; + @BindView(R2.id.tv_base_search_cancel) + TextView mTvBaseSearchCancel; + @BindView(R2.id.ll_base_search_cancel) + LinearLayout mLlBaseSearchCancel; + @BindView(R2.id.rlv_content) + RecyclerView mRlvContent; + @BindView(R2.id.srl_content) + SmartRefreshLayout mSrlContent; + @BindView(R2.id.csv_state) + CustomStateView mCsvState; + private List mDatas; + private WorkReportAdapter mAdapter; + private int mCurrentPage = 1; + private String mKeywords = ""; + private PadMainActivity mMainActivity; + + @Override + protected int getContentViewId() { + return R.layout.fragment_work_report; + } + + @Override + protected void setDataToView(View dataView) { + ButterKnife.bind(this, dataView); + setStateView(STATE_SUCCESS); + mSrlView.setEnableRefresh(false); + mSrlView.setEnableLoadMore(false); + setTitleView(true); + mTvFragmentTitle.setText("我的报告"); + mTvFragmentOption.setText("新增报告"); + mIvFragmentBack.setOnClickListener(v->mMainActivity.backFragment(1,this)); + mTvFragmentOption.setOnClickListener(v -> { + BaseFragment fragment = FragmentUtils.getFragment(PathConfig.PATH_MODULE_PAD_OA_FRAGMENT_WORK_REPORT_ADD); + mMainActivity.addFragment(1, fragment); + }); + mSrlContent.setOnRefreshListener(v -> doRefresh()); + mSrlContent.setOnLoadMoreListener(v -> doLoadMore()); + mDatas = new ArrayList<>(); + mAdapter = new WorkReportAdapter(mActivity, mDatas); + mRlvContent.setLayoutManager(new LinearLayoutManager(mActivity)); + mRlvContent.setAdapter(mAdapter); + mAdapter.addOnItemClickListener(workReportDetailBean -> { + BaseFragment id = FragmentUtils.getFragmentOne(PathConfig.PATH_MODULE_PAD_OA_FRAGMENT_WORK_REPORT_DETAIL, "id", workReportDetailBean.getWorkReportId()); + mMainActivity.addFragment(1, id); + }); + doRefresh(); + mEtBaseSearchCancel.setOnEditorActionListener((v, actionId, event) -> { + LogUtils.e("搜索==" + actionId); + if (actionId == EditorInfo.IME_ACTION_SEARCH) { + mActivity.hideSoftKeyboard(); + mEtBaseSearchCancel.clearFocus(); + mKeywords = v.getText().toString(); + doRefresh(); + return true; + } else { + return false; + } + }); + mTvBaseSearchCancel.setOnClickListener(v -> { + mEtBaseSearchCancel.setText(""); + mEtBaseSearchCancel.clearFocus(); + mKeywords = ""; + doRefresh(); + }); + } + + @Override + public void onAttach(@androidx.annotation.NonNull @NotNull Context context) { + super.onAttach(context); + mMainActivity = (PadMainActivity) getActivity(); + } + + private void doLoadMore() { + getWorkReportList(mCurrentPage); + } + + private void doRefresh() { + mDatas.clear(); + mAdapter.setData(mDatas); + getWorkReportList(1); + } + + + @Override + public void onHiddenChanged(boolean hidden) { + super.onHiddenChanged(hidden); + if (!hidden) { + if (mIsRefresh) { + mIsRefresh = false; + doRefresh(); + } + } + } + + private void getWorkReportList(int currentPage) { + mCurrentPage = currentPage; + RetrofitManager.getInstance() + .create(OAApi.class) + .getWorkReportList(mKeywords, mCurrentPage + "") + .compose(RxTransformer.getTransformer()) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + + } + + @Override + public void onNext(@NonNull WorkReportListBean listBean) { + if (listBean.getRows() != null && listBean.getRows().size() > 0) { + ++mCurrentPage; + if (currentPage == 1) { + mDatas.clear(); + mDatas.addAll(listBean.getRows()); + } else { + mDatas.addAll(listBean.getRows()); + } + mCsvState.setState(CustomStateView.STATE_SUCCESS); + mAdapter.notifyDataSetChanged(); + mSrlContent.finishRefresh(); + if (mDatas.size() >= listBean.getTotal()) { + mSrlContent.finishLoadMore(); + mSrlContent.setNoMoreData(true); + } else { + mSrlContent.finishLoadMore(); + mSrlContent.setNoMoreData(false); + } + } else { + mSrlContent.finishRefresh(); + mSrlContent.finishLoadMore(); + if (currentPage > 1) { + mSrlContent.setNoMoreData(true); + } else { + if (TextUtils.isEmpty(mKeywords)) { + //无数据 + mCsvState.setState(CustomStateView.STATE_EMPTY); + } else { + mCsvState.setState(CustomStateView.STATE_EMPTY); + ToastUtils.show("未查询到相关内容"); + } + } + } + } + + @Override + public void onError(@NonNull Throwable e) { + mSrlContent.finishLoadMore(); + mSrlContent.finishRefresh(); + ExceptionHandler.handleException(e); + mCsvState.setState(CustomStateView.STATE_ERROR); + } + + @Override + public void onComplete() { + + } + }); + } + + @Override + protected void refreshView() { + + } + + @Override + protected void loadMoreData() { + + } +} diff --git a/oamodule/src/main/res/layout/fragment_work_report.xml b/oamodule/src/main/res/layout/fragment_work_report.xml new file mode 100644 index 0000000..1752756 --- /dev/null +++ b/oamodule/src/main/res/layout/fragment_work_report.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/oamodule/src/main/res/layout/fragment_work_report_add.xml b/oamodule/src/main/res/layout/fragment_work_report_add.xml new file mode 100644 index 0000000..b89ef0d --- /dev/null +++ b/oamodule/src/main/res/layout/fragment_work_report_add.xml @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +