8 changed files with 456 additions and 0 deletions
@ -0,0 +1,47 @@ |
|||||||
|
package com.biutag.lan.controller; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage; |
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
||||||
|
import com.biutag.aop.NotPower; |
||||||
|
import com.biutag.core.AjaxResult; |
||||||
|
import com.biutag.enums.RoleEnum; |
||||||
|
import com.biutag.lan.config.AdminThreadLocal; |
||||||
|
import com.biutag.lan.domain.Notice; |
||||||
|
import com.biutag.lan.domain.Work; |
||||||
|
import com.biutag.lan.domain.bo.MailQuery; |
||||||
|
import com.biutag.lan.domain.vo.DataVo; |
||||||
|
import com.biutag.lan.domain.vo.NoticeTotalVo; |
||||||
|
import com.biutag.lan.domain.vo.NoticeVo; |
||||||
|
import com.biutag.lan.domain.vo.WorkVo; |
||||||
|
import com.biutag.lan.flow.FlowNameEnum; |
||||||
|
import com.biutag.lan.service.DataService; |
||||||
|
import com.biutag.lan.service.NoticeService; |
||||||
|
import com.biutag.lan.service.WorkService; |
||||||
|
import com.biutag.lan.validate.system.DataSearchValidate; |
||||||
|
import com.biutag.lan.validate.system.NoticeSearchValidate; |
||||||
|
import lombok.RequiredArgsConstructor; |
||||||
|
import org.springframework.validation.annotation.Validated; |
||||||
|
import org.springframework.web.bind.annotation.GetMapping; |
||||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||||
|
import org.springframework.web.bind.annotation.RestController; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
@RequiredArgsConstructor |
||||||
|
@RequestMapping("/api/data") |
||||||
|
@RestController |
||||||
|
public class DataController { |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private final DataService dataService; |
||||||
|
|
||||||
|
@NotPower |
||||||
|
@GetMapping("list") |
||||||
|
public AjaxResult<Page<Map<String, Object>>> list(Page page, @Validated DataSearchValidate searchValidate) { |
||||||
|
Page<Map<String, Object>> list = dataService.list(page, searchValidate); |
||||||
|
return AjaxResult.success(list); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,46 @@ |
|||||||
|
package com.biutag.lan.domain.vo; |
||||||
|
|
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
import lombok.Setter; |
||||||
|
import lombok.experimental.Accessors; |
||||||
|
|
||||||
|
@Accessors(chain = true) |
||||||
|
@Setter |
||||||
|
@Getter |
||||||
|
public class DataVo { |
||||||
|
private static final long serialVersionUID = 1L; |
||||||
|
|
||||||
|
private String cname; |
||||||
|
|
||||||
|
private String cratenumber; |
||||||
|
|
||||||
|
private String crate; |
||||||
|
|
||||||
|
private String completed; |
||||||
|
|
||||||
|
private String csum; |
||||||
|
|
||||||
|
private String rname; |
||||||
|
|
||||||
|
private String resolved; |
||||||
|
|
||||||
|
private String rsum; |
||||||
|
|
||||||
|
private String ratenumber; |
||||||
|
|
||||||
|
private String rate; |
||||||
|
|
||||||
|
private String sname; |
||||||
|
|
||||||
|
private String satisfied; |
||||||
|
|
||||||
|
private String sum; |
||||||
|
|
||||||
|
private String sratenumber; |
||||||
|
|
||||||
|
private String srate; |
||||||
|
|
||||||
|
private String score; |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,20 @@ |
|||||||
|
package com.biutag.lan.domain.vo; |
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
@Data |
||||||
|
@ApiModel("简易deptVO") |
||||||
|
public class EasyDeptVO implements Serializable { |
||||||
|
private static final long serialVersionUID = 1L; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "主键") |
||||||
|
private Integer id; |
||||||
|
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "名称") |
||||||
|
private String labelName; |
||||||
|
} |
||||||
@ -0,0 +1,24 @@ |
|||||||
|
package com.biutag.lan.mapper; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
||||||
|
import com.biutag.entity.system.Duty; |
||||||
|
import com.biutag.lan.domain.Mail; |
||||||
|
import com.biutag.lan.domain.vo.DataVo; |
||||||
|
import com.biutag.lan.domain.vo.MailDetail; |
||||||
|
import org.apache.ibatis.annotations.Param; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
public interface DataMapper extends BaseMapper<Mail> { |
||||||
|
|
||||||
|
|
||||||
|
List<Map<String, Object>> getFirstAllList(@Param("searchStartTime") String searchStartTime,@Param("searchEndTime") String searchEndTime); |
||||||
|
|
||||||
|
List<Map<String, Object>> getSecondList(Page page,@Param("searchStartTime") String searchStartTime,@Param("searchEndTime") String searchEndTime); |
||||||
|
|
||||||
|
List<Map<String, Object>> getThirdList(Page page,@Param("searchStartTime") String searchStartTime,@Param("searchEndTime") String searchEndTime,@Param("deptId") String deptId); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
@ -0,0 +1,85 @@ |
|||||||
|
package com.biutag.lan.service; |
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
||||||
|
import com.biutag.constants.AppConstants; |
||||||
|
import com.biutag.enums.RoleEnum; |
||||||
|
import com.biutag.lan.config.AdminThreadLocal; |
||||||
|
import com.biutag.lan.domain.*; |
||||||
|
import com.biutag.lan.domain.vo.DataVo; |
||||||
|
import com.biutag.lan.domain.vo.NoticeVo; |
||||||
|
import com.biutag.lan.mapper.*; |
||||||
|
import com.biutag.lan.validate.system.DataSearchValidate; |
||||||
|
import com.biutag.lan.validate.system.NoticeSearchValidate; |
||||||
|
import com.biutag.mapper.setting.DictDataMapper; |
||||||
|
import com.biutag.mapper.system.DeptMapper; |
||||||
|
import jakarta.annotation.Resource; |
||||||
|
import lombok.RequiredArgsConstructor; |
||||||
|
import org.springframework.beans.BeanUtils; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
import org.springframework.validation.annotation.Validated; |
||||||
|
|
||||||
|
import java.time.format.DateTimeFormatter; |
||||||
|
import java.util.LinkedList; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.stream.Collectors; |
||||||
|
import java.util.stream.Stream; |
||||||
|
|
||||||
|
|
||||||
|
@RequiredArgsConstructor |
||||||
|
@Service |
||||||
|
public class DataService extends ServiceImpl<DataMapper, Mail> { |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Resource |
||||||
|
private DataMapper dataMapper; |
||||||
|
|
||||||
|
public Page<Map<String, Object>> list(Page page, @Validated DataSearchValidate searchValidate){ |
||||||
|
List<Map<String, Object>> combinedList = null; |
||||||
|
List<Map<String, Object>> mapfirst = null; |
||||||
|
List<Map<String, Object>> mapSecond = null; |
||||||
|
List<Map<String, Object>> mapThird = null; |
||||||
|
if (searchValidate.getEasydept()==null||!searchValidate.getEasydept().equals("2")){ |
||||||
|
if (searchValidate.getSearchTime()!=null){ |
||||||
|
mapfirst = dataMapper.getFirstAllList(searchValidate.getSearchStartTime(),searchValidate.getSearchEndTime()); |
||||||
|
mapSecond = dataMapper.getSecondList(page,searchValidate.getSearchStartTime(),searchValidate.getSearchEndTime()); |
||||||
|
}else { |
||||||
|
mapfirst = dataMapper.getFirstAllList(null,null); |
||||||
|
mapSecond = dataMapper.getSecondList(page,null,null); |
||||||
|
} |
||||||
|
combinedList = Stream.concat(mapfirst.stream(), mapSecond.stream()) |
||||||
|
.collect(Collectors.toList()); |
||||||
|
}else if (searchValidate.getEasydept()!=null&&searchValidate.getEasydept().equals("2")){ |
||||||
|
if (searchValidate.getSdept()!=null){ |
||||||
|
if (searchValidate.getSearchTime()!=null){ |
||||||
|
mapThird = dataMapper.getThirdList(page,searchValidate.getSearchStartTime(),searchValidate.getSearchEndTime(),searchValidate.getSdept()); |
||||||
|
}else { |
||||||
|
mapThird = dataMapper.getThirdList(page,null,null,searchValidate.getSdept()); |
||||||
|
} |
||||||
|
combinedList = mapThird; |
||||||
|
}else{ |
||||||
|
if (searchValidate.getSearchTime()!=null){ |
||||||
|
mapfirst = dataMapper.getFirstAllList(searchValidate.getSearchStartTime(),searchValidate.getSearchEndTime()); |
||||||
|
mapSecond = dataMapper.getSecondList(page,searchValidate.getSearchStartTime(),searchValidate.getSearchEndTime()); |
||||||
|
}else { |
||||||
|
mapfirst = dataMapper.getFirstAllList(null,null); |
||||||
|
mapSecond = dataMapper.getSecondList(page,null,null); |
||||||
|
} |
||||||
|
combinedList = Stream.concat(mapfirst.stream(), mapSecond.stream()) |
||||||
|
.collect(Collectors.toList()); |
||||||
|
} |
||||||
|
} |
||||||
|
Page<Map<String, Object>> dataVoPage = new Page<>(); |
||||||
|
dataVoPage.setRecords(combinedList); |
||||||
|
dataVoPage.setTotal(page.getTotal()); |
||||||
|
dataVoPage.setCurrent(page.getCurrent()); |
||||||
|
dataVoPage.setSize(page.getSize()); |
||||||
|
dataVoPage.setPages(page.getPages()); |
||||||
|
return dataVoPage; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,30 @@ |
|||||||
|
package com.biutag.lan.validate.system; |
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
@Data |
||||||
|
@ApiModel("通知搜素参数") |
||||||
|
public class DataSearchValidate implements Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "搜索时间") |
||||||
|
private String searchTime; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "搜索时间") |
||||||
|
private String searchStartTime; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "搜索时间") |
||||||
|
private String searchEndTime; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "机构level") |
||||||
|
private String easydept; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "二级机构id") |
||||||
|
private String sdept; |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,185 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?> |
||||||
|
<!DOCTYPE mapper |
||||||
|
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
||||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
||||||
|
<mapper namespace="com.biutag.lan.mapper.DataMapper"> |
||||||
|
<select id="getSecondList" resultType="java.util.Map" parameterType="java.util.Map"> |
||||||
|
SELECT * , (cratenumber * 0.5 + sratenumber * 0.3 + ratenumber * 0.2) score FROM |
||||||
|
( |
||||||
|
( |
||||||
|
select a.name cname,a.sort, |
||||||
|
ROUND(sum(COALESCE(b.completed, 0))*100/count(1),0) crateNumber, |
||||||
|
count(b.mail_id) total, |
||||||
|
CONCAT(crateNumber,'%') crate, |
||||||
|
SUM(COALESCE(b.completed, 0)) completed,count(1) csum |
||||||
|
|
||||||
|
from dept a left join mail_mark b on a.id = b.second_dept_id |
||||||
|
|
||||||
|
<if test="searchStartTime != null and searchEndTime != null"> |
||||||
|
AND b.completion_time BETWEEN #{searchStartTime} AND (to_date(#{searchEndTime}) + interval '1 D') |
||||||
|
</if> |
||||||
|
|
||||||
|
where a.level = '2' |
||||||
|
|
||||||
|
group by a.name,a.sort |
||||||
|
order by crateNumber desc |
||||||
|
) t1 |
||||||
|
join |
||||||
|
|
||||||
|
(select t.name rname, t.resolved, t.sum rsum, CASE WHEN t.sum = 0 THEN 0 ELSE ROUND((t.resolved / t.sum) * 100) END AS rateNumber, concat(rateNumber, '%') rate |
||||||
|
from |
||||||
|
(select a.name, SUM(COALESCE(b.resolved, 0)) resolved, |
||||||
|
SUM(CASE WHEN b.completed = '1' THEN 1 ELSE 0 END) sum |
||||||
|
from dept a left join mail_mark b on a.id = b.second_dept_id |
||||||
|
<if test="searchStartTime != null and searchEndTime != null"> |
||||||
|
AND b.completion_time BETWEEN #{searchStartTime} AND (to_date(#{searchEndTime}) + interval '1 D') |
||||||
|
</if> |
||||||
|
|
||||||
|
where a.level = '2' |
||||||
|
|
||||||
|
group by a.name) t order by rateNumber desc |
||||||
|
|
||||||
|
) t2 on t1.cname = t2.rname |
||||||
|
|
||||||
|
) t3 JOIN |
||||||
|
|
||||||
|
( |
||||||
|
select a.name sname, |
||||||
|
SUM(COALESCE(b.satisfied, 0)) satisfied, |
||||||
|
SUM(CASE WHEN b.completed = '1' THEN 1 ELSE 0 END) sum, |
||||||
|
CASE WHEN sum = 0 THEN 0 ELSE ROUND(sum(COALESCE(b.satisfied, 0))*100/sum,0) END srateNumber, |
||||||
|
CONCAT(srateNumber,'%') srate |
||||||
|
from dept a left join mail_mark b on a.id = b.second_dept_id |
||||||
|
<if test="searchStartTime != null and searchEndTime != null"> |
||||||
|
AND b.completion_time BETWEEN #{searchStartTime} AND (to_date(#{searchEndTime}) + interval '1 D') |
||||||
|
</if> |
||||||
|
|
||||||
|
where a.level = '2' |
||||||
|
|
||||||
|
group by a.name |
||||||
|
order by srateNumber desc |
||||||
|
) t4 on t3.cname = t4.sname ORDER BY score desc ,sort |
||||||
|
</select> |
||||||
|
|
||||||
|
|
||||||
|
<select id="getFirstAllList" resultType="java.util.Map" > |
||||||
|
SELECT *, (CAST(REPLACE(crate, '%', '') AS NUMERIC) * 0.5 + |
||||||
|
CAST(REPLACE(srate, '%', '') AS NUMERIC) * 0.3 + |
||||||
|
CAST(REPLACE(rate, '%', '') AS NUMERIC) * 0.2) AS score,'长沙市公安局' as cname FROM |
||||||
|
( |
||||||
|
( |
||||||
|
select |
||||||
|
ROUND(sum(COALESCE(b.completed, 0))*100/count(1),0) crateNumber, |
||||||
|
CONCAT(ROUND(SUM(COALESCE(b.completed, 0))*100 / NULLIF(COUNT(1), 0),0),'%') AS cRate, |
||||||
|
SUM(COALESCE(b.completed, 0)) AS completed, |
||||||
|
COUNT(1) AS cSum, |
||||||
|
(SELECT COUNT(*) FROM mail_mark b where 1=1 |
||||||
|
<if test="searchStartTime != null and searchEndTime != null"> |
||||||
|
AND b.completion_time BETWEEN #{searchStartTime} AND (to_date(#{searchEndTime}) + interval '1 D') |
||||||
|
</if>) AS total |
||||||
|
from mail_mark b left join dept a on a.id=b.second_dept_id where 1=1 |
||||||
|
<if test="searchStartTime != null and searchEndTime != null"> |
||||||
|
AND b.completion_time BETWEEN #{searchStartTime} AND (to_date(#{searchEndTime}) + interval '1 D') |
||||||
|
</if> |
||||||
|
|
||||||
|
) t1 |
||||||
|
join |
||||||
|
|
||||||
|
( |
||||||
|
select CONCAT(ROUND(sum(COALESCE(b.resolved, 0))*100/SUM(CASE WHEN b.completed = '1' THEN 1 ELSE 0 END),0),'%') Rate, |
||||||
|
SUM(COALESCE(b.resolved, 0)) resolved,SUM(CASE WHEN b.completed = '1' THEN 1 ELSE 0 END) rSum, |
||||||
|
(SELECT COUNT(*) FROM mail_mark b where 1=1 |
||||||
|
<if test="searchStartTime != null and searchEndTime != null"> |
||||||
|
AND b.completion_time BETWEEN #{searchStartTime} AND (to_date(#{searchEndTime}) + interval '1 D') |
||||||
|
</if>) AS total |
||||||
|
|
||||||
|
from mail_mark b left join dept a on a.id=b.second_dept_id where 1=1 |
||||||
|
<if test="searchStartTime != null and searchEndTime != null"> |
||||||
|
AND b.completion_time BETWEEN #{searchStartTime} AND (to_date(#{searchEndTime}) + interval '1 D') |
||||||
|
</if> |
||||||
|
) t2 on t1.total = t2.total |
||||||
|
|
||||||
|
) t3 JOIN |
||||||
|
|
||||||
|
( |
||||||
|
select |
||||||
|
CONCAT(ROUND(SUM(COALESCE(b.satisfied, 0))*100 / NULLIF(SUM(CASE WHEN b.completed = '1' THEN 1 ELSE 0 END), 0),0),'%') AS sRate, |
||||||
|
SUM(COALESCE(b.satisfied, 0)) AS satisfied, |
||||||
|
SUM(CASE WHEN b.completed = '1' THEN 1 ELSE 0 END) AS Sum, |
||||||
|
(SELECT COUNT(*) FROM mail_mark b where 1=1 |
||||||
|
<if test="searchStartTime != null and searchEndTime != null"> |
||||||
|
AND b.completion_time BETWEEN #{searchStartTime} AND (to_date(#{searchEndTime}) + interval '1 D') |
||||||
|
</if>) AS total |
||||||
|
|
||||||
|
from mail_mark b left join dept a on a.id=b.second_dept_id where 1=1 |
||||||
|
<if test="searchStartTime != null and searchEndTime != null"> |
||||||
|
AND b.completion_time BETWEEN #{searchStartTime} AND (to_date(#{searchEndTime}) + interval '1 D') |
||||||
|
</if> |
||||||
|
) t4 on t3.total = t4.total |
||||||
|
</select> |
||||||
|
|
||||||
|
|
||||||
|
<select id="getThirdList" resultType="java.util.Map" parameterType="java.util.Map"> |
||||||
|
SELECT * , (cratenumber * 0.5 + sratenumber * 0.3 + ratenumber * 0.2) score FROM |
||||||
|
( |
||||||
|
( |
||||||
|
select a.name cname,a.sort, |
||||||
|
ROUND(sum(COALESCE(b.completed, 0))*100/count(1),0) crateNumber, |
||||||
|
count(b.mail_id) total, |
||||||
|
CONCAT(crateNumber,'%') crate, |
||||||
|
SUM(COALESCE(b.completed, 0)) completed,count(1) csum |
||||||
|
|
||||||
|
from dept a left join mail_mark b on a.id = b.second_dept_id |
||||||
|
|
||||||
|
<if test="searchStartTime != null and searchEndTime != null"> |
||||||
|
AND b.completion_time BETWEEN #{searchStartTime} AND (to_date(#{searchEndTime}) + interval '1 D') |
||||||
|
</if> |
||||||
|
|
||||||
|
where a.level = '3' |
||||||
|
<if test="deptId != null"> |
||||||
|
and a.pid = #{deptId} or a.id = #{deptId} |
||||||
|
</if> |
||||||
|
group by a.name,a.sort |
||||||
|
order by crateNumber desc |
||||||
|
) t1 |
||||||
|
join |
||||||
|
|
||||||
|
(select t.name rname, t.resolved, t.sum rsum, CASE WHEN t.sum = 0 THEN 0 ELSE ROUND((t.resolved / t.sum) * 100) END AS rateNumber, concat(rateNumber, '%') rate |
||||||
|
from |
||||||
|
(select a.name, SUM(COALESCE(b.resolved, 0)) resolved, |
||||||
|
SUM(CASE WHEN b.completed = '1' THEN 1 ELSE 0 END) sum |
||||||
|
from dept a left join mail_mark b on a.id = b.second_dept_id |
||||||
|
<if test="searchStartTime != null and searchEndTime != null"> |
||||||
|
AND b.completion_time BETWEEN #{searchStartTime} AND (to_date(#{searchEndTime}) + interval '1 D') |
||||||
|
</if> |
||||||
|
|
||||||
|
where a.level = '3' |
||||||
|
<if test="deptId != null"> |
||||||
|
and a.pid = #{deptId} or a.id = #{deptId} |
||||||
|
</if> |
||||||
|
group by a.name) t order by rateNumber desc |
||||||
|
|
||||||
|
) t2 on t1.cname = t2.rname |
||||||
|
|
||||||
|
) t3 JOIN |
||||||
|
|
||||||
|
( |
||||||
|
select a.name sname, |
||||||
|
SUM(COALESCE(b.satisfied, 0)) satisfied, |
||||||
|
SUM(CASE WHEN b.completed = '1' THEN 1 ELSE 0 END) sum, |
||||||
|
CASE WHEN sum = 0 THEN 0 ELSE ROUND(sum(COALESCE(b.satisfied, 0))*100/sum,0) END srateNumber, |
||||||
|
CONCAT(srateNumber,'%') srate |
||||||
|
from dept a left join mail_mark b on a.id = b.second_dept_id |
||||||
|
<if test="searchStartTime != null and searchEndTime != null"> |
||||||
|
AND b.completion_time BETWEEN #{searchStartTime} AND (to_date(#{searchEndTime}) + interval '1 D') |
||||||
|
</if> |
||||||
|
|
||||||
|
where a.level = '3' |
||||||
|
<if test="deptId != null"> |
||||||
|
and a.pid = #{deptId} or a.id = #{deptId} |
||||||
|
</if> |
||||||
|
group by a.name |
||||||
|
order by srateNumber desc |
||||||
|
) t4 on t3.cname = t4.sname ORDER BY score desc ,sort |
||||||
|
</select> |
||||||
|
</mapper> |
||||||
Loading…
Reference in new issue