zss
2024-04-17 ad5fa78540fdd7b5470072e0ead2b650afdca2fd
统计报表-->每日业务统计
已修改6个文件
已添加3个文件
233 ■■■■■ 文件已修改
cnas-server/src/main/java/com/yuanchu/mom/mapper/DepartmentMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/java/com/yuanchu/mom/service/impl/DepartmentServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/resources/mapper/DepartmentMapper.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/yuanchu/mom/controller/ReportController.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/yuanchu/mom/dto/CostStatisticsDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/yuanchu/mom/service/ReportService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/yuanchu/mom/service/impl/ReportServiceImpl.java 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsOrderMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/mom/service/impl/UserServiceImp.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-server/src/main/java/com/yuanchu/mom/mapper/DepartmentMapper.java
@@ -26,7 +26,7 @@
    List<Department> selectDepartment();
    //根据选择的树展示相关的人员
    IPage<UserDto> showUserById(@Param("page") IPage<UserDto> page, @Param("ids") String ids, @Param("ew") QueryWrapper<UserDto> ew);
    IPage<UserDto> showUserById(@Param("page") IPage<UserDto> page, @Param("ids") List<String> ids, @Param("ew") QueryWrapper<UserDto> ew);
    //根据部门id,查询他的所有子类id
    List<Integer> selectSonById(Integer id);
