Commit 4800f066 by guojx

Merge branch 'feature-2024-07-cloud' into 'master'

Feature 2024 07 cloud

See merge request !2111
parents 2fc03500 b39a9309
package com.gic.haoban.manage.web.controller.wechatwork;
import com.alibaba.fastjson.JSONObject;
import com.gic.api.base.commons.JSONResponse;
import com.gic.clerk.api.dto.AuthorizedUser;
import com.gic.commons.util.DateUtil;
import com.gic.commons.webapi.reponse.RestResponse;
import com.gic.haoban.manage.web.handle.WechatWorkOverviewStoreGroupHandle;
import com.gic.haoban.manage.web.qo.wechatwork.StoreGroupCommonQO;
import com.gic.haoban.manage.web.qo.wechatwork.WechatWorkOverviewQO;
import com.gic.haoban.manage.web.qo.wechatwork.WechatWorkOverviewStoreGroupQO;
import com.gic.haoban.manage.web.qo.wechatwork.WechatWorkOverviewTrendQO;
import com.gic.haoban.manage.web.utils.AuthorizedUserUtils;
import com.gic.haoban.manage.web.utils.data.DataApiQO;
import com.gic.haoban.manage.web.utils.data.StoreAuthUtils;
import com.gic.haoban.manage.web.vo.wechatwork.DataPageVO;
import com.gic.haoban.manage.web.vo.wechatwork.WechatWorkOverviewStoreGroupVO;
import com.gic.haoban.manage.web.vo.wechatwork.WechatWorkOverviewTrendVO;
import com.gic.haoban.manage.web.vo.wechatwork.WechatWorkOverviewVO;
import com.gic.qcloud.BucketNameEnum;
import com.gic.web.common.controller.NewBaseController;
import com.gic.web.common.download.DownloadTask;
import com.gic.web.common.download.DownloadTaskUtil;
import com.gic.web.common.download.constants.TaskTypeEnum;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 企微概览
* @Author guojx
* @Date 2024/7/23 10:45
*/
@RestController
@Slf4j
@RequestMapping("wechat-work-overview")
public class WechatWorkOverviewController extends NewBaseController {
@Autowired
private StoreAuthUtils storeAuthUtils;
@Autowired
private WechatWorkOverviewStoreGroupHandle wechatWorkOverviewStoreGroupHandle;
/**
* 概览
* @param qo
* @return
*/
@RequestMapping(value = "overview")
public RestResponse<WechatWorkOverviewVO> overview(@RequestBody WechatWorkOverviewQO qo) {
List<WechatWorkOverviewVO> voList = storeAuthUtils.getOverview(
"data_mbr_scale_haoban_background_overview",
new JSONObject(),
new StoreGroupCommonQO().setStoreGroupId(qo.getStoreGroupId()),
WechatWorkOverviewVO.class);
return RestResponse.successResult(CollectionUtils.isEmpty(voList) ? null : voList.get(0));
}
/**
* 趋势图
* @param qo
* @return
* @throws ParseException
*/
@RequestMapping(value = "trend")
public RestResponse<List<WechatWorkOverviewTrendVO>> trend(@RequestBody WechatWorkOverviewTrendQO qo) throws ParseException {
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(qo);
//1:总数 2:日期趋势
jsonObject.put("groupType", 2);
List<WechatWorkOverviewTrendVO> list = storeAuthUtils.getOverview(
"data_mbr_scale_haoban_background_overview_date",
jsonObject,
new StoreGroupCommonQO().setStoreGroupId(qo.getStoreGroupId()),
WechatWorkOverviewTrendVO.class);
Map<String, WechatWorkOverviewTrendVO> map = new HashMap<>();
if (CollectionUtils.isNotEmpty(list)) {
map = list.stream().collect(Collectors.toMap(e -> e.getBizDate(), e -> e));
}
List<WechatWorkOverviewTrendVO> voList = new ArrayList<>();
List<String> dateList = DateUtil.getBetweenDates(qo.getStartDate(), qo.getEndDate());
for (String date : dateList) {
WechatWorkOverviewTrendVO vo = map.get(date);
if (vo == null) {
vo = new WechatWorkOverviewTrendVO();
vo.setBizDate(date);
}
voList.add(vo);
}
return RestResponse.successResult(voList);
}
/**
* 新增概览数据
* @param qo
* @return
*/
@RequestMapping(value = "new-overview")
public RestResponse<WechatWorkOverviewTrendVO> newOverview(@RequestBody WechatWorkOverviewTrendQO qo) {
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(qo);
//1:总数 2:日期趋势
jsonObject.put("groupType", 1);
List<WechatWorkOverviewTrendVO> voList = storeAuthUtils.getOverview(
"data_mbr_scale_haoban_background_overview_date",
jsonObject,
new StoreGroupCommonQO().setStoreGroupId(qo.getStoreGroupId()),
WechatWorkOverviewTrendVO.class);
return RestResponse.successResult(CollectionUtils.isEmpty(voList) ? null : voList.get(0));
}
/**
* 门店分组
* @param qo
* @return
*/
@RequestMapping(value = "store-group")
public RestResponse<DataPageVO<WechatWorkOverviewStoreGroupVO>> storeGroup(@RequestBody WechatWorkOverviewStoreGroupQO qo) {
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(qo);
return RestResponse.successResult(storeAuthUtils.getData(new DataApiQO()
.setPageSize(qo.getPageSize())
.setCurrentPage(qo.getPageNum())
.setNoTotal(false)
.setHasCountPerPage(true)
.setClazz(WechatWorkOverviewStoreGroupVO.class)
.setJsonObject(jsonObject)
.setStoreGroupCommonQO(qo)
.setApolloKey(qo.getQueryDataType() == 1 ? "data_mbr_scale_haoban_background_count" : "data_mbr_scale_haoban_background_count_new")
));
}
/**
* 门店分组导出
* @param qo
* @return
*/
@RequestMapping(value = "export-store-group")
public RestResponse exportStoreGroup(@RequestBody WechatWorkOverviewStoreGroupQO qo) {
DownloadTask task = new DownloadTask();
task.setTaskTypeEnum(TaskTypeEnum.NO_NEW_EXCEPTION_STORE);
task.setDataType(qo.getDataType());
task.setUser(getUserInfo());
task.setTotalCount(storeGroup(qo).getResult().getTotalNum());
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(qo);
storeAuthUtils.setStoreGroupJsonParam(jsonObject, qo);
boolean isTotalQuery = qo.getQueryDataType() == 1;
jsonObject.put("apolloKey", isTotalQuery ? "data_mbr_scale_haoban_background_count" : "data_mbr_scale_haoban_background_count_new");
//Excel的标题是字段进行计算
List<String> indexList = new ArrayList<>();
List<String> fieldList = new ArrayList<>();
Integer storeGroup = jsonObject.getInteger("storeGroup");
boolean isStore = storeGroup != null && storeGroup == 7;
if (isStore) {
indexList.add("门店名称");
fieldList.add("storeName");
indexList.add("门店code");
fieldList.add("storeCode");
} else {
indexList.add("分组名称");
fieldList.add("storeGroupName");
}
indexList.add("上级分组");
fieldList.add("parentStoreGroupName");
if (isTotalQuery) {
indexList.add("企微好友总数");
fieldList.add("entwchFdNumTotal");
indexList.add("已注册会员好友数");
fieldList.add("entwchFdNumMbr");
indexList.add("未注册会员好友数");
fieldList.add("entwchFdNumNonmbr");
} else {
indexList.add("新增企微好友数");
fieldList.add("newEntwchFdNumTotal");
indexList.add("新增已注册会员好友数");
fieldList.add("newEntwchFdNumMbr");
indexList.add("新增未注册会员好友数");
fieldList.add("newEntwchFdNumNonmbr");
}
if (isTotalQuery) {
task.setFileName("企微概览-门店维度总数数据");
} else {
task.setFileName("企微概览-门店维度新增数据-" + qo.getStartDate() + "_" + qo.getEndDate());
}
task.setChannelName("数据-企微数据-企微概览");
task.setBucketName(BucketNameEnum.REPORT_50000.getName());
jsonObject.put("indexList", indexList);
jsonObject.put("fieldList", fieldList);
task.setSearchDataParams(jsonObject.toJSONString());
task.setHandler(wechatWorkOverviewStoreGroupHandle);
JSONResponse downloadTask = DownloadTaskUtil.createDownloadTask(task);
return RestResponse.successResult(downloadTask.getResult());
}
private AuthorizedUser getUserInfo() {
return AuthorizedUserUtils.getUserInfo();
}
}
package com.gic.haoban.manage.web.handle;
import com.alibaba.fastjson.JSONObject;
import com.gic.enterprise.api.dto.security.DownloadReportDTO;
import com.gic.haoban.manage.web.utils.data.DataApiQO;
import com.gic.haoban.manage.web.utils.data.StoreAuthUtils;
import com.gic.haoban.manage.web.vo.wechatwork.WechatWorkOverviewStoreGroupVO;
import com.gic.web.common.download.DownloadHandlerAbstract;
import com.gic.web.common.download.context.Context;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
/**
* 数据-企微数据-流失好友
*/
@Component
public class WechatWorkOverviewStoreGroupHandle extends DownloadHandlerAbstract<WechatWorkOverviewStoreGroupVO> {
private static final Logger LOGGER = LogManager.getLogger(WechatWorkOverviewStoreGroupHandle.class);
@Autowired
private StoreAuthUtils storeAuthUtils;
@Override
public List<WechatWorkOverviewStoreGroupVO> getData(Context context, String searchDataParams, Integer currentPage) {
return storeAuthUtils.getData(new DataApiQO()
.setClazz(WechatWorkOverviewStoreGroupVO.class)
.setPageSize(getPageSize())
.setCurrentPage(currentPage)
.setLogStr("数据-企微数据-企微概览导出日志进来")
.setSearchDataParams(searchDataParams)
.setNoTotal(false)
.setHasCountPerPage(false)
).getRows();
}
@Override
public List<String> getColumnNames() {
return Collections.EMPTY_LIST;
}
@Override
public List<String> getColumnNames(Context context){
DownloadReportDTO downloadReportDTO = context.getDownloadReportDTO();
String searchDataParams = downloadReportDTO.getSearchDataParams();
JSONObject jsonObject = JSONObject.parseObject(searchDataParams);
List<String> list = (List<String>) jsonObject.get("indexList");
return list;
}
@Override
public LinkedHashMap<String, List<String>> doubleColumnNames() {
return null;
}
@Override
public List<String> getColumns() {
return Collections.EMPTY_LIST;
}
@Override
public List<String> getColumns(Context context) {
DownloadReportDTO downloadReportDTO = context.getDownloadReportDTO();
String searchDataParams = downloadReportDTO.getSearchDataParams();
JSONObject jsonObject = JSONObject.parseObject(searchDataParams);
List<String> list = (List<String>) jsonObject.get("fieldList");
return list;
}
}
package com.gic.haoban.manage.web.qo.wechatwork;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import lombok.experimental.Accessors;
......@@ -12,40 +14,48 @@ import java.util.List;
*/
@Data
@Accessors(chain = true)
@JsonIgnoreProperties(ignoreUnknown = true)
public class StoreGroupCommonQO implements Serializable {
/**
* 门店code/名称
*/
@JSONField(serialize = false)
private String storeSearchParam;
/**
* 可以多选,英文逗号隔开。优先级高于storeId
*/
@JSONField(serialize = false)
private String storeGroupId;
/**
* 可以多选,英文逗号隔开
*/
@JSONField(serialize = false)
private String storeId;
/**
* 分组下钻的时候,当前点击的分组id参数.如果是无归属,则值是-1
* @return
*/
@JSONField(serialize = false)
private String nextStoreGroupId;
/**
* 因为存在nextStoreGroupId = -1的无归属分组。当下钻无归属,值为无归属上一层级的分组id。如果为空,说明上一层级是所有哦门店,否则必有值
*/
@JSONField(serialize = false)
private String preStoreGroupId;
/**
* 分组维度查询,勾选展示门店 1:是
*/
@JSONField(serialize = false)
private Integer showStore;
/**
* 门店状态
*/
@JSONField(serialize = false)
private List<String> statusList;
public boolean isRecycle() {
......
package com.gic.haoban.manage.web.qo.wechatwork;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import java.io.Serializable;
/**
* @Author guojx
* @Date 2024/7/23 10:29
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class WechatWorkOverviewQO implements Serializable {
private String storeGroupId;
}
package com.gic.haoban.manage.web.qo.wechatwork;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import java.io.Serializable;
/**
* @Author guojx
* @Date 2024/5/22 9:27
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class WechatWorkOverviewStoreGroupQO extends StoreGroupCommonQO implements Serializable {
/**
* 1:总数 2:新增
*/
@JSONField(serialize = false)
private Integer queryDataType;
/**
* 新增类型需要传,开始日期
*/
private String startDate;
/**
* 新增类型需要传:结束日期
*/
private String endDate;
/**
* 排序类型 1 正序 2 倒序
*/
private Integer orderByType;
/**
* 排序字段名称 1:企微好友 2:已注册会员好友 3:未注册会员好友
*/
private String orderByFields;
private Integer pageNum;
private Integer pageSize;
/**
* 下载导出参数:数据脱敏 1:脱敏 2:完整
*/
private Integer dataType = 1;
/**
* 下载导出参数:为了兼容前端传参
*/
private String requestProject;
public Integer getQueryDataType() {
return queryDataType == null ? 1 : queryDataType;
}
}
package com.gic.haoban.manage.web.qo.wechatwork;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import java.io.Serializable;
/**
* @Author guojx
* @Date 2024/7/23 10:29
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class WechatWorkOverviewTrendQO implements Serializable {
@JSONField(serialize = false)
private String storeGroupId;
/**
* yyyy-MM-dd
*/
private String startDate;
/**
* yyyy-MM-dd
*/
private String endDate;
}
package com.gic.haoban.manage.web.utils.data;
import com.alibaba.fastjson.JSONObject;
import com.gic.haoban.manage.web.qo.wechatwork.StoreGroupCommonQO;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @Author guojx
* @Date 2024/7/23 9:36
*/
@Data
@Accessors(chain = true)
public class DataApiQO implements Serializable {
/**
* 调用传的参数
* 和jsonObject和StoreGroupCommonQO参数二选一
*/
private String searchDataParams;
/**
* 数据接口名称
*/
private String apolloKey;
private Integer currentPage;
/**
* 是否打印日志
*/
private String logStr;
private Integer pageSize;
/**
* 是否需要强制合计数据
* 默认是第一页需要合计数据
*/
private boolean hasCountPerPage;
/**
* 是否强制去除合计数据
*/
private boolean noTotal;
/**
* 返回rows对象转化
*/
private Class clazz;
/**
* 数据接口调用的参数
*/
private JSONObject jsonObject;
private StoreGroupCommonQO storeGroupCommonQO;
}
package com.gic.haoban.manage.web.utils.data;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.gic.api.base.commons.Page;
import com.gic.commons.util.DataApiUtils;
......@@ -19,7 +21,10 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
......@@ -48,6 +53,14 @@ public class StoreAuthUtils {
jsonObject.put("wxEnterpriseId", login.getWxEnterpriseId());
}
public <T> List<T> getOverview(String apolloKey, JSONObject jsonObject, StoreGroupCommonQO storeGroupCommonQO, Class clazz) {
setCommonParam(jsonObject, storeGroupCommonQO);
Map<String, Object> res = DataApiUtils.http(jsonObject.toJSONString(), apolloKey);
List<JSONObject> list = DataApiUtils.getDataList(res);
List<T> voList = JSONArray.parseArray(JSON.toJSONString(list), clazz);
return voList;
}
public List<String> getAuthStoreId(StoreGroupCommonQO storeCommonQO) {
String storeGroupId = storeCommonQO.getStoreGroupId();
String storeSearchParam = storeCommonQO.getStoreSearchParam();
......@@ -110,6 +123,7 @@ public class StoreAuthUtils {
public void setStoreGroupJsonParam(JSONObject jsonObject, StoreGroupCommonQO qo) {
WebLoginDTO login = AuthWebRequestUtil.getLoginUser();
jsonObject.put("enterpriseId", login.getEnterpriseId());
jsonObject.put("wxEnterpriseId", login.getWxEnterpriseId());
Integer storeGroup = getStoreGroupLevel(qo);
jsonObject.put("storeGroup", storeGroup);
List<String> storeIds = getAuthStoreId(qo);
......@@ -160,27 +174,47 @@ public class StoreAuthUtils {
return 1;
}
@Deprecated
public DataPageVO getDataCommon(String searchDataParams, Integer currentPage, String logStr, Integer pageSize, boolean hasCountPerPage) {
return getDataCommonParent(searchDataParams, currentPage, logStr, pageSize, hasCountPerPage, false);
}
public DataPageVO getDataCommonParent(String searchDataParams, Integer currentPage, String logStr, Integer pageSize, boolean hasCountPerPage, boolean noTotal) {
public DataPageVO getData(DataApiQO qo) {
Integer currentPage = qo.getCurrentPage();
String logStr = qo.getLogStr();
Integer pageSize = qo.getPageSize();
String searchDataParams = qo.getSearchDataParams();
boolean hasCountPerPage = qo.isHasCountPerPage();
boolean noTotal = qo.isNoTotal();
Class clazz = qo.getClazz();
boolean isFirst = currentPage != null && currentPage == 1;
if (isFirst) {
if (isFirst && StringUtils.isNotBlank(logStr)) {
log.info(logStr);
}
DataPageVO vo = new DataPageVO();
vo.setPageNum(currentPage);
vo.setPageSize(pageSize);
JSONObject jsonObject = JSONObject.parseObject(searchDataParams);
JSONObject jsonObject = qo.getJsonObject();
if (jsonObject == null) {
//兼容老接口传参
jsonObject= JSONObject.parseObject(searchDataParams);
} else {
//填充所需参数
StoreGroupCommonQO storeGroupCommonQO = qo.getStoreGroupCommonQO();
setStoreGroupJsonParam(jsonObject, storeGroupCommonQO);
}
Integer storeGroup = jsonObject.getInteger("storeGroup");
boolean isStore = storeGroup != null && storeGroup == 7;
jsonObject.put("pageNum", currentPage);
jsonObject.put("pageSize", pageSize);
String apolloKey = jsonObject.getString("apolloKey");
String allApolloKey = jsonObject.getString("allApolloKey");
String apolloKey = qo.getApolloKey();
if (StringUtils.isBlank(apolloKey)) {
apolloKey = jsonObject.getString("apolloKey");
}
Map<String, Object> res = DataApiUtils.http(jsonObject.toJSONString(), apolloKey);
......@@ -198,11 +232,7 @@ public class StoreAuthUtils {
jsonObject.put("pageNum", 1);
jsonObject.put("storeGroup", 8);
String totalApolloKey = apolloKey;
if (StringUtils.isNotBlank(allApolloKey)) {
totalApolloKey = allApolloKey;
}
JSONObject total = getTotalJson(jsonObject, totalApolloKey);
JSONObject total = getTotalJson(jsonObject, apolloKey);
if (total == null) {
total = new JSONObject();
}
......@@ -217,9 +247,23 @@ public class StoreAuthUtils {
}
}
vo.setRows(list);
if (clazz != null && CollectionUtils.isNotEmpty(vo.getRows())) {
vo.setRows(JSONArray.parseArray(JSON.toJSONString(vo.getRows()), clazz));
}
return vo;
}
@Deprecated
public DataPageVO getDataCommonParent(String searchDataParams, Integer currentPage, String logStr, Integer pageSize, boolean hasCountPerPage, boolean noTotal) {
return getData(new DataApiQO().setSearchDataParams(searchDataParams)
.setCurrentPage(currentPage)
.setLogStr(logStr)
.setPageSize(pageSize)
.setHasCountPerPage(hasCountPerPage)
.setNoTotal(noTotal));
}
private List<String> getStore(String enterpriseId, String userId, String search, List<String> storeGroupIdList, List<String> status, List<String> storeIdList) {
StoreSearchDTO storeSearchDTO = new StoreSearchDTO();
storeSearchDTO.setEnterpriseId(enterpriseId);
......
package com.gic.haoban.manage.web.vo.wechatwork;
import lombok.Data;
import java.io.Serializable;
/**
* @Author guojx
* @Date 2024/5/21 15:56
*/
@Data
public class WechatWorkOverviewStoreGroupVO extends StoreGroupCommonVO implements Serializable {
/**
* 新增微信好友总数
*/
private Integer newEntwchFdNumTotal;
/**
* 新增已注册微信好友数
*/
private Integer newEntwchFdNumMbr;
/**
* 新增未注册微信好友数
*/
private Integer newEntwchFdNumNonmbr;
/**
* 微信好友总数
*/
private Integer entwchFdNumTotal;
/**
* 已注册微信好友数
*/
private Integer entwchFdNumMbr;
/**
* 未注册微信好友数
*/
private Integer entwchFdNumNonmbr;
}
package com.gic.haoban.manage.web.vo.wechatwork;
import lombok.Data;
import java.io.Serializable;
/**
* @Author guojx
* @Date 2024/5/21 15:56
*/
@Data
public class WechatWorkOverviewTrendVO implements Serializable {
/**
* 微信好友总数
*/
private Integer newEntwchFdNumTotal;
/**
* 已注册微信好友数
*/
private Integer newEntwchFdNumMbr;
/**
* 未注册微信好友数
*/
private Integer newEntwchFdNumNonmbr;
private String bizDate;
}
package com.gic.haoban.manage.web.vo.wechatwork;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Objects;
/**
* @Author guojx
* @Date 2024/5/21 15:56
*/
@Data
public class WechatWorkOverviewVO implements Serializable {
/**
* 微信好友总数
*/
private Integer entwchFdNumTotal;
/**
* 已注册微信好友数
*/
private Integer entwchFdNumMbr;
/**
* 未注册微信好友数
*/
private Integer entwchFdNumNonmbr;
/**
* 已注册微信好友数占比
*/
private Double entwchFdNumMbrRate;
/**
* 未注册微信好友数占比
*/
private Double entwchFdNumNonmbrRate;
public Double getEntwchFdNumMbrRate() {
return rate(getEntwchFdNumMbr(), getEntwchFdNumTotal(), 2);
}
public Double getEntwchFdNumNonmbrRate() {
return rate(getEntwchFdNumNonmbr(), getEntwchFdNumTotal(), 2);
}
/**
* 百分比计算,保留两位小数
* @param divisor
* @param dividend
* @param degree
* @return
*/
public static Double rate(Integer divisor,Integer dividend,int degree){
if( Objects.isNull( divisor ) || Objects.isNull( dividend ) || dividend == 0 ){
return 0.00;
}
//数字会丢失精度,先转字符串,再转bigDecimal
BigDecimal divisor1 = new BigDecimal(divisor+"");
BigDecimal dividend1 = new BigDecimal(dividend+"");
return divisor1.multiply(new BigDecimal("100")).divide(dividend1,degree,BigDecimal.ROUND_HALF_UP ).doubleValue();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment