From 407885cde2e4b434509d0f97d4c627c9636f4735 Mon Sep 17 00:00:00 2001
From: heheng <475597332@qq.com>
Date: 星期四, 14 八月 2025 17:23:52 +0800
Subject: [PATCH] 部分新功能

---
 multi-system/src/main/java/com/gkhy/exam/system/domain/WarehousingRecord.java                      |   80 ++
 multi-system/src/main/java/com/gkhy/exam/system/mapper/OutsourcedReviewSubsidiaryMapper.java       |   18 
 multi-system/src/main/resources/mapper/system/OutsourcedUnqualifiedMapper.xml                      |   16 
 multi-system/src/main/java/com/gkhy/exam/system/service/impl/OutsourcedProductServiceImpl.java     |   63 ++
 multi-system/src/main/java/com/gkhy/exam/system/mapper/WarehousingRecordDetailsMapper.java         |   18 
 multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/OutsourcedCommonController.java       |   60 +
 multi-system/src/main/java/com/gkhy/exam/system/service/OutsourcedCommonService.java               |   25 
 multi-system/src/main/resources/mapper/system/OutsourcedCommonMapper.xml                           |   15 
 multi-system/src/main/java/com/gkhy/exam/system/domain/OutsourcedReviewSubsidiary.java             |   78 ++
 multi-system/src/main/resources/mapper/system/OutsourcedProductMapper.xml                          |   16 
 multi-system/src/main/java/com/gkhy/exam/system/domain/OutsourcedCommon.java                       |   97 +++
 multi-system/src/main/java/com/gkhy/exam/system/domain/OutsourcedProduct.java                      |   80 ++
 multi-system/src/main/java/com/gkhy/exam/system/service/WarehousingRecordService.java              |   27 
 multi-system/src/main/java/com/gkhy/exam/system/service/impl/OutsourcedReviewServiceImpl.java      |  128 ++++
 multi-system/src/main/java/com/gkhy/exam/system/mapper/OutsourcedUnqualifiedMapper.java            |   21 
 multi-system/src/main/resources/mapper/system/WarehousingRecordDetailsMapper.xml                   |    5 
 multi-system/src/main/java/com/gkhy/exam/system/service/OutsourcedUnqualifiedService.java          |   24 
 multi-system/src/main/java/com/gkhy/exam/system/domain/OutsourcedUnqualified.java                  |   92 ++
 multi-system/src/main/java/com/gkhy/exam/system/mapper/OutsourcedProductMapper.java                |   21 
 multi-system/src/main/java/com/gkhy/exam/system/domain/OutsourcedReview.java                       |  185 +++++
 multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/OutsourcedReviewController.java       |   67 ++
 multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/WarehousingRecordController.java      |   65 ++
 multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/OutsourcedUnqualifiedController.java  |   58 +
 multi-system/src/main/java/com/gkhy/exam/system/domain/WarehousingRecordDetails.java               |  104 +++
 multi-system/src/main/java/com/gkhy/exam/system/mapper/OutsourcedReviewMapper.java                 |   22 
 multi-system/src/main/resources/mapper/system/OutsourcedReviewMapper.xml                           |   14 
 multi-system/src/main/resources/mapper/system/WarehousingRecordMapper.xml                          |   14 
 multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/OutsourcedProductController.java      |   61 +
 multi-system/src/main/java/com/gkhy/exam/system/service/impl/OutsourcedUnqualifiedServiceImpl.java |   66 ++
 multi-system/src/main/java/com/gkhy/exam/system/service/impl/OutsourcedCommonServiceImpl.java      |   63 ++
 multi-system/src/main/java/com/gkhy/exam/system/service/impl/WarehousingRecordServiceImpl.java     |  120 +++
 multi-system/src/main/resources/mapper/system/OutsourcedReviewSubsidiaryMapper.xml                 |    5 
 multi-system/src/main/java/com/gkhy/exam/system/mapper/WarehousingRecordMapper.java                |   21 
 multi-system/src/main/java/com/gkhy/exam/system/mapper/OutsourcedCommonMapper.java                 |   21 
 multi-system/src/main/java/com/gkhy/exam/system/service/OutsourcedReviewService.java               |   27 
 multi-system/src/main/java/com/gkhy/exam/system/service/OutsourcedProductService.java              |   25 
 36 files changed, 1,822 insertions(+), 0 deletions(-)

