From 3fb8061a9fb85629885ae8383db247946ede7eaf Mon Sep 17 00:00:00 2001
From: zhuo <2089219845@qq.com>
Date: 星期四, 20 二月 2025 09:51:39 +0800
Subject: [PATCH] 添加抽样和不合格流程

---
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/CommonOaMapper.java                             |   20 
 inspect-server/src/main/java/com/ruoyi/inspect/dto/SpotCheckQuarterDto.java                           |   22 
 inspect-server/src/main/java/com/ruoyi/inspect/controller/FinishProductSpotCheckController.java       |  198 ++++++
 inspect-server/src/main/java/com/ruoyi/inspect/service/SpotCheckQuarterItemService.java               |   15 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/FinishProductSpotCheckServiceImpl.java    |  679 ++++++++++++++++++++
 inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java                     |    2 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/SpotCheckQuarterItemServiceImpl.java      |   19 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/SpotCheckYearItemServiceImpl.java         |   19 
 inspect-server/src/main/java/com/ruoyi/inspect/dto/PushOADto.java                                     |   24 
 inspect-server/src/main/java/com/ruoyi/inspect/service/FinishProductSpotCheckService.java             |  126 +++
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/CommonOaServiceImpl.java                  |   22 
 inspect-server/src/main/java/com/ruoyi/inspect/dto/SpotCheckYearDto.java                              |   22 
 ruoyi-common/src/main/java/com/ruoyi/common/oa/OAProperty.java                                        |    8 
 inspect-server/src/main/java/com/ruoyi/inspect/service/InsUnqualifiedHandlerFileService.java          |   19 
 inspect-server/src/main/resources/mapper/SpotCheckQuarterMapper.xml                                   |   25 
 inspect-server/src/main/java/com/ruoyi/inspect/service/SpotCheckYearItemService.java                  |   15 
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/SpotCheckQuarterMapper.java                     |   39 +
 inspect-server/src/main/resources/mapper/SpotCheckYearMapper.xml                                      |   19 
 inspect-server/src/main/java/com/ruoyi/inspect/controller/InsUnqualifiedHandlerController.java        |  139 ++++
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnqualifiedHandlerFileServiceImpl.java |  111 +++
 ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java                          |    8 
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnqualifiedHandlerFileMapper.java            |   20 
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/SpotCheckYearItemMapper.java                    |   17 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnqualifiedHandlerServiceImpl.java     |  280 ++++++++
 inspect-server/src/main/java/com/ruoyi/inspect/service/InsUnqualifiedHandlerService.java              |   39 +
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/SpotCheckYearMapper.java                        |   30 
 inspect-server/src/main/java/com/ruoyi/inspect/service/CommonOaService.java                           |   13 
 27 files changed, 1,941 insertions(+), 9 deletions(-)

diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/controller/FinishProductSpotCheckController.java b/inspect-server/src/main/java/com/ruoyi/inspect/controller/FinishProductSpotCheckController.java
new file mode 100644
index 0000000..d671ee8
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/controller/FinishProductSpotCheckController.java
@@ -0,0 +1,198 @@
+package com.ruoyi.inspect.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.inspect.dto.IfsStockQueryDTO;
+import com.ruoyi.inspect.dto.SpotCheckQuarterDto;
+import com.ruoyi.inspect.dto.SpotCheckYearDto;
+import com.ruoyi.inspect.service.FinishProductSpotCheckService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * @Author zhuo
+ * @Date 2024/9/29
+ */
+@RequestMapping("/finishProductSpotCheck")
+@RestController
+@AllArgsConstructor
+@Api(tags = "鎴愬搧鎶芥牱")
+public class FinishProductSpotCheckController {
+
+    private FinishProductSpotCheckService finishProductSpotCheckService;
+
+    /**
+     * 鏌ヨifs搴撳瓨鏁伴噺
+     *
+     * @param ifsStockQueryDTO
+     * @return
+     */
+    @ApiOperation(value = "鏌ヨifs鎴愬搧搴撳瓨")
+    @PostMapping("/getIfsStock")
+    public Result getIfsStock(@RequestBody IfsStockQueryDTO ifsStockQueryDTO) {
+        return finishProductSpotCheckService.getIfsStockReport(ifsStockQueryDTO);
+    }
+
+    /********************************************************  瀛e害鎶芥牱  ********************************************************/
+
+    /**
+     * 鏂板瀛e害鎶芥
+     *
+     * @param spotCheckQuarterDto
+     * @return
+     */
+    @ApiOperation(value = "鏂板瀛e害鎶芥")
+    @PostMapping("/addQuarter")
+    public Result addQuarter(@RequestBody SpotCheckQuarterDto spotCheckQuarterDto) {
+        return Result.success(finishProductSpotCheckService.addQuarter(spotCheckQuarterDto));
+    }
+
+    /**
+     * 鏌ヨ瀛e害鎶芥牱璇︽儏
+     *
+     * @param quarterId
+     * @return
+     */
+    @ApiOperation(value = "鏌ヨ瀛e害鎶芥牱璇︽儏")
+    @GetMapping("/getQuarter")
+    public Result getQuarter(Integer quarterId) {
+        return Result.success(finishProductSpotCheckService.getQuarter(quarterId));
+    }
+
+    /**
+     * 瀛e害鎶芥牱鍒楄〃
+     * @return
+     * @throws Exception
+     */
+    @ApiOperation(value = "瀛e害鎶芥牱鍒楄〃")
+    @GetMapping("/getQuarterPage")
+    public Result getQuarterPage(Page page, SpotCheckQuarterDto spotCheckQuarter) throws Exception {
+        return Result.success(finishProductSpotCheckService.getQuarterPage(page, spotCheckQuarter));
+    }
+
+    /**
+     * 鏂板瀛e害鎶芥
+     *
+     * @param quarterId
+     * @return
+     */
+    @ApiOperation(value = "鍒犻櫎瀛e害妫�楠�")
+    @DeleteMapping("/deleteQuarter")
+    public Result deleteQuarter(Integer quarterId) {
+        return Result.success(finishProductSpotCheckService.deleteQuarter(quarterId));
+    }
+
+    /**
+     * 鎴愬搧涓嬪崟鐣岄潰鏌ヨ瀛e害淇℃伅
+     *
+     * @return
+     */
+    @ApiOperation(value = "鎴愬搧涓嬪崟鐣岄潰鏌ヨ瀛e害淇℃伅")
+    @GetMapping("/getQuarterOnOrder")
+    public Result getQuarterOnOrder() {
+        return Result.success(finishProductSpotCheckService.getQuarterOnOrder());
+    }
+
+    /**
+     * 鎴愬搧涓嬪崟鐣岄潰鏌ヨ瀛e害淇℃伅
+     *
+     * @return
+     */
+    @ApiOperation(value = "淇敼瀛e害妫�楠�")
+    @PostMapping("/updateQuarterOnOrder")
+    public Result updateQuarterOnOrder(@RequestBody SpotCheckQuarterDto spotCheckQuarterDto) {
+        return Result.success(finishProductSpotCheckService.updateQuarterOnOrder(spotCheckQuarterDto));
+    }
+
+    /**
+     * 鎴愬搧涓嬪崟鐣岄潰鏌ヨ瀛e害淇℃伅
+     *
+     * @return
+     */
+    @ApiOperation(value = "鎻愪氦鏈�缁堝搴︽姤鍛�")
+    @GetMapping("/finalReportQuarter")
+    public void finalReportQuarter(Integer quarterId, HttpServletResponse response) {
+        finishProductSpotCheckService.finalReportQuarter(quarterId, response);
+    }
+
+
+
+
+
+    /********************************************************  骞村害鎶芥牱  ********************************************************/
+
+    /**
+     * 鏂板骞村害鎶芥牱
+     *
+     * @param spotCheckYearDto
+     * @return
+     */
+    @ApiOperation(value = "鏂板骞村害鎶芥牱")
+    @PostMapping("/addSpotCheckYear")
+    public Result addSpotCheckYear(@RequestBody SpotCheckYearDto spotCheckYearDto) {
+        return Result.success(finishProductSpotCheckService.addSpotCheckYear(spotCheckYearDto));
+    }
+
+    /**
+     * 鏌ヨ瀛e害鎶芥牱璇︽儏
+     *
+     * @param yearId
+     * @return
+     */
+    @ApiOperation(value = "鏌ヨ骞村害鎶芥牱璇︽儏")
+    @GetMapping("/getSpotCheckYear")
+    public Result getSpotCheckYear(Integer yearId) {
+        return Result.success(finishProductSpotCheckService.getSpotCheckYear(yearId));
+    }
+
+    /**
+     * 瀛e害鎶芥牱鍒楄〃
+     * @return
+     * @throws Exception
+     */
+    @ApiOperation(value = "骞村害鎶芥牱鍒楄〃鍒楄〃")
+    @GetMapping("/getSpotCheckYearPage")
+    public Result getSpotCheckYearPage(Page page, SpotCheckYearDto spotCheckYear) throws Exception {
+        return Result.success(finishProductSpotCheckService.getSpotCheckYearPage(page, spotCheckYear));
+    }
+
+    /**
+     * 鍒犻櫎骞村害鎶芥牱
+     *
+     * @param yearId
+     * @return
+     */
+    @ApiOperation(value = "鍒犻櫎骞村害鎶芥牱")
+    @DeleteMapping("/deleteSpotCheckYear")
+    public Result deleteSpotCheckYear(Integer yearId) {
+        return Result.success(finishProductSpotCheckService.deleteSpotCheckYear(yearId));
+    }
+
+    /**
+     * 鎴愬搧涓嬪崟鐣岄潰鏌ヨ瀛e害淇℃伅
+     *
+     * @return
+     */
+    @ApiOperation(value = "淇敼骞村害妫�楠�")
+    @PostMapping("/updateSpotCheckYear")
+    public Result updateSpotCheckYear(@RequestBody SpotCheckYearDto spotCheckYearDto) {
+        return Result.success(finishProductSpotCheckService.updateSpotCheckYear(spotCheckYearDto));
+    }
+
+    /**
+     * 鎴愬搧涓嬪崟鐣岄潰鏌ヨ瀛e害淇℃伅
+     *
+     * @return
+     */
+    @ApiOperation(value = "鐢熸垚鏈�缁堝勾搴︽姤鍛�")
+    @GetMapping("/finalReportSpotCheckYear")
+    public Result finalReportSpotCheckYear(Integer yearId, HttpServletResponse response) {
+        return Result.success(finishProductSpotCheckService.finalReportSpotCheckYear(yearId, response));
+    }
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
index b3a36ef..c2d04ee 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
@@ -1,4 +1,4 @@
-package com.ruoyi.basic.controller;
+package com.ruoyi.inspect.controller;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsUnqualifiedHandlerController.java b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsUnqualifiedHandlerController.java
new file mode 100644
index 0000000..035e565
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsUnqualifiedHandlerController.java
@@ -0,0 +1,139 @@
+package com.ruoyi.inspect.controller;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.oa.OAProcess;
+import com.ruoyi.inspect.dto.PushOADto;
+import com.ruoyi.inspect.dto.UnqualifiedHandlerDto;
+import com.ruoyi.inspect.pojo.InsUnqualifiedHandlerFile;
+import com.ruoyi.inspect.service.InsUnqualifiedHandlerFileService;
+import com.ruoyi.inspect.service.InsUnqualifiedHandlerService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+@Api("涓嶅悎鏍煎鐞嗙鐞�")
+@RequestMapping("/unqualifiedHandler")
+@AllArgsConstructor
+@Slf4j
+public class InsUnqualifiedHandlerController {
+
+    private final InsUnqualifiedHandlerService unqualifiedHandlerService;
+    private final InsUnqualifiedHandlerFileService unqualifiedHandlerFileService;
+    private static final String REQUESTID = "requestId";
+    private static final String CHECKRESULT = "CHECKRESULT";
+
+
+
+
+    @ApiOperation(value = "鎻愪氦OA")
+    @PostMapping("/pushOA")
+    public Result pushOA(@RequestBody PushOADto pushOADto){
+        return unqualifiedHandlerService.pushOA(pushOADto);
+    }
+
+
+    @ApiOperation(value = "鏌ヨ")
+    @GetMapping("/page")
+    public Result pageByUnqualified(Page page, UnqualifiedHandlerDto unqualifiedHandlerDto){
+        return Result.success(unqualifiedHandlerService.pageList(page, unqualifiedHandlerDto));
+    }
+
+
+
+    @ApiOperation(value = "闄勪欢涓婁紶")
+    @PostMapping("/uploadFileByUnqualified")
+    public Result<?> uploadFileByUnqualified(Long handlerId, MultipartFile file) {
+        return Result.success(unqualifiedHandlerFileService.uploadFile(handlerId, file));
+    }
+
+
+    @ApiOperation(value = "涓嶅悎鏍煎鐞哋A鍥炶皟")
+    @RequestMapping(value = "/callback", produces = "text/plain")
+    public String unqualifiedHandlerOACallback(String data){
+        String msg = OAProcess.oaReturnMsg(0, "success");
+        JSONObject json = JSONObject.parseObject(data);
+        System.out.println("========>" + json);
+        try {
+            Long oaWorkId = json.getLong(REQUESTID);
+            String checkResult = json.getString(CHECKRESULT);
+            Object o = json.get("workflowRequestLogs");
+            JSONArray objects = JSONArray.parseArray(JSONObject.toJSONString(o));
+            unqualifiedHandlerService.unqualifiedHandlerOACallback(oaWorkId, checkResult,objects);
+        } catch (Exception e) {
+            System.out.println(e.getMessage());
+            msg = OAProcess.oaReturnMsg(1, "oa鍥炶皟澶辫触: " + e.getMessage());
+        }
+        System.out.println("oa鍥炶皟杩斿洖缁撴灉========>" + msg);
+        return msg;
+    }
+
+    /**
+     * 涓嬭浇oa闄勪欢
+     * @param handlerFileId
+     * @param response
+     */
+    @GetMapping("/downloadOAFile/{handlerFileId}")
+    public void downloadOAFile(@PathVariable("handlerFileId") Long handlerFileId, HttpServletResponse response){
+        unqualifiedHandlerFileService.downloadOAFile(handlerFileId,response);
+    }
+
+
+    @ApiOperation(value = "鏂板涓嶅悎鏍煎鐞�")
+    @PostMapping("/addUnqualifiedHandler")
+    public Result addUnqualifiedHandler(@RequestBody UnqualifiedHandlerDto unqualifiedHandlerDto){
+        return Result.success(unqualifiedHandlerService.addUnqualifiedHandler(unqualifiedHandlerDto));
+    }
+
+
+    @ApiOperation(value = "缂栬緫涓嶅悎鏍煎鐞�")
+    @PostMapping("/updateUnqualifiedHandler")
+    public Result updateUnqualifiedHandler(@RequestBody UnqualifiedHandlerDto unqualifiedHandlerDto){
+        return Result.success(unqualifiedHandlerService.updateUnqualifiedHandler(unqualifiedHandlerDto));
+    }
+
+
+    @ApiOperation(value = "鏌ョ湅oa娴佺▼")
+    @GetMapping("/getOaFlow")
+    public Result getOaFlow(Integer id){
+        return Result.success(unqualifiedHandlerService.getOaFlow(id));
+    }
+
+
+
+    @ApiOperation(value = "鏌ョ湅涓嶅悎鏍煎鐞嗙晫闈�")
+    @GetMapping("/getUnqualifiedHandler")
+    public Result getUnqualifiedHandler(Integer id){
+        return Result.success(unqualifiedHandlerService.getUnqualifiedHandler(id));
+    }
+
+
+    @ApiOperation(value = "鍒犻櫎涓嶅悎鏍煎鐞�")
+    @DeleteMapping("/deleteUnqualifiedHandler")
+    public Result deleteUnqualifiedHandler(Integer id) {
+        return Result.success(unqualifiedHandlerService.deleteUnqualifiedHandler(id));
+    }
+
+
+    @ApiOperation(value = "涓嬭浇闄勪欢")
+    @GetMapping("/downFile")
+    public Result<?> oaDownFile(Integer id) {
+        InsUnqualifiedHandlerFile insUnqualifiedHandlerFile = unqualifiedHandlerFileService.getById(id);
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("type", insUnqualifiedHandlerFile.getType());
+        map.put("fileUrl", insUnqualifiedHandlerFile.getFileUrl());
+        return Result.success(map);
+    }
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/dto/PushOADto.java b/inspect-server/src/main/java/com/ruoyi/inspect/dto/PushOADto.java
new file mode 100644
index 0000000..3fabfcd
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/dto/PushOADto.java
@@ -0,0 +1,24 @@
+package com.ruoyi.inspect.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 鎻愪氦oa鏁版嵁浼犺緭瀵硅薄
+ */
+@Data
+public class PushOADto {
+
+    /**
+     * 涓嶅悎鏍煎鐞嗕富閿甶d
+     */
+    @ApiModelProperty(value = "涓嶅悎鏍煎鐞嗕富閿甶d")
+    private Long handlerId;
+
+    /**
+     * 闄勪欢url
+     */
+    @ApiModelProperty(value = "闄勪欢url")
+    private String fileUrl;
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/dto/SpotCheckQuarterDto.java b/inspect-server/src/main/java/com/ruoyi/inspect/dto/SpotCheckQuarterDto.java
new file mode 100644
index 0000000..9e9f82a
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/dto/SpotCheckQuarterDto.java
@@ -0,0 +1,22 @@
+package com.ruoyi.inspect.dto;
+
+import com.ruoyi.inspect.pojo.SpotCheckQuarter;
+import com.ruoyi.inspect.pojo.SpotCheckQuarterItem;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author zhuo
+ * @Date 2024/10/10
+ */
+@Data
+public class SpotCheckQuarterDto extends SpotCheckQuarter {
+
+    @ApiModelProperty("瀛e害鎶芥璇︽儏")
+    private List<SpotCheckQuarterItem> quarterItems;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    private String createUserName;
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/dto/SpotCheckYearDto.java b/inspect-server/src/main/java/com/ruoyi/inspect/dto/SpotCheckYearDto.java
new file mode 100644
index 0000000..339f059
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/dto/SpotCheckYearDto.java
@@ -0,0 +1,22 @@
+package com.ruoyi.inspect.dto;
+
+import com.ruoyi.inspect.pojo.SpotCheckYear;
+import com.ruoyi.inspect.pojo.SpotCheckYearItem;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author zhuo
+ * @Date 2024/10/10
+ */
+@Data
+public class SpotCheckYearDto extends SpotCheckYear {
+
+    @ApiModelProperty("骞村害鎶芥牱璇︽儏")
+    private List<SpotCheckYearItem> yearItems;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    private String createUserName;
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/CommonOaMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/CommonOaMapper.java
new file mode 100644
index 0000000..41725f2
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/CommonOaMapper.java
@@ -0,0 +1,20 @@
+package com.ruoyi.inspect.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.inspect.pojo.CommonOa;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @author 27233
+* @description 閽堝琛ㄣ�恈ommon_oa(oa瀹℃牳娴佺▼淇℃伅璁板綍琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2024-08-01 15:54:11
+* @Entity com.yuanchu.mom.pojo.CommonOa
+*/
+@Mapper
+public interface CommonOaMapper extends BaseMapper<CommonOa> {
+
+}
+
+
+
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnqualifiedHandlerFileMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnqualifiedHandlerFileMapper.java
new file mode 100644
index 0000000..49c401b
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnqualifiedHandlerFileMapper.java
@@ -0,0 +1,20 @@
+package com.ruoyi.inspect.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.inspect.pojo.InsUnqualifiedHandlerFile;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @author 27233
+* @description 閽堝琛ㄣ�恑ns_unqualified_handler_file(涓嶅悎鏍煎鐞嗛檮浠惰褰曡〃)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2024-07-31 13:38:38
+* @Entity com.yuanchu.mom.pojo.InsUnqualifiedHandlerFile
+*/
+@Mapper
+public interface InsUnqualifiedHandlerFileMapper extends BaseMapper<InsUnqualifiedHandlerFile> {
+
+}
+
+
+
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/SpotCheckQuarterMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/SpotCheckQuarterMapper.java
new file mode 100644
index 0000000..2bd8b27
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/SpotCheckQuarterMapper.java
@@ -0,0 +1,39 @@
+package com.ruoyi.inspect.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.inspect.dto.SpotCheckQuarterDto;
+import com.ruoyi.inspect.pojo.SpotCheckQuarter;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 瀛e害鎶芥牱璁″垝
+ *
+ * @author zhuo
+ * @since 2024-10-09
+ */
+@Mapper
+public interface SpotCheckQuarterMapper extends BaseMapper<SpotCheckQuarter> {
+
+    /**
+     * 瀛e害鎶芥牱鍒嗛〉鏌ヨ
+     * @param page
+     * @param ew
+     * @return
+     */
+    IPage<SpotCheckQuarterDto> getQuarterPage(Page page, @Param("ew") QueryWrapper<SpotCheckQuarterDto> ew);
+
+    /**
+     * 鎴愬搧涓嬪崟鐣岄潰鏌ヨ瀛e害淇℃伅
+     * @return
+     */
+    List<Map<String, Object>> getQuarterOnOrder();
+
+}
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/SpotCheckYearItemMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/SpotCheckYearItemMapper.java
new file mode 100644
index 0000000..241deef
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/SpotCheckYearItemMapper.java
@@ -0,0 +1,17 @@
+package com.ruoyi.inspect.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.inspect.pojo.SpotCheckYearItem;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 骞村害鎶芥牱璁″垝璇︽儏琛�
+ *
+ * @author zhuo
+ * @since 2024-10-10
+ */
+@Mapper
+public interface SpotCheckYearItemMapper extends BaseMapper<SpotCheckYearItem> {
+
+}
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/SpotCheckYearMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/SpotCheckYearMapper.java
new file mode 100644
index 0000000..c72196d
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/SpotCheckYearMapper.java
@@ -0,0 +1,30 @@
+package com.ruoyi.inspect.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.inspect.dto.SpotCheckYearDto;
+import com.ruoyi.inspect.pojo.SpotCheckYear;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 骞村害鎶芥牱璁″垝
+ *
+ * @author zhuo
+ * @since 2024-10-10
+ */
+@Mapper
+public interface SpotCheckYearMapper extends BaseMapper<SpotCheckYear> {
+
+    /**
+     * 鏌ヨ骞村害鎶芥牱鍒楄〃
+     * @param page
+     * @param ew
+     * @return
+     */
+    IPage<SpotCheckYearDto> getSpotCheckYearPage(Page page, @Param("ew") QueryWrapper<SpotCheckYearDto> ew);
+
+}
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/CommonOaService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/CommonOaService.java
new file mode 100644
index 0000000..63f6a51
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/CommonOaService.java
@@ -0,0 +1,13 @@
+package com.ruoyi.inspect.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.inspect.pojo.CommonOa;
+
+/**
+* @author 27233
+* @description 閽堝琛ㄣ�恈ommon_oa(oa瀹℃牳娴佺▼淇℃伅璁板綍琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice
+* @createDate 2024-08-01 15:54:11
+*/
+public interface CommonOaService extends IService<CommonOa> {
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/FinishProductSpotCheckService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/FinishProductSpotCheckService.java
new file mode 100644
index 0000000..437b084
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/FinishProductSpotCheckService.java
@@ -0,0 +1,126 @@
+package com.ruoyi.inspect.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.inspect.dto.IfsStockQueryDTO;
+import com.ruoyi.inspect.dto.SpotCheckQuarterDto;
+import com.ruoyi.inspect.dto.SpotCheckYearDto;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鎴愬搧鎶芥牱
+ *
+ * @Author zhuo
+ * @Date 2024/9/29
+ */
+public interface FinishProductSpotCheckService {
+
+    /**
+     * 鏌ヨifs鎴愬搧搴撳瓨
+     *
+     * @return
+     */
+    Result getIfsStockReport(IfsStockQueryDTO ifsStockQueryDTO);
+
+
+    /*******************************************************  瀛e害鎶芥牱 *******************************************************/
+
+    /**
+     * 鏂板瀛e害鎶芥
+     * @param spotCheckQuarterDto
+     * @return
+     */
+    boolean addQuarter(SpotCheckQuarterDto spotCheckQuarterDto);
+
+    /**
+     * 鏌ヨ瀛e害鎶芥牱璇︽儏
+     * @param quarterId
+     * @return
+     */
+    SpotCheckQuarterDto getQuarter(Integer quarterId);
+
+    /**
+     * 瀛e害鎶芥牱鍒嗛〉鏌ヨ
+     * @param page
+     * @param spotCheckQuarter
+     * @return
+     */
+    IPage<SpotCheckQuarterDto> getQuarterPage(Page page, SpotCheckQuarterDto spotCheckQuarter);
+
+    /**
+     * 鍒犻櫎瀛e害鎶芥牱
+     * @param quarterId
+     * @return
+     */
+    boolean deleteQuarter(Integer quarterId);
+
+    /**
+     * 鎴愬搧涓嬪崟鐣岄潰鏌ヨ瀛e害淇℃伅
+     * @return
+     */
+    List<Map<String, Object>> getQuarterOnOrder();
+
+    /**
+     * 淇敼瀛e害妫�楠�
+     * @param spotCheckQuarterDto
+     * @return
+     */
+    boolean updateQuarterOnOrder(SpotCheckQuarterDto spotCheckQuarterDto);
+
+    /**
+     * 鐢熸垚鏈�缁堟姤鍛�
+     * @param quarterId
+     * @return
+     */
+    boolean finalReportQuarter(Integer quarterId, HttpServletResponse response);
+
+
+    /*******************************************************  骞村害鎶芥牱 *******************************************************/
+
+    /**
+     * 鏂板骞村害鎶芥牱
+     * @param spotCheckYearDto
+     * @return
+     */
+    boolean addSpotCheckYear(SpotCheckYearDto spotCheckYearDto);
+
+    /**
+     * 鏌ヨ骞村害鎶芥牱璇︽儏
+     * @param yearId
+     * @return
+     */
+    SpotCheckYearDto getSpotCheckYear(Integer yearId);
+
+    /**
+     * 骞村害鎶芥牱鍒楄〃
+     * @param page
+     * @param spotCheckYear
+     * @return
+     */
+    IPage<SpotCheckYearDto> getSpotCheckYearPage(Page page, SpotCheckYearDto spotCheckYear);
+
+    /**
+     * 鍒犻櫎骞村害鎶芥牱
+     * @param yearId
+     * @return
+     */
+    boolean deleteSpotCheckYear(Integer yearId);
+
+    /**
+     * 淇敼骞村害妫�楠�
+     * @param spotCheckYearDto
+     * @return
+     */
+    boolean updateSpotCheckYear(SpotCheckYearDto spotCheckYearDto);
+
+    /**
+     * 鐢熸垚鏈�缁堝勾搴︽姤鍛�
+     * @param yearId
+     * @return
+     */
+    boolean finalReportSpotCheckYear(Integer yearId, HttpServletResponse response);
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsUnqualifiedHandlerFileService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsUnqualifiedHandlerFileService.java
new file mode 100644
index 0000000..3f3825b
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsUnqualifiedHandlerFileService.java
@@ -0,0 +1,19 @@
+package com.ruoyi.inspect.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.inspect.pojo.InsUnqualifiedHandlerFile;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+* @author 27233
+* @description 閽堝琛ㄣ�恑ns_unqualified_handler_file(涓嶅悎鏍煎鐞嗛檮浠惰褰曡〃)銆戠殑鏁版嵁搴撴搷浣淪ervice
+* @createDate 2024-07-31 13:38:38
+*/
+public interface InsUnqualifiedHandlerFileService extends IService<InsUnqualifiedHandlerFile> {
+
+    InsUnqualifiedHandlerFile uploadFile(Long handlerId, MultipartFile file);
+
+    void downloadOAFile(Long handlerFileId, HttpServletResponse response);
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsUnqualifiedHandlerService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsUnqualifiedHandlerService.java
new file mode 100644
index 0000000..038a284
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsUnqualifiedHandlerService.java
@@ -0,0 +1,39 @@
+package com.ruoyi.inspect.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.inspect.dto.PushOADto;
+import com.ruoyi.inspect.dto.UnqualifiedHandlerDto;
+import com.ruoyi.inspect.pojo.CommonOa;
+import com.ruoyi.inspect.pojo.InsUnqualifiedHandler;
+import com.ruoyi.inspect.vo.UnqualifiedHandlerVO;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+* @author 27233
+* @description 閽堝琛ㄣ�恑ns_unqualified_handler(涓嶅悎鏍煎鐞嗚〃)銆戠殑鏁版嵁搴撴搷浣淪ervice
+* @createDate 2024-07-31 13:38:14
+*/
+public interface InsUnqualifiedHandlerService extends IService<InsUnqualifiedHandler> {
+
+    IPage<UnqualifiedHandlerVO> pageList(Page page, UnqualifiedHandlerDto unqualifiedHandlerDto);
+
+    Result pushOA(PushOADto pushOADto);
+
+    void unqualifiedHandlerOACallback(Long oaWorkId, String checkResult, JSONArray objects);
+
+    List<CommonOa> getOaFlow(Integer id);
+
+    boolean addUnqualifiedHandler(UnqualifiedHandlerDto unqualifiedHandlerDto);
+
+    boolean updateUnqualifiedHandler(UnqualifiedHandlerDto unqualifiedHandlerDto);
+
+    UnqualifiedHandlerDto getUnqualifiedHandler(Integer id);
+
+    boolean deleteUnqualifiedHandler(Integer id);
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/SpotCheckQuarterItemService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/SpotCheckQuarterItemService.java
new file mode 100644
index 0000000..9490f3d
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/SpotCheckQuarterItemService.java
@@ -0,0 +1,15 @@
+package com.ruoyi.inspect.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.inspect.pojo.SpotCheckQuarterItem;
+
+/**
+ * 瀛e害鎶芥牱璁″垝璇︽儏琛�
+ *
+ * @author zhuo
+ * @since 2024-10-09
+ */
+public interface SpotCheckQuarterItemService extends IService<SpotCheckQuarterItem> {
+
+}
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/SpotCheckYearItemService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/SpotCheckYearItemService.java
new file mode 100644
index 0000000..c9086d0
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/SpotCheckYearItemService.java
@@ -0,0 +1,15 @@
+package com.ruoyi.inspect.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.inspect.pojo.SpotCheckYearItem;
+
+/**
+ * 骞村害鎶芥牱璁″垝璇︽儏琛�
+ *
+ * @author zhuo
+ * @since 2024-10-10
+ */
+public interface SpotCheckYearItemService extends IService<SpotCheckYearItem> {
+
+}
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/CommonOaServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/CommonOaServiceImpl.java
new file mode 100644
index 0000000..0ef57c2
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/CommonOaServiceImpl.java
@@ -0,0 +1,22 @@
+package com.ruoyi.inspect.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.inspect.mapper.CommonOaMapper;
+import com.ruoyi.inspect.pojo.CommonOa;
+import com.ruoyi.inspect.service.CommonOaService;
+import org.springframework.stereotype.Service;
+
+/**
+* @author 27233
+* @description 閽堝琛ㄣ�恈ommon_oa(oa瀹℃牳娴佺▼淇℃伅璁板綍琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+* @createDate 2024-08-01 15:54:11
+*/
+@Service
+public class CommonOaServiceImpl extends ServiceImpl<CommonOaMapper, CommonOa>
+    implements CommonOaService {
+
+}
+
+
+
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/FinishProductSpotCheckServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/FinishProductSpotCheckServiceImpl.java
new file mode 100644
index 0000000..8d7d884
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/FinishProductSpotCheckServiceImpl.java
@@ -0,0 +1,679 @@
+package com.ruoyi.inspect.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.deepoove.poi.data.Pictures;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.DateImageUtil;
+import com.ruoyi.common.utils.IfsApiUtils;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.dto.IfsStockQueryDTO;
+import com.ruoyi.inspect.dto.SpotCheckQuarterDto;
+import com.ruoyi.inspect.dto.SpotCheckYearDto;
+import com.ruoyi.inspect.mapper.SpotCheckQuarterMapper;
+import com.ruoyi.inspect.mapper.SpotCheckYearMapper;
+import com.ruoyi.inspect.pojo.SpotCheckQuarter;
+import com.ruoyi.inspect.pojo.SpotCheckQuarterItem;
+import com.ruoyi.inspect.pojo.SpotCheckYear;
+import com.ruoyi.inspect.pojo.SpotCheckYearItem;
+import com.ruoyi.inspect.service.FinishProductSpotCheckService;
+import com.ruoyi.inspect.service.SpotCheckQuarterItemService;
+import com.ruoyi.inspect.service.SpotCheckYearItemService;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 鎴愬搧鎶芥牱
+ *
+ * @Author zhuo
+ * @Date 2024/9/29
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class FinishProductSpotCheckServiceImpl implements FinishProductSpotCheckService {
+
+    @Resource
+    private IfsApiUtils ifsApiUtils;
+    @Resource
+    private SpotCheckQuarterMapper spotCheckQuarterMapper;
+    @Resource
+    private SpotCheckQuarterItemService spotCheckQuarterItemService;
+    @Resource
+    private SpotCheckYearMapper spotCheckYearMapper;
+    @Resource
+    private SpotCheckYearItemService spotCheckYearItemService;
+    @Value("${wordUrl}")
+    private String wordUrl;
+    @Value("${file.path}")
+    private String imgUrl;
+    @Resource
+    private UserMapper userMapper;
+
+
+    public Result getIfsStockReport(IfsStockQueryDTO ifsStockQueryDTO) {
+        JSONObject jresult = new JSONObject();
+        jresult.put("total", 0);
+        jresult.put("count", 0);
+        jresult.put("data", new JSONArray());
+        JSONObject jsonObject = new JSONObject();
+        generateIfsStockQueryParams(jsonObject, ifsStockQueryDTO, ifsStockQueryDTO.getPage(), ifsStockQueryDTO.getLimit());
+        Result result = ifsApiUtils.getIfsStock(jsonObject.toJSONString());
+        if (result.getCode() == 200) {
+            JSONObject data = (JSONObject) JSON.toJSON(result.getData());
+            JSONArray array = new JSONArray();
+            for (int i = 0; i < data.getJSONArray("LIST_INFO").size(); i++) {
+                JSONObject listInfo = data.getJSONArray("LIST_INFO").getJSONObject(i);
+                array.add(listInfo);
+            }
+            //鑾峰彇鎬绘暟閲�
+            int count = data.getIntValue("TOTAL_RECORD");
+            //鑾峰彇椤垫暟
+            int total = (int) Math.ceil((double) count / (double) ifsStockQueryDTO.getLimit());
+            jresult.put("total", total);
+            jresult.put("count", count);
+            jresult.put("data", array);
+        }
+        return Result.success(jresult);
+    }
+
+    public void generateIfsStockQueryParams(JSONObject result, IfsStockQueryDTO ifsStockQueryDTO, Long pageNo, Long pageSize) {
+        result.put("PAGE", pageNo);
+        result.put("LIMIT", pageSize);
+        result.put("WAREHOUSE", "鎴愬搧浠撳簱");
+        result.put("QUANTITY_FLAG", ">0");
+        //琛ㄩ噷闈㈢殑OTC琛屽彿
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getCotcOrderNo())) {
+            result.put("C_OTC_ORDER_NO", ifsStockQueryDTO.getCotcOrderNo());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getCotcLineNo())) {
+            result.put("C_OTC_LINE_NO", ifsStockQueryDTO.getCotcLineNo());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getPartNo())) {
+            result.put("PART_NO", ifsStockQueryDTO.getPartNo());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getPartDescription())) {
+            result.put("PART_DESC", "%" + ifsStockQueryDTO.getPartDescription() + "%");
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getLocNo())) {
+            result.put("LOCATION_NO", ifsStockQueryDTO.getLocNo());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getLocDesc())) {
+            result.put("LOCATION_DESC", ifsStockQueryDTO.getLocDesc());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getLotBatchNo())) {
+            result.put("LOT_BATCH_NO", ifsStockQueryDTO.getLotBatchNo());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getWdrNo())) {
+            result.put("WDR_NO", ifsStockQueryDTO.getWdrNo());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getWarehouse())) {
+            result.put("WAREHOUSE", ifsStockQueryDTO.getWarehouse());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getLocationGroup())) {
+            result.put("LOCATION_GROUP", ifsStockQueryDTO.getLocationGroup());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getLocationGroupDesc())) {
+            result.put("LOCATION_GROUP_DESC", ifsStockQueryDTO.getLocationGroupDesc());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getReelNumber())) {
+            result.put("ATTR1", ifsStockQueryDTO.getReelNumber());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getStartMeter())) {
+            result.put("ATTR2", ifsStockQueryDTO.getStartMeter());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getEndMeter())) {
+            result.put("ATTR3", ifsStockQueryDTO.getEndMeter());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getOuterColor())) {
+            result.put("ATTR4", ifsStockQueryDTO.getOuterColor());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getInsulationColor())) {
+            result.put("ATTR5", ifsStockQueryDTO.getInsulationColor());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getOtcOrderNo())) {
+            result.put("ATTR6", ifsStockQueryDTO.getOtcOrderNo());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getMpsNo())) {
+            result.put("ATTR7", ifsStockQueryDTO.getMpsNo());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getLetteringInfo())) {
+            result.put("ATTR8", ifsStockQueryDTO.getLetteringInfo());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getSStockQuantity())) {
+            result.put("ATTR9", ifsStockQueryDTO.getSStockQuantity());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getSAvailableStockQuantity())) {
+            result.put("ATTR10", ifsStockQueryDTO.getSAvailableStockQuantity());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getSunit())) {
+            result.put("ATTR11", ifsStockQueryDTO.getSunit());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getStockSource())) {
+            result.put("ATTR12", ifsStockQueryDTO.getStockSource());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getInspInstorageTime())) {
+            result.put("ATTR13", ifsStockQueryDTO.getInspInstorageTime());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getTestRemark())) {
+            result.put("ATTR14", ifsStockQueryDTO.getTestRemark());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getGrossWeight())) {
+            result.put("ATTR15", ifsStockQueryDTO.getGrossWeight());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getNetWeight())) {
+            result.put("ATTR16", ifsStockQueryDTO.getNetWeight());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getPackingManner())) {
+            result.put("ATTR17", ifsStockQueryDTO.getPackingManner());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getCylinderNumber())) {
+            result.put("ATTR18", ifsStockQueryDTO.getCylinderNumber());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getRemark())) {
+            result.put("ATTR19", ifsStockQueryDTO.getRemark());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getLengthRequirement())) {
+            result.put("ATTR20", ifsStockQueryDTO.getLengthRequirement());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getCustomerName())) {
+            result.put("ATTR21", ifsStockQueryDTO.getCustomerName());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getSystemNo())) {
+            result.put("ATTR22", ifsStockQueryDTO.getSystemNo());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getInSource())) {
+            result.put("ATTR23", ifsStockQueryDTO.getInSource());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getSplitQuality())) {
+            result.put("ATTR24", ifsStockQueryDTO.getSplitQuality());
+        }
+        if (StrUtil.isNotBlank(ifsStockQueryDTO.getReserveQuantity())) {
+            result.put("QTY_RESERVED", ifsStockQueryDTO.getReserveQuantity());
+        }
+    }
+
+    /************************************************* 瀛e害鎶芥牱 ***********************************************************/
+
+    /**
+     * 鏂板瀛e害鎶芥
+     * @param spotCheckQuarterDto
+     * @return
+     */
+    @Override
+    public boolean addQuarter(SpotCheckQuarterDto spotCheckQuarterDto) {
+        // 鏍规嵁缂栧彿鏌ヨ涔嬪墠鐨�
+        SpotCheckQuarter spotCheckQuarter = spotCheckQuarterMapper.selectOne(Wrappers.<SpotCheckQuarter>lambdaQuery()
+                .eq(SpotCheckQuarter::getQuarterNo, spotCheckQuarterDto.getQuarterNo())
+                .orderByDesc(SpotCheckQuarter::getCreateTime)
+                .last("limit 1"));
+        if (spotCheckQuarter == null) {
+            spotCheckQuarterMapper.insert(spotCheckQuarterDto);
+            // 娣诲姞璇︽儏
+            for (SpotCheckQuarterItem quarterItem : spotCheckQuarterDto.getQuarterItems()) {
+                quarterItem.setQuarterId(spotCheckQuarterDto.getQuarterId());
+            }
+            spotCheckQuarterItemService.saveBatch(spotCheckQuarterDto.getQuarterItems());
+        } else {
+            // 绱姞璇︽儏
+            for (SpotCheckQuarterItem quarterItem : spotCheckQuarterDto.getQuarterItems()) {
+                quarterItem.setQuarterId(spotCheckQuarter.getQuarterId());
+            }
+            spotCheckQuarterItemService.saveBatch(spotCheckQuarterDto.getQuarterItems());
+        }
+
+        return true;
+    }
+
+    /**
+     * 鏌ヨ瀛e害鎶芥牱璇︽儏
+     * @param quarterId
+     * @return
+     */
+    @Override
+    public SpotCheckQuarterDto getQuarter(Integer quarterId) {
+        SpotCheckQuarter spotCheckQuarter = spotCheckQuarterMapper.selectById(quarterId);
+
+        // 鏌ヨ璇︽儏
+        List<SpotCheckQuarterItem> list = spotCheckQuarterItemService.list(Wrappers.<SpotCheckQuarterItem>lambdaQuery()
+                .eq(SpotCheckQuarterItem::getQuarterId, spotCheckQuarter.getQuarterId()));
+        SpotCheckQuarterDto spotCheckQuarterDto = new SpotCheckQuarterDto();
+        BeanUtil.copyProperties(spotCheckQuarter, spotCheckQuarterDto);
+        spotCheckQuarterDto.setQuarterItems(list);
+
+        return spotCheckQuarterDto;
+    }
+
+    /**
+     * 瀛e害鎶芥牱鍒嗛〉鏌ヨ
+     * @param page
+     * @param spotCheckQuarter
+     * @return
+     */
+    @Override
+    public IPage<SpotCheckQuarterDto> getQuarterPage(Page page, SpotCheckQuarterDto spotCheckQuarter) {
+        return spotCheckQuarterMapper.getQuarterPage(page, QueryWrappers.queryWrappers(spotCheckQuarter));
+    }
+
+    /**
+     * 鍒犻櫎瀛e害鎶芥牱
+     * @param quarterId
+     * @return
+     */
+    @Override
+    public boolean deleteQuarter(Integer quarterId) {
+        spotCheckQuarterMapper.deleteById(quarterId);
+        spotCheckQuarterItemService.remove(Wrappers.<SpotCheckQuarterItem>lambdaQuery()
+                .eq(SpotCheckQuarterItem::getQuarterId, quarterId));
+        return true;
+    }
+
+    /**
+     * 鎴愬搧涓嬪崟鐣岄潰鏌ヨ瀛e害淇℃伅
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> getQuarterOnOrder() {
+        List<Map<String, Object>> quarterOnOrder = spotCheckQuarterMapper.getQuarterOnOrder();
+        for (Map<String, Object> stringMap : quarterOnOrder) {
+            List<SpotCheckQuarterItem> list = spotCheckQuarterItemService.list(Wrappers.<SpotCheckQuarterItem>lambdaQuery()
+                    .eq(SpotCheckQuarterItem::getQuarterId, (Integer) stringMap.get("value")));
+            List<Map<String, Object>> itemMaps = list.stream().map(spotCheckQuarterItem -> {
+                Map<String, Object> map = new HashMap<>();
+                map.put("value", spotCheckQuarterItem.getQuarterItemId());
+                map.put("label", spotCheckQuarterItem.getProductModel() + " "
+                        + spotCheckQuarterItem.getProductType() + " "
+                        + spotCheckQuarterItem.getSpotCheckNumber());
+                return map;
+            }).collect(Collectors.toList());
+            stringMap.put("children", itemMaps);
+
+        }
+
+        return quarterOnOrder;
+    }
+
+    /**
+     * 淇敼瀛e害妫�楠�
+     * @param spotCheckQuarterDto
+     * @return
+     */
+    @Override
+    public boolean updateQuarterOnOrder(SpotCheckQuarterDto spotCheckQuarterDto) {
+        if (CollectionUtils.isNotEmpty(spotCheckQuarterDto.getQuarterItems())) {
+            // 娓呴櫎涔嬪墠璇︽儏
+            spotCheckQuarterItemService.remove(Wrappers.<SpotCheckQuarterItem>lambdaQuery()
+                    .eq(SpotCheckQuarterItem::getQuarterId, spotCheckQuarterDto.getQuarterId()));
+            // 娣诲姞璇︽儏
+            for (SpotCheckQuarterItem quarterItem : spotCheckQuarterDto.getQuarterItems()) {
+                quarterItem.setQuarterId(spotCheckQuarterDto.getQuarterId());
+            }
+            spotCheckQuarterItemService.saveBatch(spotCheckQuarterDto.getQuarterItems());
+        }
+
+        spotCheckQuarterMapper.updateById(spotCheckQuarterDto);
+        return true;
+    }
+
+    /**
+     * 鐢熸垚鏈�缁堟姤鍛�
+     * @param quarterId
+     * @return
+     */
+    @Override
+    public boolean finalReportQuarter(Integer quarterId, HttpServletResponse response) {
+        // 娣诲姞鎶ュ憡淇℃伅
+        SpotCheckQuarter spotCheckQuarter = spotCheckQuarterMapper.selectById(quarterId);
+
+        // 鏌ヨ璇︽儏
+        List<SpotCheckQuarterItem> itemList = spotCheckQuarterItemService.list(Wrappers.<SpotCheckQuarterItem>lambdaQuery()
+                .eq(SpotCheckQuarterItem::getQuarterId, spotCheckQuarter.getQuarterId()));
+
+        for (SpotCheckQuarterItem spotCheckQuarterItem : itemList) {
+            // 鎷兼帴鍨嬪彿鍜屾暟閲�
+            spotCheckQuarterItem.setSpotCheckNumber((StringUtils.isBlank(spotCheckQuarterItem.getProductModel()) ? "" : spotCheckQuarterItem.getProductModel()) +
+                    (StringUtils.isBlank(spotCheckQuarterItem.getSpotCheckNumber()) ? "" : spotCheckQuarterItem.getSpotCheckNumber()));
+        }
+
+        //缂栧埗浜�
+        String writeUrl = null;
+        if (spotCheckQuarter.getWriteUser() != null) {
+            try {
+                writeUrl = userMapper.selectById(spotCheckQuarter.getWriteUser()).getSignatureUrl();
+            } catch (Exception e) {
+                throw new ErrorException("鎵句笉鍒扮紪鍒朵汉鐨勭鍚�");
+            }
+            if (StrUtil.isBlank(writeUrl)) {
+                throw new ErrorException("鎵句笉鍒扮紪鍒朵汉鐨勭鍚�");
+            }
+        }
+
+        // 鍒濆鍖栨墍鏈夌殑 countersignUrl 鍙橀噺
+        String[] countersignUrls = new String[7];
+
+        // 濡傛灉 spotCheckQuarter.getCountersignUser() 涓嶆槸绌烘垨绌虹櫧瀛楃涓�
+        if (StrUtil.isNotBlank(spotCheckQuarter.getCountersignUser())) {
+            String[] split = spotCheckQuarter.getCountersignUser().split(",");
+
+            // 閬嶅巻 split 鏁扮粍锛屽苟灏嗗厓绱犱緷娆¤祴鍊肩粰 countersignUrls 鏁扮粍
+            for (int i = 0; i < Math.min(split.length, countersignUrls.length); i++) {
+
+                String countersignUrl = null;
+                try {
+                    countersignUrl = userMapper.selectById(Integer.parseInt(split[i])).getSignatureUrl();
+                } catch (Exception e) {
+                    throw new ErrorException("鎵句笉鍒扮紪鍒朵汉鐨勭鍚�");
+                }
+                if (StrUtil.isBlank(countersignUrl)) {
+                    throw new ErrorException("鎵句笉鍒扮紪鍒朵汉鐨勭鍚�");
+                }
+
+                countersignUrls[i] = countersignUrl;
+            }
+        }
+
+        // 灏� countersignUrls 鏁扮粍涓殑鍊间緷娆¤祴鍊肩粰 countersignUrl1 鍒� countersignUrl7
+        String countersignUrl1 = countersignUrls[0];
+        String countersignUrl2 = countersignUrls[1];
+        String countersignUrl3 = countersignUrls[2];
+        String countersignUrl4 = countersignUrls[3];
+        String countersignUrl5 = countersignUrls[4];
+        String countersignUrl6 = countersignUrls[5];
+        String countersignUrl7 = countersignUrls[6];
+
+        //瀹℃牳浜�
+        String examineUrl = null;
+        if (spotCheckQuarter.getExamineUser() != null) {
+            try {
+                examineUrl = userMapper.selectById(spotCheckQuarter.getExamineUser()).getSignatureUrl();
+            } catch (Exception e) {
+                throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+            }
+            if (StrUtil.isBlank(examineUrl)) {
+                throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+            }
+        }
+
+        //鎵瑰噯浜�
+        String ratifyUrl = null;
+        if (spotCheckQuarter.getRatifyUser() != null) {
+            try {
+                ratifyUrl = userMapper.selectById(spotCheckQuarter.getRatifyUser()).getSignatureUrl();
+            } catch (Exception e) {
+                throw new ErrorException("鎵句笉鍒版壒鍑嗕汉鐨勭鍚�");
+            }
+            if (StrUtil.isBlank(ratifyUrl)) {
+                throw new ErrorException("鎵句笉鍒版壒鍑嗕汉鐨勭鍚�");
+            }
+        }
+
+        String finalWriteUrl = writeUrl;
+        String finalExamineUrl = examineUrl;
+        String finalRatifyUrl = ratifyUrl;
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/spot_check_quarter.docx");
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("quarter", spotCheckQuarter);
+                    put("quarterItems", itemList);
+                    put("writeUrl", StrUtil.isBlank(finalWriteUrl) ? null :
+                            Pictures.ofLocal(imgUrl + "/" + finalWriteUrl).create());
+                    put("countersignUrl1", StrUtil.isBlank(countersignUrl1) ? null :
+                            Pictures.ofLocal(imgUrl + "/" + countersignUrl1).create());
+                    put("countersignUrl2", StrUtil.isBlank(countersignUrl2) ? null :
+                            Pictures.ofLocal(imgUrl + "/" + countersignUrl2).create());
+                    put("countersignUrl3", StrUtil.isBlank(countersignUrl3) ? null :
+                            Pictures.ofLocal(imgUrl + "/" + countersignUrl3).create());
+                    put("countersignUrl4", StrUtil.isBlank(countersignUrl4) ? null :
+                            Pictures.ofLocal(imgUrl + "/" + countersignUrl4).create());
+                    put("countersignUrl5", StrUtil.isBlank(countersignUrl5) ? null :
+                            Pictures.ofLocal(imgUrl + "/" + countersignUrl5).create());
+                    put("countersignUrl6", StrUtil.isBlank(countersignUrl6) ? null :
+                            Pictures.ofLocal(imgUrl + "/" + countersignUrl6).create());
+                    put("countersignUrl7", StrUtil.isBlank(countersignUrl7) ? null :
+                            Pictures.ofLocal(imgUrl + "/" + countersignUrl7).create());
+                    put("examineUrl", StrUtil.isBlank(finalExamineUrl) ? null :
+                            Pictures.ofLocal(imgUrl + "/" + finalExamineUrl).create());
+                    put("ratifyUrl", StrUtil.isBlank(finalRatifyUrl) ? null :
+                            Pictures.ofLocal(imgUrl + "/" + finalRatifyUrl).create());
+                    put("createDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(spotCheckQuarter.getCreateTime())).create());
+                }});
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    spotCheckQuarter.getQuarterNo() + "鎶芥牱璁″垝", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+        return true;
+    }
+
+
+    /******************************************************* 骞村害鎶芥牱  *************************************************************/
+
+    @Override
+    public boolean addSpotCheckYear(SpotCheckYearDto spotCheckYearDto) {
+        spotCheckYearMapper.insert(spotCheckYearDto);
+        // 璇︽儏
+        for (SpotCheckYearItem yearItem : spotCheckYearDto.getYearItems()) {
+            yearItem.setYearId(spotCheckYearDto.getYearId());
+        }
+        spotCheckYearItemService.saveBatch(spotCheckYearDto.getYearItems());
+        return true;
+    }
+
+    @Override
+    public SpotCheckYearDto getSpotCheckYear(Integer yearId) {
+        SpotCheckYear spotCheckYear = spotCheckYearMapper.selectById(yearId);
+
+        // 鏌ヨ璇︽儏
+        List<SpotCheckYearItem> list = spotCheckYearItemService.list(Wrappers.<SpotCheckYearItem>lambdaQuery()
+                .eq(SpotCheckYearItem::getYearId, spotCheckYear.getYearId()));
+        SpotCheckYearDto spotCheckYearDto = new SpotCheckYearDto();
+        BeanUtil.copyProperties(spotCheckYear, spotCheckYearDto);
+        spotCheckYearDto.setYearItems(list);
+
+        return spotCheckYearDto;
+    }
+
+    @Override
+    public IPage<SpotCheckYearDto> getSpotCheckYearPage(Page page, SpotCheckYearDto spotCheckYear) {
+        return spotCheckYearMapper.getSpotCheckYearPage(page, QueryWrappers.queryWrappers(spotCheckYear));
+    }
+
+    @Override
+    public boolean deleteSpotCheckYear(Integer yearId) {
+        spotCheckYearMapper.deleteById(yearId);
+        spotCheckYearItemService.remove(Wrappers.<SpotCheckYearItem>lambdaQuery()
+                .eq(SpotCheckYearItem::getYearId, yearId));
+        return true;
+    }
+
+    /**
+     * 淇敼骞村害妫�楠�
+     * @param spotCheckYearDto
+     * @return
+     */
+    @Override
+    public boolean updateSpotCheckYear(SpotCheckYearDto spotCheckYearDto) {
+        spotCheckYearMapper.updateById(spotCheckYearDto);
+
+        // 鍒犻櫎璇︽儏
+        spotCheckYearItemService.remove(Wrappers.<SpotCheckYearItem>lambdaQuery()
+                .eq(SpotCheckYearItem::getYearId, spotCheckYearDto.getYearId()));
+
+        // 閲嶆柊鏂板
+        for (SpotCheckYearItem yearItem : spotCheckYearDto.getYearItems()) {
+            yearItem.setYearId(spotCheckYearDto.getYearId());
+        }
+        spotCheckYearItemService.saveBatch(spotCheckYearDto.getYearItems());
+        return false;
+    }
+
+    @Override
+    public boolean finalReportSpotCheckYear(Integer yearId, HttpServletResponse response) {
+        SpotCheckYear spotCheckYear = spotCheckYearMapper.selectById(yearId);
+
+        // 鏌ヨ璇︽儏
+        List<SpotCheckYearItem> itemList = spotCheckYearItemService.list(Wrappers.<SpotCheckYearItem>lambdaQuery()
+                .eq(SpotCheckYearItem::getYearId, spotCheckYear.getYearId()));
+
+        //缂栧埗浜�
+        String writeUrl = null;
+        if (spotCheckYear.getWriteUser() != null) {
+            try {
+                writeUrl = userMapper.selectById(spotCheckYear.getWriteUser()).getSignatureUrl();
+            } catch (Exception e) {
+                throw new ErrorException("鎵句笉鍒扮紪鍒朵汉鐨勭鍚�");
+            }
+            if (StrUtil.isBlank(writeUrl)) {
+                throw new ErrorException("鎵句笉鍒扮紪鍒朵汉鐨勭鍚�");
+            }
+        }
+
+        // 鍒濆鍖栨墍鏈夌殑 countersignUrl 鍙橀噺
+        String[] countersignUrls = new String[7];
+
+        // 濡傛灉涓嶆槸绌烘垨绌虹櫧瀛楃涓�
+        if (StrUtil.isNotBlank(spotCheckYear.getCountersignUser())) {
+            String[] split = spotCheckYear.getCountersignUser().split(",");
+
+            // 閬嶅巻 split 鏁扮粍锛屽苟灏嗗厓绱犱緷娆¤祴鍊肩粰 countersignUrls 鏁扮粍
+            for (int i = 0; i < Math.min(split.length, countersignUrls.length); i++) {
+
+                String countersignUrl = null;
+                try {
+                    countersignUrl = userMapper.selectById(Integer.parseInt(split[i])).getSignatureUrl();
+                } catch (Exception e) {
+                    throw new ErrorException("鎵句笉鍒扮紪鍒朵汉鐨勭鍚�");
+                }
+                if (StrUtil.isBlank(countersignUrl)) {
+                    throw new ErrorException("鎵句笉鍒扮紪鍒朵汉鐨勭鍚�");
+                }
+
+                countersignUrls[i] = countersignUrl;
+            }
+        }
+
+        // 灏� countersignUrls 鏁扮粍涓殑鍊间緷娆¤祴鍊肩粰 countersignUrl1 鍒� countersignUrl7
+        String countersignUrl1 = countersignUrls[0];
+        String countersignUrl2 = countersignUrls[1];
+        String countersignUrl3 = countersignUrls[2];
+        String countersignUrl4 = countersignUrls[3];
+        String countersignUrl5 = countersignUrls[4];
+        String countersignUrl6 = countersignUrls[5];
+        String countersignUrl7 = countersignUrls[6];
+
+        //瀹℃牳浜�
+        String examineUrl = null;
+        if (spotCheckYear.getExamineUser() != null) {
+            try {
+                examineUrl = userMapper.selectById(spotCheckYear.getExamineUser()).getSignatureUrl();
+            } catch (Exception e) {
+                throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+            }
+            if (StrUtil.isBlank(examineUrl)) {
+                throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+            }
+        }
+
+        //鎵瑰噯浜�
+        String ratifyUrl = null;
+        if (spotCheckYear.getRatifyUser() != null) {
+            try {
+                ratifyUrl = userMapper.selectById(spotCheckYear.getRatifyUser()).getSignatureUrl();
+            } catch (Exception e) {
+                throw new ErrorException("鎵句笉鍒版壒鍑嗕汉鐨勭鍚�");
+            }
+            if (StrUtil.isBlank(ratifyUrl)) {
+                throw new ErrorException("鎵句笉鍒版壒鍑嗕汉鐨勭鍚�");
+            }
+        }
+
+        String finalWriteUrl = writeUrl;
+        String finalExamineUrl = examineUrl;
+        String finalRatifyUrl = ratifyUrl;
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/spot_check_year.docx");
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("year", spotCheckYear);
+                    put("yearItems", itemList);
+                    put("writeUrl", StrUtil.isBlank(finalWriteUrl) ? null :
+                            Pictures.ofLocal(imgUrl + "/" + finalWriteUrl).create());
+                    put("countersignUrl1", StrUtil.isBlank(countersignUrl1) ? null :
+                            Pictures.ofLocal(imgUrl + "/" + countersignUrl1).create());
+                    put("countersignUrl2", StrUtil.isBlank(countersignUrl2) ? null :
+                            Pictures.ofLocal(imgUrl + "/" + countersignUrl2).create());
+                    put("countersignUrl3", StrUtil.isBlank(countersignUrl3) ? null :
+                            Pictures.ofLocal(imgUrl + "/" + countersignUrl3).create());
+                    put("countersignUrl4", StrUtil.isBlank(countersignUrl4) ? null :
+                            Pictures.ofLocal(imgUrl + "/" + countersignUrl4).create());
+                    put("countersignUrl5", StrUtil.isBlank(countersignUrl5) ? null :
+                            Pictures.ofLocal(imgUrl + "/" + countersignUrl5).create());
+                    put("countersignUrl6", StrUtil.isBlank(countersignUrl6) ? null :
+                            Pictures.ofLocal(imgUrl + "/" + countersignUrl6).create());
+                    put("countersignUrl7", StrUtil.isBlank(countersignUrl7) ? null :
+                            Pictures.ofLocal(imgUrl + "/" + countersignUrl7).create());
+                    put("examineUrl", StrUtil.isBlank(finalExamineUrl) ? null :
+                            Pictures.ofLocal(imgUrl + "/" + finalExamineUrl).create());
+                    put("ratifyUrl", StrUtil.isBlank(finalRatifyUrl) ? null :
+                            Pictures.ofLocal(imgUrl + "/" + finalRatifyUrl).create());
+                    put("createDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(spotCheckYear.getCreateTime())).create());
+                }});
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    spotCheckYear.getYearHead(), "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return true;
+    }
+
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnqualifiedHandlerFileServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnqualifiedHandlerFileServiceImpl.java
new file mode 100644
index 0000000..28236fa
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnqualifiedHandlerFileServiceImpl.java
@@ -0,0 +1,111 @@
+package com.ruoyi.inspect.service.impl;
+
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.lang.UUID;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.mapper.InsUnqualifiedHandlerFileMapper;
+import com.ruoyi.inspect.pojo.InsUnqualifiedHandlerFile;
+import com.ruoyi.inspect.service.InsUnqualifiedHandlerFileService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+
+/**
+* @author 27233
+* @description 閽堝琛ㄣ�恑ns_unqualified_handler_file(涓嶅悎鏍煎鐞嗛檮浠惰褰曡〃)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+* @createDate 2024-07-31 13:38:38
+*/
+@Service
+@Slf4j
+public class InsUnqualifiedHandlerFileServiceImpl extends ServiceImpl<InsUnqualifiedHandlerFileMapper, InsUnqualifiedHandlerFile>
+    implements InsUnqualifiedHandlerFileService {
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Override
+    public InsUnqualifiedHandlerFile uploadFile(Long handlerId, MultipartFile file) {
+        String urlString;
+        String pathName;
+        String path;
+        String prefix;
+        String filename = file.getOriginalFilename();
+        String contentType = file.getContentType();
+        InsUnqualifiedHandlerFile unqualifiedHandlerFile = new InsUnqualifiedHandlerFile();
+//        unqualifiedHandlerFile.setUnqualifiedId(handlerId);
+        unqualifiedHandlerFile.setFileName(filename);
+        if (contentType != null && contentType.startsWith("image/")) {
+            // 鏄浘鐗�
+            path = imgUrl;
+            prefix = "/image/";
+            unqualifiedHandlerFile.setType(1);
+        } else {
+            // 鏄枃浠�
+            path = wordUrl;
+            prefix = "/word/";
+            unqualifiedHandlerFile.setType(2);
+        }
+        try {
+            File realpath = new File(path);
+            if (!realpath.exists()) {
+                realpath.mkdirs();
+            }
+            pathName = UUID.randomUUID() + "_" + file.getOriginalFilename();
+            urlString = realpath + "/" + pathName;
+            file.transferTo(new File(urlString));
+            unqualifiedHandlerFile.setFileUrl(pathName);
+            baseMapper.insert(unqualifiedHandlerFile);
+            return unqualifiedHandlerFile;
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("闄勪欢涓婁紶閿欒");
+            throw new ErrorException(e.getMessage());
+        }
+    }
+
+    @Override
+    public void downloadOAFile(Long handlerFileId, HttpServletResponse response) {
+        response.reset();
+        String fileName;
+        try {
+            //鏌ヨ涓婁紶闄勪欢璁板綍
+            InsUnqualifiedHandlerFile file = baseMapper.selectById(handlerFileId);
+            if (file != null){
+                fileName = file.getFileName();
+                fileName =  URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
+                response.setContentType("application/vnd.ms-excel");
+                response.setHeader("Cache-Control", "no-cache");
+                response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+                response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
+                //鑾峰彇鏂囦欢澶硅矾寰�
+                String path = file.getType()==1?imgUrl:wordUrl;
+                //鏂囦欢瀹屾暣璺緞
+                String fullPath = path + file.getFileUrl();
+                //鍒ゆ柇鏂囦欢鏄惁瀛樺湪
+                File fullFile = new File(fullPath);
+                if(fullFile.exists()){
+                    IoUtil.copy(Files.newInputStream(fullFile.toPath()),response.getOutputStream());
+                }
+            }
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+}
+
+
+
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnqualifiedHandlerServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnqualifiedHandlerServiceImpl.java
new file mode 100644
index 0000000..d4c2a25
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnqualifiedHandlerServiceImpl.java
@@ -0,0 +1,280 @@
+package com.ruoyi.inspect.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.oa.OAProcess;
+import com.ruoyi.common.oa.OAProperty;
+import com.ruoyi.common.oa.OAResult;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.dto.PushOADto;
+import com.ruoyi.inspect.dto.UnqualifiedHandlerDto;
+import com.ruoyi.inspect.mapper.InsOrderMapper;
+import com.ruoyi.inspect.mapper.InsUnqualifiedHandlerMapper;
+import com.ruoyi.inspect.pojo.CommonOa;
+import com.ruoyi.inspect.pojo.InsOrder;
+import com.ruoyi.inspect.pojo.InsUnqualifiedHandler;
+import com.ruoyi.inspect.pojo.InsUnqualifiedHandlerFile;
+import com.ruoyi.inspect.service.CommonOaService;
+import com.ruoyi.inspect.service.InsUnqualifiedHandlerFileService;
+import com.ruoyi.inspect.service.InsUnqualifiedHandlerService;
+import com.ruoyi.inspect.vo.UnqualifiedHandlerVO;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.UserService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author 27233
+ * @description 閽堝琛ㄣ�恑ns_unqualified_handler(涓嶅悎鏍煎鐞嗚〃)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+ * @createDate 2024-07-31 13:38:14
+ */
+@Service
+@Slf4j
+public class InsUnqualifiedHandlerServiceImpl extends ServiceImpl<InsUnqualifiedHandlerMapper, InsUnqualifiedHandler>
+        implements InsUnqualifiedHandlerService {
+
+    @Resource
+    private CommonOaService commonOaService;
+    @Resource
+    private OAProperty oaProperty;
+    @Resource
+    private InsUnqualifiedHandlerFileService insUnqualifiedHandlerFileService;
+    @Resource
+    private InsOrderMapper insOrderMapper;
+
+
+    @Override
+    public IPage<UnqualifiedHandlerVO> pageList(Page page, UnqualifiedHandlerDto unqualifiedHandlerDto) {
+        return baseMapper.selectPageList(page, QueryWrappers.queryWrappers(unqualifiedHandlerDto));
+    }
+
+    @Override
+    public Result pushOA(PushOADto pushOADto) {
+        //鑾峰彇涓嶅悎鏍煎鐞嗚褰�
+        UnqualifiedHandlerVO vo = baseMapper.findById(pushOADto.getHandlerId());
+
+        if (vo.getRequestId() != null) {
+            throw new ErrorException("璇ヤ笉鍚堟牸澶勭悊宸叉彁浜よ繃OA");
+        }
+
+        //鎻愪氦oa鐩稿叧瀛楁璧嬪��
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        Map<String, String> mainFields = new HashMap<>();
+        mainFields.put("bh", vo.getNo());//缂栧彿
+        mainFields.put("gysmc", vo.getSupplierName());//渚涘簲鍟嗗悕绉�
+        mainFields.put("wlmc", vo.getMaterialName());//鐗╂枡鍚嶇О
+        mainFields.put("scpc", vo.getProductionBatch());//鐢熶骇鎵规
+        mainFields.put("dhsl", vo.getCargoQuantity());//鍒拌揣鏁伴噺
+        mainFields.put("ggxh", vo.getSpecsModels());//瑙勬牸鍨嬪彿
+        mainFields.put("bjrq", vo.getInspectTime().format(formatter));//鎶ユ鏃ユ湡
+        mainFields.put("fkr", SecurityUtils.getUsername());//鍙嶉浜�
+        mainFields.put("fkrq", vo.getFeedbackTime().format(formatter));//鍙嶉鏃ユ湡
+        mainFields.put("fl", vo.getClassification());//鍒嗙被
+        mainFields.put("bhggs", vo.getOffGradeAscription());//涓嶅悎鏍煎綊灞�
+        mainFields.put("bhgqkms", vo.getUnqualifiedDesc());//涓嶅悎鏍兼儏鍐垫弿杩�
+
+        //鏌ヨ闄勪欢
+        List<InsUnqualifiedHandlerFile> handlerFiles = insUnqualifiedHandlerFileService.list(Wrappers.<InsUnqualifiedHandlerFile>lambdaQuery()
+                .eq(InsUnqualifiedHandlerFile::getUnqualifiedId, vo.getHandlerId()));
+        if (CollectionUtils.isNotEmpty(handlerFiles)) {
+            StringBuilder fileUrl = new StringBuilder();
+            for (int i = 0; i < handlerFiles.size(); i++) {
+                String path = handlerFiles.get(i).getType().equals(1) ? "/lims/img/" : "/lims/word/";
+                if (i == handlerFiles.size() - 1) {
+                    fileUrl.append("<a href='" + oaProperty.getProdIp()).append(path + handlerFiles.get(i).getFileUrl()
+                            + "'target='_blank'>" + handlerFiles.get(i).getFileName() + "</a>");
+                } else {
+                    fileUrl.append("<a href='" + oaProperty.getProdIp()).append(path + handlerFiles.get(i).getFileUrl()
+                            + "'target='_blank'>" + handlerFiles.get(i).getFileName() + "</a>").append("<br/>");
+                }
+            }
+            mainFields.put("xlimsfj", fileUrl.toString());
+        }
+        //娴佺▼鏍囬
+        String requestName = vo.getHeadline();
+        //鍙戣捣OA
+        boolean oa = false;
+        try {
+            log.info("鍙戣捣涓嶅悎鏍煎鐞哋A瀹℃牳娴佺▼");
+            String unqualifiedProcessId = oaProperty.getUnqualifiedProcessId();
+            OAResult oaResult = OAProcess.start(mainFields, requestName, unqualifiedProcessId,SecurityUtils.getUsername());
+            log.info("涓嶅悎鏍煎鐞哋A瀹℃牳娴佺▼缁撴潫锛岃繑鍥炵粨鏋�->{}" + oaResult);
+            oa = oaResult.success();
+            if (oa) {
+                String addWorkflowResult = oaResult.getAddWorkflowResult();
+                baseMapper.update(null, new LambdaUpdateWrapper<InsUnqualifiedHandler>()
+                        .set(InsUnqualifiedHandler::getRequestId, addWorkflowResult)
+                        .set(InsUnqualifiedHandler::getOaState, 2)
+                        .eq(InsUnqualifiedHandler::getId, pushOADto.getHandlerId()));
+            } else {
+                return Result.fail("鎻愪氦oa澶辫触: " + oaResult.getErrorMsg());
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        return Result.success();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void unqualifiedHandlerOACallback(Long oaWorkId, String checkResult, JSONArray objects) {
+        // 娌℃湁杩欎釜灏辩粨鏉�
+        Long count1 = baseMapper.selectCount(Wrappers.<InsUnqualifiedHandler>lambdaQuery()
+                .eq(InsUnqualifiedHandler::getRequestId, Integer.valueOf(String.valueOf(oaWorkId))));
+        if (count1 == 0) {
+            return;
+        }
+
+        //oa鐘舵�侊細3閫氳繃 4椹冲洖
+        Integer oaState = "1".equals(checkResult) ? 3 : 4;
+        baseMapper.update(null, new LambdaUpdateWrapper<InsUnqualifiedHandler>()
+                .set(InsUnqualifiedHandler::getOaState, oaState)
+                .ge(InsUnqualifiedHandler::getRequestId, Integer.valueOf(String.valueOf(oaWorkId))));
+        //淇濆瓨oa瀹℃壒娴佺▼璁板綍
+        List<CommonOa> commonOaList = new ArrayList<>();
+        objects.forEach(l -> {
+            JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(l));
+            CommonOa oa = new CommonOa();
+            oa.setApprover(jsonObject.getString("operatorName"));
+            oa.setWorkflowId(oaWorkId);
+            oa.setOperation(jsonObject.getString("operateType"));
+            oa.setApprovalDate(jsonObject.getString("operateDate"));
+            oa.setApprovalOpinion(jsonObject.getString("remark"));
+            oa.setNodeName(jsonObject.getString("nodeName"));
+            oa.setApprovalTime(jsonObject.getString("operateTime"));
+
+            //鏌ヨ鍒ゆ柇涔嬪墠鏄惁娣诲姞杩�
+            long count = commonOaService.count(Wrappers.<CommonOa>lambdaQuery()
+                    .eq(CommonOa::getApprover, oa.getApprover())
+                    .eq(CommonOa::getWorkflowId, oa.getWorkflowId())
+                    .eq(CommonOa::getOperation, oa.getOperation())
+                    .eq(CommonOa::getApprovalDate, oa.getApprovalDate())
+                    .eq(CommonOa::getApprovalOpinion, oa.getApprovalOpinion())
+                    .eq(CommonOa::getNodeName, oa.getNodeName())
+                    .eq(CommonOa::getApprovalTime, oa.getApprovalTime())
+            );
+            // 娌℃湁閲嶅娣诲姞
+            if (count == 0) {
+                commonOaList.add(oa);
+            }
+        });
+        commonOaService.saveBatch(commonOaList);
+
+    }
+
+    /**
+     * 鏌ョ湅oa娴佺▼
+     * @param id
+     * @return
+     */
+    @Override
+    public List<CommonOa> getOaFlow(Integer id) {
+        return baseMapper.getOaFlow(id);
+    }
+
+    /**
+     * 鏂板涓嶅悎鏍煎鐞�
+     * @param unqualifiedHandlerDto
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean addUnqualifiedHandler(UnqualifiedHandlerDto unqualifiedHandlerDto) {
+        if (unqualifiedHandlerDto.getInventoryQuantityId() == null) {
+            throw new ErrorException("缂哄皯鍘熸潗鏂檌d");
+        }
+        long count = this.count(Wrappers.<InsUnqualifiedHandler>lambdaQuery()
+                .eq(InsUnqualifiedHandler::getInsOrderId, unqualifiedHandlerDto.getInsOrderId()));
+        if (count > 0) {
+            throw new ErrorException("褰撳墠妫�楠屽崟宸叉彁浜よ繃涓嶅悎鏍�");
+        }
+        // 鍘熸潗鏂欑紪鍙峰垏鍓�
+        InsOrder order = insOrderMapper.selectOne(Wrappers.<InsOrder>lambdaQuery()
+                .eq(InsOrder::getId, unqualifiedHandlerDto.getInsOrderId())
+                .select(InsOrder::getEntrustCode));
+        unqualifiedHandlerDto.setNo(order.getEntrustCode());
+
+        this.save(unqualifiedHandlerDto);
+        if (CollectionUtils.isNotEmpty(unqualifiedHandlerDto.getUnqualifiedHandlerFiles())) {
+            for (InsUnqualifiedHandlerFile unqualifiedHandlerFile : unqualifiedHandlerDto.getUnqualifiedHandlerFiles()) {
+                unqualifiedHandlerFile.setUnqualifiedId(unqualifiedHandlerDto.getId());
+            }
+            insUnqualifiedHandlerFileService.updateBatchById(unqualifiedHandlerDto.getUnqualifiedHandlerFiles());
+        }
+
+        return true;
+    }
+
+    /**
+     * 缂栬緫涓嶅悎鏍煎鐞�
+     * @param unqualifiedHandlerDto
+     * @return
+     */
+    @Override
+    public boolean updateUnqualifiedHandler(UnqualifiedHandlerDto unqualifiedHandlerDto) {
+        // 鍒犻櫎闄勪欢, 閲嶆柊娣诲姞
+        insUnqualifiedHandlerFileService.remove(Wrappers.<InsUnqualifiedHandlerFile>lambdaQuery()
+                .eq(InsUnqualifiedHandlerFile::getUnqualifiedId, unqualifiedHandlerDto.getId()));
+        if (CollectionUtils.isNotEmpty(unqualifiedHandlerDto.getUnqualifiedHandlerFiles())) {
+            for (InsUnqualifiedHandlerFile unqualifiedHandlerFile : unqualifiedHandlerDto.getUnqualifiedHandlerFiles()) {
+                unqualifiedHandlerFile.setUnqualifiedId(unqualifiedHandlerDto.getId());
+            }
+            insUnqualifiedHandlerFileService.updateBatchById(unqualifiedHandlerDto.getUnqualifiedHandlerFiles());
+        }
+
+        return this.updateById(unqualifiedHandlerDto);
+    }
+
+    /**
+     * 鏌ョ湅涓嶅悎鏍煎鐞嗙晫闈�
+     * @param id
+     * @return
+     */
+    @Override
+    public UnqualifiedHandlerDto getUnqualifiedHandler(Integer id) {
+        InsUnqualifiedHandler insUnqualifiedHandler = this.getById(id);
+        UnqualifiedHandlerDto unqualifiedHandlerDto = new UnqualifiedHandlerDto();
+        BeanUtil.copyProperties(insUnqualifiedHandler, unqualifiedHandlerDto);
+        // 鏌ョ湅闄勪欢
+        List<InsUnqualifiedHandlerFile> list = insUnqualifiedHandlerFileService.list(Wrappers.<InsUnqualifiedHandlerFile>lambdaQuery()
+                .eq(InsUnqualifiedHandlerFile::getUnqualifiedId, unqualifiedHandlerDto.getId()));
+        unqualifiedHandlerDto.setUnqualifiedHandlerFiles(list);
+        return unqualifiedHandlerDto;
+    }
+
+    /**
+     * 鍒犻櫎涓嶅悎鏍�
+     * @param id
+     * @return
+     */
+    @Override
+    public boolean deleteUnqualifiedHandler(Integer id) {
+        insUnqualifiedHandlerFileService.remove(Wrappers.<InsUnqualifiedHandlerFile>lambdaQuery()
+                .eq(InsUnqualifiedHandlerFile::getUnqualifiedId, id));
+        this.removeById(id);
+        return true;
+    }
+}
+
+
+
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/SpotCheckQuarterItemServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/SpotCheckQuarterItemServiceImpl.java
new file mode 100644
index 0000000..5b7ad6c
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/SpotCheckQuarterItemServiceImpl.java
@@ -0,0 +1,19 @@
+package com.ruoyi.inspect.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.inspect.mapper.SpotCheckQuarterItemMapper;
+import com.ruoyi.inspect.pojo.SpotCheckQuarterItem;
+import com.ruoyi.inspect.service.SpotCheckQuarterItemService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 瀛e害鎶芥牱璁″垝璇︽儏琛�
+ *
+ * @author zhuo
+ * @since 2024-10-09
+ */
+@Service
+public class SpotCheckQuarterItemServiceImpl extends ServiceImpl<SpotCheckQuarterItemMapper, SpotCheckQuarterItem> implements SpotCheckQuarterItemService {
+
+}
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/SpotCheckYearItemServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/SpotCheckYearItemServiceImpl.java
new file mode 100644
index 0000000..205f980
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/SpotCheckYearItemServiceImpl.java
@@ -0,0 +1,19 @@
+package com.ruoyi.inspect.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.inspect.mapper.SpotCheckYearItemMapper;
+import com.ruoyi.inspect.pojo.SpotCheckYearItem;
+import com.ruoyi.inspect.service.SpotCheckYearItemService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 骞村害鎶芥牱璁″垝璇︽儏琛�
+ *
+ * @author zhuo
+ * @since 2024-10-10
+ */
+@Service
+public class SpotCheckYearItemServiceImpl extends ServiceImpl<SpotCheckYearItemMapper, SpotCheckYearItem> implements SpotCheckYearItemService {
+
+}
+
diff --git a/inspect-server/src/main/resources/mapper/SpotCheckQuarterMapper.xml b/inspect-server/src/main/resources/mapper/SpotCheckQuarterMapper.xml
new file mode 100644
index 0000000..6238257
--- /dev/null
+++ b/inspect-server/src/main/resources/mapper/SpotCheckQuarterMapper.xml
@@ -0,0 +1,25 @@
+<?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.SpotCheckQuarterMapper">
+    <select id="getQuarterPage" resultType="com.ruoyi.inspect.dto.SpotCheckQuarterDto">
+        select * from (        select scq.quarter_id,
+        scq.quarter_no,
+        scq.quarter_status,
+        scq.file_url,
+        scq.remark,
+        u.name create_user_name,
+        scq.create_time
+        from spot_check_quarter scq
+        left join user u on u.id = scq.create_user) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="getQuarterOnOrder" resultType="java.util.Map">
+        select quarter_id value,
+               quarter_no label
+        from spot_check_quarter
+    </select>
+
+
+</mapper>
diff --git a/inspect-server/src/main/resources/mapper/SpotCheckYearMapper.xml b/inspect-server/src/main/resources/mapper/SpotCheckYearMapper.xml
new file mode 100644
index 0000000..9584e96
--- /dev/null
+++ b/inspect-server/src/main/resources/mapper/SpotCheckYearMapper.xml
@@ -0,0 +1,19 @@
+<?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.SpotCheckYearMapper">
+
+    <select id="getSpotCheckYearPage" resultType="com.ruoyi.inspect.dto.SpotCheckYearDto">
+        select * from (select scy.year_id,
+        scy.year_head,
+        scy.table_remark,
+        scy.file_url,
+        scy.remark,
+        u.name create_user_name,
+        scy.create_time
+        from spot_check_year scy
+        left join user u on u.id = scy.create_user) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/oa/OAProperty.java b/ruoyi-common/src/main/java/com/ruoyi/common/oa/OAProperty.java
index 1880e93..48a07e0 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/oa/OAProperty.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/oa/OAProperty.java
@@ -17,10 +17,10 @@
 	 */
 	private String oaHost;
 
-//	/**
-//	 * 鏂囦欢鏌ョ湅ip鍦板潃
-//	 */
-//	private String prodIp;
+	/**
+	 * 鏂囦欢鏌ョ湅ip鍦板潃
+	 */
+	private String prodIp;
 
 	/**
 	 * 瑁呭鐢电紗锛氫笉鍚堟牸瀹℃壒oa鐨刬d
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
index 511842b..b0e9080 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -23,7 +23,7 @@
 
 /**
  * spring security閰嶇疆
- * 
+ *
  * @author ruoyi
  */
 @EnableMethodSecurity(prePostEnabled = true, securedEnabled = true)
@@ -35,7 +35,7 @@
      */
     @Autowired
     private UserDetailsService userDetailsService;
-    
+
     /**
      * 璁よ瘉澶辫触澶勭悊绫�
      */
@@ -53,7 +53,7 @@
      */
     @Autowired
     private JwtAuthenticationTokenFilter authenticationTokenFilter;
-    
+
     /**
      * 璺ㄥ煙杩囨护鍣�
      */
@@ -111,7 +111,7 @@
             .authorizeHttpRequests((requests) -> {
                 permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll());
                 // 瀵逛簬鐧诲綍login 娉ㄥ唽register 楠岃瘉鐮乧aptchaImage 鍏佽鍖垮悕璁块棶
-                requests.antMatchers("/login", "/register", "/captchaImage").permitAll()
+                requests.antMatchers("/login", "/register", "/captchaImage", "/unqualifiedHandler/callback").permitAll()
                     // 闈欐�佽祫婧愶紝鍙尶鍚嶈闂�
                     .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                     .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()

--
Gitblit v1.9.3