From c1df30be108a9f4bd443c9034e0d93657870fcde Mon Sep 17 00:00:00 2001
From: chenrui <1187576398@qq.com>
Date: 星期一, 03 三月 2025 15:30:59 +0800
Subject: [PATCH] 代码迁移bug解决

---
 inspect-server/src/main/resources/mapper/DataAnalysisMapper.xml                                           |  315 ++++++++++++++
 inspect-server/src/main/java/com/ruoyi/inspect/dto/DataAnalysisDto.java                                   |   48 ++
 performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryWorkingHoursController.java    |    2 
 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/User.java                                  |    3 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/DataAnalysisServiceImpl.java                  |  613 +++++++++++++++++++++++++++
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/DataAnalysisMapper.java                             |   74 +++
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java              |    3 
 inspect-server/src/main/java/com/ruoyi/inspect/service/DataAnalysisService.java                           |   77 +++
 performance-server/src/main/resources/mapper/AuxiliaryWorkingHoursMapper.xml                              |    9 
 performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryWorkingHoursServiceImpl.java |    5 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordCancelController.java                   |    9 
 basic-server/src/main/java/com/ruoyi/basic/controller/CapacityScopeController.java                        |    2 
 inspect-server/src/main/java/com/ruoyi/inspect/controller/DataAnalysisController.java                     |  127 +++++
 performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryWorkingHoursMapper.java            |    8 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCancelServiceImpl.java                |    4 
 15 files changed, 1,293 insertions(+), 6 deletions(-)

diff --git a/basic-server/src/main/java/com/ruoyi/basic/controller/CapacityScopeController.java b/basic-server/src/main/java/com/ruoyi/basic/controller/CapacityScopeController.java
index 3e84287..e927343 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/controller/CapacityScopeController.java
+++ b/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 {
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordCancelController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordCancelController.java
index cf573fa..5e94d64 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordCancelController.java
+++ b/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());
+        }
     }
-
-
-
 }
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCancelServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCancelServiceImpl.java
index 1f3a735..d466c02 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCancelServiceImpl.java
+++ b/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();
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/controller/DataAnalysisController.java b/inspect-server/src/main/java/com/ruoyi/inspect/controller/DataAnalysisController.java
new file mode 100644
index 0000000..130e075
--- /dev/null
+++ b/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));
+    }
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/dto/DataAnalysisDto.java b/inspect-server/src/main/java/com/ruoyi/inspect/dto/DataAnalysisDto.java
new file mode 100644
index 0000000..437239b
--- /dev/null
+++ b/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:瀛e害妫�楠�")
+    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;
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/DataAnalysisMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/DataAnalysisMapper.java
new file mode 100644
index 0000000..6cb9f0a
--- /dev/null
+++ b/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();
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/DataAnalysisService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/DataAnalysisService.java
new file mode 100644
index 0000000..20e4a0c
--- /dev/null
+++ b/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);
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/DataAnalysisServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/DataAnalysisServiceImpl.java
new file mode 100644
index 0000000..33b9b28
--- /dev/null
+++ b/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")) {
+            // 瀛e害妫�楠�
+            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");
+        }
+    }
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java
index 43fcea6..d3acb91 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java
+++ b/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;
     }
 
     /**
diff --git a/inspect-server/src/main/resources/mapper/DataAnalysisMapper.xml b/inspect-server/src/main/resources/mapper/DataAnalysisMapper.xml
new file mode 100644
index 0000000..6e4e410
--- /dev/null
+++ b/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>
diff --git a/performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryWorkingHoursController.java b/performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryWorkingHoursController.java
index 4afdf9f..3d0f996 100644
--- a/performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryWorkingHoursController.java
+++ b/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="淇敼杈呭姪宸ユ椂")
diff --git a/performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryWorkingHoursMapper.java b/performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryWorkingHoursMapper.java
index d412e8b..8e8e6e3 100644
--- a/performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryWorkingHoursMapper.java
+++ b/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);
 }
diff --git a/performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryWorkingHoursServiceImpl.java b/performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryWorkingHoursServiceImpl.java
index 9863d69..9bb9ac7 100644
--- a/performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryWorkingHoursServiceImpl.java
+++ b/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);
     }
 
diff --git a/performance-server/src/main/resources/mapper/AuxiliaryWorkingHoursMapper.xml b/performance-server/src/main/resources/mapper/AuxiliaryWorkingHoursMapper.xml
index 0c4fd2c..1ff785f 100644
--- a/performance-server/src/main/resources/mapper/AuxiliaryWorkingHoursMapper.xml
+++ b/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>
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/User.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/User.java
index eb50fe3..e5f795a 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/User.java
+++ b/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;
+
 }
 

--
Gitblit v1.9.3