cnas-server/src/main/java/com/yuanchu/mom/service/impl/DepartmentServiceImpl.java
@@ -15,6 +15,7 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yuanchu.mom.utils.QueryWrappers;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import lombok.var;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -40,6 +41,7 @@
@Service
@AllArgsConstructor
@Transactional(rollbackFor = Exception.class)
@Slf4j
public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Department> implements DepartmentService {
    DepartmentMapper departmentMapper;
@@ -90,9 +92,11 @@
    public Map<String, Object> showUserById(Page page, UserDto user) {
        //根据部门id,查询他的所有子类id
        List<Integer> list = departmentMapper.selectSonById(Integer.parseInt(user.getDepartId()));
        String ids = list.stream()
        List<String> ids = list.stream()
                .map(Object::toString)
                .collect(Collectors.joining(","));
                //.collect(Collectors.joining(","));
                .collect(Collectors.toList());
        log.info(ids+"\n");
        Map<String, Object> map = new HashMap<>();
        map.put("head", PrintChina.printChina(UserDto.class));
        map.put("body", departmentMapper.showUserById(page, ids, QueryWrappers.queryWrappers(user)));
cnas-server/src/main/resources/mapper/DepartmentMapper.xml
@@ -18,7 +18,10 @@
    </select>
    <select id="showUserById" resultType="com.yuanchu.mom.dto.UserDto">
        select * from (select id, name, age, email, phone,depart_id
        from user where FIND_IN_SET( SUBSTRING_INDEX(depart_id, ',', -1) ,#{ids}) > 0 ) a
        from user where state=1 and SUBSTRING_INDEX(depart_id, ',', -1) in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach> ) a
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
@@ -34,6 +37,7 @@
                     JOIN DepartmentHierarchy dh ON d.father_id = dh.id
        )
        SELECT id
        FROM DepartmentHierarchy;
        FROM DepartmentHierarchy
        order by id desc;
    </select>
</mapper>
inspect-server/src/main/java/com/yuanchu/mom/controller/ReportController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.yuanchu.mom.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.mom.dto.SampleOrderDto;
import com.yuanchu.mom.service.ReportService;
import com.yuanchu.mom.utils.JackSonUtil;
import com.yuanchu.mom.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RestController
@AllArgsConstructor
@RequestMapping("/report")
@Api("报表模块")
public class ReportController {
    private ReportService reportService;
    @ApiOperation(value = "每日业务统计")
    @GetMapping("/businessStatisticsByDay")
    public Result businessStatisticsByDay(){
        return Result.success(reportService.businessStatisticsByDay());
    }
    @ApiOperation(value = "检测项目统计")
    @GetMapping("/testProductByDay")
    public Result testProductByDay(){
        return Result.success(reportService.testProductByDay());
    }
}
inspect-server/src/main/java/com/yuanchu/mom/dto/CostStatisticsDto.java
@@ -44,6 +44,8 @@
    private Integer insSampleId;
    private Double cost;//工时
    public Integer getNum() {
        return num = 1;
    }
inspect-server/src/main/java/com/yuanchu/mom/service/ReportService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.yuanchu.mom.service;
import java.util.Map;
public interface ReportService {
    //每日业务统计
    Map<String,Object> businessStatisticsByDay();
    //检测项目统计
    Map<String,Object> testProductByDay();
}
inspect-server/src/main/java/com/yuanchu/mom/service/impl/ReportServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,160 @@
package com.yuanchu.mom.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.mom.dto.CostStatisticsDto;
import com.yuanchu.mom.mapper.InsOrderMapper;
import com.yuanchu.mom.mapper.InsProductMapper;
import com.yuanchu.mom.mapper.InsProductUserMapper;
import com.yuanchu.mom.pojo.InsOrder;
import com.yuanchu.mom.pojo.InsProduct;
import com.yuanchu.mom.pojo.InsProductUser;
import com.yuanchu.mom.service.ReportService;
import com.yuanchu.mom.utils.QueryWrappers;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
@AllArgsConstructor
public class ReportServiceImpl implements ReportService {
    private InsOrderMapper insOrderMapper;
    private InsProductUserMapper insProductUserMapper;
    private InsProductMapper insProductMapper;
    //每日业务统计
    @Override
    public Map<String, Object> businessStatisticsByDay() {
        Map<String, Object> map = new HashMap<>();
        /*任务接收*/
        //今日任务接收
        Long receive = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery().eq(InsOrder::getState, 1).apply("DATE(create_time) = CURDATE()"));
        map.put("RECEIVE", receive);
        //昨日任务接收
        Long received = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery().eq(InsOrder::getState, 1).apply("DATE(create_time) = CURDATE() - INTERVAL 1 DAY"));
        received = received == 0 ? 1 : received;
        //比例=(今天-昨天)/昨天
        BigDecimal ratio = new BigDecimal(receive - received).divide(new BigDecimal(received), 2, BigDecimal.ROUND_HALF_UP);
        map.put("RECEIVE_RATIO", ratio);
        /*任务已完成*/
        //今日任务完成
        Long finishe = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery().eq(InsOrder::getState, 4).apply("DATE(create_time) = CURDATE()"));
        map.put("FINISHE", finishe);
        //昨日任务完成
        Long finished = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery().eq(InsOrder::getState, 4).apply("DATE(create_time) = CURDATE() - INTERVAL 1 DAY"));
        finished = finished == 0 ? 1 : finished;
        //任务完成比例=(今天-昨天)/昨天
        BigDecimal finishedRatio = new BigDecimal(finishe - finished).divide(new BigDecimal(finished), 2, BigDecimal.ROUND_HALF_UP);
        map.put("FINISHE_RATIO", finishedRatio);
        /*任务剩余*/
        //今日任务剩余
        long surplus = receive - finishe;
        map.put("SURPLUS", surplus);
        //昨日任务剩余
        long surplused = received - finished;
        surplused = surplused == 0 ? 1 : surplused;
        //剩余比例=(今天-昨天)/昨天
        BigDecimal surplusRatio = new BigDecimal(surplus - surplused).divide(new BigDecimal(surplused), 2, BigDecimal.ROUND_HALF_UP);
        map.put("SURPLUS_RATIO", surplusRatio);
        /*检测费用*/
        //今日检测费用
        QueryWrapper<CostStatisticsDto> costStatisticsDtoQueryWrappers = new QueryWrapper<>();
        costStatisticsDtoQueryWrappers.eq("create_time", LocalDateTime.now());
        IPage<CostStatisticsDto> page = new Page<>();
        page.setSize(-1);
        page.setCurrent(-1);
        IPage<CostStatisticsDto> iPage = insOrderMapper.selectCostStatistics(page, costStatisticsDtoQueryWrappers);
        BigDecimal price = BigDecimal.ZERO;
        for (CostStatisticsDto record : iPage.getRecords()) {
            price.add(record.getPrice());
        }
        map.put("PRICE", price);
        //昨日检测费用
        QueryWrapper<CostStatisticsDto> costWrappers = new QueryWrapper<>();
        costWrappers.eq("create_time", LocalDateTime.now().minusDays(1));
        IPage<CostStatisticsDto> dtoIPage = insOrderMapper.selectCostStatistics(page, costWrappers);
        BigDecimal priced = BigDecimal.ZERO;
        for (CostStatisticsDto record : dtoIPage.getRecords()) {
            priced.add(record.getPrice());
        }
        priced = priced.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ONE : priced;
        //比例=(今日-昨日)/昨日
        BigDecimal priceRatio = (price.subtract(priced)).divide(priced, 2, BigDecimal.ROUND_HALF_UP);
        map.put("PRICE_RATIO", priceRatio);
        /*检测工时*/
        //今日检测工时
        Double cost = 0.0;
        for (CostStatisticsDto record : iPage.getRecords()) {
            cost += record.getCost();
        }
        map.put("COST", cost);
        //昨日检测工时
        Double costed = 0.0;
        for (CostStatisticsDto record : dtoIPage.getRecords()) {
            costed += record.getCost();
        }
        costed = costed == 0 ? 1 : costed;
        //比例=(今日-昨日)/昨日
        BigDecimal costRatio = new BigDecimal(cost - costed).divide(new BigDecimal(costed), 2, BigDecimal.ROUND_HALF_UP);
        map.put("COST_RATIO", costRatio);
        /*检测人员*/
        //今日检测人员
        Long person = insProductUserMapper.selectCount(Wrappers.<InsProductUser>lambdaQuery().apply("DATE(create_time) = CURDATE()"));
        map.put("PERSON", person);
        //昨日检测人员
        Long persons = insProductUserMapper.selectCount(Wrappers.<InsProductUser>lambdaQuery().apply("DATE(create_time) = CURDATE() - INTERVAL 1 DAY"));
        persons = persons == 0 ? 1 : persons;
        //比例=(今天-昨天)/昨天
        BigDecimal personRatio = new BigDecimal(person - persons).divide(new BigDecimal(persons), 2, BigDecimal.ROUND_HALF_UP);
        map.put("PERSON_RATIO", personRatio);
        /*近十日任务接收量与完成量*/
        //获取近十日的横坐标
        LocalDate currentDate = LocalDate.now();
        List<LocalDate> lastTenDays = new ArrayList<>();
        List<Long> receTenDays = new ArrayList<>();
        List<Long> finTenDays = new ArrayList<>();
        for (int i = 9; i > -1; i--) {
            lastTenDays.add(currentDate.minusDays(i));
            receTenDays.add(insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery().eq(InsOrder::getState, 1).apply("DATE(create_time) = CURDATE() - INTERVAL " + i + " DAY")));
            finTenDays.add(insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery().eq(InsOrder::getState, 4).apply("DATE(create_time) = CURDATE() - INTERVAL " + i + " DAY")));
        }
        map.put("DAYS", lastTenDays);
        map.put("RECETENDAYS", receTenDays);
        map.put("FINISHTENDAYS", finTenDays);
        return map;
    }
    //检测项目统计
    @Override
    public Map<String, Object> testProductByDay() {
        Map<String, Object> map = new HashMap<>();
        /*项目接收*/
        //今日项目接收量
        Long receive = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery().eq(InsProduct::getState, 1).apply("DATE(create_time) = CURDATE()"));
        /*项目完成*/
        /*项目剩余*/
        /*今日项目合格率*/
        /*今日项目完成率*/
        /*今日项目延期率*/
        /*近十日的项目接收量与完成量*/
        return map;
    }
}
inspect-server/src/main/resources/mapper/InsOrderMapper.xml
@@ -125,6 +125,7 @@
        isa.sample,
        isa.model,
        c.price,
        c.cost,
        c.inspection_item,
        u.company,
        u.`name`,
@@ -134,7 +135,7 @@
        ins_order i
        LEFT JOIN ins_sample isa ON isa.ins_order_id = i.id
        LEFT JOIN `user` u ON u.id = i.user_id
        LEFT JOIN (select SUM(b.price) price,b.ins_sample_id,GROUP_CONCAT(b.inspection_item SEPARATOR ',')
        LEFT JOIN (select SUM(b.price) price, sum(b.man_hour) cost,b.ins_sample_id,GROUP_CONCAT(b.inspection_item SEPARATOR ',')
        inspection_item from (select * from ins_product where state = 1 GROUP BY ins_sample_id,man_hour_group) b GROUP
        BY b.ins_sample_id) c ON c.ins_sample_id = isa.id
        ) a
user-server/src/main/java/com/yuanchu/mom/service/impl/UserServiceImp.java
@@ -70,11 +70,13 @@
    @Override
    public int updateUser(User user) {
        user.setDepartId("1,"+user.getDepartId());
        return userMapper.updateById(user);
    }
    @Override
    public int addUser(User user) {
        user.setDepartId("1,"+user.getDepartId());
        return userMapper.insert(user);
    }