diff --git a/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/OutsourcedCommonController.java b/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/OutsourcedCommonController.java
new file mode 100644
index 0000000..a54e520
--- /dev/null
+++ b/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/OutsourcedCommonController.java
@@ -0,0 +1,60 @@
+package com.gkhy.exam.admin.controller.web;
+
+
+import com.gkhy.exam.common.annotation.RepeatSubmit;
+import com.gkhy.exam.common.api.CommonResult;
+import com.gkhy.exam.system.domain.OutsourcedCommon;
+import com.gkhy.exam.system.domain.OutsourcedProduct;
+import com.gkhy.exam.system.service.OutsourcedCommonService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ * 外包 前端控制器
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@RestController
+@RequestMapping("/system/outsourcedCommon")
+@Api(tags = "外包工艺流程图/加工合同质量协议/产品检验合格记录管理")
+public class OutsourcedCommonController {
+
+    @Autowired
+    private OutsourcedCommonService outsourcedCommonService;
+
+    @ApiOperation(value = "外包工艺流程图/加工合同质量协议/产品检验合格记录列表(分页)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "pageNum", dataType = "int", required = false, value = "当前页,默认1"),
+            @ApiImplicitParam(paramType = "query", name = "pageSize", dataType = "int", required = false, value = "每页数目,默认10"),
+            @ApiImplicitParam(paramType = "query", name = "companyId", dataType = "int", required = false, value = "公司id"),
+            @ApiImplicitParam(paramType = "query", name = "osType", dataType = "int", required = true, value = "1、外包工艺流程图2、加工合同质量协议3、产品检验合格记录"),
+    })
+    @GetMapping("/selectOutsourcedCommonList")
+    public CommonResult selectOutsourcedCommonList(OutsourcedCommon outsourcedCommon){
+        return CommonResult.success(outsourcedCommonService.selectOutsourcedCommonList(outsourcedCommon));
+    }
+    @RepeatSubmit
+    @ApiOperation(value = "新增编辑工艺流程图/加工合同质量协议/产品检验合格记录")
+    @PostMapping("/saveOutsourcedCommon")
+    public CommonResult saveOutsourcedCommon(@RequestBody @Validated OutsourcedCommon outsourcedCommon){
+        return outsourcedCommonService.saveOutsourcedCommon(outsourcedCommon);
+    }
+
+    @ApiOperation(value = "删除外包工艺流程图/加工合同质量协议/产品检验合格记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "id", dataType = "int", required = true, value = "id"),
+    })
+    @GetMapping("/deletedOutsourcedCommon")
+    public CommonResult deletedOutsourcedCommon(@RequestParam Long id){
+        return outsourcedCommonService.deletedOutsourcedCommon(id);
+    }
+
+}
diff --git a/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/OutsourcedProductController.java b/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/OutsourcedProductController.java
new file mode 100644
index 0000000..5db46e3
--- /dev/null
+++ b/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/OutsourcedProductController.java
@@ -0,0 +1,61 @@
+package com.gkhy.exam.admin.controller.web;
+
+
+import com.gkhy.exam.common.annotation.RepeatSubmit;
+import com.gkhy.exam.common.api.CommonResult;
+import com.gkhy.exam.system.domain.AnnualMaintenance;
+import com.gkhy.exam.system.domain.OutsourcedProduct;
+import com.gkhy.exam.system.domain.vo.AnnualMaintenanceSaveDTOReq;
+import com.gkhy.exam.system.service.AnnualMaintenanceService;
+import com.gkhy.exam.system.service.OutsourcedProductService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ * 外包产品名称 前端控制器
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@RestController
+@RequestMapping("/system/outsourcedProduct")
+@Api(tags = "外包产品名称管理")
+public class OutsourcedProductController {
+
+    @Resource
+    private OutsourcedProductService outsourcedProductService;
+
+    @ApiOperation(value = "外包产品名称列表(分页)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "pageNum", dataType = "int", required = false, value = "当前页,默认1"),
+            @ApiImplicitParam(paramType = "query", name = "pageSize", dataType = "int", required = false, value = "每页数目,默认10"),
+            @ApiImplicitParam(paramType = "query", name = "companyId", dataType = "int", required = false, value = "公司id"),
+    })
+    @GetMapping("/selectOutsourcedProductList")
+    public CommonResult selectOutsourcedProductList(OutsourcedProduct outsourcedProduct){
+        return CommonResult.success(outsourcedProductService.selectOutsourcedProductList(outsourcedProduct));
+    }
+    @RepeatSubmit
+    @ApiOperation(value = "新增编辑外包产品名称")
+    @PostMapping("/saveOutsourcedProduct")
+    public CommonResult saveOutsourcedProduct(@RequestBody @Validated OutsourcedProduct outsourcedProduct){
+        return outsourcedProductService.saveOutsourcedProduct(outsourcedProduct);
+    }
+
+    @ApiOperation(value = "删除外包产品名称")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "id", dataType = "int", required = true, value = "id"),
+    })
+    @GetMapping("/deletedOutsourcedProduct")
+    public CommonResult deletedOutsourcedProduct(@RequestParam Long id){
+        return outsourcedProductService.deletedOutsourcedProduct(id);
+    }
+}
diff --git a/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/OutsourcedReviewController.java b/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/OutsourcedReviewController.java
new file mode 100644
index 0000000..2686587
--- /dev/null
+++ b/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/OutsourcedReviewController.java
@@ -0,0 +1,67 @@
+package com.gkhy.exam.admin.controller.web;
+
+
+import com.gkhy.exam.common.annotation.RepeatSubmit;
+import com.gkhy.exam.common.api.CommonResult;
+import com.gkhy.exam.system.domain.OutsourcedReview;
+import com.gkhy.exam.system.domain.WarehousingRecord;
+import com.gkhy.exam.system.service.OutsourcedReviewService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ * 外包过程评审 前端控制器
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@RestController
+@RequestMapping("/system/outsourcedReview")
+@Api(tags = "外包过程评审")
+public class OutsourcedReviewController {
+
+    @Autowired
+    private OutsourcedReviewService outsourcedReviewService;
+
+    @ApiOperation(value = "外包过程评审列表(分页)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "pageNum", dataType = "int", required = false, value = "当前页,默认1"),
+            @ApiImplicitParam(paramType = "query", name = "pageSize", dataType = "int", required = false, value = "每页数目,默认10"),
+            @ApiImplicitParam(paramType = "query", name = "companyId", dataType = "int", required = false, value = "公司id"),
+    })
+    @GetMapping("/selectOutsourcedReviewList")
+    public CommonResult selectOutsourcedReviewList(OutsourcedReview outsourcedReview){
+        return CommonResult.success(outsourcedReviewService.selectOutsourcedReviewList(outsourcedReview));
+    }
+    @RepeatSubmit
+    @ApiOperation(value = "新增编辑外包过程评审")
+    @PostMapping("/saveOutsourcedReview")
+    public CommonResult saveOutsourcedReview(@RequestBody @Validated OutsourcedReview outsourcedReview){
+        return outsourcedReviewService.saveOutsourcedReview(outsourcedReview);
+    }
+    @ApiOperation(value = "外包过程评审详情")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "id", dataType = "int", required = true, value = "id"),
+    })
+    @GetMapping("/getOutsourcedReview")
+    public CommonResult getOutsourcedReview(@RequestParam Long id){
+        return outsourcedReviewService.getOutsourcedReview(id);
+    }
+    @ApiOperation(value = "删除外包过程评审")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "id", dataType = "int", required = true, value = "id"),
+    })
+    @GetMapping("/deletedOutsourcedReview")
+    public CommonResult deletedOutsourcedReview(@RequestParam Long id){
+        return outsourcedReviewService.deletedOutsourcedReview(id);
+    }
+
+
+}
diff --git a/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/OutsourcedUnqualifiedController.java b/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/OutsourcedUnqualifiedController.java
new file mode 100644
index 0000000..a06ea80
--- /dev/null
+++ b/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/OutsourcedUnqualifiedController.java
@@ -0,0 +1,58 @@
+package com.gkhy.exam.admin.controller.web;
+
+
+import com.gkhy.exam.common.annotation.RepeatSubmit;
+import com.gkhy.exam.common.api.CommonResult;
+import com.gkhy.exam.system.domain.OutsourcedProduct;
+import com.gkhy.exam.system.domain.OutsourcedUnqualified;
+import com.gkhy.exam.system.service.OutsourcedUnqualifiedService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ * 外包不合格品处理及纠错 前端控制器
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@RestController
+@RequestMapping("/system/outsourcedUnqualified")
+@Api(tags = "外包不合格品处理及纠错管理")
+public class OutsourcedUnqualifiedController {
+
+    @Autowired
+    private OutsourcedUnqualifiedService outsourcedUnqualifiedService;
+
+    @ApiOperation(value = "外包不合格品处理及纠错列表(分页)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "pageNum", dataType = "int", required = false, value = "当前页,默认1"),
+            @ApiImplicitParam(paramType = "query", name = "pageSize", dataType = "int", required = false, value = "每页数目,默认10"),
+            @ApiImplicitParam(paramType = "query", name = "companyId", dataType = "int", required = false, value = "公司id"),
+    })
+    @GetMapping("/selectOutsourcedUnqualifiedList")
+    public CommonResult selectOutsourcedUnqualifiedList(OutsourcedUnqualified outsourcedUnqualified){
+        return CommonResult.success(outsourcedUnqualifiedService.selectOutsourcedUnqualifiedList(outsourcedUnqualified));
+    }
+    @RepeatSubmit
+    @ApiOperation(value = "新增编辑外包不合格品处理及纠错")
+    @PostMapping("/saveOutsourcedUnqualified")
+    public CommonResult saveOutsourcedUnqualified(@RequestBody @Validated OutsourcedUnqualified outsourcedUnqualified){
+        return outsourcedUnqualifiedService.saveOutsourcedUnqualified(outsourcedUnqualified);
+    }
+
+    @ApiOperation(value = "删除外包不合格品处理及纠错")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "id", dataType = "int", required = true, value = "id"),
+    })
+    @GetMapping("/deletedOutsourcedUnqualified")
+    public CommonResult deletedOutsourcedUnqualified(@RequestParam Long id){
+        return outsourcedUnqualifiedService.deletedOutsourcedUnqualified(id);
+    }
+}
diff --git a/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/WarehousingRecordController.java b/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/WarehousingRecordController.java
new file mode 100644
index 0000000..6b1fb49
--- /dev/null
+++ b/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/WarehousingRecordController.java
@@ -0,0 +1,65 @@
+package com.gkhy.exam.admin.controller.web;
+
+
+import com.gkhy.exam.common.annotation.RepeatSubmit;
+import com.gkhy.exam.common.api.CommonResult;
+import com.gkhy.exam.system.domain.OutsourcedUnqualified;
+import com.gkhy.exam.system.domain.WarehousingRecord;
+import com.gkhy.exam.system.service.WarehousingRecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ * 出入库记录主表 前端控制器
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@RestController
+@RequestMapping("/system/warehousingRecord")
+@Api(tags = "出入库记录")
+public class WarehousingRecordController {
+    @Autowired
+    private WarehousingRecordService warehousingRecordService;
+
+    @ApiOperation(value = "出入库记录列表(分页)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "pageNum", dataType = "int", required = false, value = "当前页,默认1"),
+            @ApiImplicitParam(paramType = "query", name = "pageSize", dataType = "int", required = false, value = "每页数目,默认10"),
+            @ApiImplicitParam(paramType = "query", name = "companyId", dataType = "int", required = false, value = "公司id"),
+    })
+    @GetMapping("/selectWarehousingRecordList")
+    public CommonResult selectWarehousingRecordList(WarehousingRecord warehousingRecord){
+        return CommonResult.success(warehousingRecordService.selectWarehousingRecordList(warehousingRecord));
+    }
+    @RepeatSubmit
+    @ApiOperation(value = "新增编辑出入库记录")
+    @PostMapping("/saveWarehousingRecord")
+    public CommonResult saveWarehousingRecord(@RequestBody @Validated WarehousingRecord warehousingRecord){
+        return warehousingRecordService.saveWarehousingRecord(warehousingRecord);
+    }
+    @ApiOperation(value = "入库记录详情")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "id", dataType = "int", required = true, value = "id"),
+    })
+    @GetMapping("/getWarehousingRecord")
+    public CommonResult getWarehousingRecord(@RequestParam Long id){
+        return warehousingRecordService.getWarehousingRecord(id);
+    }
+    @ApiOperation(value = "删除出入库记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "id", dataType = "int", required = true, value = "id"),
+    })
+    @GetMapping("/deletedWarehousingRecord")
+    public CommonResult deletedWarehousingRecord(@RequestParam Long id){
+        return warehousingRecordService.deletedWarehousingRecord(id);
+    }
+
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/domain/OutsourcedCommon.java b/multi-system/src/main/java/com/gkhy/exam/system/domain/OutsourcedCommon.java
new file mode 100644
index 0000000..b856787
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/domain/OutsourcedCommon.java
@@ -0,0 +1,97 @@
+package com.gkhy.exam.system.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * <p>
+ * 外包工艺流程图/加工合同质量协议/产品检验合格记录
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@Getter
+@Setter
+@TableName("outsourced_common")
+@ApiModel(value = "OutsourcedCommon对象", description = "外包工艺流程图/加工合同质量协议/产品检验合格记录")
+public class OutsourcedCommon implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "公司id",required = true)
+    @TableField("company_id")
+    @NotNull(message = "公司id不能为空")
+    private Long companyId;
+
+    @ApiModelProperty(value = "供应商id",required = true)
+    @TableField("supplier_id")
+    @NotNull(message = "供应商id不能为空")
+    private Integer supplierId;
+
+    @ApiModelProperty(value = "供应商名称")
+    @TableField(exist = false)
+    private String supplierName;
+
+//    @ApiModelProperty(value = "产品名称",required = true)
+//    @TableField("product_name")
+//    @NotBlank(message = "产品名称不能为空")
+//    private String productName;
+
+    @ApiModelProperty(value = "1、外包工艺流程图2、加工合同质量协议3、产品检验合格记录",required = true)
+    @TableField("os_type")
+    @NotNull(message = "类型不能为空")
+    private Integer osType;
+
+    @ApiModelProperty("附件名称")
+    @TableField("file_name")
+    private String fileName;
+
+    @ApiModelProperty("附件地址")
+    @TableField("file_path")
+    private String filePath;
+
+    @ApiModelProperty("格式")
+    @TableField("format")
+    private String format;
+
+    @ApiModelProperty("删除标志(0为删除,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("创建人")
+    @TableField("create_by")
+    private String createBy;
+
+    @ApiModelProperty("更新时间")
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("更新人")
+    @TableField("update_by")
+    private String updateBy;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/domain/OutsourcedProduct.java b/multi-system/src/main/java/com/gkhy/exam/system/domain/OutsourcedProduct.java
new file mode 100644
index 0000000..16f5069
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/domain/OutsourcedProduct.java
@@ -0,0 +1,80 @@
+package com.gkhy.exam.system.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * <p>
+ * 外包产品名称
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@Getter
+@Setter
+@TableName("outsourced_product")
+@ApiModel(value = "OutsourcedProduct对象", description = "外包产品名称")
+public class OutsourcedProduct implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "公司id",required = true)
+    @TableField("company_id")
+    @NotNull(message = "公司id不能为空")
+    private Long companyId;
+
+    @ApiModelProperty(value = "供应商id",required = true)
+    @TableField("supplier_id")
+    @NotNull(message = "供应商id不能为空")
+    private Integer supplierId;
+
+    @ApiModelProperty(value = "供应商名称")
+    @TableField(exist = false)
+    private String supplierName;
+
+    @ApiModelProperty(value = "产品名称",required = true)
+    @TableField("product_name")
+    @NotBlank(message = "产品名称不能为空")
+    private String productName;
+
+    @ApiModelProperty("删除标志(0为删除,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("创建人")
+    @TableField("create_by")
+    private String createBy;
+
+    @ApiModelProperty("更新时间")
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("更新人")
+    @TableField("update_by")
+    private String updateBy;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/domain/OutsourcedReview.java b/multi-system/src/main/java/com/gkhy/exam/system/domain/OutsourcedReview.java
new file mode 100644
index 0000000..dff74ff
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/domain/OutsourcedReview.java
@@ -0,0 +1,185 @@
+package com.gkhy.exam.system.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * <p>
+ * 外包过程评审
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@Getter
+@Setter
+@TableName("outsourced_review")
+@ApiModel(value = "OutsourcedReview对象", description = "外包过程评审")
+public class OutsourcedReview implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "公司id",required = true)
+    @TableField("company_id")
+    @NotNull(message = "公司id不能为空")
+    private Long companyId;
+
+    @ApiModelProperty(value = "评审名称",required = true)
+    @TableField("review_name")
+    @NotBlank(message = "评审名称不能为空")
+    private String reviewName;
+
+    @ApiModelProperty(value = "产品名称",required = true)
+    @TableField("product_name")
+    @NotBlank(message = "产品名称不能为空")
+    private String productName;
+
+    @ApiModelProperty(value = "部门id",required = true)
+    @TableField("dept_id")
+    @NotNull(message = "部门id不能为空")
+    private Long deptId;
+
+    @ApiModelProperty(value = "部门负责人id",required = true)
+    @TableField("dept_leader_id")
+    @NotNull(message = "部门负责人id不能为空")
+    private Integer deptLeaderId;
+
+    @ApiModelProperty(value = "外包过程",required = true)
+    @TableField("outsourced_process")
+    @NotBlank(message = "外包过程不能为空")
+    private String outsourcedProcess;
+
+    @ApiModelProperty(value = "是否为关键件重要件:1、重要2、关键3、普通",required = true)
+    @TableField("piece_type")
+    @NotNull(message = "是否为关键件重要件不能为空")
+    private Integer pieceType;
+
+    @ApiModelProperty(value = "过程重要性:1、关键2、一般",required = true)
+    @TableField("process_type")
+    @NotNull(message = "过程重要性不能为空")
+    private Integer processType;
+
+    @ApiModelProperty(value = "是否可外包:1、是2、否",required = true)
+    @TableField("outsource_type")
+    @NotNull(message = "是否可外包不能为空")
+    private Integer outsourceType;
+
+    @ApiModelProperty("措施内容")
+    @TableField("measure")
+    private String measure;
+
+    @ApiModelProperty(value = "申请部门",required = true)
+    @TableField("apply_dept")
+    @NotBlank(message = "申请部门不能为空")
+    private String applyDept;
+
+    @ApiModelProperty(value = "申请部门日期",required = true)
+    @TableField("apply_dept_date")
+    @NotNull(message = "申请部门日期不能为空")
+    private LocalDateTime applyDeptDate;
+
+    @ApiModelProperty(value = "质检部",required = true)
+    @TableField("quality_inspection")
+    @NotBlank(message = "质检部不能为空")
+    private String qualityInspection;
+
+    @ApiModelProperty(value = "质检部日期",required = true)
+    @TableField("quality_inspection_date")
+    @NotNull(message = "质检部日期不能为空")
+    private LocalDateTime qualityInspectionDate;
+
+    @ApiModelProperty(value = "管理者代表",required = true)
+    @TableField("management_representative")
+    @NotBlank(message = "管理者代表不能为空")
+    private String managementRepresentative;
+
+    @ApiModelProperty(value = "管理者代表日期",required = true)
+    @TableField("management_representative_date")
+    @NotNull(message = "质检部日期不能为空")
+    private LocalDateTime managementRepresentativeDate;
+
+    @ApiModelProperty("批准意见")
+    @TableField("approval_opinions")
+    private String approvalOpinions;
+
+    @ApiModelProperty(value = "主管领导",required = true)
+    @TableField("executive")
+    @NotBlank(message = "主管领导不能为空")
+    private String executive;
+
+    @ApiModelProperty(value = "主管领导日期",required = true)
+    @TableField("executive_date")
+    @NotNull(message = "主管领导日期不能为空")
+    private LocalDateTime executiveDate;
+
+    @ApiModelProperty("过程重要性:1、本单位2、生产急需3、其他")
+    @TableField("necessity")
+    private String necessity;
+
+    @ApiModelProperty("过程可行性:1、本单位图纸2、本单位合格原材料3、本单位实施过程4、其他")
+    @TableField("feasibility")
+    private String feasibility;
+
+    @ApiModelProperty("风险识别:1、质量影响2、供货影响3、经济效益4、其他")
+    @TableField("risk_recognition")
+    private String riskRecognition;
+
+    @ApiModelProperty("质量措施:1、进货检验2、我方检验3、顾客方检验")
+    @TableField("quality_measures")
+    private String qualityMeasures;
+
+    @ApiModelProperty("进度措施:1、供方沟通2、供方出计划3、列出制约")
+    @TableField("progress_measures")
+    private String progressMeasures;
+
+    @ApiModelProperty("经济措施:1、我司财务2、预算范围内3、协商解决")
+    @TableField("economic_measure")
+    private String economicMeasure;
+
+    @ApiModelProperty("删除标志(0为删除,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("创建人")
+    @TableField("create_by")
+    private String createBy;
+
+    @ApiModelProperty("更新时间")
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("更新人")
+    @TableField("update_by")
+    private String updateBy;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    @Version
+    private Integer version;
+
+    @ApiModelProperty("协作单位")
+    @TableField(exist = false)
+    private List<OutsourcedReviewSubsidiary> outsourcedReviewSubsidiaryList;
+
+    @ApiModelProperty("删除的协作单位id")
+    @TableField(exist = false)
+    private List<Long> delOutsourcedReviewSubsidiaryIds;
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/domain/OutsourcedReviewSubsidiary.java b/multi-system/src/main/java/com/gkhy/exam/system/domain/OutsourcedReviewSubsidiary.java
new file mode 100644
index 0000000..12c3691
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/domain/OutsourcedReviewSubsidiary.java
@@ -0,0 +1,78 @@
+package com.gkhy.exam.system.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 外包过程评审附属表
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@Getter
+@Setter
+@TableName("outsourced_review_subsidiary")
+@ApiModel(value = "OutsourcedReviewSubsidiary对象", description = "外包过程评审附属表")
+public class OutsourcedReviewSubsidiary implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("主表id")
+    @TableField("review_id")
+    private Long reviewId;
+
+    @ApiModelProperty("协作单位地址")
+    @TableField("assist_address")
+    private String assistAddress;
+
+    @ApiModelProperty("协作单位名称")
+    @TableField("assist_name")
+    private String assistName;
+
+    @ApiModelProperty("电话")
+    @TableField("phone")
+    private String phone;
+
+    @ApiModelProperty("排序")
+    @TableField("sort")
+    private Integer sort;
+
+    @ApiModelProperty("删除标志(0为删除,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("创建人")
+    @TableField("create_by")
+    private String createBy;
+
+    @ApiModelProperty("更新时间")
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("更新人")
+    @TableField("update_by")
+    private String updateBy;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/domain/OutsourcedUnqualified.java b/multi-system/src/main/java/com/gkhy/exam/system/domain/OutsourcedUnqualified.java
new file mode 100644
index 0000000..36b35cd
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/domain/OutsourcedUnqualified.java
@@ -0,0 +1,92 @@
+package com.gkhy.exam.system.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * <p>
+ * 外包不合格品处理及纠错
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@Getter
+@Setter
+@TableName("outsourced_unqualified")
+@ApiModel(value = "OutsourcedUnqualified对象", description = "外包不合格品处理及纠错")
+public class OutsourcedUnqualified implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "公司id",required = true)
+    @TableField("company_id")
+    @NotNull(message = "公司id不能为空")
+    private Long companyId;
+
+    @ApiModelProperty(value = "供应商id",required = true)
+    @TableField("supplier_id")
+    @NotNull(message = "供应商id不能为空")
+    private Integer supplierId;
+
+    @ApiModelProperty(value = "供应商名称")
+    @TableField(exist = false)
+    private String supplierName;
+
+    @ApiModelProperty(value = "产品名称",required = true)
+    @TableField("unqualified_product_name")
+    @NotBlank(message = "产品名称不能为空")
+    private String unqualifiedProductName;
+
+    @ApiModelProperty("附件名称")
+    @TableField("file_name")
+    private String fileName;
+
+    @ApiModelProperty("附件地址")
+    @TableField("file_path")
+    private String filePath;
+
+    @ApiModelProperty("格式")
+    @TableField("format")
+    private String format;
+
+    @ApiModelProperty("删除标志(0为删除,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("创建人")
+    @TableField("create_by")
+    private String createBy;
+
+    @ApiModelProperty("更新时间")
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("更新人")
+    @TableField("update_by")
+    private String updateBy;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/domain/WarehousingRecord.java b/multi-system/src/main/java/com/gkhy/exam/system/domain/WarehousingRecord.java
new file mode 100644
index 0000000..11dcfde
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/domain/WarehousingRecord.java
@@ -0,0 +1,80 @@
+package com.gkhy.exam.system.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+/**
+ * <p>
+ * 出入库记录主表
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@Getter
+@Setter
+@TableName("warehousing_record")
+@ApiModel(value = "WarehousingRecord对象", description = "出入库记录主表")
+public class WarehousingRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "公司id",required = true)
+    @TableField("company_id")
+    @NotNull(message = "公司id不能为空")
+    private Long companyId;
+
+    @ApiModelProperty(value = "记录名称",required = true)
+    @TableField("record_name")
+    @NotNull(message = "记录名称不能为空")
+    private String recordName;
+
+    @ApiModelProperty("删除标志(0为删除,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("创建人")
+    @TableField("create_by")
+    private String createBy;
+
+    @ApiModelProperty("更新时间")
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("更新人")
+    @TableField("update_by")
+    private String updateBy;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    @Version
+    private Integer version;
+
+    @ApiModelProperty("出入库记录详情")
+    @TableField(exist = false)
+    @NotEmpty
+    private List<WarehousingRecordDetails> warehousingRecordDetails;
+
+    @ApiModelProperty("出入库记录详情删除数据")
+    @TableField(exist = false)
+    private List<Long> delDetails;
+
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/domain/WarehousingRecordDetails.java b/multi-system/src/main/java/com/gkhy/exam/system/domain/WarehousingRecordDetails.java
new file mode 100644
index 0000000..4848deb
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/domain/WarehousingRecordDetails.java
@@ -0,0 +1,104 @@
+package com.gkhy.exam.system.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * <p>
+ * 出入库记录主表详情/
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@Getter
+@Setter
+@TableName("warehousing_record_details")
+@ApiModel(value = "WarehousingRecordDetails对象", description = "出入库记录主表详情")
+public class WarehousingRecordDetails implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("记录主id")
+    @TableField("record_id")
+    private Long recordId;
+
+    @ApiModelProperty("登记时间")
+    @TableField("boarding_time")
+    @NotNull(message = "登记时间不能为空")
+    private LocalDateTime boardingTime;
+
+    @ApiModelProperty("名称")
+    @TableField("name")
+    private String name;
+
+    @ApiModelProperty("入库单位")
+    @TableField("enter_company")
+    private String enterCompany;
+
+    @ApiModelProperty("入库数量")
+    @TableField("enter_num")
+    private Integer enterNum;
+
+    @ApiModelProperty("入库经手人")
+    @TableField("enter_person")
+    private String enterPerson;
+
+    @ApiModelProperty("出库单位")
+    @TableField("outbound_company")
+    private String outboundCompany;
+
+    @ApiModelProperty("出库数量")
+    @TableField("outbound_num")
+    private Integer outboundNum;
+
+    @ApiModelProperty("出库经手人")
+    @TableField("outbound_person")
+    private String outboundPerson;
+
+    @ApiModelProperty("库存")
+    @TableField("amount")
+    private Integer amount;
+
+    @ApiModelProperty("备注")
+    @TableField("remark")
+    private String remark;
+
+    @ApiModelProperty("删除标志(0为删除,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("创建人")
+    @TableField("create_by")
+    private String createBy;
+
+    @ApiModelProperty("更新时间")
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("更新人")
+    @TableField("update_by")
+    private String updateBy;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    @Version
+    private Integer version;
+
+
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/mapper/OutsourcedCommonMapper.java b/multi-system/src/main/java/com/gkhy/exam/system/mapper/OutsourcedCommonMapper.java
new file mode 100644
index 0000000..2c62d56
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/mapper/OutsourcedCommonMapper.java
@@ -0,0 +1,21 @@
+package com.gkhy.exam.system.mapper;
+
+import com.gkhy.exam.system.domain.OutsourcedCommon;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 外包工艺流程图/加工合同质量协议/产品检验合格记录 Mapper 接口
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@Mapper
+public interface OutsourcedCommonMapper extends BaseMapper<OutsourcedCommon> {
+
+    List<OutsourcedCommon> selectOutsourcedCommonList(OutsourcedCommon outsourcedCommon);
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/mapper/OutsourcedProductMapper.java b/multi-system/src/main/java/com/gkhy/exam/system/mapper/OutsourcedProductMapper.java
new file mode 100644
index 0000000..cc206a0
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/mapper/OutsourcedProductMapper.java
@@ -0,0 +1,21 @@
+package com.gkhy.exam.system.mapper;
+
+import com.gkhy.exam.system.domain.OutsourcedProduct;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 外包产品名称 Mapper 接口
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@Mapper
+public interface OutsourcedProductMapper extends BaseMapper<OutsourcedProduct> {
+
+    List<OutsourcedProduct> getOutsourcedProductList(OutsourcedProduct outsourcedProduct);
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/mapper/OutsourcedReviewMapper.java b/multi-system/src/main/java/com/gkhy/exam/system/mapper/OutsourcedReviewMapper.java
new file mode 100644
index 0000000..5e26832
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/mapper/OutsourcedReviewMapper.java
@@ -0,0 +1,22 @@
+package com.gkhy.exam.system.mapper;
+
+import com.gkhy.exam.system.domain.OutsourcedReview;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 外包过程评审 Mapper 接口
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@Mapper
+public interface OutsourcedReviewMapper extends BaseMapper<OutsourcedReview> {
+
+    List<OutsourcedReview> getOutsourcedReviewList(OutsourcedReview outsourcedReview);
+
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/mapper/OutsourcedReviewSubsidiaryMapper.java b/multi-system/src/main/java/com/gkhy/exam/system/mapper/OutsourcedReviewSubsidiaryMapper.java
new file mode 100644
index 0000000..0ea1547
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/mapper/OutsourcedReviewSubsidiaryMapper.java
@@ -0,0 +1,18 @@
+package com.gkhy.exam.system.mapper;
+
+import com.gkhy.exam.system.domain.OutsourcedReviewSubsidiary;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 外包过程评审附属表 Mapper 接口
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@Mapper
+public interface OutsourcedReviewSubsidiaryMapper extends BaseMapper<OutsourcedReviewSubsidiary> {
+
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/mapper/OutsourcedUnqualifiedMapper.java b/multi-system/src/main/java/com/gkhy/exam/system/mapper/OutsourcedUnqualifiedMapper.java
new file mode 100644
index 0000000..d03583d
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/mapper/OutsourcedUnqualifiedMapper.java
@@ -0,0 +1,21 @@
+package com.gkhy.exam.system.mapper;
+
+import com.gkhy.exam.system.domain.OutsourcedUnqualified;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 外包不合格品处理及纠错 Mapper 接口
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@Mapper
+public interface OutsourcedUnqualifiedMapper extends BaseMapper<OutsourcedUnqualified> {
+
+    List<OutsourcedUnqualified> getOutsourcedUnqualifiedList(OutsourcedUnqualified outsourcedUnqualified);
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/mapper/WarehousingRecordDetailsMapper.java b/multi-system/src/main/java/com/gkhy/exam/system/mapper/WarehousingRecordDetailsMapper.java
new file mode 100644
index 0000000..ccbfb67
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/mapper/WarehousingRecordDetailsMapper.java
@@ -0,0 +1,18 @@
+package com.gkhy.exam.system.mapper;
+
+import com.gkhy.exam.system.domain.WarehousingRecordDetails;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 出入库记录主表详情 Mapper 接口
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@Mapper
+public interface WarehousingRecordDetailsMapper extends BaseMapper<WarehousingRecordDetails> {
+
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/mapper/WarehousingRecordMapper.java b/multi-system/src/main/java/com/gkhy/exam/system/mapper/WarehousingRecordMapper.java
new file mode 100644
index 0000000..e6c912d
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/mapper/WarehousingRecordMapper.java
@@ -0,0 +1,21 @@
+package com.gkhy.exam.system.mapper;
+
+import com.gkhy.exam.system.domain.WarehousingRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 出入库记录主表 Mapper 接口
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@Mapper
+public interface WarehousingRecordMapper extends BaseMapper<WarehousingRecord> {
+
+    List<WarehousingRecord> selectWarehousingRecordList(WarehousingRecord warehousingRecord);
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/OutsourcedCommonService.java b/multi-system/src/main/java/com/gkhy/exam/system/service/OutsourcedCommonService.java
new file mode 100644
index 0000000..2f5dd53
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/service/OutsourcedCommonService.java
@@ -0,0 +1,25 @@
+package com.gkhy.exam.system.service;
+
+import com.gkhy.exam.common.api.CommonPage;
+import com.gkhy.exam.common.api.CommonResult;
+import com.gkhy.exam.system.domain.OutsourcedCommon;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gkhy.exam.system.domain.OutsourcedUnqualified;
+
+/**
+ * <p>
+ * 外包工艺流程图/加工合同质量协议/产品检验合格记录 服务类
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+public interface OutsourcedCommonService extends IService<OutsourcedCommon> {
+
+    CommonPage selectOutsourcedCommonList(OutsourcedCommon outsourcedCommon);
+
+    CommonResult saveOutsourcedCommon(OutsourcedCommon outsourcedCommon);
+
+    CommonResult deletedOutsourcedCommon(Long id);
+
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/OutsourcedProductService.java b/multi-system/src/main/java/com/gkhy/exam/system/service/OutsourcedProductService.java
new file mode 100644
index 0000000..63430c4
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/service/OutsourcedProductService.java
@@ -0,0 +1,25 @@
+package com.gkhy.exam.system.service;
+
+import com.gkhy.exam.common.api.CommonPage;
+import com.gkhy.exam.common.api.CommonResult;
+import com.gkhy.exam.system.domain.AnnualMaintenanceService;
+import com.gkhy.exam.system.domain.OutsourcedProduct;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 外包产品名称 服务类
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+public interface OutsourcedProductService extends IService<OutsourcedProduct> {
+
+
+    CommonPage selectOutsourcedProductList(OutsourcedProduct outsourcedProduct);
+
+    CommonResult saveOutsourcedProduct(OutsourcedProduct outsourcedProduct);
+
+    CommonResult deletedOutsourcedProduct(Long id);
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/OutsourcedReviewService.java b/multi-system/src/main/java/com/gkhy/exam/system/service/OutsourcedReviewService.java
new file mode 100644
index 0000000..08c7e77
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/service/OutsourcedReviewService.java
@@ -0,0 +1,27 @@
+package com.gkhy.exam.system.service;
+
+import com.gkhy.exam.common.api.CommonPage;
+import com.gkhy.exam.common.api.CommonResult;
+import com.gkhy.exam.system.domain.OutsourcedReview;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gkhy.exam.system.domain.WarehousingRecord;
+
+/**
+ * <p>
+ * 外包过程评审 服务类
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+public interface OutsourcedReviewService extends IService<OutsourcedReview> {
+
+    CommonPage selectOutsourcedReviewList(OutsourcedReview outsourcedReview);
+
+    CommonResult saveOutsourcedReview(OutsourcedReview outsourcedReview);
+
+    CommonResult getOutsourcedReview(Long id);
+
+    CommonResult deletedOutsourcedReview(Long id);
+
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/OutsourcedUnqualifiedService.java b/multi-system/src/main/java/com/gkhy/exam/system/service/OutsourcedUnqualifiedService.java
new file mode 100644
index 0000000..3d80ab0
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/service/OutsourcedUnqualifiedService.java
@@ -0,0 +1,24 @@
+package com.gkhy.exam.system.service;
+
+import com.gkhy.exam.common.api.CommonPage;
+import com.gkhy.exam.common.api.CommonResult;
+import com.gkhy.exam.system.domain.OutsourcedProduct;
+import com.gkhy.exam.system.domain.OutsourcedUnqualified;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 外包不合格品处理及纠错 服务类
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+public interface OutsourcedUnqualifiedService extends IService<OutsourcedUnqualified> {
+
+    CommonPage selectOutsourcedUnqualifiedList(OutsourcedUnqualified outsourcedUnqualified);
+
+    CommonResult saveOutsourcedUnqualified(OutsourcedUnqualified outsourcedUnqualified);
+
+    CommonResult deletedOutsourcedUnqualified(Long id);
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/WarehousingRecordService.java b/multi-system/src/main/java/com/gkhy/exam/system/service/WarehousingRecordService.java
new file mode 100644
index 0000000..a2d0bbf
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/service/WarehousingRecordService.java
@@ -0,0 +1,27 @@
+package com.gkhy.exam.system.service;
+
+import com.gkhy.exam.common.api.CommonPage;
+import com.gkhy.exam.common.api.CommonResult;
+import com.gkhy.exam.system.domain.OutsourcedCommon;
+import com.gkhy.exam.system.domain.WarehousingRecord;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 出入库记录主表 服务类
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+public interface WarehousingRecordService extends IService<WarehousingRecord> {
+
+
+    CommonPage selectWarehousingRecordList(WarehousingRecord warehousingRecord);
+
+    CommonResult saveWarehousingRecord(WarehousingRecord warehousingRecord);
+
+    CommonResult getWarehousingRecord(Long id);
+
+    CommonResult deletedWarehousingRecord(Long id);
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/impl/OutsourcedCommonServiceImpl.java b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/OutsourcedCommonServiceImpl.java
new file mode 100644
index 0000000..6eaf84d
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/OutsourcedCommonServiceImpl.java
@@ -0,0 +1,63 @@
+package com.gkhy.exam.system.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.gkhy.exam.common.api.CommonPage;
+import com.gkhy.exam.common.api.CommonResult;
+import com.gkhy.exam.common.constant.UserConstant;
+import com.gkhy.exam.common.utils.PageUtils;
+import com.gkhy.exam.common.utils.SecurityUtils;
+import com.gkhy.exam.system.domain.OutsourcedCommon;
+import com.gkhy.exam.system.mapper.OutsourcedCommonMapper;
+import com.gkhy.exam.system.service.OutsourcedCommonService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ * 外包工艺流程图/加工合同质量协议/产品检验合格记录 服务实现类
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@Service
+public class OutsourcedCommonServiceImpl extends ServiceImpl<OutsourcedCommonMapper, OutsourcedCommon> implements OutsourcedCommonService {
+
+    @Autowired
+    private OutsourcedCommonMapper outsourcedCommonMapper;
+
+    @Override
+    public CommonPage selectOutsourcedCommonList(OutsourcedCommon outsourcedCommon) {
+        PageUtils.startPage();
+        List<OutsourcedCommon> outsourcedCommons = outsourcedCommonMapper.selectOutsourcedCommonList(outsourcedCommon);
+        return CommonPage.restPage(outsourcedCommons);
+    }
+
+    @Override
+    public CommonResult saveOutsourcedCommon(OutsourcedCommon outsourcedCommon) {
+        if (outsourcedCommon.getId() == null){
+            outsourcedCommon.setCreateBy(SecurityUtils.getUsername());
+            outsourcedCommon.setCreateTime(LocalDateTime.now());
+            return outsourcedCommonMapper.insert(outsourcedCommon) > 0 ? CommonResult.success("保存成功") : CommonResult.failed("保存失败");
+        }
+
+        outsourcedCommon.setUpdateBy(SecurityUtils.getUsername());
+        outsourcedCommon.setUpdateTime(LocalDateTime.now());
+        return outsourcedCommonMapper.updateById(outsourcedCommon) > 0 ? CommonResult.success("保存成功") : CommonResult.failed("保存失败");
+    }
+
+    @Override
+    public CommonResult deletedOutsourcedCommon(Long id) {
+        outsourcedCommonMapper.update(new OutsourcedCommon(),
+                new LambdaUpdateWrapper<OutsourcedCommon>().eq(OutsourcedCommon::getId, id)
+                        .set(OutsourcedCommon::getDelFlag, UserConstant.DEPT_DISABLE)
+                        .set(OutsourcedCommon::getUpdateTime, LocalDateTime.now())
+                        .set(OutsourcedCommon::getUpdateBy, SecurityUtils.getUsername()));
+
+        return CommonResult.success();
+    }
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/impl/OutsourcedProductServiceImpl.java b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/OutsourcedProductServiceImpl.java
new file mode 100644
index 0000000..7746a03
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/OutsourcedProductServiceImpl.java
@@ -0,0 +1,63 @@
+package com.gkhy.exam.system.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.gkhy.exam.common.api.CommonPage;
+import com.gkhy.exam.common.api.CommonResult;
+import com.gkhy.exam.common.constant.UserConstant;
+import com.gkhy.exam.common.utils.PageUtils;
+import com.gkhy.exam.common.utils.SecurityUtils;
+import com.gkhy.exam.system.domain.AnnualMaintenanceEvaluateDevice;
+import com.gkhy.exam.system.domain.OutsourcedProduct;
+import com.gkhy.exam.system.mapper.OutsourcedProductMapper;
+import com.gkhy.exam.system.service.OutsourcedProductService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ * 外包产品名称 服务实现类
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@Service
+public class OutsourcedProductServiceImpl extends ServiceImpl<OutsourcedProductMapper, OutsourcedProduct> implements OutsourcedProductService {
+
+    @Autowired
+    private OutsourcedProductMapper outsourcedProductMapper;
+    @Override
+    public CommonPage selectOutsourcedProductList(OutsourcedProduct outsourcedProduct) {
+        PageUtils.startPage();
+        List<OutsourcedProduct> outsourcedProducts = outsourcedProductMapper.getOutsourcedProductList(outsourcedProduct);
+        return CommonPage.restPage(outsourcedProducts);
+    }
+
+    @Override
+    public CommonResult saveOutsourcedProduct(OutsourcedProduct outsourcedProduct) {
+        if (outsourcedProduct.getId() == null){
+            outsourcedProduct.setCreateBy(SecurityUtils.getUsername());
+            outsourcedProduct.setCreateTime(LocalDateTime.now());
+            return outsourcedProductMapper.insert(outsourcedProduct) > 0 ? CommonResult.success("保存成功") : CommonResult.failed("保存失败");
+        }
+
+        outsourcedProduct.setUpdateBy(SecurityUtils.getUsername());
+        outsourcedProduct.setUpdateTime(LocalDateTime.now());
+        return outsourcedProductMapper.updateById(outsourcedProduct) > 0 ? CommonResult.success("保存成功") : CommonResult.failed("保存失败");
+    }
+
+    @Override
+    public CommonResult deletedOutsourcedProduct(Long id) {
+         outsourcedProductMapper.update(new OutsourcedProduct(),
+                new LambdaUpdateWrapper<OutsourcedProduct>().eq(OutsourcedProduct::getId, id)
+                        .set(OutsourcedProduct::getDelFlag, UserConstant.DEPT_DISABLE)
+                        .set(OutsourcedProduct::getUpdateTime, LocalDateTime.now())
+                        .set(OutsourcedProduct::getUpdateBy, SecurityUtils.getUsername()));
+
+        return CommonResult.success();
+    }
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/impl/OutsourcedReviewServiceImpl.java b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/OutsourcedReviewServiceImpl.java
new file mode 100644
index 0000000..373964a
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/OutsourcedReviewServiceImpl.java
@@ -0,0 +1,128 @@
+package com.gkhy.exam.system.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.gkhy.exam.common.api.CommonPage;
+import com.gkhy.exam.common.api.CommonResult;
+import com.gkhy.exam.common.constant.UserConstant;
+import com.gkhy.exam.common.utils.PageUtils;
+import com.gkhy.exam.common.utils.SecurityUtils;
+import com.gkhy.exam.system.domain.OutsourcedReview;
+import com.gkhy.exam.system.domain.OutsourcedReviewSubsidiary;
+import com.gkhy.exam.system.domain.WarehousingRecordDetails;
+import com.gkhy.exam.system.mapper.OutsourcedReviewMapper;
+import com.gkhy.exam.system.mapper.OutsourcedReviewSubsidiaryMapper;
+import com.gkhy.exam.system.service.OutsourcedReviewService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ * 外包过程评审 服务实现类
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@Service
+public class OutsourcedReviewServiceImpl extends ServiceImpl<OutsourcedReviewMapper, OutsourcedReview> implements OutsourcedReviewService {
+
+    @Autowired
+    private OutsourcedReviewMapper outsourcedReviewMapper;
+
+    @Autowired
+    private OutsourcedReviewSubsidiaryMapper outsourcedReviewSubsidiaryMapper;
+
+    @Override
+    public CommonPage selectOutsourcedReviewList(OutsourcedReview outsourcedReview) {
+        PageUtils.startPage();
+        List<OutsourcedReview> outsourcedReviewList = outsourcedReviewMapper.getOutsourcedReviewList(outsourcedReview);
+        return CommonPage.restPage(outsourcedReviewList);
+    }
+
+    @Override
+    @Transactional
+    public CommonResult saveOutsourcedReview(OutsourcedReview outsourcedReview) {
+        List<OutsourcedReviewSubsidiary> outsourcedReviewSubsidiaryList = outsourcedReview.getOutsourcedReviewSubsidiaryList();
+        if (ObjectUtils.isEmpty(outsourcedReviewSubsidiaryList)){
+            return CommonResult.failed("保存参数不能为空");
+        }
+        int i = 0;
+        if (outsourcedReview.getId() == null){
+            outsourcedReview.setCreateBy(SecurityUtils.getUsername());
+            outsourcedReview.setCreateTime(LocalDateTime.now());
+            i = outsourcedReviewMapper.insert(outsourcedReview);
+        }else {
+            outsourcedReview.setUpdateTime(LocalDateTime.now());
+            outsourcedReview.setUpdateBy(SecurityUtils.getUsername());
+            i = outsourcedReviewMapper.updateById(outsourcedReview);
+        }
+        if (i > 0){
+            batchSaveSubsidiary(outsourcedReview.getId(), outsourcedReviewSubsidiaryList, outsourcedReview.getDelOutsourcedReviewSubsidiaryIds());
+        }
+        return i > 0 ? CommonResult.success() : CommonResult.failed();
+    }
+
+    private void batchSaveSubsidiary(Long outsourcedReviewId, List<OutsourcedReviewSubsidiary> outsourcedReviewSubsidiaryList,List<Long> delOutsourcedReviewSubsidiaryIds) {
+
+        if (ObjectUtils.isNotEmpty(delOutsourcedReviewSubsidiaryIds)){
+            int update = outsourcedReviewSubsidiaryMapper.update(new OutsourcedReviewSubsidiary(),
+                    new LambdaUpdateWrapper<OutsourcedReviewSubsidiary>().eq(OutsourcedReviewSubsidiary::getId, delOutsourcedReviewSubsidiaryIds).set(OutsourcedReviewSubsidiary::getDelFlag, UserConstant.DEPT_DISABLE)
+                            .set(OutsourcedReviewSubsidiary::getUpdateTime, LocalDateTime.now()).set(OutsourcedReviewSubsidiary::getUpdateBy, SecurityUtils.getUsername())
+            );
+            if (update <= 0){
+                throw new RuntimeException("操作失败");
+            }
+        }
+        outsourcedReviewSubsidiaryList.forEach(outsourcedReviewSubsidiary -> {
+            if (outsourcedReviewSubsidiary.getId() == null){
+                outsourcedReviewSubsidiary.setReviewId(outsourcedReviewId);
+                outsourcedReviewSubsidiary.setCreateTime(LocalDateTime.now());
+                outsourcedReviewSubsidiary.setCreateBy(SecurityUtils.getUsername());
+                outsourcedReviewSubsidiaryMapper.insert(outsourcedReviewSubsidiary);
+            }else {
+                outsourcedReviewSubsidiary.setUpdateTime(LocalDateTime.now());
+                outsourcedReviewSubsidiary.setUpdateBy(SecurityUtils.getUsername());
+                outsourcedReviewSubsidiaryMapper.updateById(outsourcedReviewSubsidiary);
+            }
+        });
+
+    }
+
+    @Override
+    public CommonResult getOutsourcedReview(Long id) {
+
+        OutsourcedReview outsourcedReview = outsourcedReviewMapper.selectById(id);
+        if (outsourcedReview != null){
+            List<OutsourcedReviewSubsidiary> outsourcedReviewSubsidiaryList = outsourcedReviewSubsidiaryMapper.selectList(
+                    new LambdaQueryWrapper<>(OutsourcedReviewSubsidiary.class).eq(OutsourcedReviewSubsidiary::getReviewId, id)
+                            .eq(OutsourcedReviewSubsidiary::getDelFlag, UserConstant.ENABLE).orderByDesc(OutsourcedReviewSubsidiary::getCreateTime)
+            );
+            outsourcedReview.setOutsourcedReviewSubsidiaryList(outsourcedReviewSubsidiaryList);
+        }
+        return CommonResult.success(outsourcedReview);
+    }
+
+    @Override
+    @Transactional
+    public CommonResult deletedOutsourcedReview(Long id) {
+        int i = outsourcedReviewMapper.update(new OutsourcedReview(),
+                new LambdaUpdateWrapper<OutsourcedReview>().eq(OutsourcedReview::getId, id).set(OutsourcedReview::getDelFlag, UserConstant.DEPT_DISABLE)
+                        .set(OutsourcedReview::getUpdateTime, LocalDateTime.now()).set(OutsourcedReview::getUpdateBy, SecurityUtils.getUsername())
+        );
+        if (i > 0){
+            outsourcedReviewSubsidiaryMapper.update(new OutsourcedReviewSubsidiary(),
+                    new LambdaUpdateWrapper<OutsourcedReviewSubsidiary>().eq(OutsourcedReviewSubsidiary::getReviewId, id)
+                            .set(OutsourcedReviewSubsidiary::getDelFlag, UserConstant.DEPT_DISABLE)
+                            .set(OutsourcedReviewSubsidiary::getUpdateTime, LocalDateTime.now())
+                            .set(OutsourcedReviewSubsidiary::getUpdateBy, SecurityUtils.getUsername()));
+        }
+        return CommonResult.success();
+    }
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/impl/OutsourcedUnqualifiedServiceImpl.java b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/OutsourcedUnqualifiedServiceImpl.java
new file mode 100644
index 0000000..4218687
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/OutsourcedUnqualifiedServiceImpl.java
@@ -0,0 +1,66 @@
+package com.gkhy.exam.system.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.gkhy.exam.common.api.CommonPage;
+import com.gkhy.exam.common.api.CommonResult;
+import com.gkhy.exam.common.constant.UserConstant;
+import com.gkhy.exam.common.utils.PageUtils;
+import com.gkhy.exam.common.utils.SecurityUtils;
+import com.gkhy.exam.system.domain.OutsourcedProduct;
+import com.gkhy.exam.system.domain.OutsourcedUnqualified;
+import com.gkhy.exam.system.mapper.OutsourcedUnqualifiedMapper;
+import com.gkhy.exam.system.service.OutsourcedUnqualifiedService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ * 外包不合格品处理及纠错 服务实现类
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@Service
+public class OutsourcedUnqualifiedServiceImpl extends ServiceImpl<OutsourcedUnqualifiedMapper, OutsourcedUnqualified> implements OutsourcedUnqualifiedService {
+
+
+    @Autowired
+    private OutsourcedUnqualifiedMapper outsourcedUnqualifiedMapper;
+
+
+    @Override
+    public CommonPage selectOutsourcedUnqualifiedList(OutsourcedUnqualified outsourcedUnqualified) {
+        PageUtils.startPage();
+        List<OutsourcedUnqualified> outsourcedUnqualifieds = outsourcedUnqualifiedMapper.getOutsourcedUnqualifiedList(outsourcedUnqualified);
+        return CommonPage.restPage(outsourcedUnqualifieds);
+    }
+
+    @Override
+    public CommonResult saveOutsourcedUnqualified(OutsourcedUnqualified outsourcedUnqualified) {
+        if (outsourcedUnqualified.getId() == null){
+            outsourcedUnqualified.setCreateBy(SecurityUtils.getUsername());
+            outsourcedUnqualified.setCreateTime(LocalDateTime.now());
+            return outsourcedUnqualifiedMapper.insert(outsourcedUnqualified) > 0 ? CommonResult.success("保存成功") : CommonResult.failed("保存失败");
+        }
+
+        outsourcedUnqualified.setUpdateBy(SecurityUtils.getUsername());
+        outsourcedUnqualified.setUpdateTime(LocalDateTime.now());
+        return outsourcedUnqualifiedMapper.updateById(outsourcedUnqualified) > 0 ? CommonResult.success("保存成功") : CommonResult.failed("保存失败");
+    }
+
+    @Override
+    public CommonResult deletedOutsourcedUnqualified(Long id) {
+        outsourcedUnqualifiedMapper.update(new OutsourcedUnqualified(),
+                new LambdaUpdateWrapper<OutsourcedUnqualified>().eq(OutsourcedUnqualified::getId, id)
+                        .set(OutsourcedUnqualified::getDelFlag, UserConstant.DEPT_DISABLE)
+                        .set(OutsourcedUnqualified::getUpdateTime, LocalDateTime.now())
+                        .set(OutsourcedUnqualified::getUpdateBy, SecurityUtils.getUsername()));
+
+        return CommonResult.success();
+    }
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/impl/WarehousingRecordServiceImpl.java b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/WarehousingRecordServiceImpl.java
new file mode 100644
index 0000000..609f1fb
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/WarehousingRecordServiceImpl.java
@@ -0,0 +1,120 @@
+package com.gkhy.exam.system.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.gkhy.exam.common.api.CommonPage;
+import com.gkhy.exam.common.api.CommonResult;
+import com.gkhy.exam.common.constant.UserConstant;
+import com.gkhy.exam.common.utils.PageUtils;
+import com.gkhy.exam.common.utils.SecurityUtils;
+import com.gkhy.exam.system.domain.OutsourcedUnqualified;
+import com.gkhy.exam.system.domain.WarehousingRecord;
+import com.gkhy.exam.system.domain.WarehousingRecordDetails;
+import com.gkhy.exam.system.mapper.WarehousingRecordDetailsMapper;
+import com.gkhy.exam.system.mapper.WarehousingRecordMapper;
+import com.gkhy.exam.system.service.WarehousingRecordService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ * 出入库记录主表 服务实现类
+ * </p>
+ *
+ * @author hh
+ * @since 2025-08-13 09:16:37
+ */
+@Service
+public class WarehousingRecordServiceImpl extends ServiceImpl<WarehousingRecordMapper, WarehousingRecord> implements WarehousingRecordService {
+
+    @Autowired
+    private WarehousingRecordMapper warehousingRecordMapper;
+    @Autowired
+    private WarehousingRecordDetailsMapper warehousingRecordDetailsMapper;
+
+    @Override
+    public CommonPage selectWarehousingRecordList(WarehousingRecord warehousingRecord) {
+        PageUtils.startPage();
+        List<WarehousingRecord> warehousingRecords = warehousingRecordMapper.selectWarehousingRecordList(warehousingRecord);
+        return CommonPage.restPage(warehousingRecords);
+    }
+
+    @Override
+    @Transactional
+    public CommonResult saveWarehousingRecord(WarehousingRecord warehousingRecord) {
+        List<WarehousingRecordDetails> warehousingRecordDetails = warehousingRecord.getWarehousingRecordDetails();
+        if (ObjectUtil.isEmpty(warehousingRecordDetails)){
+            return CommonResult.validateFailed("请选择入库记录详情");
+        }
+        int i = 0;
+        if (warehousingRecord.getId() == null){
+            warehousingRecord.setCreateTime(LocalDateTime.now());
+            warehousingRecord.setCreateBy(SecurityUtils.getUsername());
+             i = warehousingRecordMapper.insert(warehousingRecord);
+        }else {
+
+            warehousingRecord.setUpdateTime(LocalDateTime.now());
+            warehousingRecord.setUpdateBy(SecurityUtils.getUsername());
+            i = warehousingRecordMapper.updateById(warehousingRecord);
+        }
+        if (i > 0){
+          batchSave(warehousingRecord.getId(), warehousingRecordDetails,warehousingRecord.getDelDetails());
+        }
+        return CommonResult.success();
+    }
+
+    private void batchSave(Long id, List<WarehousingRecordDetails> warehousingRecordDetails,List<Long> delDetails) {
+        warehousingRecordDetails.stream().filter(item -> item.getId() == null).forEach(item -> {
+            item.setRecordId(id);
+            item.setCreateTime(LocalDateTime.now());
+            item.setCreateBy(SecurityUtils.getUsername());
+            warehousingRecordDetailsMapper.insert(item);
+        });
+        warehousingRecordDetails.stream().filter(item -> item.getId() != null).forEach(item -> {
+            item.setRecordId(id);
+            item.setUpdateTime(LocalDateTime.now());
+            item.setUpdateBy(SecurityUtils.getUsername());
+            warehousingRecordDetailsMapper.updateById(item);
+        });
+        if (delDetails != null){
+            warehousingRecordDetailsMapper.update(new WarehousingRecordDetails(),
+                    new LambdaUpdateWrapper<WarehousingRecordDetails>().in(WarehousingRecordDetails::getId, delDetails)
+                            .set(WarehousingRecordDetails::getDelFlag, UserConstant.DEPT_DISABLE)
+                            .set(WarehousingRecordDetails::getUpdateTime, LocalDateTime.now())
+                            .set(WarehousingRecordDetails::getUpdateBy, SecurityUtils.getUsername()));
+        }
+
+    }
+
+    @Override
+    public CommonResult getWarehousingRecord(Long id) {
+        WarehousingRecord warehousingRecord = warehousingRecordMapper.selectById(id);
+        List<WarehousingRecordDetails > de = warehousingRecordDetailsMapper.selectList(
+                new LambdaQueryWrapper<>(WarehousingRecordDetails.class).eq(WarehousingRecordDetails::getRecordId, id)
+                        .eq(WarehousingRecordDetails::getDelFlag, UserConstant.ENABLE).orderByAsc(WarehousingRecordDetails::getCreateTime));
+        warehousingRecord.setWarehousingRecordDetails(de);
+        return CommonResult.success(warehousingRecord);
+    }
+
+    @Override
+    @Transactional
+    public CommonResult deletedWarehousingRecord(Long id) {
+        warehousingRecordMapper.update(new WarehousingRecord(),
+                new LambdaUpdateWrapper<WarehousingRecord>().eq(WarehousingRecord::getId, id)
+                        .set(WarehousingRecord::getDelFlag, UserConstant.DEPT_DISABLE)
+                        .set(WarehousingRecord::getUpdateTime, LocalDateTime.now())
+                        .set(WarehousingRecord::getUpdateBy, SecurityUtils.getUsername()));
+        warehousingRecordDetailsMapper.update(new WarehousingRecordDetails(),
+                new LambdaUpdateWrapper<WarehousingRecordDetails>().eq(WarehousingRecordDetails::getRecordId, id)
+                        .set(WarehousingRecordDetails::getDelFlag, UserConstant.DEPT_DISABLE)
+                        .set(WarehousingRecordDetails::getUpdateTime, LocalDateTime.now())
+                        .set(WarehousingRecordDetails::getUpdateBy, SecurityUtils.getUsername()));
+        return CommonResult.success();
+    }
+}
diff --git a/multi-system/src/main/resources/mapper/system/OutsourcedCommonMapper.xml b/multi-system/src/main/resources/mapper/system/OutsourcedCommonMapper.xml
new file mode 100644
index 0000000..be0c561
--- /dev/null
+++ b/multi-system/src/main/resources/mapper/system/OutsourcedCommonMapper.xml
@@ -0,0 +1,15 @@
+<?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.gkhy.exam.system.mapper.OutsourcedCommonMapper">
+
+    <select id="selectOutsourcedCommonList" resultType="com.gkhy.exam.system.domain.OutsourcedCommon"
+            parameterType="com.gkhy.exam.system.domain.OutsourcedCommon">
+        select a.*, b.supplier_name as supplierName from outsourced_common a
+        left join supplier_sure b on a.supplier_id = b.id
+        where a.del_flag = 0
+        <if test="companyId != null">
+            and a.company_id = #{companyId}
+        </if>
+        order by a.create_time desc
+    </select>
+</mapper>
diff --git a/multi-system/src/main/resources/mapper/system/OutsourcedProductMapper.xml b/multi-system/src/main/resources/mapper/system/OutsourcedProductMapper.xml
new file mode 100644
index 0000000..f249519
--- /dev/null
+++ b/multi-system/src/main/resources/mapper/system/OutsourcedProductMapper.xml
@@ -0,0 +1,16 @@
+<?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.gkhy.exam.system.mapper.OutsourcedProductMapper">
+
+    <select id="getOutsourcedProductList" parameterType="com.gkhy.exam.system.domain.OutsourcedProduct"
+            resultType="com.gkhy.exam.system.domain.OutsourcedProduct">
+        select a.*, b.supplier_name as supplierName from outsourced_product a
+        left join supplier_sure b on a.supplier_id = b.id
+        where a.del_flag = 0
+        <if test="companyId != null">
+            and a.company_id = #{companyId}
+        </if>
+        order by a.create_time desc
+    </select>
+
+</mapper>
diff --git a/multi-system/src/main/resources/mapper/system/OutsourcedReviewMapper.xml b/multi-system/src/main/resources/mapper/system/OutsourcedReviewMapper.xml
new file mode 100644
index 0000000..decb604
--- /dev/null
+++ b/multi-system/src/main/resources/mapper/system/OutsourcedReviewMapper.xml
@@ -0,0 +1,14 @@
+<?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.gkhy.exam.system.mapper.OutsourcedReviewMapper">
+
+    <select id="getOutsourcedReviewList" resultType="com.gkhy.exam.system.domain.OutsourcedReview" parameterType="com.gkhy.exam.system.domain.OutsourcedReview">
+
+        select * from outsourced_review where del_flag = 0
+        <if test="companyId != null">
+            and company_id = #{companyId}
+        </if>
+        order by create_time desc
+
+    </select>
+</mapper>
diff --git a/multi-system/src/main/resources/mapper/system/OutsourcedReviewSubsidiaryMapper.xml b/multi-system/src/main/resources/mapper/system/OutsourcedReviewSubsidiaryMapper.xml
new file mode 100644
index 0000000..3314ddc
--- /dev/null
+++ b/multi-system/src/main/resources/mapper/system/OutsourcedReviewSubsidiaryMapper.xml
@@ -0,0 +1,5 @@
+<?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.gkhy.exam.system.mapper.OutsourcedReviewSubsidiaryMapper">
+
+</mapper>
diff --git a/multi-system/src/main/resources/mapper/system/OutsourcedUnqualifiedMapper.xml b/multi-system/src/main/resources/mapper/system/OutsourcedUnqualifiedMapper.xml
new file mode 100644
index 0000000..81dd57a
--- /dev/null
+++ b/multi-system/src/main/resources/mapper/system/OutsourcedUnqualifiedMapper.xml
@@ -0,0 +1,16 @@
+<?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.gkhy.exam.system.mapper.OutsourcedUnqualifiedMapper">
+
+
+    <select id="getOutsourcedUnqualifiedList" parameterType="com.gkhy.exam.system.domain.OutsourcedUnqualified"
+            resultType="com.gkhy.exam.system.domain.OutsourcedUnqualified">
+        select a.*, b.supplier_name as supplierName from outsourced_unqualified a
+        left join supplier_sure b on a.supplier_id = b.id
+        where a.del_flag = 0
+        <if test="companyId != null">
+            and a.company_id = #{companyId}
+        </if>
+        order by a.create_time desc
+    </select>
+</mapper>
diff --git a/multi-system/src/main/resources/mapper/system/WarehousingRecordDetailsMapper.xml b/multi-system/src/main/resources/mapper/system/WarehousingRecordDetailsMapper.xml
new file mode 100644
index 0000000..666339e
--- /dev/null
+++ b/multi-system/src/main/resources/mapper/system/WarehousingRecordDetailsMapper.xml
@@ -0,0 +1,5 @@
+<?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.gkhy.exam.system.mapper.WarehousingRecordDetailsMapper">
+
+</mapper>
diff --git a/multi-system/src/main/resources/mapper/system/WarehousingRecordMapper.xml b/multi-system/src/main/resources/mapper/system/WarehousingRecordMapper.xml
new file mode 100644
index 0000000..83e45a5
--- /dev/null
+++ b/multi-system/src/main/resources/mapper/system/WarehousingRecordMapper.xml
@@ -0,0 +1,14 @@
+<?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.gkhy.exam.system.mapper.WarehousingRecordMapper">
+
+    <select id="selectWarehousingRecordList" parameterType="com.gkhy.exam.system.domain.WarehousingRecord"
+            resultType="com.gkhy.exam.system.domain.WarehousingRecord">
+        select * from warehousing_record
+        where del_flag = 0
+        <if test="companyId != null">
+            and company_id = #{companyId}
+        </if>
+        order by create_time desc
+    </select>
+</mapper>

--
Gitblit v1.9.2