工程统计

This commit is contained in:
方亮 2025-09-26 10:00:03 +08:00
parent 73f9f1d258
commit b000f4a841
7 changed files with 450 additions and 0 deletions

View File

@ -0,0 +1,74 @@
package com.bonus.bmw.controller;
import com.bonus.bmw.domain.po.HomePagePo;
import com.bonus.bmw.domain.vo.HomePageSubProVo;
import com.bonus.bmw.service.ProStatisticsService;
import com.bonus.common.core.web.controller.BaseController;
import com.bonus.common.core.web.domain.AjaxResult;
import com.bonus.common.core.web.page.TableDataInfo;
import com.bonus.common.log.annotation.SysLog;
import com.bonus.common.log.enums.OperaType;
import com.bonus.common.security.annotation.InnerAuth;
import com.bonus.common.security.annotation.RequiresPermissions;
import com.bonus.common.security.annotation.RequiresPermissionsOrInnerAuth;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/**
* 工程统计
* @author fly
*/
@RestController
@RequestMapping("/proStatistics")
public class ProStatisticsController extends BaseController {
/**
* 服务对象
*/
@Autowired
private ProStatisticsService service;
/**
* 工程统计
* @param o
* @return
*/
@RequiresPermissionsOrInnerAuth(innerAuth = @InnerAuth(isUser = false), requiresPermissions = @RequiresPermissions("pro:statistics:query"))
@GetMapping("/getProStatisticsTable")
@SysLog(title = "工程统计", businessType = OperaType.QUERY, logType = 0, module = "工程统计->工程统计", details = "工程统计")
public TableDataInfo getProStatisticsTable(HomePagePo o) {
try {
startPage();
List<HomePageSubProVo> list = service.getProStatisticsTable(o);
return getDataTable(list);
} catch (Exception e) {
logger.error(e.toString(), e);
}
return getDataTableError(new ArrayList<>());
}
/**
* 工程-数据概览
* @param o
* @return
*/
@RequiresPermissionsOrInnerAuth(innerAuth = @InnerAuth(isUser = false), requiresPermissions = @RequiresPermissions("pro:statistics:query"))
@GetMapping("/getProDataOverview")
@SysLog(title = "数据概览", businessType = OperaType.QUERY, logType = 0, module = "工程统计->数据概览", details = "数据概览")
public AjaxResult getDataOverview(HomePagePo o) {
try {
return service.getProDataOverview(o);
} catch (Exception e) {
logger.error(e.toString(), e);
}
return error("系统异常,请联系管理员");
}
}

View File

@ -52,4 +52,5 @@ public class HomePageSubProVo {
private String attTime;
private String proAddress;
}

View File

@ -0,0 +1,101 @@
package com.bonus.bmw.domain.vo;
import lombok.Data;
@Data
public class ProStatisticsPo {
/**
* 项目总数
*/
private Integer proNum;
private String proId;
private String proName;
private String subCompanyName;
private String proType;
private String volLevel;
private String proStatus;
/**
* 入场
*/
private String einNum;
/**
* 考勤
*/
private String attNum;
/**
* 黄灯状态
*/
private String yellowNum;
/**
* 绿灯状态
*/
private String greenNum;
/**
* 黄灯超七天状态
*/
private String yellowThanSevenDayNum;
/**
* 分包数
*/
private String subNum;
/**
* 班组数
*/
private String teamNum;
/**
* 是否考勤
*/
private String isAtt;
/**
* 入场时间
*/
private String einTime;
/**
* 出场时间
*/
private String exitTime;
/**
* 考勤时间
*/
private String attTime;
/**
* 出场有文件人数
*/
private String exitUploadFile;
/**
* 出场无文件人数
*/
private String noExitUploadFile;
/**
* 累计入场
*/
private Long einNumHis;
/**
* 累计考勤
*/
private Long attNumHis;
/**
* 申请补卡次数
*/
private Long repairPersonNum;
/**
* 累计补卡次数
*/
private Long repairNumHis;
/**
* 累计工资总数
*/
private Double salaryMoneyNum;
/**
* 工资册数量
*/
private Double payrollNum;
/**
* 发放工资人次
*/
private Double payrollWorkerTime;
}

View File

