chenrui
2025-03-03 c1df30be108a9f4bd443c9034e0d93657870fcde
代码迁移bug解决
已修改9个文件
已添加6个文件
1299 ■■■■■ 文件已修改
basic-server/src/main/java/com/ruoyi/basic/controller/CapacityScopeController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordCancelController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCancelServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/controller/DataAnalysisController.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/DataAnalysisDto.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/DataAnalysisMapper.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/DataAnalysisService.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/DataAnalysisServiceImpl.java 613 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/DataAnalysisMapper.xml 315 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryWorkingHoursController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryWorkingHoursMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryWorkingHoursServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/resources/mapper/AuxiliaryWorkingHoursMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/User.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/controller/CapacityScopeController.java
@@ -359,7 +359,7 @@
                    buffer.append("]");
                    str.setRadiusList(buffer.toString());
                }
                // æ”¶è´¹æ ‡å‡†
                //收费标准
                if (list1.get(26) == null) {
                    str.setRates(null);
                } else {
cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordCancelController.java
@@ -79,9 +79,10 @@
    @ApiOperation(value = "导入作废文件销毁记录")
    @PostMapping("/exportInManageRecordCancel")
    public Result exportInManageRecordCancel(MultipartFile file){
        return Result.success(manageRecordCancelService.exportInManageRecordCancel(file));
        try {
            return Result.success(manageRecordCancelService.exportInManageRecordCancel(file));
        }catch (Exception e){
            return Result.fail(e.getMessage());
        }
    }
}
cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCancelServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.UUID;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -471,6 +472,9 @@
                    }
                }
            }
            if(CollectionUtils.isEmpty(manageRecordCancelList)){
                throw new RuntimeException("导入模板有误");
            }
            saveOrUpdateBatch(manageRecordCancelList);
        } catch (IOException e) {
            e.printStackTrace();
inspect-server/src/main/java/com/ruoyi/inspect/controller/DataAnalysisController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,127 @@
package com.ruoyi.inspect.controller;
import com.ruoyi.basic.dto.IfsInventoryQuantitySupplierDto;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.inspect.dto.DataAnalysisDto;
import com.ruoyi.inspect.service.DataAnalysisService;
import com.ruoyi.inspect.vo.DeviationAnalyzeVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * @Author zhuo
 * @Date 2024/10/16
 */
@RequestMapping("/dataAnalysis")
@RestController
@AllArgsConstructor
@Api(tags = "数据分析")
public class DataAnalysisController {
    private DataAnalysisService dataAnalysisService;
    /**
     * æŸ¥è¯¢åŽŸææ–™æŸ±çŠ¶ç»Ÿè®¡
     * @param dataAnalysisDto
     * @return
     */
    @ApiOperation(value = "查询原材料柱状统计")
    @GetMapping("/getRawPassRateByBarChart")
    public Result getRawPassRateByBarChart(DataAnalysisDto dataAnalysisDto) {
        return Result.success(dataAnalysisService.getRawPassRateByBarChart(dataAnalysisDto));
    }
    /**
     * æŸ¥è¯¢åŽŸææ–™æŸ±çŠ¶ç»Ÿè®¡
     * @param dataAnalysisDto
     * @return
     */
    @ApiOperation(value = "查询原材料合格率饼状态")
    @GetMapping("/getRawPassRateByCake")
    public Result getRawPassRateByCake(DataAnalysisDto dataAnalysisDto) {
        return Result.success(dataAnalysisService.getRawPassRateByCake(dataAnalysisDto));
    }
    /**
     * æŸ¥è¯¢åŽŸææ–™é¡¹
     * @param dataAnalysisDto
     * @return
     */
    @ApiOperation(value = "查询原材料项")
    @GetMapping("/getRawItemNames")
    public Result getRawItemNames(DataAnalysisDto dataAnalysisDto) {
        return Result.success(dataAnalysisService.getRawItemNames(dataAnalysisDto));
    }
    /**
     * æŸ¥è¯¢åŽŸææ–™é¡¹æ£€åˆ†æž
     * @param dataAnalysisDto
     * @return
     */
    @ApiOperation(value = "查询原材料项检分析")
    @PostMapping("/getRawProductAnalysis")
    public Result getRawProductAnalysis(@RequestBody DataAnalysisDto dataAnalysisDto) {
        return Result.success(dataAnalysisService.getRawProductAnalysis(dataAnalysisDto));
    }
    /**
     * æŸ¥è¯¢åŽŸææ–™é¡¹æ£€åˆ†æžåˆ—è¡¨
     * @param dataAnalysisDto
     * @return
     */
    @ApiOperation(value = "查询原材料项检分析列表")
    @PostMapping("/getRawProductAnalysisAllList")
    public Result<List<IfsInventoryQuantitySupplierDto>> getRawProductAnalysisAllList(@RequestBody DataAnalysisDto dataAnalysisDto) {
        return Result.success(dataAnalysisService.getRawProductAnalysisAllList(dataAnalysisDto));
    }
    /**
     * æŸ¥è¯¢åŽŸææ–™é¡¹æ£€åˆ†æžåˆ—è¡¨
     * @param dataAnalysisDto
     * @return
     */
    @ApiOperation(value = "查询原材料项检分析合格率")
    @PostMapping("/getRawProductAnalysisRawPass")
    public Result getRawProductAnalysisRawPass(@RequestBody DataAnalysisDto dataAnalysisDto) {
        return Result.success(dataAnalysisService.getRawProductAnalysisRawPass(dataAnalysisDto));
    }
    /**
     * æŸ¥è¯¢åŽŸææ–™é¡¹æ£€å’ŒåŽ‚å®¶æ•°æ®å¯¹æ¯”
     * @param dataAnalysisDto
     * @return
     */
    @ApiOperation(value = "查询原材料项检和厂家数据对比")
    @PostMapping("/getRawSupplierCompare")
    public Result<DeviationAnalyzeVo> getRawSupplierCompare(@RequestBody DataAnalysisDto dataAnalysisDto) {
        return Result.success(dataAnalysisService.getRawSupplierCompare(dataAnalysisDto));
    }
    /**
     * æŸ¥è¯¢æœ¬æœˆä¸Žä¸Šä¸ªæœˆåˆæ ¼çŽ‡å¯¹æ¯”
     * @param dataAnalysisDto
     * @return
     */
    @ApiOperation(value = "查询本月与上个月合格率对比")
    @GetMapping("/getRawUpMonth")
    public Result getRawUpMonth(DataAnalysisDto dataAnalysisDto) {
        return Result.success(dataAnalysisService.getRawUpMonth(dataAnalysisDto));
    }
    /**
     * æŸ¥è¯¢æ£€éªŒé¡¹ç±»åž‹é¥¼å›¾
     * @param dataAnalysisDto
     * @return
     */
    @ApiOperation(value = "查询检验项类型饼图")
    @GetMapping("/getOrderTypeCookie")
    public Result getOrderTypeCookie(DataAnalysisDto dataAnalysisDto) {
        return Result.success(dataAnalysisService.getOrderTypeCookie(dataAnalysisDto));
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/DataAnalysisDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.ruoyi.inspect.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * @Author zhuo
 * @Date 2024/10/16
 */
@Data
public class DataAnalysisDto {
    @ApiModelProperty("时间类型, 1:本周, 2:本月, 3:本年")
    private String dateType;
    @ApiModelProperty("检测类型, 1:进厂检验, 2:季度检验")
    private String orderType;
    @ApiModelProperty("开始时间")
    private String beginDate;
    @ApiModelProperty("结束时间")
    private String endDate;
    @ApiModelProperty("样品名称")
    private String sampleName;
    @ApiModelProperty("型号")
    private String modelName;
    @ApiModelProperty("供应商名称")
    private String supplierName;
    @ApiModelProperty("分组类型, 0: é»˜è®¤æŒ‰ç…§æ ·å“åŒºåˆ† 1: åŒä¸€åނ家, åŒä¸€åž‹å·, ä¸åŒæ‰¹æ¬¡, 2 : åŒä¸€åž‹å·, ä¸åŒåނ家")
    private String groupType;
    @ApiModelProperty("选择的检验项名称")
    private List<String> itemNames;
    @ApiModelProperty("订单id")
    private List<Integer> orderIds;
    @ApiModelProperty("厂家数据")
    private List<String> supplierDataList;
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/DataAnalysisMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
package com.ruoyi.inspect.mapper;
import com.ruoyi.basic.dto.IfsInventoryQuantitySupplierDto;
import com.ruoyi.inspect.dto.DataAnalysisDto;
import com.ruoyi.inspect.vo.RawMaterialSupplierVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
 * æ•°æ®åˆ†æž
 *
 * @Author zhuo
 * @Date 2024/10/16
 */
@Mapper
public interface DataAnalysisMapper {
    /**
     * èŽ·å–æœ¬å‘¨çš„åŽŸææ–™ä¿¡æ¯
     * @return
     */
    List<Map<String, Object>> getRawPassRateByBarChartByWeek(@Param("dto") DataAnalysisDto dataAnalysisDto);
    /**
     * èŽ·å–æœ¬æœˆçš„åŽŸææ–™ä¿¡æ¯
     * @return
     */
    List<Map<String, Object>> getRawPassRateByBarChartByDay(@Param("dto") DataAnalysisDto dataAnalysisDto);
    /**
     * èŽ·å–æœ¬å¹´çš„åŽŸææ–™ä¿¡æ¯
     * @return
     */
    List<Map<String, Object>> getRawPassRateByBarChartByYear(@Param("dto") DataAnalysisDto dataAnalysisDtor);
    /**
     * æŸ¥çœ‹åŽŸææ–™é¥¼çŠ¶å›¾
     * @return
     */
    Map<String, Object> getRawPassRateByCake(@Param("dto") DataAnalysisDto dataAnalysisDto);
    /**
     * æŸ¥è¯¢æ£€æµ‹é¡¹é›†åˆ
     * @param dataAnalysisDto
     * @return
     */
    List<IfsInventoryQuantitySupplierDto> getRawProductAnalysisAllSample(@Param("dto") DataAnalysisDto dataAnalysisDto);
    /**
     * æŸ¥è¯¢æ‰€æœ‰çš„
     * @param dataAnalysisDto
     * @return
     */
    List<IfsInventoryQuantitySupplierDto> getRawProductAnalysisList(@Param("dto") DataAnalysisDto dataAnalysisDto);
    List<RawMaterialSupplierVo> getItemValueByOrderIds(@Param("insOrderIds") List<Integer> insOrderIds, @Param("itemName") String itemName);
    /**
     * æŸ¥è¯¢æœ¬æœˆä¸Žä¸Šæœˆåˆæ ¼çŽ‡å¯¹æ¯”
     * @return
     */
    List<Map<String, Object>> getRawUpMonth();
    /**
     * æŸ¥è¯¢æ£€éªŒé¡¹ç±»åž‹é¥¼å›¾
     * @return
     */
    Map<String, Object> getOrderTypeCookie();
}
inspect-server/src/main/java/com/ruoyi/inspect/service/DataAnalysisService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,77 @@
package com.ruoyi.inspect.service;
import com.ruoyi.basic.dto.IfsInventoryQuantitySupplierDto;
import com.ruoyi.inspect.dto.DataAnalysisDto;
import com.ruoyi.inspect.vo.DeviationAnalyzeVo;
import com.ruoyi.inspect.vo.RawProductAnalysisVo;
import java.util.List;
import java.util.Map;
/**
 * æ•°æ®åˆ†æž
 *
 * @Author zhuo
 * @Date 2024/10/16
 */
public interface DataAnalysisService {
    /**
     * æŸ¥è¯¢åŽŸææ–™æŸ±çŠ¶ç»Ÿè®¡
     * @return
     */
    List<Map<String, Object>> getRawPassRateByBarChart(DataAnalysisDto dataAnalysisDto);
    /**
     * æŸ¥è¯¢åŽŸææ–™åˆæ ¼çŽ‡é¥¼çŠ¶å›¾
     * @param dataAnalysisDto
     * @return
     */
    Map<String, Object> getRawPassRateByCake(DataAnalysisDto dataAnalysisDto);
    /**
     * æŸ¥è¯¢æ£€éªŒé¡¹åç§°
     * @param dataAnalysisDto
     * @return
     */
    List<String> getRawItemNames(DataAnalysisDto dataAnalysisDto);
    /**
     * æŸ¥è¯¢åŽŸææ–™é¡¹æ£€åˆ†æž
     * @param dataAnalysisDto
     * @return
     */
    RawProductAnalysisVo getRawProductAnalysis(DataAnalysisDto dataAnalysisDto);
    /**
     * æŸ¥è¯¢æ£€æµ‹é¡¹åˆ†æžåˆ—表
     * @param dataAnalysisDto
     * @return
     */
    List<IfsInventoryQuantitySupplierDto> getRawProductAnalysisAllList(DataAnalysisDto dataAnalysisDto);
    /**
     * æŸ¥è¯¢åŽŸææ–™é¡¹æ£€åˆ†æžåˆæ ¼çŽ‡
     * @param dataAnalysisDto
     * @return
     */
    RawProductAnalysisVo getRawProductAnalysisRawPass(DataAnalysisDto dataAnalysisDto);
    /**
     * æŸ¥è¯¢åŽŸææ–™é¡¹æ£€å’ŒåŽ‚å®¶æ•°æ®å¯¹æ¯”
     * @param dataAnalysisDto
     * @return
     */
    DeviationAnalyzeVo getRawSupplierCompare(DataAnalysisDto dataAnalysisDto);
    /**
     * æŸ¥è¯¢æœ¬æœˆä¸Žä¸Šæœˆåˆæ ¼çŽ‡å¯¹æ¯”
     * @param dataAnalysisDto
     * @return
     */
    List<Map<String, Object>> getRawUpMonth(DataAnalysisDto dataAnalysisDto);
    Map<String, Object> getOrderTypeCookie(DataAnalysisDto dataAnalysisDto);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/DataAnalysisServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,613 @@
package com.ruoyi.inspect.service.impl;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.ruoyi.basic.dto.IfsInventoryQuantitySupplierDto;
import com.ruoyi.common.constant.InsOrderTypeConstants;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.dto.DataAnalysisDto;
import com.ruoyi.inspect.dto.SampleProductRawAnalysisDto;
import com.ruoyi.inspect.mapper.DataAnalysisMapper;
import com.ruoyi.inspect.mapper.InsProductMapper;
import com.ruoyi.inspect.service.DataAnalysisService;
import com.ruoyi.inspect.vo.DeviationAnalyzeVo;
import com.ruoyi.inspect.vo.RawMaterialSupplierVo;
import com.ruoyi.inspect.vo.RawProductAnalysisVo;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * æ•°æ®åˆ†æž
 *
 * @Author zhuo
 * @Date 2024/10/16
 */
@Service
@AllArgsConstructor
public class DataAnalysisServiceImpl implements DataAnalysisService {
    private DataAnalysisMapper dataAnalysisMapper;
    private InsProductMapper insProductMapper;
    /**
     * æŸ¥è¯¢åŽŸææ–™æŸ±çŠ¶ç»Ÿè®¡
     * @return searchTime  æ—¶é—´
     * @return passRate  åˆæ ¼çއ
     * @return sum  æ€»æ•°
     */
    @Override
    public List<Map<String, Object>> getRawPassRateByBarChart(DataAnalysisDto dataAnalysisDto) {
        // æ ¼å¼åŒ–字段, é¿å…æŠ¥é”™
        this.formatDataAnalysisDto(dataAnalysisDto);
        // èŽ·å–å½“å‰æ—¥æœŸ
        DateTime now = DateUtil.date();
        if (StrUtil.isNotBlank(dataAnalysisDto.getBeginDate()) && StrUtil.isNotBlank(dataAnalysisDto.getEndDate())) {
            return dataAnalysisMapper.getRawPassRateByBarChartByDay(dataAnalysisDto);
        } else if (dataAnalysisDto.getDateType().equals("1")) {
            // èŽ·å–æœ¬å‘¨çš„å¼€å§‹æ—¶é—´ï¼ˆå‘¨ä¸€ 00:00:00)
            DateTime beginOfWeek = DateUtil.beginOfWeek(now);
            // èŽ·å–æœ¬å‘¨çš„ç»“æŸæ—¶é—´ï¼ˆå‘¨æ—¥ 23:59:59)
            // èŽ·å–æœ¬å‘¨çš„ç»“æŸæ—¶é—´ï¼ˆå‘¨æ—¥ 23:59:59)
            DateTime endOfWeek = DateUtil.endOfWeek(now);
            dataAnalysisDto.setBeginDate(DateUtil.format(beginOfWeek, "yyyy-MM-dd HH:mm:ss"));
            dataAnalysisDto.setEndDate(DateUtil.format(endOfWeek, "yyyy-MM-dd HH:mm:ss"));
            return dataAnalysisMapper.getRawPassRateByBarChartByWeek(dataAnalysisDto);
        } else if (dataAnalysisDto.getDateType().equals("2")) {
            // èŽ·å–å½“å‰æœˆçš„å¼€å§‹æ—¶é—´ï¼ˆæ¯æœˆ1号 00:00:00)
            DateTime beginOfMonth = DateUtil.beginOfMonth(now);
            // èŽ·å–å½“å‰æœˆçš„ç»“æŸæ—¶é—´ï¼ˆæœ¬æœˆæœ€åŽä¸€å¤© 23:59:59)
            DateTime endOfMonth = DateUtil.endOfMonth(now);
            dataAnalysisDto.setBeginDate(DateUtil.format(beginOfMonth, "yyyy-MM-dd HH:mm:ss"));
            dataAnalysisDto.setEndDate(DateUtil.format(endOfMonth, "yyyy-MM-dd HH:mm:ss"));
            return dataAnalysisMapper.getRawPassRateByBarChartByDay(dataAnalysisDto);
        } else if (dataAnalysisDto.getDateType().equals("3")) {
            // èŽ·å–å½“å‰å¹´çš„å¼€å§‹æ—¶é—´ï¼ˆæ¯å¹´1月1日 00:00:00)
            DateTime beginOfYear = DateUtil.beginOfYear(now);
            // èŽ·å–å½“å‰å¹´çš„ç»“æŸæ—¶é—´ï¼ˆæ¯å¹´12月31日 23:59:59)
            DateTime endOfYear = DateUtil.endOfYear(now);
            dataAnalysisDto.setBeginDate(DateUtil.format(beginOfYear, "yyyy-MM-dd HH:mm:ss"));
            dataAnalysisDto.setEndDate(DateUtil.format(endOfYear, "yyyy-MM-dd HH:mm:ss"));
            return dataAnalysisMapper.getRawPassRateByBarChartByYear(dataAnalysisDto);
        }
        return null;
    }
    /**
     * æŸ¥è¯¢åŽŸææ–™é¥¼çŠ¶å›¾
     * @param dataAnalysisDto
     * @return
     * sum          : æ€»æ•°
     * unQualified  : ä¸åˆæ ¼æ•°é‡
     * qualified  : åˆæ ¼æ•°é‡
     * passRate  : åˆæ ¼çއ
     */
    @Override
    public Map<String, Object> getRawPassRateByCake(DataAnalysisDto dataAnalysisDto) {
        // æ ¼å¼åŒ–字段, é¿å…æŠ¥é”™
        this.formatDataAnalysisDto(dataAnalysisDto);
        // èŽ·å–å½“å‰æ—¥æœŸ
        DateTime now = DateUtil.date();
        if (StrUtil.isNotBlank(dataAnalysisDto.getBeginDate()) && StrUtil.isNotBlank(dataAnalysisDto.getEndDate())) {
        } else if (dataAnalysisDto.getDateType().equals("1")) {
            // èŽ·å–æœ¬å‘¨çš„å¼€å§‹æ—¶é—´ï¼ˆå‘¨ä¸€ 00:00:00)
            DateTime beginOfWeek = DateUtil.beginOfWeek(now);
            // èŽ·å–æœ¬å‘¨çš„ç»“æŸæ—¶é—´ï¼ˆå‘¨æ—¥ 23:59:59)
            DateTime endOfWeek = DateUtil.endOfWeek(now);
            dataAnalysisDto.setBeginDate(DateUtil.format(beginOfWeek, "yyyy-MM-dd HH:mm:ss"));
            dataAnalysisDto.setEndDate(DateUtil.format(endOfWeek, "yyyy-MM-dd HH:mm:ss"));
        } else if (dataAnalysisDto.getDateType().equals("2")) {
            // èŽ·å–å½“å‰æœˆçš„å¼€å§‹æ—¶é—´ï¼ˆæ¯æœˆ1号 00:00:00)
            DateTime beginOfMonth = DateUtil.beginOfMonth(now);
            // èŽ·å–å½“å‰æœˆçš„ç»“æŸæ—¶é—´ï¼ˆæœ¬æœˆæœ€åŽä¸€å¤© 23:59:59)
            DateTime endOfMonth = DateUtil.endOfMonth(now);
            dataAnalysisDto.setBeginDate(DateUtil.format(beginOfMonth, "yyyy-MM-dd HH:mm:ss"));
            dataAnalysisDto.setEndDate(DateUtil.format(endOfMonth, "yyyy-MM-dd HH:mm:ss"));
        } else if (dataAnalysisDto.getDateType().equals("3")) {
            // èŽ·å–å½“å‰å¹´çš„å¼€å§‹æ—¶é—´ï¼ˆæ¯å¹´1月1日 00:00:00)
            DateTime beginOfYear = DateUtil.beginOfYear(now);
            // èŽ·å–å½“å‰å¹´çš„ç»“æŸæ—¶é—´ï¼ˆæ¯å¹´12月31日 23:59:59)
            DateTime endOfYear = DateUtil.endOfYear(now);
            dataAnalysisDto.setBeginDate(DateUtil.format(beginOfYear, "yyyy-MM-dd HH:mm:ss"));
            dataAnalysisDto.setEndDate(DateUtil.format(endOfYear, "yyyy-MM-dd HH:mm:ss"));
        }
        return dataAnalysisMapper.getRawPassRateByCake(dataAnalysisDto);
    }
    /**
     * æŸ¥è¯¢æ£€éªŒé¡¹åç§°
     * @param dataAnalysisDto
     * @return
     */
    @Override
    public List<String> getRawItemNames(DataAnalysisDto dataAnalysisDto) {
        // æ ¼å¼åŒ–字段, é¿å…æŠ¥é”™
        this.formatDataAnalysisDto(dataAnalysisDto);
        List<IfsInventoryQuantitySupplierDto> analysisList = dataAnalysisMapper.getRawProductAnalysisAllSample(dataAnalysisDto);
        // æ ¹æ®æ ·å“id查询检测参数
        if (CollectionUtils.isEmpty(analysisList)) {
            return null;
        }
        List<Integer> sampleIds = analysisList.stream().map(IfsInventoryQuantitySupplierDto::getSampleId).collect(Collectors.toList());
        // æŸ¥è¯¢æ£€éªŒé¡¹ç›®
        return insProductMapper.selectItemNameBySampleIds(sampleIds);
    }
    /**
     * æŸ¥è¯¢åŽŸææ–™é¡¹æ£€åˆ†æž
     * @param dataAnalysisDto
     * @return
     */
    @Override
    public RawProductAnalysisVo getRawProductAnalysis(DataAnalysisDto dataAnalysisDto) {
        // æ ¼å¼åŒ–字段, é¿å…æŠ¥é”™
        this.formatDataAnalysisDto(dataAnalysisDto);
        List<IfsInventoryQuantitySupplierDto> analysisList = dataAnalysisMapper.getRawProductAnalysisAllSample(dataAnalysisDto);
        // æ ¹æ®æ ·å“id查询检测参数
        if (CollectionUtils.isEmpty(analysisList)) {
            return null;
        }
        List<Integer> sampleIds = analysisList.stream().map(IfsInventoryQuantitySupplierDto::getSampleId).collect(Collectors.toList());
        // æŸ¥è¯¢æ£€éªŒé¡¹ç›®
        List<SampleProductRawAnalysisDto> sampleProductList = insProductMapper.selectListBySampleIds(sampleIds);
        List<String> itemNames = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(dataAnalysisDto.getItemNames())) {
            itemNames = dataAnalysisDto.getItemNames();
        } else {
            itemNames = insProductMapper.selectItemNameBySampleIds(sampleIds);
        }
        // æ ¹æ®æ ·å“åˆ†ç»„
        List<Map<String, Object>> productList = new ArrayList<>();
        Map<Integer, List<SampleProductRawAnalysisDto>> collect = sampleProductList.stream().collect(Collectors.groupingBy(SampleProductRawAnalysisDto::getInsSampleId));
        List<String> finalItemNames = itemNames;
        collect.forEach((integer, rawAnalysisDtos) -> {
            // æ£€éªŒé¡¹ç›®åç§°è½¬æ¢æˆmap
            Map<String, Object> itemMap = new HashMap<>();
            for (String itemName : finalItemNames) {
                itemMap.put(itemName, null);
            }
            // éåŽ†æ£€éªŒé¡¹
            for (SampleProductRawAnalysisDto rawAnalysisDto : rawAnalysisDtos) {
                itemMap.put(rawAnalysisDto.getInspectionItem(), rawAnalysisDto.getLastValue());
            }
            itemMap.put("product", rawAnalysisDtos.get(0).getSampleCode());
            productList.add(itemMap);
        });
        RawProductAnalysisVo rawProductAnalysisVo = new RawProductAnalysisVo();
        rawProductAnalysisVo.setItemNames(itemNames);
        rawProductAnalysisVo.setProductList(productList);
        return rawProductAnalysisVo;
    }
    /**
     * æŸ¥è¯¢æ£€æµ‹é¡¹åˆ†æžåˆ—表
     * @param dataAnalysisDto
     * @return
     */
    @Override
    public List<IfsInventoryQuantitySupplierDto> getRawProductAnalysisAllList(DataAnalysisDto dataAnalysisDto) {
        // æ ¼å¼åŒ–字段, é¿å…æŠ¥é”™
        this.formatDataAnalysisDto(dataAnalysisDto);
        return dataAnalysisMapper.getRawProductAnalysisList(dataAnalysisDto);
    }
    /**
     * æŸ¥è¯¢é¡¹æ£€åˆ†æžåˆæ ¼çއ
     * @param dataAnalysisDto
     * @return
     */
    @Override
    public RawProductAnalysisVo getRawProductAnalysisRawPass(DataAnalysisDto dataAnalysisDto) {
        // æ ¼å¼åŒ–字段, é¿å…æŠ¥é”™
        this.formatDataAnalysisDto(dataAnalysisDto);
        List<IfsInventoryQuantitySupplierDto> analysisList = dataAnalysisMapper.getRawProductAnalysisAllSample(dataAnalysisDto);
        // æ ¹æ®æ ·å“id查询检测参数
        if (CollectionUtils.isEmpty(analysisList)) {
            return null;
        }
        List<Integer> sampleIds = analysisList.stream().map(IfsInventoryQuantitySupplierDto::getSampleId).collect(Collectors.toList());
        // æŸ¥è¯¢æ£€éªŒé¡¹ç›®
        List<SampleProductRawAnalysisDto> sampleProductList = insProductMapper.selectListBySampleIds(sampleIds);
        List<String> itemNames = new ArrayList<>();
        List<String> finalItemNames = itemNames;
        if (CollectionUtils.isNotEmpty(dataAnalysisDto.getItemNames())) {
            itemNames = dataAnalysisDto.getItemNames();
        } else {
            itemNames = insProductMapper.selectItemNameBySampleIds(sampleIds);
        }
        // åˆ†ç»„
        List<Map<String, Object>> productList = new ArrayList<>();
        Map<String, List<SampleProductRawAnalysisDto>> groupList = new HashMap<>();
        switch (dataAnalysisDto.getGroupType()) {
            case "0":  // é»˜è®¤æ ·å“åŒºåˆ†
                groupList = sampleProductList.stream()
                        .collect(Collectors.groupingBy(SampleProductRawAnalysisDto::getSample));
                break;
            case "1":  // æ‰¹æ¬¡å·åŒºåˆ†
                groupList = sampleProductList.stream()
                        .collect(Collectors.groupingBy(SampleProductRawAnalysisDto::getUpdateBatchNo));
                break;
            case "2":  // åŽ‚å®¶åŒºåˆ†
                groupList = sampleProductList.stream()
                        .collect(Collectors.groupingBy(SampleProductRawAnalysisDto::getSupplierName));
                break;
        }
        groupList.forEach((groupName, rawAnalysisDtos) -> {
            // æŒ‰ç…§æ£€éªŒé¡¹åŒºåˆ†
            // æ£€éªŒé¡¹ç›®åç§°è½¬æ¢æˆmap
            Map<String, Object> itemMap = new HashMap<>();
            for (String itemName : finalItemNames) {
                itemMap.put(itemName, null);
            }
            Map<String, List<SampleProductRawAnalysisDto>> groupItemList = rawAnalysisDtos.stream().collect(Collectors.groupingBy(SampleProductRawAnalysisDto::getInspectionItem));
            groupItemList.forEach((itemName, dtos) -> {
                // ç»Ÿè®¡åˆæ ¼æ€»æ•°
                long qualifiedCount = dtos.stream()
                        .filter(dto -> dto.getInsResult() != null && dto.getInsResult().equals(1))
                        .count();
                long totalCount = dtos.size();
                BigDecimal passRate = new BigDecimal(qualifiedCount).divide(new BigDecimal(totalCount), 4, RoundingMode.HALF_UP)
                        .multiply(new BigDecimal(100))
                        .setScale(2, RoundingMode.HALF_UP);
                itemMap.put(itemName, passRate);
            });
            itemMap.put("product", groupName);
            productList.add(itemMap);
        });
        RawProductAnalysisVo rawProductAnalysisVo = new RawProductAnalysisVo();
        rawProductAnalysisVo.setItemNames(itemNames);
        rawProductAnalysisVo.setProductList(productList);
        return rawProductAnalysisVo;
    }
    @Override
    public DeviationAnalyzeVo getRawSupplierCompare(DataAnalysisDto dataAnalysisDto) {
        // åˆ¤æ–­è®¢å•id是否有五个
        if (CollectionUtils.isEmpty(dataAnalysisDto.getOrderIds()) || dataAnalysisDto.getOrderIds().size() != 5) {
            throw new ErrorException("请选择五条数据");
        }
        if (CollectionUtils.isEmpty(dataAnalysisDto.getItemNames()) || dataAnalysisDto.getItemNames().size() != 1) {
            throw new ErrorException("请选择一个检验项检验项");
        }
        if (CollectionUtils.isNotEmpty(dataAnalysisDto.getSupplierDataList())) {
            if (dataAnalysisDto.getSupplierDataList().size() != 5) {
                throw new ErrorException("厂家数据请输入完整5条");
            }
        }
        List<RawMaterialSupplierVo> rawMaterialSupplierVoList = dataAnalysisMapper.getItemValueByOrderIds(dataAnalysisDto.getOrderIds(), dataAnalysisDto.getItemNames().get(0));
        // åˆ¤æ–­åŽ‚å®¶ææ–™åç§°è§„æ ¼åž‹å·æ˜¯å¦æ˜¯ä¸€æ ·çš„
        RawMaterialSupplierVo rawMaterialSupplierVo = rawMaterialSupplierVoList.get(0);
        for (RawMaterialSupplierVo materialSupplierVo : rawMaterialSupplierVoList) {
            if (!materialSupplierVo.getSupplierName().equals(rawMaterialSupplierVo.getSupplierName()) ||
                    !materialSupplierVo.getSample().equals(rawMaterialSupplierVo.getSample()) ||
                    !materialSupplierVo.getModel().equals(rawMaterialSupplierVo.getModel())) {
                throw new ErrorException("选择的检验信息不匹配");
            }
        }
        List<String> lastValues = rawMaterialSupplierVoList.stream().map(RawMaterialSupplierVo::getLastValue).collect(Collectors.toList());
        // è®¡ç®—本地数据
        Map<String, List<Object>> localData = dataCompute(lastValues);
        DeviationAnalyzeVo deviationAnalyzeVo = new DeviationAnalyzeVo();
        deviationAnalyzeVo.setLocalData(localData.get("data"));
        deviationAnalyzeVo.setLocalULC(localData.get("uclData"));
        deviationAnalyzeVo.setLocalLCL(localData.get("lclData"));
        deviationAnalyzeVo.setLocalAverage(localData.get("averageData"));
        deviationAnalyzeVo.setLocalRange(localData.get("rangeData"));
        // åˆ¤æ–­æ˜¯å¦æœ‰åŽ‚å®¶æ•°æ®
        if (CollectionUtils.isNotEmpty(dataAnalysisDto.getSupplierDataList())) {
            List<String> supplierValues = dataAnalysisDto.getSupplierDataList();
            List<Object> absoluteDeviation = new ArrayList<>();
            List<Object> averageList = new ArrayList<>();
            for (int i = 0; i < lastValues.size(); i++) {
                // åˆ¤æ–­æœ‰å€¼æ˜¯å¦ä¸ºç©º
                if (StringUtils.isNotBlank(lastValues.get(i)) ||
                        StringUtils.isNotBlank(supplierValues.get(i))) {
                    BigDecimal laseValue = new BigDecimal(lastValues.get(i));
                    BigDecimal supplierValue = new BigDecimal(supplierValues.get(i));
                    // è®¡ç®— (B3 - B2)
                    BigDecimal result = laseValue.subtract(supplierValue)
                            .divide(laseValue, 10, RoundingMode.HALF_UP)
                            .abs()
                            .setScale(2, RoundingMode.HALF_UP);
                    absoluteDeviation.add(result);
                } else {
                    absoluteDeviation.add(null);
                }
            }
            // è®¡ç®—平均值
            List<String> stringList = absoluteDeviation.stream()
                    .map(obj -> obj == null ? "null" : obj.toString())
                    .collect(Collectors.toList());
            BigDecimal average = computeAverage(stringList);
            absoluteDeviation.add(average);
            for (int i = 0; i < 5; i++) {
                averageList.add(average);
            }
            // è®¡ç®—厂家数据
            Map<String, List<Object>> supplierData = dataCompute(supplierValues);
            deviationAnalyzeVo.setSupplierData(supplierData.get("data"));
            deviationAnalyzeVo.setSupplierULC(supplierData.get("uclData"));
            deviationAnalyzeVo.setSupplierLCL(supplierData.get("lclData"));
            deviationAnalyzeVo.setSupplierAverage(supplierData.get("averageData"));
            deviationAnalyzeVo.setSupplierRange(supplierData.get("rangeData"));
            deviationAnalyzeVo.setAbsoluteDeviation(absoluteDeviation);
            deviationAnalyzeVo.setAverage(averageList);
        }
        return deviationAnalyzeVo;
    }
    /**
     * æŸ¥è¯¢æœ¬æœˆä¸Žä¸Šæœˆåˆæ ¼çŽ‡å¯¹æ¯”
     * @param dataAnalysisDto
     * @return
     */
    @Override
    public List<Map<String, Object>> getRawUpMonth(DataAnalysisDto dataAnalysisDto) {
        return dataAnalysisMapper.getRawUpMonth();
    }
    /**
     * æŸ¥è¯¢æ£€éªŒé¡¹ç±»åž‹é¥¼å›¾
     * @param dataAnalysisDto
     * @return
     */
    @Override
    public Map<String, Object> getOrderTypeCookie(DataAnalysisDto dataAnalysisDto) {
        return dataAnalysisMapper.getOrderTypeCookie();
    }
    /**
     * è®¡ç®—返回数据
     * @param lastValues
     * @return
     */
    private static Map<String, List<Object>> dataCompute(List<String> lastValues) {
        // å¹³å‡å€¼
        BigDecimal average = computeAverage(lastValues);
        // æ ‡å‡†åå·®
        BigDecimal standardDeviation = computeStandardDeviation(lastValues);
        // ç›¸å¯¹åå·®
        BigDecimal relativeDeviation = standardDeviation.divide(average, 2, RoundingMode.HALF_UP);
        // å¹³å‡ç›¸å¯¹åå·®
        BigDecimal sqrt5 = BigDecimal.valueOf(Math.sqrt(5));
        BigDecimal averageRelativeDeviation = standardDeviation.divide(sqrt5, 2, RoundingMode.HALF_UP);
        // ucl
        BigDecimal ucl = average.add(new BigDecimal("3").multiply(standardDeviation)).setScale(2, RoundingMode.HALF_UP);
        // lcl
        BigDecimal lcl = average.subtract(new BigDecimal("3").multiply(standardDeviation)).setScale(2, RoundingMode.HALF_UP);
        // æžå·®
        BigDecimal range = computeRange(lastValues);
        // æ•°æ®æ‹¼æŽ¥
        // æ£€æµ‹æ•°æ®
        List<Object> data = new ArrayList<>();
        for (String lastValue : lastValues) {
            data.add(lastValue);
        }
        data.add(average);
        data.add(standardDeviation);
        data.add(relativeDeviation);
        data.add(averageRelativeDeviation);
        //ucl
        List<Object> uclData = new ArrayList<>();
        //lcl
        List<Object> lclData = new ArrayList<>();
        //平均值
        List<Object> averageData = new ArrayList<>();
        //极差
        List<Object> rangeData = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            uclData.add(ucl);
            lclData.add(lcl);
            averageData.add(average);
            rangeData.add(range);
        }
        Map<String, List<Object>> map = new HashMap<>();
        map.put("data", data);
        map.put("uclData", uclData);
        map.put("lclData", lclData);
        map.put("averageData", averageData);
        map.put("rangeData", rangeData);
        return map;
    }
    /**
     * è®¡ç®—极差
     * @param lastValues
     * @return
     */
    public static BigDecimal computeRange(List<String> lastValues) {
        int count = 0;
        BigDecimal min = null;
        BigDecimal max = null;
        for (String value : lastValues) {
            if (StrUtil.isNotBlank(value)) {
                BigDecimal bigDecimalValue = new BigDecimal(value);
                if (min == null || bigDecimalValue.compareTo(min) < 0) {
                    min = bigDecimalValue;
                }
                if (max == null || bigDecimalValue.compareTo(max) > 0) {
                    max = bigDecimalValue;
                }
                count++;
            }
        }
        if (count == 0 || min == null || max == null) {
            return BigDecimal.ZERO;
        }
        BigDecimal range = max.subtract(min);
        return range.setScale(2, RoundingMode.HALF_UP);
    }
    /**
     * è®¡ç®—平均值
     * @param values
     * @return
     */
    private static BigDecimal computeAverage(List<String> values) {
        BigDecimal sum = BigDecimal.ZERO;
        int count = 0;
        for (String value : values) {
            if (StrUtil.isNotBlank(value)) {
                BigDecimal number = new BigDecimal(value);
                sum = sum.add(number);
                count++;
            }
        }
        return count == 0 ? BigDecimal.ZERO : sum.divide(BigDecimal.valueOf(count), 2, BigDecimal.ROUND_HALF_UP);
    }
    /**
     * è®¡ç®—标准偏差
     * @return
     */
    private static BigDecimal computeStandardDeviation(List<String> lastValues) {
        int count = 0;
        // å°†å­—符串转换为 BigDecimal åˆ—表
        List<BigDecimal> values = new ArrayList<>();
        for (String value : lastValues) {
            if (StrUtil.isNotBlank(value)) {
                values.add(new BigDecimal(value));
                count++;
            }
        }
        if (count == 0) {
            return BigDecimal.ZERO;
        }
        // è®¡ç®—平均值
        BigDecimal sum = BigDecimal.ZERO;
        for (BigDecimal value : values) {
            sum = sum.add(value);
        }
        BigDecimal mean = sum.divide(new BigDecimal(values.size()), MathContext.DECIMAL128);
        // è®¡ç®—每个数值与平均值的差的平方
        BigDecimal squaredDifferenceSum = BigDecimal.ZERO;
        for (BigDecimal value : values) {
            BigDecimal difference = value.subtract(mean);
            BigDecimal squaredDifference = difference.multiply(difference);
            squaredDifferenceSum = squaredDifferenceSum.add(squaredDifference);
        }
        // è®¡ç®—标准差,注意这里使用的是样本标准差计算公式
        BigDecimal variance = squaredDifferenceSum.divide(new BigDecimal(values.size() - 1), MathContext.DECIMAL128);
        BigDecimal stddev = sqrt(variance);
        // ä¿ç•™ä¸¤ä½å°æ•°
        return stddev.setScale(2, RoundingMode.HALF_UP);
    }
    private static BigDecimal sqrt(BigDecimal value) {
        // ä½¿ç”¨ Heron's method è®¡ç®—平方根
        BigDecimal x = value;
        BigDecimal tolerance = new BigDecimal("1E-10");
        BigDecimal guess = value.divide(BigDecimal.valueOf(2), MathContext.DECIMAL128);
        while (x.subtract(guess).abs().compareTo(tolerance) > 0) {
            x = guess;
            guess = x.add(value.divide(x, MathContext.DECIMAL128)).divide(new BigDecimal("2"), MathContext.DECIMAL128);
        }
        return guess;
    }
    /**
     * *****格式化字段****
     * @param dataAnalysisDto
     */
    private void formatDataAnalysisDto(DataAnalysisDto dataAnalysisDto) {
        // æ ¼å¼è¯å­—段, é¿å…æŠ¥é”™
        if (StrUtil.isBlank(dataAnalysisDto.getOrderType())) {
            dataAnalysisDto.setOrderType("1");
        }
        if (dataAnalysisDto.getOrderType().equals("2")) {
            // å­£åº¦æ£€éªŒ
            dataAnalysisDto.setOrderType(InsOrderTypeConstants.QUARTERLY_TEST);
        } else {
            // è¿›åŽ‚æ£€éªŒ
            dataAnalysisDto.setOrderType(InsOrderTypeConstants.ENTER_THE_FACTORY);
        }
        if (StrUtil.isBlank(dataAnalysisDto.getDateType())) {
            dataAnalysisDto.setDateType("1");
        }
        if (StrUtil.isBlank(dataAnalysisDto.getGroupType())) {
            dataAnalysisDto.setGroupType("0");
        }
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java
@@ -387,7 +387,8 @@
        ifsInventoryQuantityDto.setBeginDeclareDate(null);
        ifsInventoryQuantityDto.setEndDeclareDate(null);
        return standardTreeMapper.getIfsByOver(page, QueryWrappers.queryWrappers(ifsInventoryQuantityDto), beginDeclareDate, endDeclareDate);
        IPage<IfsInventoryQuantitySupplierDto> ifsByOver = standardTreeMapper.getIfsByOver(page, QueryWrappers.queryWrappers(ifsInventoryQuantityDto), beginDeclareDate, endDeclareDate);
        return ifsByOver;
    }
    /**
inspect-server/src/main/resources/mapper/DataAnalysisMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,315 @@
<?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.ruoyi.inspect.mapper.DataAnalysisMapper">
    <!-- èŽ·å–æœ¬å‘¨çš„åŽŸææ–™ä¿¡æ¯ -->
    <select id="getRawPassRateByBarChartByWeek" resultType="java.util.Map">
        WITH RECURSIVE AllWeeks AS (SELECT 1 AS week
                                     UNION ALL
                                     SELECT week + 1
                                     FROM AllWeeks
                                     WHERE week &lt; 7)
        SELECT COALESCE(sub.sum, 0)      AS sum,
               CASE am.week
                   WHEN 1 THEN '星期日'
                   WHEN 2 THEN '星期一'
                   WHEN 3 THEN '星期二'
                   WHEN 4 THEN '星期三'
                   WHEN 5 THEN '星期四'
                   WHEN 6 THEN '星期五'
                   WHEN 7 THEN '星期六'
                END                   AS searchTime,
               COALESCE(sub.passRate, 0) AS passRate
        FROM AllWeeks am
                 LEFT JOIN (select COUNT(*)                 sum,
                                   DAYOFWEEK(io1.send_time) searchTime,
                                   ROUND((COUNT(*) - SUM(CASE WHEN inspect_status in (2, 4) THEN 1 ELSE 0 END)) / COUNT(*) *
                                         100,
                                         2)                 passRate
                            from ifs_inventory_quantity iiq
                                     LEFT JOIN ins_order io1 on io1.ifs_inventory_id = iiq.id
                                and io1.order_type = #{dto.orderType}
                                and io1.state != -1
                                     left join (select is2.ins_order_id,
                                                       is2.sample_type,
                                                       is2.model,
                                                       is2.sample
                                                from ins_sample is2
                                                group by is2.ins_order_id) ins on ins.ins_order_id = io1.id
                            where iiq.is_finish = 1
                              and iiq.inspect_status not in (0, 3)
                              and (io1.send_time between #{dto.beginDate} and #{dto.endDate})
        <if test="dto.sampleName != null and dto.sampleName != ''">
            and ins.sample like concat('%', #{dto.sampleName}, '%')
        </if>
        <if test="dto.modelName != null and dto.modelName != ''">
            and ins.model like concat('%', #{dto.modelName}, '%')
        </if>
        <if test="dto.supplierName != null and dto.supplierName != ''">
            and iiq.supplier_name like concat('%', #{dto.supplierName}, '%')
        </if>
                            GROUP BY DAYOFWEEK(io1.send_time)
                            having searchTime is not null) sub ON am.week = sub.searchTime
        WHERE am.week BETWEEN 1 AND 7
        ORDER BY am.week
    </select>
    <!-- èŽ·å–æœ¬æœˆçš„åŽŸææ–™ä¿¡æ¯ -->
    <select id="getRawPassRateByBarChartByDay" resultType="java.util.Map">
        select COUNT(*)                         sum,
               DATE_FORMAT(io1.send_time, '%Y-%m-%d') searchTime,
               ROUND((COUNT(*) - SUM(CASE WHEN inspect_status in (2, 4) THEN 1 ELSE 0 END)) / COUNT(*) * 100,
                     2)                         passRate
        from ifs_inventory_quantity iiq
                 LEFT JOIN ins_order io1 on io1.ifs_inventory_id = iiq.id
            and io1.order_type = #{dto.orderType}
            and io1.state != -1
                 left join (select is2.ins_order_id,
                                   is2.sample_type,
                                   is2.model,
                                   is2.sample
                            from ins_sample is2
                            group by is2.ins_order_id) ins on ins.ins_order_id = io1.id
        where iiq.is_finish = 1
          and iiq.inspect_status not in (0, 3)
        and (io1.send_time between #{dto.beginDate} and #{dto.endDate})
        <if test="dto.sampleName != null and dto.sampleName != ''">
            and ins.sample like concat('%', #{dto.sampleName}, '%')
        </if>
        <if test="dto.modelName != null and dto.modelName != ''">
            and ins.model like concat('%', #{dto.modelName}, '%')
        </if>
        <if test="dto.supplierName != null and dto.supplierName != ''">
            and iiq.supplier_name like concat('%', #{dto.supplierName}, '%')
        </if>
        GROUP BY DATE_FORMAT(io1.send_time, '%Y-%m-%d')
        having searchTime is not null
        order by searchTime
    </select>
    <!-- èŽ·å–æœ¬å¹´çš„åŽŸææ–™ä¿¡æ¯ -->
    <select id="getRawPassRateByBarChartByYear" resultType="java.util.Map">
        WITH RECURSIVE AllMonths AS (SELECT 1 AS month
                                     UNION ALL
                                     SELECT month + 1
                                     FROM AllMonths
                                     WHERE month &lt; 12)
        SELECT COALESCE(sub.sum, 0)      AS sum,
               CASE am.month
                   WHEN 1 THEN '1月'
                   WHEN 2 THEN '2月'
                   WHEN 3 THEN '3月'
                   WHEN 4 THEN '4月'
                   WHEN 5 THEN '5月'
                   WHEN 6 THEN '6月'
                   WHEN 7 THEN '7月'
                   WHEN 8 THEN '8月'
                   WHEN 9 THEN '9月'
                   WHEN 10 THEN '10月'
                   WHEN 11 THEN '11月'
                   WHEN 12 THEN '12月'
                END                   AS searchTime,
               COALESCE(sub.passRate, 0) AS passRate
        FROM AllMonths am
                 LEFT JOIN (select COUNT(*)                         sum,
                                   DATE_FORMAT(io1.send_time, '%m') searchTime,
                                   ROUND((COUNT(*) - SUM(CASE WHEN inspect_status in (2, 4) THEN 1 ELSE 0 END)) /
                                         COUNT(*) * 100,
                                         2)                         passRate
                            from ifs_inventory_quantity iiq
                                     LEFT JOIN ins_order io1 on io1.ifs_inventory_id = iiq.id
                                and io1.order_type = #{dto.orderType}
                                and io1.state != -1
                                     left join (select is2.ins_order_id,
                                                       is2.sample_type,
                                                       is2.model,
                                                       is2.sample
                                                from ins_sample is2
                                                group by is2.ins_order_id) ins on ins.ins_order_id = io1.id
                            where iiq.is_finish = 1
                              and iiq.inspect_status not in (0, 3)
                              and (io1.send_time between #{dto.beginDate} and #{dto.endDate})
        <if test="dto.sampleName != null and dto.sampleName != ''">
            and ins.sample like concat('%', #{dto.sampleName}, '%')
        </if>
        <if test="dto.modelName != null and dto.modelName != ''">
            and ins.model like concat('%', #{dto.modelName}, '%')
        </if>
        <if test="dto.supplierName != null and dto.supplierName != ''">
            and iiq.supplier_name like concat('%', #{dto.supplierName}, '%')
        </if>
                            GROUP BY DATE_FORMAT(io1.send_time, '%Y-%m')
                            having searchTime is not null) sub ON am.month = sub.searchTime
        WHERE am.month BETWEEN 1 AND 12
        ORDER BY am.month
    </select>
    <!-- æŸ¥çœ‹åŽŸææ–™é¥¼çŠ¶å›¾ -->
    <select id="getRawPassRateByCake" resultType="java.util.Map">
        select COUNT(*)                                                                                             sum,
               (COUNT(*) - SUM(CASE WHEN inspect_status in (2, 4) THEN 1 ELSE 0 END))                               qualified,
               (COUNT(*) - SUM(CASE WHEN inspect_status = 1 THEN 1 ELSE 0 END))                                     unQualified,
               ROUND((COUNT(*) - SUM(CASE WHEN inspect_status in (2, 4) THEN 1 ELSE 0 END)) / COUNT(*) * 100,
                     2) AS passRate
        from ifs_inventory_quantity iiq
                 LEFT JOIN ins_order io1 on io1.ifs_inventory_id = iiq.id
            and io1.order_type = #{dto.orderType}
            and io1.state != -1
                 left join (select is2.ins_order_id,
                                   is2.sample_type,
                                   is2.model,
                                   is2.sample
                            from ins_sample is2
                            group by is2.ins_order_id) ins on ins.ins_order_id = io1.id
        where iiq.is_finish = 1
          and iiq.inspect_status not in (0, 3)
          and (io1.send_time between #{dto.beginDate} and #{dto.endDate})
        <if test="dto.sampleName != null and dto.sampleName != ''">
            and ins.sample like concat('%', #{dto.sampleName}, '%')
        </if>
        <if test="dto.modelName != null and dto.modelName != ''">
            and ins.model like concat('%', #{dto.modelName}, '%')
        </if>
        <if test="dto.supplierName != null and dto.supplierName != ''">
            and iiq.supplier_name like concat('%', #{dto.supplierName}, '%')
        </if>
    </select>
    <select id="getRawProductAnalysisAllSample" resultType="com.ruoyi.basic.dto.IfsInventoryQuantitySupplierDto">
        select iiq.*,
               io1.entrust_code,
               io1.id     enter_order_id,
               ins.id     sample_id,
               ins.sample_type,
               ins.sample sample_name,
               ins.model  sample_model,
               io1.send_time
        from ifs_inventory_quantity iiq
                 LEFT JOIN ins_order io1 on io1.ifs_inventory_id = iiq.id
            and io1.order_type = #{dto.orderType}
            and io1.state != -1
                 left join ins_sample  ins on ins.ins_order_id = io1.id
        where iiq.is_finish = 1
          and iiq.inspect_status not in (0, 3)
        <if test="dto.beginDate != null and dto.beginDate != '' and dto.endDate != null and dto.endDate != ''">
            and (io1.send_time between #{dto.beginDate} and #{dto.endDate})
        </if>
        <if test="dto.sampleName != null and dto.sampleName != ''">
            and ins.sample like concat('%', #{dto.sampleName}, '%')
        </if>
        <if test="dto.modelName != null and dto.modelName != ''">
            and ins.model like concat('%', #{dto.modelName}, '%')
        </if>
        <if test="dto.supplierName != null and dto.supplierName != ''">
            and iiq.supplier_name like concat('%', #{dto.supplierName}, '%')
        </if>
    </select>
    <!-- æŸ¥è¯¢æ£€æµ‹é¡¹é›†åˆ -->
    <select id="getRawProductAnalysisList" resultType="com.ruoyi.basic.dto.IfsInventoryQuantitySupplierDto">
        select iiq.*,
               io1.entrust_code,
               io1.id     enter_order_id,
               ins.id     sample_id,
               ins.sample_type,
               ins.sample sample_name,
               ins.model  sample_model,
               u.name     user_name,
               io1.send_time
        from ifs_inventory_quantity iiq
                 LEFT JOIN ins_order io1 on io1.ifs_inventory_id = iiq.id
            and io1.order_type = #{dto.orderType}
            and io1.state != -1
                 left join user u on io1.create_user = u.id
                 left join (select is2.ins_order_id,
                                   is2.sample_type,
                                   is2.sample_code,
                                   is2.model,
                                   is2.sample,
                                   is2.id
                            from ins_sample is2
                            group by is2.ins_order_id) ins on ins.ins_order_id = io1.id
        where iiq.is_finish = 1
          and iiq.inspect_status not in (0, 3)
        <if test="dto.beginDate != null and dto.beginDate != '' and dto.endDate != null and dto.endDate != ''">
            and (io1.send_time between #{dto.beginDate} and #{dto.endDate})
        </if>
        <if test="dto.sampleName != null and dto.sampleName != ''">
            and ins.sample like concat('%', #{dto.sampleName}, '%')
        </if>
        <if test="dto.modelName != null and dto.modelName != ''">
            and ins.model like concat('%', #{dto.modelName}, '%')
        </if>
        <if test="dto.supplierName != null and dto.supplierName != ''">
            and iiq.supplier_name like concat('%', #{dto.supplierName}, '%')
        </if>
    </select>
    <select id="getItemValueByOrderIds" resultType="com.ruoyi.inspect.vo.RawMaterialSupplierVo">
        select io2.id                   orderId,
               io2.entrust_code,
               ins.sample,
               ins.model,
               iiq.supplier_name,
               (select ip.`last_value`
                from ins_product ip
                where concat(ip.inspection_item, ip.inspection_item_subclass) = #{itemName}
                  and ip.ins_sample_id = ins.id
                limit 1) lastValue
        from ins_order io2
                 left join ifs_inventory_quantity iiq on io2.ifs_inventory_id = iiq.id
                 left join (select is2.ins_order_id,
                                   is2.sample_type,
                                   is2.sample_code,
                                   is2.model,
                                   is2.sample,
                                   is2.id
                            from ins_sample is2
                            group by is2.ins_order_id) ins on ins.ins_order_id = io2.id
        where io2.id in
        <foreach collection="insOrderIds" index="index" open="(" separator="," close=")" item="val">
            #{val}
        </foreach>
    </select>
    <!-- æŸ¥è¯¢æœ¬æœˆä¸Žä¸Šæœˆåˆæ ¼çŽ‡å¯¹æ¯” -->
    <select id="getRawUpMonth" resultType="java.util.Map">
        select DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), '%Y-%m') as month,
               (select ROUND((COUNT(*) - SUM(CASE WHEN inspect_status in (2, 4) THEN 1 ELSE 0 END)) / COUNT(*) *
                             100,
                             2) passRate
                from ifs_inventory_quantity iiq
                         LEFT JOIN ins_order io1 on io1.ifs_inventory_id = iiq.id
                    and io1.order_type = '进厂检验'
                    and io1.state != -1
                where iiq.is_finish = 1
                  and iiq.inspect_status not in (0, 3)
                  and (io1.send_time between DATE_FORMAT(DATE_SUB(DATE_FORMAT(NOW(), '%Y-%m-01'), INTERVAL 1 MONTH), '%Y-%m-%d %H:%i:%s')
                    and DATE_FORMAT(LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH)), '%Y-%m-%d 23:59:59'))) passRate
        UNION ALL
        select DATE_FORMAT(CURRENT_DATE, '%Y-%m') as month,
               (select ROUND((COUNT(*) - SUM(CASE WHEN inspect_status in (2, 4) THEN 1 ELSE 0 END)) / COUNT(*) *
                             100,
                             2) passRate
                from ifs_inventory_quantity iiq
                         LEFT JOIN ins_order io1 on io1.ifs_inventory_id = iiq.id
                    and io1.order_type = '进厂检验'
                    and io1.state != -1
                where iiq.is_finish = 1
                  and iiq.inspect_status not in (0, 3)
                  and (io1.send_time between
                    DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL -DAY(CURDATE()) + 1 DAY), '%Y-%m-%d 00:00:00')
                    and DATE_FORMAT(LAST_DAY(CURDATE()), '%Y-%m-%d 23:59:59'))) passRate
    </select>
    <!-- æŸ¥è¯¢æœ¬æœˆæ£€éªŒç±»åž‹ -->
    <select id="getOrderTypeCookie" resultType="java.util.Map">
        select sum(order_type = '抽检')                  spotCheck,
               sum(order_type = 'Customer-ordered test') customer,
               sum(order_type = '进厂检验')              enter,
               sum(order_type = 'Quarterly inspection')  quarterly
        from ins_order
        where state != -1
          and (send_time between DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 1 MONTH) + INTERVAL 1 DAY,
                                             '%Y-%m-%d 00:00:00') and DATE_FORMAT(LAST_DAY(NOW()), '%Y-%m-%d 23:59:59'))
    </select>
</mapper>
performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryWorkingHoursController.java
@@ -38,7 +38,9 @@
    @ApiOperation(value="删除辅助工时")
    @DeleteMapping("/deleteAuxiliaryWorkingHours")
    public Result deleteAuxiliaryWorkingHours(Integer id){
        return Result.success(auxiliaryWorkingHoursService.deleteAuxiliaryWorkingHours(id));
    }
    @ApiOperation(value="修改辅助工时")
performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryWorkingHoursMapper.java
@@ -17,4 +17,12 @@
 */
public interface AuxiliaryWorkingHoursMapper extends BaseMapper<AuxiliaryWorkingHours> {
    IPage<AuxiliaryWorkingHours> selectAuxiliaryWorkingHours(@Param("page") Page page, @Param("ew") QueryWrapper<AuxiliaryWorkingHours> ew);
    /**
     * ç»‘定辅助工时配置的日工时管理数量
     *
     * @param auxiliaryWorkingHoursId
     * @return
     */
    int hourDayBindAuxiliaryCount(@Param("auxiliaryWorkingHoursId") Integer auxiliaryWorkingHoursId);
}
performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryWorkingHoursServiceImpl.java
@@ -35,6 +35,11 @@
    @Override
    public int deleteAuxiliaryWorkingHours(Integer id) {
        // åˆ¤æ–­æ—¥å·¥æ—¶ç®¡ç†ä¸­æ˜¯å¦å·²ç»‘定待删除辅助工时配置
        int count = auxiliaryWorkingHoursMapper.hourDayBindAuxiliaryCount(id);
        if(count > 0){
            throw new RuntimeException("已在日工时管理中绑定,禁止删除!");
        }
        return auxiliaryWorkingHoursMapper.deleteById(id);
    }
performance-server/src/main/resources/mapper/AuxiliaryWorkingHoursMapper.xml
@@ -35,4 +35,13 @@
          ${ew.customSqlSegment}
      </if>
  </select>
  <select id="hourDayBindAuxiliaryCount">
      SELECT
          COUNT(*)
      FROM
          auxiliary_working_hours_day T1
              LEFT JOIN auxiliary_working_hours T2 ON T1.number = T2.number
      WHERE T2.id = #{auxiliaryWorkingHoursId}
  </select>
</mapper>
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/User.java
@@ -96,5 +96,8 @@
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "部门id")
    private Long departId;
}