From c9e7ae240d4c0e69413dc27d40e31e2c9bc19368 Mon Sep 17 00:00:00 2001 From: itgaojian Date: Wed, 5 Jul 2023 17:57:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baselib/core/retrofit_net/BaseUrlApi.java | 8 +- .../core/widget/base/CustomDialog.java | 3 +- .../base/ViewPageWhiteNavigatorAdapter.java | 1 + .../baselib/core/widget/views/BallView.java | 10 +- .../core/widget/views/CircleChartView.java | 15 +- .../widget/views/ConditionAllAreaPopup.java | 7 +- .../baselib/utils/StringUtils.java | 84 +++++++++ .../shp_rectangle_white_ra_bottom.xml | 6 + .../layout/layout_custom_loading_dialog.xml | 8 +- .../main/res/layout/popup_all_area_layout.xml | 7 +- baselib/src/main/res/values/colors.xml | 1 + .../logs/StatisticsCommandActivity.java | 11 +- .../adapters/PopulaceCountAdapter.java | 4 +- .../GridLeaderStatisticsFragment.java | 178 ++++++------------ .../IncidentLeaderStatisticsFragment.java | 93 ++++++--- .../PopulaceLeaderStatisticsFragment.java | 29 +-- .../fragment_grid_leader_statistics.xml | 2 +- .../fragment_incident_leader_statistics.xml | 36 +++- .../fragment_populace_leader_statistics.xml | 27 +-- .../res/layout/multi_incident_mark_view.xml | 4 +- .../fragments/LeaderMainFragment.java | 8 +- .../drawable-xhdpi/ic_incident_track_icon.png | Bin 0 -> 4556 bytes .../ic_populace_popedom_icon.png | Bin 0 -> 3608 bytes .../ic_statistics_data_icon.png | Bin 0 -> 4612 bytes 24 files changed, 330 insertions(+), 212 deletions(-) create mode 100755 baselib/src/main/res/drawable/shp_rectangle_white_ra_bottom.xml create mode 100755 mainmodule/src/main/res/drawable-xhdpi/ic_incident_track_icon.png create mode 100755 mainmodule/src/main/res/drawable-xhdpi/ic_populace_popedom_icon.png create mode 100755 mainmodule/src/main/res/drawable-xhdpi/ic_statistics_data_icon.png diff --git a/baselib/src/main/java/com/tenlionsoft/baselib/core/retrofit_net/BaseUrlApi.java b/baselib/src/main/java/com/tenlionsoft/baselib/core/retrofit_net/BaseUrlApi.java index 437cf85..c7e0388 100755 --- a/baselib/src/main/java/com/tenlionsoft/baselib/core/retrofit_net/BaseUrlApi.java +++ b/baselib/src/main/java/com/tenlionsoft/baselib/core/retrofit_net/BaseUrlApi.java @@ -20,13 +20,13 @@ public class BaseUrlApi { public static final String SYS_VISITS = "visits/";/*信访系统*/ public static final String BASE_MAIN_IP = IP + SYS_USERCENTER; - // public static final String BASE_CASE_IP = IP + SYS_CASE; - public static final String BASE_CASE_IP = "http://192.168.0.120:9000/" + SYS_CASE; + public static final String BASE_CASE_IP = IP + SYS_CASE; +// public static final String BASE_CASE_IP = "http://192.168.0.120:9000/" + SYS_CASE; public static final String BASE_CASE_LOCAL_IP = "http://49.233.36.36:58099/case/"; public static final String BASE_LIBRARY_IP = IP + SYS_LIBRARY; public static final String BASE_TASK_IP = IP + SYS_TASK; - // public static final String BASE_PERSON_IP = IP + SYS_POPULATION; - public static final String BASE_PERSON_IP = "http://192.168.0.115:8080/" + SYS_POPULATION; + public static final String BASE_PERSON_IP = IP + SYS_POPULATION; +// public static final String BASE_PERSON_IP = "http://192.168.0.115:8080/" + SYS_POPULATION; public static final String BASE_HOUSE_IP = IP + SYS_HOUSE; public static final String BASE_SECURITY_IP = IP + SYS_SECURITY; public static final String BASE_VISITS_IP = IP + SYS_VISITS; diff --git a/baselib/src/main/java/com/tenlionsoft/baselib/core/widget/base/CustomDialog.java b/baselib/src/main/java/com/tenlionsoft/baselib/core/widget/base/CustomDialog.java index 175bd8f..0bc39f7 100644 --- a/baselib/src/main/java/com/tenlionsoft/baselib/core/widget/base/CustomDialog.java +++ b/baselib/src/main/java/com/tenlionsoft/baselib/core/widget/base/CustomDialog.java @@ -61,7 +61,8 @@ public class CustomDialog extends ProgressDialog { window.setWindowAnimations(R.style.Dialog_ChoseFile); WindowManager.LayoutParams params = window.getAttributes(); params.dimAmount = 0.3f; - params.width = (int) (width * 0.5); + params.width = (int) (width * 0.4); +// params.width = WindowManager.LayoutParams.WRAP_CONTENT; params.height = WindowManager.LayoutParams.WRAP_CONTENT; window.setAttributes(params); window.setBackgroundDrawable(new ColorDrawable()); diff --git a/baselib/src/main/java/com/tenlionsoft/baselib/core/widget/base/ViewPageWhiteNavigatorAdapter.java b/baselib/src/main/java/com/tenlionsoft/baselib/core/widget/base/ViewPageWhiteNavigatorAdapter.java index cd63616..d0d5f86 100644 --- a/baselib/src/main/java/com/tenlionsoft/baselib/core/widget/base/ViewPageWhiteNavigatorAdapter.java +++ b/baselib/src/main/java/com/tenlionsoft/baselib/core/widget/base/ViewPageWhiteNavigatorAdapter.java @@ -53,4 +53,5 @@ public class ViewPageWhiteNavigatorAdapter extends CommonNavigatorAdapter { indicator.setColors(Color.WHITE); return indicator; } + } diff --git a/baselib/src/main/java/com/tenlionsoft/baselib/core/widget/views/BallView.java b/baselib/src/main/java/com/tenlionsoft/baselib/core/widget/views/BallView.java index 24901d5..be844ed 100644 --- a/baselib/src/main/java/com/tenlionsoft/baselib/core/widget/views/BallView.java +++ b/baselib/src/main/java/com/tenlionsoft/baselib/core/widget/views/BallView.java @@ -66,7 +66,13 @@ public class BallView extends View { super.onMeasure(widthMeasureSpec, heightMeasureSpec); mWidth = resolveSize(mWidth, widthMeasureSpec); mHeight = resolveSize(mHeight, heightMeasureSpec); - setMeasuredDimension(mWidth, mHeight); + setMeasuredDimension( + Math.max(getSuggestedMinimumWidth(), + resolveSize(mWidth, + widthMeasureSpec)), + Math.max(getSuggestedMinimumHeight(), + resolveSize(mHeight, + heightMeasureSpec))); } @@ -104,7 +110,7 @@ public class BallView extends View { emptyPaint.setColor(Color.parseColor("#FFA900")); emptyPaint.setStyle(Paint.Style.FILL); emptyPaint.setTextSize(ConvertUtils.sp2px(14f)); - canvas.drawText("暂无数据", canvas.getHeight() / 2, canvas.getWidth() / 2, emptyPaint); + canvas.drawText("暂无数据", mWidth / 2, mHeight / 2, emptyPaint); } } diff --git a/baselib/src/main/java/com/tenlionsoft/baselib/core/widget/views/CircleChartView.java b/baselib/src/main/java/com/tenlionsoft/baselib/core/widget/views/CircleChartView.java index 0691546..e3364f8 100644 --- a/baselib/src/main/java/com/tenlionsoft/baselib/core/widget/views/CircleChartView.java +++ b/baselib/src/main/java/com/tenlionsoft/baselib/core/widget/views/CircleChartView.java @@ -36,9 +36,9 @@ public class CircleChartView extends View { private Paint mTextPaint; private Bitmap mBitmap; private Paint mPaint; - private int mSmallCirRadius = 25; //圆环上小圆的半径 + private int mSmallCirRadius = 20; //圆环上小圆的半径 private int mPadding = 25;//圆环距离视图的距离 - private int mDisCircle = 35;//中心圆与圆环的间距 + private int mDisCircle = 25;//中心圆与圆环的间距 private double mStartAngle = 0;//开始角度 private double mSweepAngle = 0;//角度 private double mSurplusAngle = 360;// @@ -68,6 +68,7 @@ public class CircleChartView extends View { * 初始化 */ private void init() { + setLayerType(LAYER_TYPE_SOFTWARE, null);//禁用硬件加速 //初始化画笔 mColorPaint = new Paint(); mColorPaint.setColor(Color.parseColor("#FFA800")); @@ -96,7 +97,7 @@ public class CircleChartView extends View { mCirclePaint.setColor(Color.parseColor("#E7E7E7")); mCirclePaint.setStyle(Paint.Style.FILL); mCirclePaint.setAntiAlias(true); - mCirclePaint.setShadowLayer(3, 4, 4, Color.parseColor("#E5E5E5")); + mCirclePaint.setShadowLayer(2, 4, 4, Color.parseColor("#E9E9E9")); mBitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.ic_statistics_count_percent_icon); mPaint = new Paint(); @@ -165,10 +166,10 @@ public class CircleChartView extends View { int bitMapCenterX = mCenterX; int bitmapCenterY = mCenterY - 20; Rect dstRect = new Rect(); - int l = bitMapCenterX - 40; - int t = bitmapCenterY - 40; - int r = bitMapCenterX + 40; - int b = bitmapCenterY + 40; + int l = bitMapCenterX - 32; + int t = bitmapCenterY - 36; + int r = bitMapCenterX + 32; + int b = bitmapCenterY + 36; dstRect.set(l, t, r, b); canvas.drawBitmap(mBitmap, null, dstRect, mTextPaint); //计算文字的宽度 diff --git a/baselib/src/main/java/com/tenlionsoft/baselib/core/widget/views/ConditionAllAreaPopup.java b/baselib/src/main/java/com/tenlionsoft/baselib/core/widget/views/ConditionAllAreaPopup.java index 0c4feba..c706c8d 100644 --- a/baselib/src/main/java/com/tenlionsoft/baselib/core/widget/views/ConditionAllAreaPopup.java +++ b/baselib/src/main/java/com/tenlionsoft/baselib/core/widget/views/ConditionAllAreaPopup.java @@ -65,6 +65,8 @@ public class ConditionAllAreaPopup extends BasePopupWindow { mCurrentAreaStr = currentArea; mUserLevel = userLevel; mTvCurrentArea = view.findViewById(R.id.tv_current_area); +// FrameLayout flContent = view.findViewById(R.id.fl_content); +// flContent.setOnClickListener(v -> this.dismiss()); mTvCurrentArea.setText(mCurrentAreaStr); mRlvArea1 = view.findViewById(R.id.rlv_area_1); mRlvArea2 = view.findViewById(R.id.rlv_area_2); @@ -173,12 +175,15 @@ public class ConditionAllAreaPopup extends BasePopupWindow { break; } setContentView(view); - setBackgroundColor(Color.parseColor("#11000000")); + setBackgroundColor(Color.parseColor("#67000000")); setPopupGravity(Gravity.CENTER | Gravity.BOTTOM); DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); int height = (int) (displayMetrics.heightPixels * 0.3); setHeight(height); +// setHeight(displayMetrics.heightPixels); setWidth(displayMetrics.widthPixels); + setAlignBackground(true); + setAlignBackgroundGravity(Gravity.TOP); } diff --git a/baselib/src/main/java/com/tenlionsoft/baselib/utils/StringUtils.java b/baselib/src/main/java/com/tenlionsoft/baselib/utils/StringUtils.java index 06fca76..47a3e57 100755 --- a/baselib/src/main/java/com/tenlionsoft/baselib/utils/StringUtils.java +++ b/baselib/src/main/java/com/tenlionsoft/baselib/utils/StringUtils.java @@ -1,6 +1,31 @@ package com.tenlionsoft.baselib.utils; +import android.text.SpannableString; +import android.text.TextUtils; +import android.text.style.RelativeSizeSpan; + +import java.text.DecimalFormat; + public final class StringUtils { + /** + * 中文数字 + */ + private static final String[] CN_NUM = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"}; + + /** + * 中文数字单位 + */ + private static final String[] CN_UNIT = {"", "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千"}; + + /** + * 特殊字符:负 + */ + private static final String CN_NEGATIVE = "负"; + + /** + * 特殊字符:点 + */ + private static final String CN_POINT = "点"; private StringUtils() { throw new UnsupportedOperationException("u can't instantiate me..."); @@ -182,4 +207,63 @@ public final class StringUtils { } return new String(chars); } + + /** + * int 转 中文数字 + * 支持到int最大值 + * + * @param intNum 要转换的整型数 + * @return 中文数字 + */ + public static String int2chineseNum(int intNum) { + StringBuffer sb = new StringBuffer(); + boolean isNegative = false; + if (intNum < 0) { + isNegative = true; + intNum *= -1; + } + int count = 0; + while (intNum > 0) { + sb.insert(0, CN_NUM[intNum % 10] + CN_UNIT[count]); + intNum = intNum / 10; + count++; + } + + if (isNegative) + sb.insert(0, CN_NEGATIVE); + + + return sb.toString().replaceAll("零[千百十]", "零").replaceAll("零+万", "万") + .replaceAll("零+亿", "亿").replaceAll("亿万", "亿零") + .replaceAll("零+", "零").replaceAll("零$", ""); + } + + public static CharSequence numAddUnit(int num) { + if (num > 9999) { + //万 + DecimalFormat df2 = new DecimalFormat("0.00"); + String format = df2.format((float) num / 10000); + String content = format + "万"; + SpannableString s = new SpannableString(content); + s.setSpan(new RelativeSizeSpan(0.6f), content.indexOf("万"), content.length(), + 0); + return s; + } else { + DecimalFormat mFormat = new DecimalFormat("###,###,###,###"); + String format = mFormat.format(num); + return format; + } + } + + public static CharSequence numAddUnit(String num) { + if (TextUtils.isEmpty(num)) return "0"; + try { + int i = Integer.parseInt(num); + DecimalFormat mFormat = new DecimalFormat("###,###,###,###"); + String format = mFormat.format(i); + return format; + } catch (Exception e) { + return "0"; + } + } } diff --git a/baselib/src/main/res/drawable/shp_rectangle_white_ra_bottom.xml b/baselib/src/main/res/drawable/shp_rectangle_white_ra_bottom.xml new file mode 100755 index 0000000..0d347e1 --- /dev/null +++ b/baselib/src/main/res/drawable/shp_rectangle_white_ra_bottom.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/baselib/src/main/res/layout/layout_custom_loading_dialog.xml b/baselib/src/main/res/layout/layout_custom_loading_dialog.xml index 87aaa9f..b35bd8a 100644 --- a/baselib/src/main/res/layout/layout_custom_loading_dialog.xml +++ b/baselib/src/main/res/layout/layout_custom_loading_dialog.xml @@ -16,8 +16,8 @@ @@ -35,7 +35,7 @@ android:maxEms="10" android:maxLines="1" android:textColor="@color/white" - android:textSize="15sp" - tools:text="加载中加载中加载中加载中加载中...." /> + android:textSize="15dp" + tools:text="加载中...." /> \ No newline at end of file diff --git a/baselib/src/main/res/layout/popup_all_area_layout.xml b/baselib/src/main/res/layout/popup_all_area_layout.xml index 7b6b880..df1e644 100644 --- a/baselib/src/main/res/layout/popup_all_area_layout.xml +++ b/baselib/src/main/res/layout/popup_all_area_layout.xml @@ -3,10 +3,10 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="5dp" - android:background="@drawable/shp_rectangle_white" + android:background="@drawable/shp_rectangle_white_ra_bottom" android:orientation="vertical"> + - - - \ No newline at end of file diff --git a/baselib/src/main/res/values/colors.xml b/baselib/src/main/res/values/colors.xml index 0cc078c..21ac955 100755 --- a/baselib/src/main/res/values/colors.xml +++ b/baselib/src/main/res/values/colors.xml @@ -111,6 +111,7 @@ #686767 #535353 #00000000 + #67000000 #1189FF #9F1512 diff --git a/commonmodule/src/main/java/com/tengshisoft/commonmodule/activitys/logs/StatisticsCommandActivity.java b/commonmodule/src/main/java/com/tengshisoft/commonmodule/activitys/logs/StatisticsCommandActivity.java index bc8e969..7da07d4 100644 --- a/commonmodule/src/main/java/com/tengshisoft/commonmodule/activitys/logs/StatisticsCommandActivity.java +++ b/commonmodule/src/main/java/com/tengshisoft/commonmodule/activitys/logs/StatisticsCommandActivity.java @@ -17,11 +17,11 @@ import com.tengshisoft.commonmodule.R2; import com.tenlionsoft.baselib.constant.PathConfig; import com.tenlionsoft.baselib.core.widget.base.BaseActivity; import com.tenlionsoft.baselib.core.widget.base.BaseFragment; -import com.tenlionsoft.baselib.core.widget.base.ViewPageNavigatorAdapter; import com.tenlionsoft.baselib.core.widget.base.ViewPageWhiteNavigatorAdapter; import com.tenlionsoft.baselib.utils.UIUtil; import net.lucode.hackware.magicindicator.MagicIndicator; +import net.lucode.hackware.magicindicator.abs.IPagerNavigator; import net.lucode.hackware.magicindicator.buildins.commonnavigator.CommonNavigator; import java.util.ArrayList; @@ -42,9 +42,9 @@ import butterknife.Unbinder; public class StatisticsCommandActivity extends BaseActivity { @BindView(R2.id.mi_tabs) - public MagicIndicator mMiTabs; + MagicIndicator mMiTabs; @BindView(R2.id.vp_content) - public ViewPager2 mVpContent; + ViewPager2 mVpContent; @BindView(R2.id.iv_back) ImageView mIvBack; @@ -90,7 +90,10 @@ public class StatisticsCommandActivity extends BaseActivity { commonNavigator.setAdjustMode(false); mMiTabs.setNavigator(commonNavigator); mVpContent.setUserInputEnabled(false); - UIUtil.bindViewPager2(mMiTabs, mVpContent, null); + UIUtil.bindViewPager2(mMiTabs, mVpContent, pos -> { + IPagerNavigator navigator = mMiTabs.getNavigator(); + }); + mVpContent.setOffscreenPageLimit(1); } diff --git a/commonmodule/src/main/java/com/tengshisoft/commonmodule/adapters/PopulaceCountAdapter.java b/commonmodule/src/main/java/com/tengshisoft/commonmodule/adapters/PopulaceCountAdapter.java index 0002855..28e7081 100644 --- a/commonmodule/src/main/java/com/tengshisoft/commonmodule/adapters/PopulaceCountAdapter.java +++ b/commonmodule/src/main/java/com/tengshisoft/commonmodule/adapters/PopulaceCountAdapter.java @@ -9,6 +9,7 @@ import com.tengshisoft.commonmodule.R; import com.tengshisoft.commonmodule.beans.AreaPopulaceBean; import com.tengshisoft.commonmodule.holders.PopulaceItemHolder; import com.tenlionsoft.baselib.core.widget.base.BaseRecyclerAdapter; +import com.tenlionsoft.baselib.utils.StringUtils; import java.util.List; @@ -34,7 +35,8 @@ public class PopulaceCountAdapter extends BaseRecyclerAdapter> areaReportTop7 = RetrofitManager.getInstance() .create(CenterApis.class) - .getAreaReportTop7(mCurrentAreaCode, UserLgUtils.getToken()) + .getAreaReportTop7(mCurrentAreaCode, UserLgUtils.getToken()); + //网格员上报事件 + Observable areaGridPercent = RetrofitManager.getInstance() + .create(CenterApis.class) + .getAreaGridPercent(mCurrentAreaCode, UserLgUtils.getToken()); + //辖区内网格员 + Observable areaGrid = RetrofitManager.getInstance() + .create(CenterApis.class) + .getAreaGrid(mCurrentAreaCode, UserLgUtils.getToken()); + //辖区下级网格员人数 + Observable areaLowerGrid = RetrofitManager.getInstance() + .create(CenterApis.class) + .getAreaLowerGrid(mCurrentAreaCode, UserLgUtils.getToken()); + Observable[] observables1 = new Observable[]{areaReportTop7, areaGridPercent, areaGrid, areaLowerGrid}; + Observable.mergeArrayDelayError(observables1) .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Observer>() { + .observeOn(AndroidSchedulers.mainThread(), true) + .subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { } @Override - public void onNext(@NonNull List areaIncidentCategoryBeans) { + public void onNext(Object o) { if (mDialog != null && mDialog.isShowing()) { mDialog.dismiss(); } - areaIncidentCategoryBeans.add(0, new IncidentTop7Bean()); - mTop7BeanList = areaIncidentCategoryBeans; - mTop7Adapter.setData(mTop7BeanList); + mSrlView.finishRefresh(); + LogUtils.e("TOP7" + o.getClass().getSimpleName()); + if (o instanceof ArrayList) { + //TOP7 + ArrayList areaIncidentCategoryBeans = (ArrayList) o; + areaIncidentCategoryBeans.add(0, new IncidentTop7Bean()); + mTop7BeanList = areaIncidentCategoryBeans; + mTop7Adapter.setData(mTop7BeanList); + } else if (o instanceof AreaIncidentPercentBean) { + //网格员上报事件占比 + AreaIncidentPercentBean b = (AreaIncidentPercentBean) o; + setAreaIncidentPercent(b); + } else if (o instanceof AreaGridCountBean) { + //网格员占比 + AreaGridCountBean b = (AreaGridCountBean) o; + setGridCount(b); + } else if (o instanceof AreaGridLowCountBean) { + //下级网格人数 + AreaGridLowCountBean b = (AreaGridLowCountBean) o; + if (b.getData() != null && b.getData().size() > 0) { + mRlvGridCount.setVisibility(View.VISIBLE); + mTvGridCountHint.setVisibility(View.GONE); + mLowCountDatas = b.getData(); + mGridCountAdapter.setData(mLowCountDatas); + } else { + mRlvGridCount.setVisibility(View.GONE); + mTvGridCountHint.setVisibility(View.VISIBLE); + } + } } @Override @@ -134,6 +176,8 @@ public class GridLeaderStatisticsFragment extends BaseFragment { if (mDialog != null && mDialog.isShowing()) { mDialog.dismiss(); } + mSrlView.finishRefresh(); + ExceptionHandler.handleException(e); } @Override @@ -141,101 +185,6 @@ public class GridLeaderStatisticsFragment extends BaseFragment { } }); - RetrofitManager.getInstance() - .create(CenterApis.class) - .getAreaGridPercent(mCurrentAreaCode, UserLgUtils.getToken()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Observer() { - @Override - public void onSubscribe(@NonNull Disposable d) { - - } - - @Override - public void onNext(@NonNull AreaIncidentPercentBean areaIncidentCategoryBeans) { - if (mDialog != null && mDialog.isShowing()) { - mDialog.dismiss(); - } - setAreaIncidentPercent(areaIncidentCategoryBeans); - } - - @Override - public void onError(@NonNull Throwable e) { - if (mDialog != null && mDialog.isShowing()) { - mDialog.dismiss(); - } - } - - @Override - public void onComplete() { - - } - }); - - //获取辖区内网格员 - RetrofitManager.getInstance() - .create(CenterApis.class) - .getAreaGrid(mCurrentAreaCode, UserLgUtils.getToken()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Observer() { - @Override - public void onSubscribe(@NonNull Disposable d) { - - } - - @Override - public void onNext(@NonNull AreaGridCountBean areaPopulaceBean) { - setGridCount(areaPopulaceBean); - } - - @Override - public void onError(@NonNull Throwable e) { - - } - - @Override - public void onComplete() { - - } - }); - //获取辖区下级网格员 - RetrofitManager.getInstance() - .create(CenterApis.class) - .getAreaLowerGrid(mCurrentAreaCode, UserLgUtils.getToken()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Observer() { - @Override - public void onSubscribe(@NonNull Disposable d) { - - } - - @Override - public void onNext(@NonNull AreaGridLowCountBean areaPopulaceBeans) { - if (areaPopulaceBeans.getData() != null && areaPopulaceBeans.getData().size() > 0) { - mRlvGridCount.setVisibility(View.VISIBLE); - mTvGridCountHint.setVisibility(View.GONE); - mLowCountDatas = areaPopulaceBeans.getData(); - mGridCountAdapter.setData(mLowCountDatas); - } else { - mRlvGridCount.setVisibility(View.GONE); - mTvGridCountHint.setVisibility(View.VISIBLE); - } - } - - @Override - public void onError(@NonNull Throwable e) { - - } - - @Override - public void onComplete() { - - } - }); - } /** @@ -249,6 +198,7 @@ public class GridLeaderStatisticsFragment extends BaseFragment { double percent = ((double) bean.getData().getCount() / bean.getData().getTotal()) * 100; DecimalFormat format = new DecimalFormat("#0.00"); String percentStr = format.format(percent); + LogUtils.e("网格人数:" + bean.getData().getCount() + "\n总人数:" + bean.getData().getTotal() + "占比:" + percentStr); //计算占用比例 mCcvPercent.setData(Double.parseDouble(percentStr)); String countStr = bean.getData().getCount() + " 人"; @@ -266,22 +216,18 @@ public class GridLeaderStatisticsFragment extends BaseFragment { */ private void initViews() { mTop7BeanList = new ArrayList<>(); - mTvCurrentTime.setText("数据更新时间:" + TimeUtils.getCurrentTimeHHMM()); + mCurrentAreaCode = UserLgUtils.getUserAreaCode(); + mTvArea.setText(UserLgUtils.getUserFullAreaName()); mRlvGridIncident.setLayoutManager(new LinearLayoutManager(mActivity)); mTop7Adapter = new IncidentStatisticsAdapter(mActivity, mTop7BeanList); mRlvGridIncident.setAdapter(mTop7Adapter); - mLowCountDatas = new ArrayList<>(); mGridCountAdapter = new GridPersonCountAdapter(mActivity, mLowCountDatas); mRlvGridCount.setLayoutManager(new GridLayoutManager(mActivity, 1, GridLayoutManager.HORIZONTAL, false)); mRlvGridCount.setAdapter(mGridCountAdapter); - - mCurrentAreaCode = UserLgUtils.getUserAreaCode(); initPieChart(); mLlArea.setOnClickListener(v -> onShowArea()); - mTvArea.setText(UserLgUtils.getUserFullAreaName()); mDialog = UIUtil.initDialog(mActivity, "加载中..."); - mDialog.show(); } /** @@ -323,7 +269,7 @@ public class GridLeaderStatisticsFragment extends BaseFragment { getData(); areaPopup.dismiss(); }); - areaPopup.setOffsetY(10); + areaPopup.setOffsetY(20); areaPopup.showPopupWindow(mTvArea); } @@ -334,7 +280,7 @@ public class GridLeaderStatisticsFragment extends BaseFragment { */ private void setAreaIncidentPercent(AreaIncidentPercentBean bean) { ArrayList entries = new ArrayList<>(); - + mTvCurrentTime.setText("数据更新时间:" + bean.getData().getDataTime()); mPieChart.clear(); if (bean.getData() == null) return; if (bean.getData().getNowAreaReportNum() == 0 && bean.getData().getOtherAreaReportNum() == 0) return; @@ -398,7 +344,7 @@ public class GridLeaderStatisticsFragment extends BaseFragment { @Override protected void refreshView() { - + getData(); } @Override diff --git a/commonmodule/src/main/java/com/tengshisoft/commonmodule/fragments/IncidentLeaderStatisticsFragment.java b/commonmodule/src/main/java/com/tengshisoft/commonmodule/fragments/IncidentLeaderStatisticsFragment.java index 9bef3ba..5acdf52 100644 --- a/commonmodule/src/main/java/com/tengshisoft/commonmodule/fragments/IncidentLeaderStatisticsFragment.java +++ b/commonmodule/src/main/java/com/tengshisoft/commonmodule/fragments/IncidentLeaderStatisticsFragment.java @@ -4,6 +4,7 @@ import android.app.ProgressDialog; import android.graphics.Color; import android.graphics.Typeface; import android.text.SpannableString; +import android.text.TextUtils; import android.text.style.ForegroundColorSpan; import android.text.style.RelativeSizeSpan; import android.text.style.StyleSpan; @@ -42,26 +43,28 @@ import com.tengshisoft.commonmodule.utils.PiePercentFormater; import com.tengshisoft.commonmodule.views.MyIncidentMarkerView; 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.views.ConditionAllAreaPopup; import com.tenlionsoft.baselib.utils.ExceptionHandler; import com.tenlionsoft.baselib.utils.LogUtils; +import com.tenlionsoft.baselib.utils.StringUtils; +import com.tenlionsoft.baselib.utils.TimeUtils; import com.tenlionsoft.baselib.utils.UIUtil; import com.tenlionsoft.baselib.utils.UserLgUtils; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Random; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.Unbinder; +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; 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 io.reactivex.rxjava3.schedulers.Schedulers; /** * 作者: adam @@ -91,29 +94,32 @@ public class IncidentLeaderStatisticsFragment extends BaseFragment { TextView mTvHotType2; @BindView(R2.id.tv_hot_detail) TextView mTvHotDetail; + @BindView(R2.id.tv_hot_detail_scale) + TextView mTvHotDetailScale; + @BindView(R2.id.tv_refresh_time) + TextView mTvRefreshTime; private Unbinder mBind; private LabelAdapter mLabelAdapter; private List mLabelBeanList; private List labelHint = null; private String mCurrentAreaCode; private ProgressDialog mDialog; + private Random mColorRandom; @Override protected void setDataToView(View dataView) { mBind = ButterKnife.bind(this, dataView); setStateView(STATE_SUCCESS); mSrlView.setEnableLoadMore(false); - mSrlView.setEnableRefresh(false); + mSrlView.setEnableRefresh(true); initViews(); - getData(); + mSrlView.autoRefresh(); } /** * 获取数据 */ private void getData() { - - //获取事件分类占比 Observable areaTypeScale = RetrofitManager.getInstance() .create(CenterApis.class) @@ -127,7 +133,8 @@ public class IncidentLeaderStatisticsFragment extends BaseFragment { .create(CenterApis.class) .getAreaIncidentCategory(mCurrentAreaCode, UserLgUtils.getToken()); Observable.mergeDelayError(areaTypeScale, areaHot, areaIncidentCategory) - .compose(RxTransformer.getTransformer()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread(), true) .subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { @@ -136,6 +143,10 @@ public class IncidentLeaderStatisticsFragment extends BaseFragment { @Override public void onNext(@NonNull Object o) { + mSrlView.finishRefresh(); + if (mDialog != null && mDialog.isShowing()) { + mDialog.dismiss(); + } if (o instanceof AreaIncidentScaleBean) { AreaIncidentScaleBean b = (AreaIncidentScaleBean) o; if (b.getReportTypeList() != null && b.getReportTypeList().size() > 0) { @@ -152,21 +163,25 @@ public class IncidentLeaderStatisticsFragment extends BaseFragment { } mLabelAdapter.setData(mLabelBeanList); setInfoToView(b, mLabelBeanList); + } else { + mPieChart.clear(); + mPieChart.invalidate(); } } else if (o instanceof AreaIncidentHotBean) { AreaIncidentHotBean b = (AreaIncidentHotBean) o; setHotDataToView(b); - } else if (o instanceof List) { - List b = (List) o; + } else if (o instanceof ArrayList) { + ArrayList b = (ArrayList) o; setIncidentCategory(b); } - if (mDialog != null && mDialog.isShowing()) { - mDialog.dismiss(); - } + } @Override public void onError(@NonNull Throwable e) { + if (mDialog != null && mDialog.isShowing()) { + mDialog.dismiss(); + } if (mDialog != null && mDialog.isShowing()) { mDialog.dismiss(); } @@ -184,20 +199,25 @@ public class IncidentLeaderStatisticsFragment extends BaseFragment { * 显示热门事件数据 */ private void setHotDataToView(AreaIncidentHotBean hotBean) { - mTvHotType1.setText(hotBean.getTypeName1()); - mTvHotType2.setText(hotBean.getTypeName2()); - mTvHotDetail.setText(generateHotTxt("共计上报" + hotBean.getReportNum() + "件\n占比" + hotBean.getReportScale() + "%")); + mTvHotType1.setText(TextUtils.isEmpty(hotBean.getTypeName1()) ? "无" : hotBean.getTypeName1()); + mTvHotType2.setText(TextUtils.isEmpty(hotBean.getTypeName2()) ? "无" : hotBean.getTypeName2()); + mTvHotDetail.setText(generateHotTxt("共计上报" + StringUtils.numAddUnit(hotBean.getReportNum()) + "件")); + String scale = TextUtils.isEmpty(hotBean.getReportScale()) ? "0" : hotBean.getReportScale(); + mTvHotDetailScale.setText(generateHotScale("占比" + scale + "%")); } private SpannableString generateHotTxt(String content) { SpannableString s = new SpannableString(content); s.setSpan(new RelativeSizeSpan(1.4f), content.lastIndexOf("报") + 1, content.indexOf("件"), 0); - s.setSpan(new UnderlineSpan(), content.lastIndexOf("报"), content.indexOf("件"), 0); + s.setSpan(new UnderlineSpan(), content.lastIndexOf("报") + 1, content.indexOf("件"), 0); + s.setSpan(new StyleSpan(Typeface.BOLD), content.lastIndexOf("报") + 1, content.indexOf("件"), 0); + return s; + } + private SpannableString generateHotScale(String content) { + SpannableString s = new SpannableString(content); s.setSpan(new RelativeSizeSpan(1.4f), content.indexOf("比") + 1, content.length() - 1, 0); s.setSpan(new UnderlineSpan(), content.lastIndexOf("比") + 1, content.length() - 1, 0); - - s.setSpan(new StyleSpan(Typeface.BOLD), content.lastIndexOf("报") + 1, content.indexOf("件"), 0); s.setSpan(new StyleSpan(Typeface.BOLD), content.lastIndexOf("比") + 1, content.length() - 1, 0); return s; } @@ -207,9 +227,9 @@ public class IncidentLeaderStatisticsFragment extends BaseFragment { */ private void setInfoToView(AreaIncidentScaleBean b, List list) { //设置文字数据 - - mTvDoIncident.setText(generateDisTxt("上报事件已处理\n" + b.getOverNum() + "件")); - mTvUndoIncident.setText(generateDisTxt("上报事件未处理\n" + b.getNoOverNum() + "件")); + mPieChart.clear(); + mTvDoIncident.setText(generateDisTxt("上报事件已处理\n" + StringUtils.numAddUnit(b.getOverNum()) + "件")); + mTvUndoIncident.setText(generateDisTxt("上报事件未处理\n" + StringUtils.numAddUnit(b.getNoOverNum()) + "件")); ArrayList entries = new ArrayList<>(); if (list == null || list.size() == 0) return; @@ -257,7 +277,7 @@ public class IncidentLeaderStatisticsFragment extends BaseFragment { mLlArea.setOnClickListener(v -> onShowArea()); mTvArea.setText(UserLgUtils.getUserFullAreaName()); mDialog = UIUtil.initDialog(mActivity, "加载中..."); - mDialog.show(); + mTvRefreshTime.setText("数据更新时间:" + TimeUtils.getCurrentDate()); } private void onShowArea() { @@ -275,7 +295,7 @@ public class IncidentLeaderStatisticsFragment extends BaseFragment { getData(); areaPopup.dismiss(); }); - areaPopup.setOffsetY(10); + areaPopup.setOffsetY(20); areaPopup.showPopupWindow(mTvArea); } @@ -311,7 +331,7 @@ public class IncidentLeaderStatisticsFragment extends BaseFragment { * 构建事件分类占比图中心展示的文字 */ private SpannableString generateCenterSpannableText(int total) { - String content = "上报事件总数\n" + total + "件"; + String content = "上报事件总数\n" + StringUtils.numAddUnit(total) + "件"; SpannableString s = new SpannableString(content); s.setSpan(new RelativeSizeSpan(0.8f), 0, content.indexOf("数") + 1, 0); s.setSpan(new RelativeSizeSpan(0.8f), content.lastIndexOf("件"), content.length(), 0); @@ -380,6 +400,7 @@ public class IncidentLeaderStatisticsFragment extends BaseFragment { * 显示事件分类 */ private void setIncidentCategory(List datas) { + mHbcChart.clear(); if (datas != null && datas.size() > 0) { setAxis(datas); float maxiNum = getMaxNum(datas); @@ -411,7 +432,6 @@ public class IncidentLeaderStatisticsFragment extends BaseFragment { mHbcChart.setMarker(mv); // Set the marker to the chart } else { - mHbcChart.clear(); mHbcChart.setNoDataText("当前区域内无数据"); } mHbcChart.invalidate(); @@ -437,14 +457,29 @@ public class IncidentLeaderStatisticsFragment extends BaseFragment { * 获取随机颜色值 */ private int getRandomColor() { - Random rnd = new Random(); - int color = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)); - return color; + if (mColorRandom == null) { + mColorRandom = new Random(); + } + int r = 0; + int g = 0; + int b = 0; + for (int i = 0; i < 2; i++) { + int temp = mColorRandom.nextInt(16); + r = r * 16 + temp; + temp = mColorRandom.nextInt(16); + g = g * 16 + temp; + temp = mColorRandom.nextInt(16); + b = b * 16 + temp; + } + return Color.rgb(r, g, b); +// Random rnd = new Random(); +// int color = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)); +// return color; } @Override protected void refreshView() { - + getData(); } @Override diff --git a/commonmodule/src/main/java/com/tengshisoft/commonmodule/fragments/PopulaceLeaderStatisticsFragment.java b/commonmodule/src/main/java/com/tengshisoft/commonmodule/fragments/PopulaceLeaderStatisticsFragment.java index 82b31f6..93af084 100644 --- a/commonmodule/src/main/java/com/tengshisoft/commonmodule/fragments/PopulaceLeaderStatisticsFragment.java +++ b/commonmodule/src/main/java/com/tengshisoft/commonmodule/fragments/PopulaceLeaderStatisticsFragment.java @@ -33,6 +33,8 @@ import com.tenlionsoft.baselib.core.widget.views.ConditionAllAreaPopup; import com.tenlionsoft.baselib.core.widget.views.TypeBoldTextView; import com.tenlionsoft.baselib.utils.ExceptionHandler; import com.tenlionsoft.baselib.utils.LogUtils; +import com.tenlionsoft.baselib.utils.StringUtils; +import com.tenlionsoft.baselib.utils.UIUtil; import com.tenlionsoft.baselib.utils.UserLgUtils; import java.util.ArrayList; @@ -79,6 +81,8 @@ public class PopulaceLeaderStatisticsFragment extends BaseFragment { BallView mBvType; @BindView(R2.id.tv_refresh_time) TextView mTvRefreshTime; + @BindView(R2.id.tv_gird_or_community) + TextView mTvGirdOrCommunity; private Unbinder mBind; private String mCurrentAreaCode; private ProgressDialog mDialog; @@ -90,9 +94,9 @@ public class PopulaceLeaderStatisticsFragment extends BaseFragment { mBind = ButterKnife.bind(this, dataView); setStateView(STATE_SUCCESS); mSrlView.setEnableLoadMore(false); - mSrlView.setEnableRefresh(false); + mSrlView.setEnableRefresh(true); initViews(); - getData(); + mSrlView.autoRefresh(); } /** @@ -116,6 +120,7 @@ public class PopulaceLeaderStatisticsFragment extends BaseFragment { if (mDialog != null && mDialog.isShowing()) { mDialog.dismiss(); } + mSrlView.finishRefresh(); setInfoToView(bean); } @@ -124,6 +129,7 @@ public class PopulaceLeaderStatisticsFragment extends BaseFragment { if (mDialog != null && mDialog.isShowing()) { mDialog.dismiss(); } + mSrlView.finishRefresh(); ExceptionHandler.handleException(e); } @@ -141,11 +147,11 @@ public class PopulaceLeaderStatisticsFragment extends BaseFragment { */ private void setInfoToView(AreaPopulaceBean bean) { mTvRefreshTime.setText("数据更新时间 : " + bean.getFreshTime()); - mTvTotalPopulace.setText(bean.getZongShu() + "");//总人口 + mTvTotalPopulace.setText(StringUtils.numAddUnit(bean.getZongShu() + ""));//总人口 mTvPopulacePercent.setText(bean.getZhanQuanShi() + "%");//占全市 mTvPopulaceIncidentPercent.setText(bean.getShiJianLv() + "%"); - mTvPopulaceCommunity.setText(bean.getSheQuCun() + ""); - + mTvPopulaceCommunity.setText(StringUtils.numAddUnit(bean.getSheQuCun() + "")); + mTvGirdOrCommunity.setText(bean.isGrid() ? "辖区网格" : "辖区社区/村"); mCountDatas.clear(); mPopulaceCountAdapter.setData(mCountDatas); @@ -299,8 +305,7 @@ public class PopulaceLeaderStatisticsFragment extends BaseFragment { mRlvCategoryPercent.setAdapter(mPopulaceCountAdapter); mLlArea.setOnClickListener(v -> onShowArea()); mTvArea.setText(UserLgUtils.getUserFullAreaName()); -// mDialog = UIUtil.initDialog(mActivity, "加载中..."); -// mDialog.show(); + mDialog = UIUtil.initDialog(mActivity, "加载中..."); } @@ -316,13 +321,13 @@ public class PopulaceLeaderStatisticsFragment extends BaseFragment { mTvArea.setText(areaNames); //刷新数据 mCurrentAreaCode = areaCode; -// if (mDialog != null) { -// mDialog.show(); -// } + if (mDialog != null) { + mDialog.show(); + } getData(); areaPopup.dismiss(); }); - areaPopup.setOffsetY(10); + areaPopup.setOffsetY(20); areaPopup.showPopupWindow(mTvArea); } @@ -385,7 +390,7 @@ public class PopulaceLeaderStatisticsFragment extends BaseFragment { @Override protected void refreshView() { - + getData(); } @Override diff --git a/commonmodule/src/main/res/layout/fragment_grid_leader_statistics.xml b/commonmodule/src/main/res/layout/fragment_grid_leader_statistics.xml index c7253af..90d80d4 100644 --- a/commonmodule/src/main/res/layout/fragment_grid_leader_statistics.xml +++ b/commonmodule/src/main/res/layout/fragment_grid_leader_statistics.xml @@ -8,13 +8,13 @@ tools:background="@color/gray"> diff --git a/commonmodule/src/main/res/layout/fragment_incident_leader_statistics.xml b/commonmodule/src/main/res/layout/fragment_incident_leader_statistics.xml index 2c51c0d..a89cfda 100644 --- a/commonmodule/src/main/res/layout/fragment_incident_leader_statistics.xml +++ b/commonmodule/src/main/res/layout/fragment_incident_leader_statistics.xml @@ -8,13 +8,13 @@ tools:background="@color/gray"> @@ -72,12 +72,21 @@ android:src="@drawable/ic_statistics_title_icon" /> + + + tools:text="共计上报100.00万件" /> + + @@ -68,9 +69,9 @@ android:layout_height="wrap_content" android:background="@drawable/shp_rectangle_top_left_bottom" android:paddingLeft="10dp" - android:paddingTop="10dp" + android:paddingTop="6dp" android:paddingRight="50dp" - android:paddingBottom="10dp"> + android:paddingBottom="6dp"> + android:textColor="@color/white" + android:textSize="@dimen/text_14" /> + android:textSize="@dimen/text_16" /> + android:textSize="@dimen/text_16" /> + android:textSize="@dimen/text_16" /> + android:textSize="@dimen/text_16" /> diff --git a/commonmodule/src/main/res/layout/multi_incident_mark_view.xml b/commonmodule/src/main/res/layout/multi_incident_mark_view.xml index 3620cd7..742f75e 100644 --- a/commonmodule/src/main/res/layout/multi_incident_mark_view.xml +++ b/commonmodule/src/main/res/layout/multi_incident_mark_view.xml @@ -17,7 +17,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawableLeft="@drawable/ic_point_blue_text_title" - android:text="已处理:" + android:text="未处理:" android:textColor="#FF8300" android:textSize="@dimen/text_12" /> @@ -40,7 +40,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawableLeft="@drawable/ic_point_yellow_text_title" - android:text="未处理:" + android:text="已处理:" android:textColor="#2F5CFB" android:textSize="@dimen/text_12" /> diff --git a/mainmodule/src/main/java/com/tengshisoft/mainmodule/fragments/LeaderMainFragment.java b/mainmodule/src/main/java/com/tengshisoft/mainmodule/fragments/LeaderMainFragment.java index be3da9a..6a3a5c4 100755 --- a/mainmodule/src/main/java/com/tengshisoft/mainmodule/fragments/LeaderMainFragment.java +++ b/mainmodule/src/main/java/com/tengshisoft/mainmodule/fragments/LeaderMainFragment.java @@ -98,7 +98,6 @@ public class LeaderMainFragment extends BaseFragment { "督办消息", "归档事件", "已办事件", - "事件处理", "通讯录", "事件追踪", "辖区人口", @@ -109,12 +108,11 @@ public class LeaderMainFragment extends BaseFragment { R.drawable.ic_early_icon, R.drawable.ic_supervise_icon, R.drawable.ic_file_icon, - R.drawable.ic_incident_accept_icon, R.drawable.ic_case_dispose, R.drawable.ic_list_contact, - R.drawable.ic_journal_list, - R.drawable.ic_populace_list_icon, - R.drawable.ic_journal_list}; + R.drawable.ic_incident_track_icon, + R.drawable.ic_populace_popedom_icon, + R.drawable.ic_statistics_data_icon}; private FunctionTitleNumAdapter mNumAdapter; private Disposable mDisposable; private List mDatas; diff --git a/mainmodule/src/main/res/drawable-xhdpi/ic_incident_track_icon.png b/mainmodule/src/main/res/drawable-xhdpi/ic_incident_track_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..084ae46e2619b4138b4bbb7e87fedab336cf4ae4 GIT binary patch literal 4556 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