@ -0,0 +1,27 @@
package com.bonus.bmw.mapper;
import com.bonus.bmw.domain.po.HomePagePo;
import com.bonus.bmw.domain.vo.HomePageSubProVo;
import com.bonus.bmw.domain.vo.ProStatisticsPo;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface ProStatisticsMapper {
List<HomePageSubProVo> getProStatisticsTable(HomePagePo o);
ProStatisticsPo getEinNumByHis(HomePagePo o);
ProStatisticsPo getEinWorkerLight(HomePagePo o);
ProStatisticsPo getWorkerAttAndRepair(HomePagePo o);
int getProRepairNum(HomePagePo o);
ProStatisticsPo getWorkerWage(HomePagePo o);
int getWorkerSalaryNum(HomePagePo o);
}

View File

@ -0,0 +1,24 @@
package com.bonus.bmw.service;
import com.bonus.bmw.domain.po.HomePagePo;
import com.bonus.bmw.domain.vo.HomePageSubProVo;
import com.bonus.common.core.web.domain.AjaxResult;
import java.util.List;
public interface ProStatisticsService {
/**
* 获取工程统计
* @param o
* @return
*/
List<HomePageSubProVo> getProStatisticsTable(HomePagePo o);
/**
* 获取工程数据概览
* @param o
* @return
*/
AjaxResult getProDataOverview(HomePagePo o);
}

View File

@ -0,0 +1,100 @@
package com.bonus.bmw.service.impl;
import com.bonus.bmw.domain.po.HomePagePo;
import com.bonus.bmw.domain.vo.HomePageSubProVo;
import com.bonus.bmw.domain.vo.ProStatisticsPo;
import com.bonus.bmw.mapper.ProStatisticsMapper;
import com.bonus.bmw.service.ProStatisticsService;
import com.bonus.common.core.web.domain.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class ProStatisticsServiceImpl implements ProStatisticsService {
@Autowired
private ProStatisticsMapper mapper;
@Override
public List<HomePageSubProVo> getProStatisticsTable(HomePagePo o) {
return mapper.getProStatisticsTable(o);
}
@Override
public AjaxResult getProDataOverview(HomePagePo o) {
Map<String,Object> map = new HashMap<>();
List<HomePageSubProVo> list = mapper.getProStatisticsTable(o);
if(list != null && !list.isEmpty()){
map.put("subNum",list.get(0).getSubNum());
map.put("teamNum",list.get(0).getTeamNum());
map.put("einNum",list.get(0).getEinNum());
}else{
map.put("subNum",0);
map.put("teamNum",0);
map.put("einNum",0);
}
//累计入场
ProStatisticsPo einNum = mapper.getEinNumByHis(o);
if(einNum != null){
map.put("einNumHis",einNum.getEinNumHis());
map.put("exitNum",einNum.getEinNumHis() - Long.parseLong((String) map.get("einNum")) );
map.put("einTime",einNum.getEinTime());
map.put("exitTime",einNum.getExitTime());
map.put("exitUploadFile",einNum.getExitUploadFile());
map.put("noExitUploadFile",einNum.getNoExitUploadFile());
}else{
map.put("einNumHis",0);
map.put("exitNum",0);
map.put("einTime","");
map.put("exitTime","");
map.put("exitUploadFile",0);
map.put("noExitUploadFile",0);
}
//在场灯状态
ProStatisticsPo lightStatus = mapper.getEinWorkerLight(o);
if(lightStatus != null){
map.put("yellowNum",lightStatus.getYellowNum());
map.put("greenNum",lightStatus.getGreenNum());
map.put("yellowThanSevenDayNum",lightStatus.getYellowThanSevenDayNum());
}else{
map.put("yellowNum",0);
map.put("greenNum",0);
map.put("yellowThanSevenDayNum",0);
}
//考勤
ProStatisticsPo attAndRepair = mapper.getWorkerAttAndRepair(o);
if(attAndRepair != null){
map.put("attNumHis",attAndRepair.getAttNumHis());
map.put("repairPersonNum",attAndRepair.getRepairPersonNum());
map.put("repairNumHis",attAndRepair.getRepairNumHis());
}else{
map.put("attNumHis",0);
map.put("repairPersonNum",0);
map.put("repairNumHis",0);
}
//申请补卡次数
int proRepairNum = mapper.getProRepairNum(o);
map.put("proRepairNum",proRepairNum);
//工资
ProStatisticsPo workerWage = mapper.getWorkerWage(o);
if(workerWage != null){
map.put("salaryMoneyNum",workerWage.getSalaryMoneyNum());
map.put("payrollNum",workerWage.getPayrollNum());
map.put("payrollWorkerTime",workerWage.getPayrollWorkerTime());
}else{
map.put("salaryMoneyNum",0);
map.put("payrollNum",0);
map.put("payrollWorkerTime",0);
}
//发放工资人数
int workerSalaryNum = mapper.getWorkerSalaryNum(o);
map.put("workerSalaryNum",workerSalaryNum);
return AjaxResult.success(map);
}
}

