Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
张雷
/
skboot-zhongye
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
构建
提交
问题看板
文件
提交
网络
比较
分支
标签
ea10bd28
由
dengxuelong
编写于
2024-10-28 10:40:53 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
化验日报-在线值
1 个父辈
408a631f
隐藏空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
894 行增加
和
0 行删除
sk-module-datafill/src/main/java/com/skua/modules/report/controller/JmReportController.java
sk-module-datafill/src/main/java/com/skua/modules/report/mapper/ReportHeaderMapper.java
sk-module-datafill/src/main/java/com/skua/modules/report/mapper/xml/ReportHeaderMapper.xml
sk-module-datafill/src/main/java/com/skua/modules/util/ReportUtil.java
sk-module-system/src/main/java/com/skua/config/ShiroConfig.java
sk-module-datafill/src/main/java/com/skua/modules/report/controller/JmReportController.java
0 → 100644
查看文件 @
ea10bd2
package
com
.
skua
.
modules
.
report
.
controller
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.skua.core.api.vo.Result
;
import
com.skua.modules.report.entity.ReportDisplay
;
import
com.skua.modules.report.entity.ReportHeader
;
import
com.skua.modules.report.mapper.FReportManageMapper
;
import
com.skua.modules.report.mapper.ReportHeaderMapper
;
import
com.skua.modules.report.service.IJmReportService
;
import
com.skua.modules.report.service.IReportDisplayService
;
import
com.skua.modules.report.vo.ReportShow
;
import
com.skua.modules.util.ReportUtil
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
io.swagger.annotations.ApiParam
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.bind.annotation.RestController
;
import
javax.servlet.http.HttpServletRequest
;
import
java.math.BigDecimal
;
import
java.util.*
;
import
java.util.stream.Collectors
;
@Slf4j
@Api
(
tags
=
"积木 报表展示"
)
@RestController
@RequestMapping
(
"/report/jmReport"
)
public
class
JmReportController
{
@Autowired
ReportDisplayController
reportDisplayController
;
@Autowired
FReportManageMapper
reportManageMapper
;
@Autowired
IReportDisplayService
reportDisplayService
;
@Autowired
ReportHeaderMapper
reportHeaderMapper
;
@Autowired
IJmReportService
jmReportService
;
@ApiOperation
(
value
=
"化验日报-在线值"
,
notes
=
"积木报表"
)
@GetMapping
(
value
=
"/hyrbZxz"
)
public
Map
trCount
(
@RequestParam
(
name
=
"departId"
)
String
departId
,
@RequestParam
(
name
=
"date"
)
String
date
//yyyy-MM-dd
)
{
Map
returnData
=
new
HashMap
();
//查询【表头】 保持和[生产报表]一致
QueryWrapper
<
ReportDisplay
>
reportDisplayQueryWrapper
=
new
QueryWrapper
<>();
reportDisplayQueryWrapper
.
eq
(
"depart_id"
,
departId
);
reportDisplayQueryWrapper
.
eq
(
"report_name"
,
"生产报表"
);
ReportDisplay
reportDisplay
=
reportDisplayService
.
getOne
(
reportDisplayQueryWrapper
);
if
(
reportDisplay
==
null
)
{
return
returnData
;
}
List
<
Map
<
String
,
String
>>
reportHeaderList
=
reportHeaderMapper
.
hyrbZxz
(
reportDisplay
.
getId
());
Map
<
String
,
String
>
reportHeaderMap
=
reportHeaderList
.
stream
().
collect
(
Collectors
.
toMap
(
v
->
v
.
get
(
"tag"
),
o
->
o
.
get
(
"metricId"
)));
//查询【数据】
ReportShow
params
=
new
ReportShow
();
params
.
setId
(
reportDisplay
.
getId
());
params
.
setDepartId
(
departId
);
params
.
setStartDateTime
(
date
+
" 00:00:00"
);
params
.
setEndDateTime
(
date
+
" 23:59:59"
);
params
.
setReportType
(
"day"
);
Result
<
List
<
Map
<
String
,
Object
>>>
dataListResult
=
reportDisplayController
.
reprotShow
(
params
);
List
<
Map
<
String
,
Object
>>
dataList
=
CollectionUtils
.
isEmpty
(
dataListResult
.
getResult
())
?
new
LinkedList
<>()
:
dataListResult
.
getResult
();
//(正常情况下只有一条)
//查询【告警上限】
List
<
Map
<
String
,
String
>>
limitList
=
reportHeaderMapper
.
queryLimit
(
departId
);
Map
<
String
,
String
>
limitMap
=
limitList
.
stream
().
collect
(
Collectors
.
toMap
(
v
->
v
.
get
(
"tag"
),
o
->
o
.
get
(
"maxValue"
)));
List
<
String
>
tagList
=
Arrays
.
asList
(
"CSCOD"
,
"CSNH3N"
,
"CSPH"
,
"CSTN"
,
"CSTP"
,
"JSCOD"
,
"JSNH3N"
,
"JSPH"
,
"JSTN"
,
"JSTP"
,
"JSSS"
,
"CSSS"
);
//组装数据
for
(
Map
<
String
,
Object
>
dataMap
:
dataList
)
{
for
(
String
tag
:
tagList
)
{
String
metricId
=
reportHeaderMap
.
get
(
tag
);
//点位Id
dataMap
.
put
(
tag
,
dataMap
.
get
(
metricId
));
BigDecimal
minValue
=
tag
.
contains
(
"PH"
)
?
new
BigDecimal
(
"6"
)
:
BigDecimal
.
ZERO
;
//PH的阈值固定为6~9
BigDecimal
maxValue
=
tag
.
contains
(
"PH"
)
?
new
BigDecimal
(
"9"
)
:
ReportUtil
.
getBigDecimalValue
(
tag
,
limitMap
);
maxValue
=
maxValue
==
null
?
new
BigDecimal
(
"9999999"
)
:
maxValue
;
boolean
flag
=
false
;
BigDecimal
valueBigDecimal
=
ReportUtil
.
newBigDecimal
(
metricId
,
null
);
if
(
valueBigDecimal
!=
null
&&
(
valueBigDecimal
.
compareTo
(
minValue
)
<
0
||
valueBigDecimal
.
compareTo
(
maxValue
)
>
0
)){
flag
=
true
;
//超标!
}
dataMap
.
put
(
tag
+
"_是否超标"
,
flag
?
"yes"
:
"no"
);
//判断是否告警
}
}
returnData
.
put
(
"data"
,
dataList
);
return
returnData
;
}
}
sk-module-datafill/src/main/java/com/skua/modules/report/mapper/ReportHeaderMapper.java
查看文件 @
ea10bd2
package
com
.
skua
.
modules
.
report
.
mapper
;
import
java.util.List
;
import
java.util.Map
;
import
org.apache.ibatis.annotations.Param
;
import
com.skua.modules.report.entity.ReportHeader
;
...
...
@@ -15,4 +16,13 @@ public interface ReportHeaderMapper extends BaseMapper<ReportHeader> {
//查询报表信息
List
<
ReportHeader
>
headerAll
(
@Param
(
"reportId"
)
String
reportId
);
List
<
Map
<
String
,
String
>>
hyrbZxz
(
String
id
);
/**
* 查询告警上限值
* @param depart
* @return
*/
List
<
Map
<
String
,
String
>>
queryLimit
(
String
depart
);
}
...
...
sk-module-datafill/src/main/java/com/skua/modules/report/mapper/xml/ReportHeaderMapper.xml
查看文件 @
ea10bd2
...
...
@@ -30,4 +30,31 @@
report_id =#{reportId}
ORDER BY sort_num
</select>
<select
id=
"hyrbZxz"
resultType=
"java.util.Map"
>
select m.metric_uid_tag as 'tag', h.key_index as 'metricId', h.title
from report_header h
join sys_monitor_metric_info m on h.key_index = m.id
where
h.report_id = #{id}
and metric_uid_tag is not null
and metric_uid_tag != ''
</select>
<select
id=
"queryLimit"
resultType=
"java.util.Map"
>
SELECT
b.alarm_param_code AS tag,
b.alarm_param_upper_limit AS `maxValue`
FROM
sys_factory_info a
LEFT JOIN alarm_param_standard_config b ON a.out_level = b.alarm_level_standard_id
WHERE
depart_id = #{depart}
UNION ALL
SELECT
index_code,
upper
FROM
water_quality_in_level
WHERE
depart_id = #{depart}
</select>
</mapper>
...
...
sk-module-datafill/src/main/java/com/skua/modules/util/ReportUtil.java
0 → 100644
查看文件 @
ea10bd2
package
com
.
skua
.
modules
.
util
;
import
cn.hutool.core.util.NumberUtil
;
import
com.skua.core.util.ConvertUtils
;
import
com.skua.modules.report.entity.FReportItem
;
import
org.apache.commons.collections.CollectionUtils
;
import
org.apache.commons.lang.StringUtils
;
import
java.math.BigDecimal
;
import
java.text.DecimalFormat
;
import
java.time.LocalDate
;
import
java.time.format.DateTimeFormatter
;
import
java.util.*
;
import
java.util.stream.Collectors
;
public
class
ReportUtil
{
/**
* 计算加权平均,权重固定为‘今日处理水量’
* @param everyDayList 每天的数据
* @param keys 要计算 加权平均 的key
* @return Map<key, 加权平均值>
*/
public
static
Map
<
String
,
BigDecimal
>
calWeighAvg
(
List
<
Map
>
everyDayList
,
String
...
keys
)
{
//水质key, 累计值
Map
<
String
,
BigDecimal
>
accValueMap
=
new
HashMap
<>();
for
(
String
key
:
keys
)
{
//数据初始化
accValueMap
.
put
(
key
,
BigDecimal
.
ZERO
);
}
//累计水量
BigDecimal
totalSl
=
BigDecimal
.
ZERO
;
for
(
Map
dayData
:
everyDayList
)
{
//今日水量
BigDecimal
sl
=
dayData
.
get
(
"今日水处理量"
)
==
null
||
StringUtils
.
isBlank
(
dayData
.
get
(
"今日水处理量"
).
toString
())
?
null
:
new
BigDecimal
(
dayData
.
get
(
"今日水处理量"
).
toString
());
if
(
sl
==
null
||
sl
.
compareTo
(
BigDecimal
.
ZERO
)
==
0
){
continue
;
}
totalSl
=
NumberUtil
.
add
(
totalSl
,
sl
);
for
(
String
key
:
keys
)
{
//COD*水量
BigDecimal
value
=
dayData
.
get
(
key
)
==
null
||
!
NumberUtil
.
isNumber
(
dayData
.
get
(
key
).
toString
())
?
null
:
new
BigDecimal
(
dayData
.
get
(
key
).
toString
());
BigDecimal
mulValue
=
NumberUtil
.
mul
(
value
,
sl
);
accValueMap
.
put
(
key
,
NumberUtil
.
add
(
accValueMap
.
get
(
key
),
mulValue
));
}
}
if
(
totalSl
.
compareTo
(
BigDecimal
.
ZERO
)
==
0
){
//累计水量为0,直接返回
return
accValueMap
;
}
for
(
Map
.
Entry
<
String
,
BigDecimal
>
entry
:
accValueMap
.
entrySet
())
{
// value / 权重
entry
.
setValue
(
NumberUtil
.
round
(
NumberUtil
.
div
(
entry
.
getValue
(),
totalSl
),
2
));
}
return
accValueMap
;
}
/**
* sum
* @param allValueMap 同一个key的数据,汇总到一起
* @param key
* @return 0 or 计算的值,不会返回null
*/
public
static
BigDecimal
calSumValue
(
Map
<
String
,
List
<
BigDecimal
>>
allValueMap
,
String
key
)
{
return
NumberUtil
.
add
(
Optional
.
ofNullable
(
allValueMap
.
get
(
key
)).
orElse
(
new
LinkedList
<>()).
toArray
(
new
BigDecimal
[
0
]));
}
/**
* max
* @param allValueMap 同一个key的数据,汇总到一起
* @param key
* @return 0 or 计算的值,不会返回null
*/
public
static
BigDecimal
calMaxValue
(
Map
<
String
,
List
<
BigDecimal
>>
allValueMap
,
String
key
)
{
if
(
CollectionUtils
.
isEmpty
(
allValueMap
.
get
(
key
)))
{
return
null
;
}
return
NumberUtil
.
max
(
Optional
.
ofNullable
(
allValueMap
.
get
(
key
)).
orElse
(
new
LinkedList
<>()).
toArray
(
new
BigDecimal
[
0
]));
}
/**
* min
* @param allValueMap 同一个key的数据,汇总到一起
* @param key
* @return 0 or 计算的值,不会返回null
*/
public
static
BigDecimal
calMinValue
(
Map
<
String
,
List
<
BigDecimal
>>
allValueMap
,
String
key
)
{
if
(
CollectionUtils
.
isEmpty
(
allValueMap
.
get
(
key
)))
{
return
null
;
}
return
NumberUtil
.
min
(
Optional
.
ofNullable
(
allValueMap
.
get
(
key
)).
orElse
(
new
LinkedList
<>()).
toArray
(
new
BigDecimal
[
0
]));
}
/**
* max(包含小于符号)
* @param notLessThanMonthValueMap 同一个key的数据,汇总到一起 (不包含小于符号的数据)
* @param lessThanValueMap 同一个key的数据,汇总到一起 包含【小于符号】的值,但会去掉小于符号
* @param key
* @return 0 or 计算的值,不会返回null
*/
public
static
String
calMaxValueContainsLessThan
(
Map
<
String
,
List
<
BigDecimal
>>
notLessThanMonthValueMap
,
Map
<
String
,
List
<
BigDecimal
>>
lessThanValueMap
,
String
key
)
{
//最大值(不包含小于符号的数据)
BigDecimal
maxInNotLessValue
=
null
;
if
(
CollectionUtils
.
isNotEmpty
(
notLessThanMonthValueMap
.
get
(
key
)))
{
maxInNotLessValue
=
NumberUtil
.
max
(
Optional
.
ofNullable
(
notLessThanMonthValueMap
.
get
(
key
)).
orElse
(
new
LinkedList
<>()).
toArray
(
new
BigDecimal
[
0
]));
}
if
(
CollectionUtils
.
isNotEmpty
(
lessThanValueMap
.
get
(
key
))){
//最大值(在所有的包含'<'数据中)
BigDecimal
maxInLessThanValue
=
NumberUtil
.
max
(
Optional
.
ofNullable
(
lessThanValueMap
.
get
(
key
)).
orElse
(
new
LinkedList
<>()).
toArray
(
new
BigDecimal
[
0
]));
if
(
maxInLessThanValue
==
null
){
return
maxInNotLessValue
==
null
?
""
:
maxInNotLessValue
.
toPlainString
();
}
if
(
maxInNotLessValue
==
null
||
maxInLessThanValue
.
compareTo
(
maxInNotLessValue
)
>
0
){
return
"<"
+
maxInLessThanValue
.
toPlainString
();
}
}
return
maxInNotLessValue
==
null
?
""
:
maxInNotLessValue
.
toPlainString
();
}
/**
* min(包含小于符号)
* @param allValueMap 同一个key的数据,汇总到一起 (所有的数据)
* @param lessThanValueMap 同一个key的数据,汇总到一起 包含【小于符号】的值
* @param key
* @return 0 or 计算的值,不会返回null
*/
public
static
String
calMinValueContainsLessThan
(
Map
<
String
,
List
<
BigDecimal
>>
allValueMap
,
Map
<
String
,
List
<
BigDecimal
>>
lessThanValueMap
,
String
key
)
{
if
(
CollectionUtils
.
isEmpty
(
allValueMap
.
get
(
key
)))
{
return
null
;
}
//最小值(在所有的数据中)
BigDecimal
minInAllValue
=
NumberUtil
.
min
(
Optional
.
ofNullable
(
allValueMap
.
get
(
key
)).
orElse
(
new
LinkedList
<>()).
toArray
(
new
BigDecimal
[
0
]));
if
(
CollectionUtils
.
isNotEmpty
(
lessThanValueMap
.
get
(
key
))){
//最小值(在所有的包含'<'数据中)
BigDecimal
minInLessThanValue
=
NumberUtil
.
min
(
Optional
.
ofNullable
(
lessThanValueMap
.
get
(
key
)).
orElse
(
new
LinkedList
<>()).
toArray
(
new
BigDecimal
[
0
]));
if
(
minInLessThanValue
!=
null
&&
minInLessThanValue
.
compareTo
(
minInAllValue
)
<=
0
){
return
"<"
+
minInLessThanValue
.
toPlainString
();
}
}
return
minInAllValue
.
toPlainString
();
}
/**
* 计算平均值
* @param allValueMap 同一个key的数据,汇总到一起
* @param key
* @return 0 or 计算的值,不会返回null
*/
public
static
BigDecimal
calAvgValue
(
Map
<
String
,
List
<
BigDecimal
>>
allValueMap
,
String
key
)
{
return
calAvgValue
(
allValueMap
,
key
,
4
);
}
/**
* 计算平均值
* @param allValueMap 同一个key的数据,汇总到一起
* @param key
* @return 0 or 计算的值,不会返回null
*/
public
static
BigDecimal
calAvgValue
(
Map
<
String
,
List
<
BigDecimal
>>
allValueMap
,
String
key
,
int
scale
)
{
BigDecimal
avgValue
;
List
<
BigDecimal
>
valueList
=
Optional
.
ofNullable
(
allValueMap
.
get
(
key
)).
orElse
(
new
LinkedList
<>());
if
(
CollectionUtils
.
isNotEmpty
(
valueList
))
{
double
sum
=
NumberUtil
.
add
(
valueList
.
toArray
(
new
BigDecimal
[
0
])).
doubleValue
();
avgValue
=
ReportUtil
.
div
(
sum
,
valueList
.
size
());
avgValue
=
NumberUtil
.
round
(
avgValue
,
scale
);
}
else
{
avgValue
=
null
;
}
return
avgValue
;
}
/**
* 同一个key的数据,汇总到一起
* 非数字的值将被忽略(null 空字符串 非法数字)
* 去掉<
* @param everyDayReportList
* @return
*/
public
static
Map
<
String
,
List
<
BigDecimal
>>
valueListGroupByKey
(
List
<
Map
>
everyDayReportList
)
{
Map
<
String
,
List
<
BigDecimal
>>
allValueMap
=
new
HashMap
();
for
(
Map
<
String
,
Object
>
dayData
:
everyDayReportList
)
{
for
(
Map
.
Entry
<
String
,
Object
>
entry
:
dayData
.
entrySet
())
{
Object
value
=
entry
.
getValue
();
String
key
=
entry
.
getKey
();
if
(!
allValueMap
.
containsKey
(
key
))
{
allValueMap
.
put
(
key
,
new
LinkedList
<>());
}
if
(
value
==
null
||
StringUtils
.
isBlank
(
value
.
toString
())){
continue
;
}
//客户要求支持填写 '<'
String
valueString
=
value
.
toString
().
replaceAll
(
"\\<"
,
""
).
replaceAll
(
"<"
,
""
).
trim
();
if
(
NumberUtil
.
isNumber
(
valueString
)){
List
<
BigDecimal
>
valueList
=
allValueMap
.
get
(
key
);
valueList
.
add
(
new
BigDecimal
(
valueString
));
}
}
}
return
allValueMap
;
}
/**
* 只获取【包含小于符号】的值,但是返回的值会把小于符号去掉
* @param everyDayReportList
* @return
*/
public
static
Map
<
String
,
List
<
BigDecimal
>>
lessThanValueListGroupByKey
(
List
<
Map
>
everyDayReportList
)
{
Map
<
String
,
List
<
BigDecimal
>>
allValueMap
=
new
HashMap
();
for
(
Map
<
String
,
Object
>
dayData
:
everyDayReportList
)
{
for
(
Map
.
Entry
<
String
,
Object
>
entry
:
dayData
.
entrySet
())
{
Object
value
=
entry
.
getValue
();
String
key
=
entry
.
getKey
();
if
(!
allValueMap
.
containsKey
(
key
))
{
allValueMap
.
put
(
key
,
new
LinkedList
<>());
}
if
(
value
==
null
||
StringUtils
.
isBlank
(
value
.
toString
())){
continue
;
}
if
(!(
value
.
toString
().
startsWith
(
"<"
)
||
value
.
toString
().
startsWith
(
"<"
))){
continue
;
}
//去掉 '<'
String
valueString
=
value
.
toString
().
replaceAll
(
"\\<"
,
""
).
replaceAll
(
"<"
,
""
).
trim
();
if
(
NumberUtil
.
isNumber
(
valueString
)){
List
<
BigDecimal
>
valueList
=
allValueMap
.
get
(
key
);
valueList
.
add
(
new
BigDecimal
(
valueString
));
}
}
}
return
allValueMap
;
}
/**
* 只获取【不包含小于符号】的值
* @param everyDayReportList
* @return
*/
public
static
Map
<
String
,
List
<
BigDecimal
>>
notLessThanValueListGroupByKey
(
List
<
Map
>
everyDayReportList
)
{
Map
<
String
,
List
<
BigDecimal
>>
allValueMap
=
new
HashMap
();
for
(
Map
<
String
,
Object
>
dayData
:
everyDayReportList
)
{
for
(
Map
.
Entry
<
String
,
Object
>
entry
:
dayData
.
entrySet
())
{
Object
value
=
entry
.
getValue
();
String
key
=
entry
.
getKey
();
if
(!
allValueMap
.
containsKey
(
key
))
{
allValueMap
.
put
(
key
,
new
LinkedList
<>());
}
if
(
value
==
null
||
StringUtils
.
isBlank
(
value
.
toString
())){
continue
;
}
if
((
value
.
toString
().
startsWith
(
"<"
)
||
value
.
toString
().
startsWith
(
"<"
))){
continue
;
}
String
valueString
=
value
.
toString
().
trim
();
if
(
NumberUtil
.
isNumber
(
valueString
)){
List
<
BigDecimal
>
valueList
=
allValueMap
.
get
(
key
);
valueList
.
add
(
new
BigDecimal
(
valueString
));
}
}
}
return
allValueMap
;
}
/**
* 对于包含【小于符号】的值,返回的值会替换成0
* @param everyDayReportList
* @return
*/
public
static
Map
<
String
,
List
<
BigDecimal
>>
lessThanValueToZeroListGroupByKey
(
List
<
Map
>
everyDayReportList
)
{
Map
<
String
,
List
<
BigDecimal
>>
allValueMap
=
new
HashMap
();
for
(
Map
<
String
,
Object
>
dayData
:
everyDayReportList
)
{
for
(
Map
.
Entry
<
String
,
Object
>
entry
:
dayData
.
entrySet
())
{
Object
value
=
entry
.
getValue
();
String
key
=
entry
.
getKey
();
if
(!
allValueMap
.
containsKey
(
key
))
{
allValueMap
.
put
(
key
,
new
LinkedList
<>());
}
if
(
value
==
null
||
StringUtils
.
isBlank
(
value
.
toString
())){
continue
;
}
String
valueString
=
value
.
toString
();
if
(
value
.
toString
().
startsWith
(
"<"
)
||
value
.
toString
().
startsWith
(
"<"
)){
valueString
=
"0"
;
}
if
(
NumberUtil
.
isNumber
(
valueString
)){
List
<
BigDecimal
>
valueList
=
allValueMap
.
get
(
key
);
valueList
.
add
(
new
BigDecimal
(
valueString
));
}
}
}
return
allValueMap
;
}
/**
* 同一个key的数据,汇总到一起
* 非数字的值将被忽略(null 空字符串 非法数字)
* @param everyDayReportList
* @return
*/
public
static
Map
<
String
,
List
<
BigDecimal
>>
valueListGroupByKey1
(
List
<
Map
<
String
,
Object
>>
everyDayReportList
)
{
return
valueListGroupByKey
(
transformListMap
(
everyDayReportList
));
}
public
static
List
<
Map
>
transformListMap
(
List
<
Map
<
String
,
Object
>>
list
){
List
<
Map
>
returnData
=
new
LinkedList
<>();
returnData
.
addAll
(
list
);
return
returnData
;
}
/**
* 多个数据集,合并每天的数据
*
* @param startTime yyyy-MM-dd
* @param endTime
* @param dataList 各个数据集(报表数据必须包含key为time的日期)
* @return
*/
public
static
List
<
Map
>
mergeEveryDayData
(
String
startTime
,
String
endTime
,
List
<
Map
>...
dataList
){
List
<
Map
<
String
,
Map
>>
mapList
=
new
LinkedList
<>();
for
(
List
<
Map
>
maps
:
dataList
)
{
//Map<日期, 报表数据> 报表数据必须包含key为time的日期 否则可能报错:IllegalStateException: Duplicate key
for
(
Map
map
:
maps
)
{
Object
time
=
map
.
get
(
"time"
);
System
.
out
.
println
();
}
Map
<
String
,
Map
>
mapByTime
=
maps
.
stream
().
collect
(
Collectors
.
toMap
(
m
->
(
String
)
m
.
get
(
"time"
),
po
->
po
));
mapList
.
add
(
mapByTime
);
}
LocalDate
startLocalDate
=
LocalDate
.
parse
(
startTime
);
LocalDate
endLocalDate
=
LocalDate
.
parse
(
endTime
).
plusDays
(
1
);
List
<
Map
>
returnData
=
new
LinkedList
<>();
int
index
=
1
;
while
(
startLocalDate
.
compareTo
(
endLocalDate
)
<
0
){
String
currentDate
=
startLocalDate
.
format
(
DateTimeFormatter
.
ISO_LOCAL_DATE
);
Map
map
=
new
HashMap
();
for
(
Map
<
String
,
Map
>
reportDataMap
:
mapList
)
{
map
.
putAll
(
reportDataMap
.
getOrDefault
(
currentDate
,
new
HashMap
<>()));
}
map
.
put
(
"time"
,
currentDate
);
map
.
put
(
"序号"
,
index
++);
returnData
.
add
(
map
);
startLocalDate
=
startLocalDate
.
plusDays
(
1
);
}
return
returnData
;
}
/**
* 计算每天电量
* @param startTime
* @param endTime
* @param xjReportData 巡检填报 原始数据
* @return
*/
public
static
List
<
Map
>
calEveryDayDlData
(
String
startTime
,
String
endTime
,
List
<
Map
<
String
,
Object
>>
xjReportData
){
Map
<
String
,
Map
<
String
,
Object
>>
xjReportDataMap
=
xjReportData
.
stream
().
collect
(
Collectors
.
toMap
(
m
->
(
String
)
m
.
get
(
"time"
),
po
->
po
));
LocalDate
startLocalDate
=
LocalDate
.
parse
(
startTime
);
LocalDate
endLocalDate
=
LocalDate
.
parse
(
endTime
).
plusDays
(
1
);
List
<
Map
>
returnData
=
new
LinkedList
<>();
while
(
startLocalDate
.
compareTo
(
endLocalDate
)
<
0
)
{
String
currentDate
=
startLocalDate
.
format
(
DateTimeFormatter
.
ISO_LOCAL_DATE
);
Map
dataMap
=
new
HashMap
();
dataMap
.
put
(
"time"
,
currentDate
);
returnData
.
add
(
dataMap
);
if
(
xjReportDataMap
.
containsKey
(
currentDate
))
{
dataMap
.
put
(
"今日电量"
,
String
.
valueOf
(
ReportUtil
.
getBigDecimalValue
(
"MRDL"
,
xjReportDataMap
.
get
(
currentDate
))));
}
startLocalDate
=
startLocalDate
.
plusDays
(
1
);
}
return
returnData
;
}
private
static
String
generateKey
(
String
time
,
String
departId
){
return
departId
+
"_"
+
time
;
}
/**
* key翻译成中文
* @param oldMap
* @param attributeList
* @return
*/
public
static
Map
<
String
,
Object
>
transformKey
(
Map
<
String
,
Object
>
oldMap
,
List
<
FReportItem
>
attributeList
)
{
Map
<
String
,
FReportItem
>
reportItemMap
=
attributeList
.
stream
().
collect
(
Collectors
.
toMap
(
FReportItem:
:
getItemCode
,
po
->
po
));
Map
<
String
,
Object
>
newMap
=
new
LinkedHashMap
<>();
for
(
String
key
:
oldMap
.
keySet
())
{
String
newKey
=
key
;
if
(
reportItemMap
.
containsKey
(
key
)){
newKey
=
reportItemMap
.
get
(
key
).
getItemAlias
();
}
newMap
.
put
(
newKey
,
oldMap
.
get
(
key
));
}
return
newMap
;
}
/**
* 计算加权平均
* (a1*b1 + a2*b2)/ (b1+b2)
* @param dataList
* @param a1
* @param b1
* @param a2
* @param b2
* @param key 新数据key (结果将会被保存到Map中)
*/
public
static
void
calWeightAvg
(
List
<
Map
>
dataList
,
String
a1
,
String
b1
,
String
a2
,
String
b2
,
String
key
)
{
//(a1*b1 + a2*b2)/ (b1+b2)
for
(
Map
map
:
dataList
)
{
BigDecimal
value
=
null
;
BigDecimal
a1value
=
getBigDecimalValue
(
a1
,
map
);
BigDecimal
b1value
=
getBigDecimalValue
(
b1
,
map
);
BigDecimal
a2value
=
getBigDecimalValue
(
a2
,
map
);
BigDecimal
b2value
=
getBigDecimalValue
(
b2
,
map
);
// (b1+b2)
BigDecimal
b1AddB2
=
NumberUtil
.
add
(
b1value
,
b2value
);
if
(
b1AddB2
.
compareTo
(
BigDecimal
.
ZERO
)
==
0
){
value
=
null
;
}
else
{
//有bug:NumberUtil.mul(30, null) = 30 ,而不是期望的0
BigDecimal
a1MulB1
=
(
a1value
==
null
||
b1value
==
null
)
?
null
:
ReportUtil
.
mul
(
a1value
,
b1value
);
BigDecimal
a2MulB2
=
(
a2value
==
null
||
b2value
==
null
)
?
null
:
ReportUtil
.
mul
(
a2value
,
b2value
);
value
=
ReportUtil
.
div
(
ReportUtil
.
add
(
a1MulB1
,
a2MulB2
),
b1AddB2
);
}
map
.
put
(
key
,
value
);
}
}
/**
* 计算加权平均
* (key1*weight1 + key2*weight2 + keyN*weightN) / sum (weight1+weight2+weightN)
* @param dataList
* @param valueKey
* @param weightKey
* @param valueKey 新数据key (结果将会被保存到Map中)
*/
public
static
BigDecimal
calTotalWeightAvgAB
(
List
<
Map
>
dataList
,
String
weightKey
,
String
valueKey
,
Integer
scale
)
{
BigDecimal
total
=
BigDecimal
.
ZERO
;
BigDecimal
totalWeight
=
BigDecimal
.
ZERO
;
scale
=
scale
==
null
?
4
:
scale
;
//默认4位小数
for
(
Map
map
:
dataList
)
{
BigDecimal
keyValue
=
getBigDecimalValue
(
valueKey
,
map
);
BigDecimal
weightValue
=
getBigDecimalValue
(
weightKey
,
map
);
if
(
keyValue
==
null
||
keyValue
.
compareTo
(
BigDecimal
.
ZERO
)
==
0
||
weightValue
==
null
||
weightValue
.
compareTo
(
BigDecimal
.
ZERO
)
==
0
){
continue
;
}
total
=
NumberUtil
.
add
(
total
,
NumberUtil
.
mul
(
keyValue
,
weightValue
));
totalWeight
=
NumberUtil
.
add
(
totalWeight
,
weightValue
);
}
if
(
totalWeight
.
compareTo
(
BigDecimal
.
ZERO
)
==
0
)
{
return
null
;
//返回null
}
else
{
return
NumberUtil
.
round
(
NumberUtil
.
div
(
total
,
totalWeight
),
scale
);
}
}
public
static
BigDecimal
getBigDecimalValue
(
String
a1
,
Map
map
)
{
if
(
map
==
null
){
return
null
;
}
Object
value
=
map
.
get
(
a1
);
if
(
value
==
null
||
StringUtils
.
isBlank
(
value
.
toString
())){
return
null
;
}
//客户要求支持填写 '<'
String
valueString
=
value
.
toString
().
replaceAll
(
"\\<"
,
""
).
replaceAll
(
"<"
,
""
).
trim
();
return
!
NumberUtil
.
isNumber
(
valueString
)
?
null
:
new
BigDecimal
(
valueString
);
}
public
static
void
main
(
String
[]
args
)
{
System
.
out
.
println
(
roundContainsEndZero
(
1
,
2
));
List
<
Map
<
String
,
Object
>>
monthReportData
=
new
LinkedList
<>();
// Map<String, Object> map1 = new HashMap<>();
// map1.put("java", "0.1");
// monthReportData.add(map1);
// Map<String, Object> map2 = new HashMap<>();
// map2.put("java", "0.2");
// monthReportData.add(map2);
System
.
out
.
println
(
"======="
);
System
.
out
.
println
(
calMaxValueContainsLessThan
(
notLessThanValueListGroupByKey
(
transformListMap
(
monthReportData
)),
lessThanValueListGroupByKey
(
transformListMap
(
monthReportData
)),
"java"
));
Map
<
String
,
Object
>
map3
=
new
HashMap
<>();
map3
.
put
(
"java"
,
"<0.1"
);
monthReportData
.
add
(
map3
);
Map
<
String
,
Object
>
map4
=
new
HashMap
<>();
map4
.
put
(
"java"
,
"<0.3"
);
monthReportData
.
add
(
map4
);
System
.
out
.
println
(
"======="
);
System
.
out
.
println
(
calMaxValueContainsLessThan
(
notLessThanValueListGroupByKey
(
transformListMap
(
monthReportData
)),
lessThanValueListGroupByKey
(
transformListMap
(
monthReportData
)),
"java"
));
Map
<
String
,
Object
>
map5
=
new
HashMap
<>();
map5
.
put
(
"java"
,
"<10"
);
monthReportData
.
add
(
map5
);
Map
<
String
,
Object
>
map6
=
new
HashMap
<>();
map6
.
put
(
"java"
,
"10"
);
monthReportData
.
add
(
map6
);
System
.
out
.
println
(
"======="
);
System
.
out
.
println
(
calMaxValueContainsLessThan
(
notLessThanValueListGroupByKey
(
transformListMap
(
monthReportData
)),
lessThanValueListGroupByKey
(
transformListMap
(
monthReportData
)),
"java"
));
double
number
=
3.1415926
;
DecimalFormat
df
=
new
DecimalFormat
(
"#.##"
);
String
formattedNumber
=
df
.
format
(
number
);
// System.out.println(df.format(0d));
// System.out.println(df.format(0.0d));
// System.out.println(df.format(0.666d));
// System.out.println(round(0d, 0));
// System.out.println(round(0.1001d, 2));
// System.out.println(round(0.0001d, 1));
// System.out.println(round(111.555d, 1));
// System.out.println(round(1.455d, 2));
// System.out.println(round(1.555d, 2));
// System.out.println(round(111.555d, 3));
}
/**
* 数字格式化,保留小数位,并会去掉末尾0
* 有bug:1.455d=》1.46 ; 1.555d 》 1.55
* @param value
* @param scale 小数位数
* @return
*/
@Deprecated
public
static
String
format
(
double
value
,
int
scale
){
StringBuilder
sb
=
new
StringBuilder
(
"#"
);
if
(
scale
>
0
){
sb
.
append
(
"."
);
for
(
int
i
=
0
;
i
<
scale
;
i
++)
{
sb
.
append
(
"#"
);
}
}
DecimalFormat
df
=
new
DecimalFormat
(
sb
.
toString
());
return
df
.
format
(
value
);
}
/**
* 数字格式化,保留小数位,并会去掉末尾0
* @param value
* @param scale 小数位数
* @return
*/
public
static
String
roundForDouble
(
double
value
,
int
scale
){
// return NumberUtil.round(value,scale).toString().replaceAll("\\.?0*$", "");
return
NumberUtil
.
round
(
value
,
scale
).
stripTrailingZeros
().
toPlainString
();
}
/**
* 乘法
* @param a1value
* @param b1value
* @return
*/
public
static
BigDecimal
mul
(
Number
a1value
,
Number
b1value
){
//NumberUtil.mul(30, null) = 30 ,而不是期望的0
return
(
a1value
==
null
||
b1value
==
null
)
?
null
:
NumberUtil
.
mul
(
a1value
,
b1value
);
}
/**
* add
* @param a1value
* @param b1value
* @return
*/
public
static
BigDecimal
add
(
Number
a1value
,
Number
b1value
){
//NumberUtil.add(null, null) = 0 ,而不是期望的null
return
(
a1value
==
null
&&
b1value
==
null
)
?
null
:
NumberUtil
.
add
(
a1value
,
b1value
);
}
/**
* 除法
* @param a1value
* @param b1value
* @return
*/
public
static
BigDecimal
div
(
Number
a1value
,
Number
b1value
){
//NumberUtil.div(null, 1) 会出现空指针异常
return
(
a1value
==
null
||
b1value
==
null
||
new
BigDecimal
(
b1value
.
toString
()).
compareTo
(
BigDecimal
.
ZERO
)
==
0
)
?
null
:
NumberUtil
.
div
(
a1value
,
b1value
);
}
/**
* 保留小数位,并会去掉末尾0,规避科学计数法
* @param value
* @param scale
* @return
*/
public
static
BigDecimal
round
(
Number
value
,
int
scale
){
//NumberUtil.round(null) 会返回0,这不合理,并且不会舍弃小数点后的末尾0
if
(
value
==
null
)
{
return
null
;
}
//stripTrailingZeros:可以去掉末尾0,但是可能会返回科学计数法,比如10:1E+2
//.toPlainString() : 返回非科学技术法的字符串表示
return
new
BigDecimal
(
NumberUtil
.
round
(
new
BigDecimal
(
value
.
toString
()),
scale
).
stripTrailingZeros
().
toPlainString
());
}
/**
* 保留小数位,[不会]去掉末尾0,规避科学计数法
* @param value
* @param scale
* @return
*/
public
static
BigDecimal
roundContainsEndZero
(
Number
value
,
int
scale
){
//NumberUtil.round(null) 会返回0,这不合理,并且不会舍弃小数点后的末尾0
if
(
value
==
null
)
{
return
null
;
}
//stripTrailingZeros:可以去掉末尾0,但是可能会返回科学计数法,比如10:1E+2
//.toPlainString() : 返回非科学技术法的字符串表示
return
new
BigDecimal
(
NumberUtil
.
round
(
new
BigDecimal
(
value
.
toString
()),
scale
).
toPlainString
());
}
/**
* 保留小数位,[不会]去掉末尾0,规避科学计数法
* @param value
* @param scale
* @return
*/
public
static
String
roundStringContainsEndZero
(
Number
value
,
int
scale
){
//NumberUtil.round(null) 会返回0,这不合理,并且不会舍弃小数点后的末尾0
if
(
value
==
null
)
{
return
null
;
}
//stripTrailingZeros:可以去掉末尾0,但是可能会返回科学计数法,比如10:1E+2
//.toPlainString() : 返回非科学技术法的字符串表示
return
NumberUtil
.
round
(
new
BigDecimal
(
value
.
toString
()),
scale
).
toPlainString
();
}
/**
* 四舍五入 并会去掉末尾0,规避科学计数法(包含小于符号的返回原值)
* @param value
* @param scale
* @return
*/
public
static
String
roundForContainsLessThan
(
String
value
,
int
scale
){
if
(
StringUtils
.
isBlank
(
value
))
{
return
null
;
}
if
(
value
.
startsWith
(
"<"
)
||
value
.
startsWith
(
"<"
)){
//包含小于符号:返回原值
return
value
;
}
//stripTrailingZeros:可以去掉末尾0,但是可能会返回科学计数法,比如10:1E+2
//.toPlainString() : 返回非科学技术法的字符串表示
return
NumberUtil
.
round
(
new
BigDecimal
(
value
),
scale
).
stripTrailingZeros
().
toPlainString
();
}
/**
* 四舍五入 去掉末尾0,规避科学计数法(返回字符串)
* @param value
* @param scale
* @return
*/
public
static
String
roundToString
(
Number
value
,
int
scale
){
if
(
value
==
null
)
{
return
null
;
}
return
NumberUtil
.
round
(
new
BigDecimal
(
value
.
toString
()),
scale
).
stripTrailingZeros
().
toPlainString
();
}
/**
* 字符串转为数字
* @param s
* @return
*/
public
static
BigDecimal
strToDecimal
(
String
s
){
if
(
s
==
null
)
{
return
null
;
}
else
{
try
{
return
new
BigDecimal
(
s
);
}
catch
(
Exception
e
)
{
return
null
;
}
}
}
public
static
BigDecimal
newBigDecimal
(
String
value
,
BigDecimal
defaultValue
){
if
(
value
!=
null
&&
NumberUtil
.
isNumber
(
value
)){
return
new
BigDecimal
(
value
);
}
return
defaultValue
;
}
}
sk-module-system/src/main/java/com/skua/config/ShiroConfig.java
查看文件 @
ea10bd2
...
...
@@ -49,6 +49,7 @@ public class ShiroConfig {
filterChainDefinitionMap
.
put
(
"/sys/logout"
,
"anon"
);
//登出接口排除
filterChainDefinitionMap
.
put
(
"/sys/getEncryptedString"
,
"anon"
);
//获取加密串
filterChainDefinitionMap
.
put
(
"/sys/sms"
,
"anon"
);
//短信验证码
filterChainDefinitionMap
.
put
(
"/report/jmReport/*"
,
"anon"
);
//积木报表
filterChainDefinitionMap
.
put
(
"/sys/phoneLogin"
,
"anon"
);
//手机登录
filterChainDefinitionMap
.
put
(
"/sys/user/checkOnlyUser"
,
"anon"
);
//校验用户是否存在
filterChainDefinitionMap
.
put
(
"/sys/user/register"
,
"anon"
);
//用户注册
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论