feat(): 添加按公司统计事件和事故数量功能

dev
lishiwei 2026-06-10 09:03:36 +08:00
parent 93845f208e
commit b1be1b300a
13 changed files with 202 additions and 2 deletions

View File

@ -16,6 +16,7 @@ import com.zcloud.accident.dto.AccidentCountQry;
import com.zcloud.accident.dto.AccidentPageQry;
import com.zcloud.accident.dto.AccidentUpdateCmd;
import com.zcloud.accident.dto.clientobject.AccidentCO;
import com.zcloud.accident.dto.clientobject.AccidentCorpCountStatCO;
import com.zcloud.accident.dto.clientobject.AccidentCountStatCO;
import com.zcloud.accident.dto.clientobject.AccidentExportCO;
import com.zcloud.accident.dto.clientobject.EventExportCO;
@ -26,6 +27,8 @@ import lombok.AllArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
@ -118,8 +121,14 @@ public class AccidentController {
}
}
@ApiOperation("按公司和事故类型统计个数")
@ApiOperation("按公司统计事件和事故数")
@PostMapping("/countByCorpinfoAndType")
public MultiResponse<AccidentCorpCountStatCO> countByCorpinfoAndType(@RequestBody AccidentCountQry accidentCountQry) {
return accidentService.countByCorpinfo(accidentCountQry);
}
@ApiOperation("按照事故类型钻取统计个数")
@PostMapping("/countByIncidentType")
public MultiResponse<AccidentCountStatCO> countByCorpinfoIdAndIncidentType(@RequestBody AccidentCountQry accidentCountQry) {
return accidentService.countByCorpinfoIdAndIncidentType(accidentCountQry);
}

View File

@ -0,0 +1,21 @@
package com.zcloud.accident.command.convertor;
import com.zcloud.accident.domain.model.AccidentCorpCountStat;
import com.zcloud.accident.dto.clientobject.AccidentCorpCountStatCO;
import org.mapstruct.Mapper;
import java.util.List;
/**
* /
*
* @Author
* @Date
*/
@Mapper(componentModel = "spring")
public interface AccidentCorpCountStatConvertor {
AccidentCorpCountStatCO convertToCO(AccidentCorpCountStat stat);
List<AccidentCorpCountStatCO> convertToCOList(List<AccidentCorpCountStat> stats);
}

View File