View File

@ -0,0 +1,123 @@
<?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.bonus.bmw.mapper.ProStatisticsMapper">
<resultMap id="BaseResultMap" type="com.bonus.bmw.domain.vo.HomePageVo">
<result column="mainProNum" property="mainProNum" />
<result column="proNum" property="proNum" />
<result column="yellowNum" property="yellowNum"/>
<result column="yellowThanSevenDayNum" property="yellowThanSevenDayNum"/>
</resultMap>
<select id="getProStatisticsTable" resultType="com.bonus.bmw.domain.vo.HomePageSubProVo">
SELECT
pp.id AS pro_id,
pp.pro_name,
psc.sub_company_name,
pp.pro_type,
pp.vol_level,
pp.pro_status,
pp.pro_address,
count(DISTINCT ps.id) AS subNum,
count(DISTINCT psc.id) AS teamNum,
count(DISTINCT bwem.worker_id) AS einNum
FROM
pm_project pp
LEFT JOIN pm_sub_company psc ON pp.sub_com_id = psc.id
LEFT JOIN bm_worker_ein_msg bwem ON pp.id = bwem.pro_id
AND bwem.is_active = 1
LEFT JOIN bm_sub_contract bsc ON pp.id = bsc.pro_id
AND bsc.is_active = 1
AND bsc.sub_ein_status = 1
LEFT JOIN pm_sub ps ON ps.id = bsc.sub_id
AND bsc.is_active = 1
LEFT JOIN pm_sub_team_contract pstc ON pp.id = pstc.pro_id
AND pstc.is_active = 1
AND pstc.team_ein_status = 1
LEFT JOIN pm_sub_team pst ON pst.id = pstc.team_id
AND pst.is_active = 1
WHERE
pp.is_active = 1
<if test="proName != null">
AND locate(#{proName},pp.pro_name)
</if>
<if test="proStatus != null">
AND pp.pro_status = #{proStatus}
</if>
<if test="proId != null">
AND pp.id = #{proId}
</if>
GROUP BY
pp.id
</select>
<select id="getEinNumByHis" resultType="com.bonus.bmw.domain.vo.ProStatisticsPo">
SELECT
count(DISTINCT pp.worker_id) AS einNumHis,
min(pp.ein_time) as einTime,
max(pp.exit_time) as exitTime,
sum(if(ein_status=2 and is_upload_file = 1,1,0)) as exitUploadFile,
sum(if(ein_status=2 and is_upload_file = 0,1,0)) as noExitUploadFile
FROM
bm_worker_ein_pro_record pp
where
pp.pro_id = #{proId}
</select>
<select id="getEinWorkerLight" resultType="com.bonus.bmw.domain.vo.ProStatisticsPo">
SELECT
sum(if(light_status=1,1,0)) as yellowNum,
sum(if(light_status=2,1,0)) as greenNum,
COUNT(DISTINCT IF(light_status = 1 AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) > IF(yellow_date is null, CURRENT_DATE, yellow_date), worker_id, null)) as yellowThanSevenDayNum
FROM
bm_worker_ein_msg pp
where
pp.pro_id = #{proId}
</select>
<select id="getWorkerAttAndRepair" resultType="com.bonus.bmw.domain.vo.ProStatisticsPo">
SELECT
count(pp.worker_id) AS attNumHis,
count(DISTINCT if(pp.is_repair = 1,pp.worker_id,null)) AS repairPersonNum,
sum(if(pp.is_repair = 1,1,0)) AS repairNumHis
FROM
bm_att_person pp
WHERE
pp.pro_id = #{proId}
</select>
<select id="getProRepairNum" resultType="int">
SELECT
count(pp.id) AS proRepairNum
FROM
bm_repair_card_apply pp
WHERE
pp.pro_id = #{proId} and pp.check_status = 1
</select>
<select id="getWorkerWage" resultType="com.bonus.bmw.domain.vo.ProStatisticsPo">
SELECT
sum(pp.net_salary) AS salaryMoneyNum,
sum(pp.id) AS payrollNum,
sum(pp.pay_num) AS payrollWorkerTime
FROM
tb_pro_month_table pp
WHERE
pp.pro_id = #{proId}
</select>
<select id="getWorkerSalaryNum" resultType="int">
SELECT
count(distinct pp.user_id) AS workerSalaryNum
FROM
tb_pro_month_table_roster pp
WHERE
pp.pro_id = #{proId}
</select>
</mapper>