@ -3,11 +3,15 @@ package com.zcloud.accident.command.query;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.MultiResponse;
import com.zcloud.accident.command.convertor.AccidentCoConvertor;
import com.zcloud.accident.command.convertor.AccidentCorpCountStatConvertor;
import com.zcloud.accident.command.convertor.AccidentCountStatConvertor;
import com.zcloud.accident.domain.gateway.AccidentGateway;
import com.zcloud.accident.domain.model.AccidentCorpCountStat;
import com.zcloud.accident.domain.model.AccidentCountStat;
import com.zcloud.accident.dto.AccidentCountQry;
import com.zcloud.accident.dto.AccidentPageQry;
import com.zcloud.accident.dto.clientobject.AccidentCO;
import com.zcloud.accident.dto.clientobject.AccidentCorpCountStatCO;
import com.zcloud.accident.dto.clientobject.AccidentCountStatCO;
import com.zcloud.accident.persistence.dataobject.AccidentDO;
import com.zcloud.accident.persistence.repository.AccidentRepository;
@ -15,8 +19,10 @@ import com.zcloud.gbscommon.utils.PageQueryHelper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
@ -32,6 +38,7 @@ public class AccidentQueryExe {
private final AccidentCoConvertor accidentCoConvertor;
private final AccidentGateway accidentGateway;
private final AccidentCountStatConvertor accidentCountStatConvertor;
private final AccidentCorpCountStatConvertor accidentCorpCountStatConvertor;
/**
* id
@ -77,6 +84,34 @@ public class AccidentQueryExe {
List<AccidentDO> accidentDOs = accidentRepository.listAll(params,menuPerms);
return accidentCoConvertor.converDOsToCOs(accidentDOs);
}
/**
*
* @param accidentCountQry ID
* @return
*/
public MultiResponse<AccidentCorpCountStatCO> countByCorpinfo(AccidentCountQry accidentCountQry) {
List<AccidentCorpCountStat> resultList = accidentGateway.countByCorpinfo(accidentCountQry.getCorpinfoIds());
List<AccidentCorpCountStatCO> coList = accidentCorpCountStatConvertor.convertToCOList(resultList);
// 补全无数据的公司事件和事故数量为0
if (accidentCountQry.getCorpinfoIds() != null) {
Set<Long> existIds = new HashSet<>();
for (AccidentCorpCountStatCO co : coList) {
existIds.add(co.getCorpinfoId());
}
for (String idStr : accidentCountQry.getCorpinfoIds()) {
Long corpinfoId = Long.valueOf(idStr);
if (!existIds.contains(corpinfoId)) {
AccidentCorpCountStatCO co = new AccidentCorpCountStatCO();
co.setCorpinfoId(corpinfoId);
co.setEventCount(0L);
co.setAccidentCount(0L);
coList.add(co);
}
}
}
return MultiResponse.of(coList);
}
/**
* corpinfoIdincidentType
* @param accidentCountQry ID
@ -84,6 +119,21 @@ public class AccidentQueryExe {
*/
public MultiResponse<AccidentCountStatCO> countByCorpinfoIdAndIncidentType(AccidentCountQry accidentCountQry) {
List<com.zcloud.accident.domain.model.AccidentCountStat> resultList = accidentGateway.countByCorpinfoIdAndIncidentType(accidentCountQry.getCorpinfoIds(),accidentCountQry.getEqAccidentType());
AccidentCountStat acc = new AccidentCountStat();
acc.setCorpinfoId(2008712261453131776L);
acc.setIncidentType("accident003");
acc.setCount(1L);
AccidentCountStat bcc = new AccidentCountStat();
bcc.setCorpinfoId(2012084659332952064L);
bcc.setIncidentType("accident001");
bcc.setCount(1L);
AccidentCountStat ccc = new AccidentCountStat();
ccc.setCorpinfoId(2008712261453131776L);
ccc.setIncidentType("accident001");
ccc.setCount(3L);
resultList.add(acc);
resultList.add(bcc);
resultList.add(ccc);
List<AccidentCountStatCO> coList = accidentCountStatConvertor.convertToCOList(resultList);
return MultiResponse.of(coList);
}

View File

@ -11,6 +11,7 @@ import com.zcloud.accident.dto.AccidentCountQry;
import com.zcloud.accident.dto.AccidentPageQry;
import com.zcloud.accident.dto.AccidentUpdateCmd;
import com.zcloud.accident.dto.clientobject.AccidentCO;
import com.zcloud.accident.dto.clientobject.AccidentCorpCountStatCO;
import com.zcloud.accident.dto.clientobject.AccidentCountStatCO;
import com.alibaba.cola.dto.PageResponse;
@ -72,6 +73,11 @@ public class AccidentServiceImpl implements AccidentServiceI {
accidentRemoveExe.execute(ids);
}
@Override
public MultiResponse<AccidentCorpCountStatCO> countByCorpinfo(AccidentCountQry accidentCountQry) {
return accidentQueryExe.countByCorpinfo(accidentCountQry);
}
@Override
public MultiResponse<AccidentCountStatCO> countByCorpinfoIdAndIncidentType(AccidentCountQry accidentCountQry) {
return accidentQueryExe.countByCorpinfoIdAndIncidentType(accidentCountQry);

View File

@ -5,6 +5,7 @@ import com.zcloud.accident.dto.AccidentCountQry;
import com.zcloud.accident.dto.AccidentPageQry;
import com.zcloud.accident.dto.AccidentUpdateCmd;
import com.zcloud.accident.dto.clientobject.AccidentCO;
import com.zcloud.accident.dto.clientobject.AccidentCorpCountStatCO;
import com.zcloud.accident.dto.clientobject.AccidentCountStatCO;
import com.alibaba.cola.dto.PageResponse;
@ -40,7 +41,14 @@ public interface AccidentServiceI {
void removeBatch(Long[] ids);
/**
* corpinfoIdincidentType
*
* @param accidentCountQry ID
* @return
*/
MultiResponse<AccidentCorpCountStatCO> countByCorpinfo(AccidentCountQry accidentCountQry);
/**
* corpinfoIdincidentType
* @param accidentCountQry ID
* @return
*/

View File

@ -0,0 +1,28 @@
package com.zcloud.accident.dto.clientobject;
import com.alibaba.cola.dto.ClientObject;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* /
*
* @Author
* @Date
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AccidentCorpCountStatCO extends ClientObject {
@ApiModelProperty(value = "公司ID")
private Long corpinfoId;
@ApiModelProperty(value = "事件数量")
private Long eventCount;
@ApiModelProperty(value = "事故数量")
private Long accidentCount;
}

View File

@ -1,6 +1,7 @@
package com.zcloud.accident.domain.gateway;
import com.zcloud.accident.domain.model.AccidentE;
import com.zcloud.accident.domain.model.AccidentCorpCountStat;
import com.zcloud.accident.domain.model.AccidentCountStat;
import java.util.List;
@ -28,6 +29,14 @@ public interface AccidentGateway {
Boolean deletedAccidentById(Long id);
Boolean deletedAccidentByIds(Long[] id);
/**
*
*
* @param corpinfoIds ID
* @return
*/
List<AccidentCorpCountStat> countByCorpinfo(List<String> corpinfoIds);
/**
* corpinfoIdincidentType
*

View File

@ -0,0 +1,21 @@
package com.zcloud.accident.domain.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* /
* (type=1)(type=2)
*
* @Author
* @Date
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AccidentCorpCountStat {
private Long corpinfoId;
private Long eventCount;
private Long accidentCount;
}

View File

@ -3,6 +3,7 @@ package com.zcloud.accident.gatewayimpl;
import com.jjb.saas.framework.auth.utils.AuthContext;
import com.zcloud.accident.domain.gateway.AccidentGateway;
import com.zcloud.accident.domain.model.AccidentE;
import com.zcloud.accident.domain.model.AccidentCorpCountStat;
import com.zcloud.accident.domain.model.AccidentCountStat;
import com.zcloud.accident.persistence.dataobject.AccidentDO;
import com.zcloud.accident.persistence.repository.AccidentRepository;
@ -51,6 +52,11 @@ public class AccidentGatewayImpl implements AccidentGateway {
return accidentRepository.removeByIds(Arrays.asList(ids));
}
@Override
public List<AccidentCorpCountStat> countByCorpinfo(List<String> corpinfoIds) {
return accidentRepository.countByCorpinfo(corpinfoIds);
}
@Override
public List<AccidentCountStat> countByCorpinfoIdAndIncidentType(List<String> corpinfoIds, Integer eqAccidentType) {
return accidentRepository.countByCorpinfoIdAndIncidentType(corpinfoIds,eqAccidentType);

View File

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.jjb.saas.framework.datascope.annotation.DataScope;
import com.jjb.saas.framework.datascope.annotation.DataScopes;
import com.zcloud.accident.domain.model.AccidentCorpCountStat;
import com.zcloud.accident.domain.model.AccidentCountStat;
import com.zcloud.accident.persistence.dataobject.AccidentDO;
import org.apache.ibatis.annotations.Mapper;
@ -24,6 +25,14 @@ import java.util.Map;
@DataScope(method = "list", menuPerms = "")})
public interface AccidentMapper extends BaseMapper<AccidentDO> {
/**
*
*
* @param corpinfoIds ID
* @return corpinfoIdcorpinfoNameeventCountaccidentCount
*/
List<AccidentCorpCountStat> countByCorpinfo(@Param("corpinfoIds") List<String> corpinfoIds);
/**
* corpinfoIdincidentType
*

View File

@ -1,6 +1,7 @@
package com.zcloud.accident.persistence.repository;
import com.zcloud.accident.persistence.dataobject.AccidentDO;
import com.zcloud.accident.domain.model.AccidentCorpCountStat;
import com.zcloud.accident.domain.model.AccidentCountStat;
import com.alibaba.cola.dto.PageResponse;
import com.jjb.saas.framework.repository.repo.BaseRepository;
@ -26,6 +27,14 @@ public interface AccidentRepository extends BaseRepository<AccidentDO> {
*/
List<AccidentDO> listAll(Map<String,Object> params,String menuPerms);
/**
*
*
* @param corpinfoIds ID
* @return corpinfoIdcorpinfoNameeventCountaccidentCount
*/
List<AccidentCorpCountStat> countByCorpinfo(@Param("corpinfoIds") List<String> corpinfoIds);
/**
* corpinfoIdincidentType
*

View File

@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.jjb.saas.framework.auth.utils.AuthContext;
import com.jjb.saas.framework.repository.common.PageHelper;
import com.jjb.saas.framework.repository.repo.impl.BaseRepositoryImpl;
import com.zcloud.accident.domain.model.AccidentCorpCountStat;
import com.zcloud.accident.domain.model.AccidentCountStat;
import com.zcloud.accident.persistence.dataobject.AccidentDO;
import com.zcloud.accident.persistence.mapper.AccidentMapper;
@ -47,6 +48,11 @@ public class AccidentRepositoryImpl extends BaseRepositoryImpl<AccidentMapper, A
return accidentMapper.list(params, menuPerms);
}
@Override
public List<AccidentCorpCountStat> countByCorpinfo(List<String> corpinfoIds) {
return accidentMapper.countByCorpinfo(corpinfoIds);
}
@Override
public List<AccidentCountStat> countByCorpinfoIdAndIncidentType(List<String> corpinfoIds, Integer eqAccidentType) {
return accidentMapper.countByCorpinfoIdAndIncidentType(corpinfoIds, eqAccidentType);

View File

@ -71,6 +71,24 @@
order by create_time desc
</select>
<select id="countByCorpinfo" resultType="com.zcloud.accident.domain.model.AccidentCorpCountStat">
SELECT
corpinfo_id,
SUM(CASE WHEN type = 1 THEN 1 ELSE 0 END) as event_count,
SUM(CASE WHEN type = 2 THEN 1 ELSE 0 END) as accident_count
FROM accident
<where>
and delete_enum = 'FALSE'
<if test="corpinfoIds != null and !corpinfoIds.isEmpty() and corpinfoIds.size()>0">
AND corpinfo_id IN
<foreach collection="corpinfoIds" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
</where>
GROUP BY corpinfo_id
</select>
<select id="countByCorpinfoIdAndIncidentType" resultType="com.zcloud.accident.domain.model.AccidentCountStat">
SELECT
corpinfo_id,