From ae659b7fe99a8862082a4ba4bb24148a2a6727ca Mon Sep 17 00:00:00 2001
From: tuqin <tuqin@tuqin.cn>
Date: 星期四, 08 十月 2026 16:57:40 +0800
Subject: [PATCH] feat(芯导): 仓储物流出库 / 人力资源(离职/在职/合同/薪资) / 环保门禁(门禁+智能巡检) 后端

---
 src/main/java/com/ruoyi/envaccess/pojo/EnvAccessVehicle.java                                |   82 ++++
 src/main/resources/mapper/envaccess/EnvInspectionMapper.xml                                 |   34 +
 src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordOutMapper.java            |   10 
 src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java                                |   19 
 src/main/java/com/ruoyi/staff/pojo/StaffContract.java                                       |  134 ++++++
 src/main/java/com/ruoyi/envaccess/service/IEnvInspectionService.java                        |   17 
 src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java                    |    7 
 src/main/resources/mapper/envaccess/EnvAccessVehicleMapper.xml                              |   37 +
 src/main/java/com/ruoyi/staff/controller/StaffContractController.java                       |   97 ++++
 src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml                  |   57 ++
 src/main/java/com/ruoyi/envaccess/mapper/EnvInspectionMapper.java                           |   18 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java                  |    7 
 src/main/java/com/ruoyi/staff/service/IStaffContractService.java                            |   19 
 src/main/java/com/ruoyi/envaccess/service/impl/EnvAccessVehicleServiceImpl.java             |   35 +
 src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordOutService.java          |    4 
 src/main/resources/mapper/staff/StaffContractMapper.xml                                     |   37 +
 src/main/java/com/ruoyi/envaccess/service/impl/EnvInspectionServiceImpl.java                |   98 ++++
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java    |   18 
 src/main/java/com/ruoyi/staff/mapper/StaffContractMapper.java                               |   18 
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java    |    7 
 src/main/java/com/ruoyi/envaccess/controller/EnvAccessVehicleController.java                |   58 ++
 src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java                          |   46 ++
 src/main/java/com/ruoyi/staff/service/impl/StaffContractServiceImpl.java                    |   74 +++
 src/main/java/com/ruoyi/staff/pojo/StaffOnJob.java                                          |   13 
 src/main/java/com/ruoyi/envaccess/mapper/EnvAccessVehicleMapper.java                        |   18 
 src/main/java/com/ruoyi/envaccess/pojo/EnvInspection.java                                   |  100 +++++
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java |   13 
 src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml                     |    6 
 src/main/java/com/ruoyi/envaccess/service/IEnvAccessVehicleService.java                     |   15 
 src/main/java/com/ruoyi/envaccess/controller/EnvInspectionController.java                   |   70 +++
 30 files changed, 1,160 insertions(+), 8 deletions(-)

diff --git a/src/main/java/com/ruoyi/envaccess/controller/EnvAccessVehicleController.java b/src/main/java/com/ruoyi/envaccess/controller/EnvAccessVehicleController.java
new file mode 100644
index 0000000..c11720e
--- /dev/null
+++ b/src/main/java/com/ruoyi/envaccess/controller/EnvAccessVehicleController.java
@@ -0,0 +1,58 @@
+package com.ruoyi.envaccess.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.envaccess.pojo.EnvAccessVehicle;
+import com.ruoyi.envaccess.service.IEnvAccessVehicleService;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 鐜繚闂ㄧ--杞﹁締/绉诲姩鏈烘鍙拌处锛堣繘鍑哄巶杞﹁締銆佸巶鍐呰溅杈嗐�侀潪閬撹矾绉诲姩鏈烘锛�
+ */
+@RestController
+@RequestMapping("/environmentAccess/vehicle")
+public class EnvAccessVehicleController {
+
+    @Resource
+    private IEnvAccessVehicleService envAccessVehicleService;
+
+    @GetMapping("/page")
+    public AjaxResult page(Page page, EnvAccessVehicle req) {
+        return AjaxResult.success(envAccessVehicleService.listPage(page, req));
+    }
+
+    @GetMapping("/{id}")
+    public AjaxResult detail(@PathVariable Long id) {
+        return AjaxResult.success(envAccessVehicleService.getById(id));
+    }
+
+    @PostMapping("/add")
+    @Log(title = "闂ㄧ绠$悊-鏂板", businessType = BusinessType.INSERT)
+    public AjaxResult add(@RequestBody EnvAccessVehicle vehicle) {
+        vehicle.setId(null);
+        return envAccessVehicleService.save(vehicle) ? AjaxResult.success() : AjaxResult.error("鏂板澶辫触");
+    }
+
+    @PostMapping("/update")
+    @Log(title = "闂ㄧ绠$悊-淇敼", businessType = BusinessType.UPDATE)
+    public AjaxResult update(@RequestBody EnvAccessVehicle vehicle) {
+        return envAccessVehicleService.updateById(vehicle) ? AjaxResult.success() : AjaxResult.error("淇敼澶辫触");
+    }
+
+    @DeleteMapping("/delete")
+    @Log(title = "闂ㄧ绠$悊-鍒犻櫎", businessType = BusinessType.DELETE)
+    public AjaxResult delete(@RequestBody List<Long> ids) {
+        return envAccessVehicleService.removeByIds(ids) ? AjaxResult.success() : AjaxResult.error("鍒犻櫎澶辫触");
+    }
+
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, EnvAccessVehicle req) {
+        envAccessVehicleService.export(response, req);
+    }
+}
diff --git a/src/main/java/com/ruoyi/envaccess/controller/EnvInspectionController.java b/src/main/java/com/ruoyi/envaccess/controller/EnvInspectionController.java
new file mode 100644
index 0000000..f9e748e
--- /dev/null
+++ b/src/main/java/com/ruoyi/envaccess/controller/EnvInspectionController.java
@@ -0,0 +1,70 @@
+package com.ruoyi.envaccess.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.envaccess.pojo.EnvInspection;
+import com.ruoyi.envaccess.service.IEnvInspectionService;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 鐜繚闂ㄧ--鏅鸿兘宸℃鍙拌处锛堝惈璺緞瑙勫垝/AI瑙嗛鍒嗘瀽/鎶ュ憡/鏃犱汉鏈烘満鍣ㄤ汉锛孉I涓庢棤浜烘満瀛楁棰勭暀锛�
+ */
+@RestController
+@RequestMapping("/environmentAccess/inspection")
+public class EnvInspectionController {
+
+    @Resource
+    private IEnvInspectionService envInspectionService;
+
+    @GetMapping("/page")
+    public AjaxResult page(Page page, EnvInspection req) {
+        return AjaxResult.success(envInspectionService.listPage(page, req));
+    }
+
+    @GetMapping("/{id}")
+    public AjaxResult detail(@PathVariable Long id) {
+        return AjaxResult.success(envInspectionService.getById(id));
+    }
+
+    @PostMapping("/add")
+    @Log(title = "鏅鸿兘宸℃-鏂板", businessType = BusinessType.INSERT)
+    public AjaxResult add(@RequestBody EnvInspection inspection) {
+        inspection.setId(null);
+        if (inspection.getStatus() == null) {
+            inspection.setStatus(0);
+        }
+        return envInspectionService.save(inspection) ? AjaxResult.success() : AjaxResult.error("鏂板澶辫触");
+    }
+
+    @PostMapping("/update")
+    @Log(title = "鏅鸿兘宸℃-淇敼", businessType = BusinessType.UPDATE)
+    public AjaxResult update(@RequestBody EnvInspection inspection) {
+        return envInspectionService.updateById(inspection) ? AjaxResult.success() : AjaxResult.error("淇敼澶辫触");
+    }
+
+    @DeleteMapping("/delete")
+    @Log(title = "鏅鸿兘宸℃-鍒犻櫎", businessType = BusinessType.DELETE)
+    public AjaxResult delete(@RequestBody List<Long> ids) {
+        return envInspectionService.removeByIds(ids) ? AjaxResult.success() : AjaxResult.error("鍒犻櫎澶辫触");
+    }
+
+    /**
+     * 鑷姩鐢熸垚宸℃鎶ュ憡
+     */
+    @GetMapping("/report/{id}")
+    @Log(title = "鏅鸿兘宸℃-鐢熸垚鎶ュ憡", businessType = BusinessType.OTHER)
+    public AjaxResult generateReport(@PathVariable Long id) {
+        return AjaxResult.success((Object) envInspectionService.generateReport(id));
+    }
+
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, EnvInspection req) {
+        envInspectionService.export(response, req);
+    }
+}
diff --git a/src/main/java/com/ruoyi/envaccess/mapper/EnvAccessVehicleMapper.java b/src/main/java/com/ruoyi/envaccess/mapper/EnvAccessVehicleMapper.java
new file mode 100644
index 0000000..d10b8dd
--- /dev/null
+++ b/src/main/java/com/ruoyi/envaccess/mapper/EnvAccessVehicleMapper.java
@@ -0,0 +1,18 @@
+package com.ruoyi.envaccess.mapper;
+
+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.envaccess.pojo.EnvAccessVehicle;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface EnvAccessVehicleMapper extends BaseMapper<EnvAccessVehicle> {
+
+    IPage<EnvAccessVehicle> listPage(Page page, @Param("req") EnvAccessVehicle req);
+
+    List<EnvAccessVehicle> list(@Param("req") EnvAccessVehicle req);
+}
diff --git a/src/main/java/com/ruoyi/envaccess/mapper/EnvInspectionMapper.java b/src/main/java/com/ruoyi/envaccess/mapper/EnvInspectionMapper.java
new file mode 100644
index 0000000..bec5e1d
--- /dev/null
+++ b/src/main/java/com/ruoyi/envaccess/mapper/EnvInspectionMapper.java
@@ -0,0 +1,18 @@
+package com.ruoyi.envaccess.mapper;
+
+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.envaccess.pojo.EnvInspection;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface EnvInspectionMapper extends BaseMapper<EnvInspection> {
+
+    IPage<EnvInspection> listPage(Page page, @Param("req") EnvInspection req);
+
+    List<EnvInspection> list(@Param("req") EnvInspection req);
+}
diff --git a/src/main/java/com/ruoyi/envaccess/pojo/EnvAccessVehicle.java b/src/main/java/com/ruoyi/envaccess/pojo/EnvAccessVehicle.java
new file mode 100644
index 0000000..183b1af
--- /dev/null
+++ b/src/main/java/com/ruoyi/envaccess/pojo/EnvAccessVehicle.java
@@ -0,0 +1,82 @@
+package com.ruoyi.envaccess.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.dto.DateQueryDto;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * 鐜繚闂ㄧ--杞﹁締/绉诲姩鏈烘鍙拌处
+ * env_access_vehicle
+ */
+@TableName(value = "env_access_vehicle")
+@Data
+public class EnvAccessVehicle extends DateQueryDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 绫诲瀷 1杩涘嚭鍘� 2鍘傚唴 3闈為亾璺Щ鍔ㄦ満姊�
+     */
+    @Excel(name = "绫诲瀷", readConverterExp = "1=杩涘嚭鍘傝溅杈�,2=鍘傚唴杞﹁締,3=闈為亾璺Щ鍔ㄦ満姊�")
+    private Integer vehicleType;
+
+    @Excel(name = "杞︾墝/鏈烘缂栧彿")
+    private String plateNo;
+
+    @Excel(name = "杞﹁締/鏈烘鍨嬪彿")
+    private String vehicleModel;
+
+    @Excel(name = "浣跨敤浜�")
+    private String driverName;
+
+    @Excel(name = "鑱旂郴鐢佃瘽")
+    private String driverPhone;
+
+    @Excel(name = "鐢ㄩ��")
+    private String usePurpose;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date occurTime;
+
+    /**
+     * 1杩涘巶 0鍑哄巶锛堣繘鍑哄巶鐢級
+     */
+    @Excel(name = "鏂瑰悜", readConverterExp = "1=杩涘巶,0=鍑哄巶")
+    private Integer direction;
+
+    @Excel(name = "鐘舵��")
+    private String status;
+
+    @Excel(name = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "鍒涘缓鐢ㄦ埛")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty(value = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "淇敼鐢ㄦ埛")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty(value = "绉熸埛ID")
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+}
diff --git a/src/main/java/com/ruoyi/envaccess/pojo/EnvInspection.java b/src/main/java/com/ruoyi/envaccess/pojo/EnvInspection.java
new file mode 100644
index 0000000..a424af3
--- /dev/null
+++ b/src/main/java/com/ruoyi/envaccess/pojo/EnvInspection.java
@@ -0,0 +1,100 @@
+package com.ruoyi.envaccess.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.dto.DateQueryDto;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * 鐜繚闂ㄧ--鏅鸿兘宸℃鍙拌处
+ * env_inspection
+ */
+@TableName(value = "env_inspection")
+@Data
+public class EnvInspection extends DateQueryDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    @Excel(name = "宸℃鍚嶇О")
+    private String inspectionName;
+
+    /**
+     * 1瀹氭湡 2涓存椂 3鏁呴殰
+     */
+    @Excel(name = "宸℃绫诲瀷", readConverterExp = "1=瀹氭湡宸℃,2=涓存椂宸℃,3=鏁呴殰宸℃")
+    private Integer inspectionType;
+
+    @Excel(name = "宸℃璺緞瑙勫垝")
+    private String routePlan;
+
+    @Excel(name = "宸℃鍖哄煙")
+    private String area;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "璁″垝寮�濮嬫椂闂�", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date planStartTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "璁″垝缁撴潫鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date planEndTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "瀹為檯寮�濮嬫椂闂�", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date actualStartTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "瀹為檯缁撴潫鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date actualEndTime;
+
+    @Excel(name = "宸℃浜哄憳")
+    private String inspector;
+
+    @Excel(name = "宸℃缁撴灉")
+    private String inspectionResult;
+
+    @ApiModelProperty(value = "AI瑙嗛鍒嗘瀽缁撴灉(棰勭暀)")
+    private String aiAnalysis;
+
+    @ApiModelProperty(value = "鏃犱汉鏈�/鏈哄櫒浜哄洖浼犳暟鎹�(棰勭暀)")
+    private String uavData;
+
+    @ApiModelProperty(value = "鑷姩鐢熸垚宸℃鎶ュ憡")
+    private String reportPath;
+
+    /**
+     * 0寰呮墽琛� 1鎵ц涓� 2宸插畬鎴� 3宸插彇娑�
+     */
+    @Excel(name = "鐘舵��", readConverterExp = "0=寰呮墽琛�,1=鎵ц涓�,2=宸插畬鎴�,3=宸插彇娑�")
+    private Integer status;
+
+    @Excel(name = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "鍒涘缓鐢ㄦ埛")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty(value = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "淇敼鐢ㄦ埛")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty(value = "绉熸埛ID")
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+}
diff --git a/src/main/java/com/ruoyi/envaccess/service/IEnvAccessVehicleService.java b/src/main/java/com/ruoyi/envaccess/service/IEnvAccessVehicleService.java
new file mode 100644
index 0000000..462c428
--- /dev/null
+++ b/src/main/java/com/ruoyi/envaccess/service/IEnvAccessVehicleService.java
@@ -0,0 +1,15 @@
+package com.ruoyi.envaccess.service;
+
+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.envaccess.pojo.EnvAccessVehicle;
+
+import javax.servlet.http.HttpServletResponse;
+
+public interface IEnvAccessVehicleService extends IService<EnvAccessVehicle> {
+
+    IPage<EnvAccessVehicle> listPage(Page page, EnvAccessVehicle req);
+
+    void export(HttpServletResponse response, EnvAccessVehicle req);
+}
diff --git a/src/main/java/com/ruoyi/envaccess/service/IEnvInspectionService.java b/src/main/java/com/ruoyi/envaccess/service/IEnvInspectionService.java
new file mode 100644
index 0000000..7096111
--- /dev/null
+++ b/src/main/java/com/ruoyi/envaccess/service/IEnvInspectionService.java
@@ -0,0 +1,17 @@
+package com.ruoyi.envaccess.service;
+
+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.envaccess.pojo.EnvInspection;
+
+import javax.servlet.http.HttpServletResponse;
+
+public interface IEnvInspectionService extends IService<EnvInspection> {
+
+    IPage<EnvInspection> listPage(Page page, EnvInspection req);
+
+    String generateReport(Long id);
+
+    void export(HttpServletResponse response, EnvInspection req);
+}
diff --git a/src/main/java/com/ruoyi/envaccess/service/impl/EnvAccessVehicleServiceImpl.java b/src/main/java/com/ruoyi/envaccess/service/impl/EnvAccessVehicleServiceImpl.java
new file mode 100644
index 0000000..82e9e05
--- /dev/null
+++ b/src/main/java/com/ruoyi/envaccess/service/impl/EnvAccessVehicleServiceImpl.java
@@ -0,0 +1,35 @@
+package com.ruoyi.envaccess.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.envaccess.mapper.EnvAccessVehicleMapper;
+import com.ruoyi.envaccess.pojo.EnvAccessVehicle;
+import com.ruoyi.envaccess.service.IEnvAccessVehicleService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+@Service
+@AllArgsConstructor
+@Transactional(rollbackFor = Exception.class)
+public class EnvAccessVehicleServiceImpl extends ServiceImpl<EnvAccessVehicleMapper, EnvAccessVehicle> implements IEnvAccessVehicleService {
+
+    private EnvAccessVehicleMapper envAccessVehicleMapper;
+
+    @Override
+    public IPage<EnvAccessVehicle> listPage(Page page, EnvAccessVehicle req) {
+        return envAccessVehicleMapper.listPage(page, req);
+    }
+
+    @Override
+    public void export(HttpServletResponse response, EnvAccessVehicle req) {
+        List<EnvAccessVehicle> list = envAccessVehicleMapper.list(req);
+        ExcelUtil<EnvAccessVehicle> util = new ExcelUtil<EnvAccessVehicle>(EnvAccessVehicle.class);
+        util.exportExcel(response, list, "闂ㄧ绠$悊鍙拌处");
+    }
+}
diff --git a/src/main/java/com/ruoyi/envaccess/service/impl/EnvInspectionServiceImpl.java b/src/main/java/com/ruoyi/envaccess/service/impl/EnvInspectionServiceImpl.java
new file mode 100644
index 0000000..5ea22b8
--- /dev/null
+++ b/src/main/java/com/ruoyi/envaccess/service/impl/EnvInspectionServiceImpl.java
@@ -0,0 +1,98 @@
+package com.ruoyi.envaccess.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.exception.base.BaseException;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.envaccess.mapper.EnvInspectionMapper;
+import com.ruoyi.envaccess.pojo.EnvInspection;
+import com.ruoyi.envaccess.service.IEnvInspectionService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletResponse;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+@Service
+@AllArgsConstructor
+@Transactional(rollbackFor = Exception.class)
+public class EnvInspectionServiceImpl extends ServiceImpl<EnvInspectionMapper, EnvInspection> implements IEnvInspectionService {
+
+    private EnvInspectionMapper envInspectionMapper;
+
+    @Override
+    public IPage<EnvInspection> listPage(Page page, EnvInspection req) {
+        return envInspectionMapper.listPage(page, req);
+    }
+
+    @Override
+    public void export(HttpServletResponse response, EnvInspection req) {
+        List<EnvInspection> list = envInspectionMapper.list(req);
+        ExcelUtil<EnvInspection> util = new ExcelUtil<EnvInspection>(EnvInspection.class);
+        util.exportExcel(response, list, "鏅鸿兘宸℃鍙拌处");
+    }
+
+    /**
+     * 鏍规嵁宸℃璁板綍鑷姩鐢熸垚宸℃鎶ュ憡锛圚TML锛夛紝骞跺啓鍥� report_path
+     */
+    @Override
+    public String generateReport(Long id) {
+        EnvInspection it = getById(id);
+        if (it == null) {
+            throw new BaseException("宸℃璁板綍涓嶅瓨鍦�");
+        }
+        String typeText = it.getInspectionType() == null ? "" :
+                (it.getInspectionType() == 1 ? "瀹氭湡宸℃" : it.getInspectionType() == 2 ? "涓存椂宸℃" :
+                        it.getInspectionType() == 3 ? "鏁呴殰宸℃" : "");
+        String statusText = it.getStatus() == null ? "" :
+                (it.getStatus() == 0 ? "寰呮墽琛�" : it.getStatus() == 1 ? "鎵ц涓�" :
+                        it.getStatus() == 2 ? "宸插畬鎴�" : it.getStatus() == 3 ? "宸插彇娑�" : "");
+        String now = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+
+        StringBuilder sb = new StringBuilder();
+        sb.append("<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:w='urn:schemas-microsoft-com:office:word'>")
+          .append("<head><meta charset='utf-8'><title>鏅鸿兘宸℃鎶ュ憡</title></head><body>");
+        sb.append("<h2 style='text-align:center;'>鏅鸿兘宸℃鎶ュ憡</h2>");
+        sb.append("<p style='text-align:right;'>鎶ュ憡鐢熸垚鏃堕棿锛�").append(now).append("</p>");
+        sb.append("<table border='1' cellspacing='0' cellpadding='6' style='border-collapse:collapse;width:100%;font-size:14px;'>");
+        row(sb, "宸℃鍚嶇О", it.getInspectionName());
+        row(sb, "宸℃绫诲瀷", typeText);
+        row(sb, "宸℃鍖哄煙", it.getArea());
+        row(sb, "宸℃璺緞瑙勫垝", it.getRoutePlan());
+        row(sb, "璁″垝鏃堕棿", fmt(it.getPlanStartTime()) + " ~ " + fmt(it.getPlanEndTime()));
+        row(sb, "瀹為檯鏃堕棿", fmt(it.getActualStartTime()) + " ~ " + fmt(it.getActualEndTime()));
+        row(sb, "宸℃浜哄憳", it.getInspector());
+        row(sb, "宸℃鐘舵��", statusText);
+        row(sb, "宸℃缁撴灉/璁板綍", it.getInspectionResult());
+        row(sb, "AI瑙嗛鍒嗘瀽缁撴灉", it.getAiAnalysis());
+        row(sb, "鏃犱汉鏈�/鏈哄櫒浜烘暟鎹�", it.getUavData());
+        row(sb, "澶囨敞", it.getRemark());
+        sb.append("</table>");
+        sb.append("<p style='margin-top:30px;'>宸℃浜虹瀛楋細________________&nbsp;&nbsp;&nbsp;&nbsp;瀹℃壒浜虹瀛楋細________________</p>");
+        sb.append("</body></html>");
+
+        String content = sb.toString();
+        EnvInspection upd = new EnvInspection();
+        upd.setId(id);
+        upd.setReportPath(content);
+        updateById(upd);
+        return content;
+    }
+
+    private static String fmt(java.util.Date d) {
+        if (d == null) {
+            return "";
+        }
+        return new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(d);
+    }
+
+    private static void row(StringBuilder sb, String label, Object value) {
+        sb.append("<tr><td style='background:#f0f1f5;width:180px;'>").append(label)
+          .append("</td><td>").append(value == null ? "" : String.valueOf(value).replace("\n", "<br/>"))
+          .append("</td></tr>");
+    }
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java
index d7f1a84..f37acc5 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java
@@ -98,4 +98,22 @@
         util.exportExcel(response, list, "鐢熶骇鍑哄簱鍙拌处");
     }
 
+    /**
+     * 閫�璐у嚭搴擄紙閲囪喘閫�璐у嚭搴擄級鍙拌处鏌ヨ
+     */
+    @GetMapping("/listPageByPurchaseReturn")
+    @Log(title = "閫�璐у嚭搴�-鍑哄簱鍙拌处-鍑哄簱鏌ヨ", businessType = BusinessType.OTHER)
+    public AjaxResult listPageByPurchaseReturn(Page page, ProcurementRecordOutPageDto procurementDto) {
+        IPage<ProcurementRecordOutPageDto> result = procurementRecordOutService.listPageByPurchaseReturn(page, procurementDto);
+        return AjaxResult.success(result);
+    }
+
+    /**
+     * 閫�璐у嚭搴擄紙閲囪喘閫�璐у嚭搴擄級鍙拌处瀵煎嚭
+     */
+    @PostMapping("/exportPurchaseReturn")
+    public void exportPurchaseReturn(HttpServletResponse response) {
+        procurementRecordOutService.exportPurchaseReturn(response);
+    }
+
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java
index 9124e75..44c0e0d 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java
@@ -20,8 +20,13 @@
     private Integer salesLedgerProductId;
 
     /**
-     * 鍑哄簱绫诲瀷 1-閲囪喘鍑哄簱 2-閿�鍞嚭搴� 3-鑷畾涔�
+     * 鍑哄簱绫诲瀷 1-閲囪喘鍑哄簱 2-閿�鍞嚭搴� 3-鑷畾涔夊嚭搴�(鍙戞枡/棰嗙敤) 5-閫�璐у嚭搴�(閲囪喘閫�璐�)
      */
     private Integer type;
 
+    /**
+     * 渚涘簲鍟嗗悕绉帮紙閫�璐у嚭搴�-閫�鍥炰緵搴斿晢鏃朵娇鐢級
+     */
+    private String supplierName;
+
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordOutMapper.java b/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordOutMapper.java
index 6cd9dab..a54314a 100644
--- a/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordOutMapper.java
+++ b/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordOutMapper.java
@@ -26,4 +26,14 @@
     IPage<ProcurementRecordOutPageDto> listPageByProduct(Page page,@Param("req") ProcurementRecordOutPageDto procurementDto);
 
     IPage<ProcurementRecordOutPageDto> listPageByCustom(Page page,@Param("req") ProcurementRecordOutPageDto procurementDto);
+
+    /**
+     * 閫�璐у嚭搴擄紙閲囪喘閫�璐у嚭搴擄級鍙拌处鍒嗛〉
+     */
+    IPage<ProcurementRecordOutPageDto> listPageByPurchaseReturn(Page page,@Param("req") ProcurementRecordOutPageDto procurementDto);
+
+    /**
+     * 閫�璐у嚭搴撳彴璐﹀鍑烘暟鎹�
+     */
+    List<ProcurementRecordOutPageDto> listPurchaseReturn();
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
index aa85a3d..42d469c 100644
--- a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
+++ b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
@@ -49,11 +49,16 @@
 
 
     /**
-     * 鍑哄簱绫诲瀷 1-閲囪喘 2-閿�鍞� 3-鑷畾涔�
+     * 鍑哄簱绫诲瀷 1-閲囪喘鍑哄簱 2-閿�鍞嚭搴� 3-鑷畾涔夊嚭搴�(鍙戞枡/棰嗙敤) 5-閫�璐у嚭搴�(閲囪喘閫�璐�)
      */
     private Integer type;
 
     /**
+     * 渚涘簲鍟嗗悕绉帮紙閫�璐у嚭搴�-閫�鍥炰緵搴斿晢鏃惰褰曪級
+     */
+    private String supplierName;
+
+    /**
      * 鍑哄簱鐢ㄦ埛
      */
     private String createBy;
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordOutService.java b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordOutService.java
index a8fb7eb..cdd4ab1 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordOutService.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordOutService.java
@@ -27,4 +27,8 @@
     IPage<ProcurementRecordOutPageDto> listPageByProduct(Page page, ProcurementRecordOutPageDto procurementDto);
 
     IPage<ProcurementRecordOutPageDto> listPageByCustom(Page page, ProcurementRecordOutPageDto procurementDto);
+
+    IPage<ProcurementRecordOutPageDto> listPageByPurchaseReturn(Page page, ProcurementRecordOutPageDto procurementDto);
+
+    void exportPurchaseReturn(HttpServletResponse response);
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
index c8fedc3..b9f9641 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
@@ -74,6 +74,7 @@
                 .inboundBatches(aLong.equals(0L) ? "绗�1鎵规" : "绗�"+ (aLong + 1) + "鎵规")
                 .inboundNum(new BigDecimal(procurementRecordOutAdd.getQuantity()))
                 .type(procurementRecordOutAdd.getType())
+                .supplierName(procurementRecordOutAdd.getSupplierName())
                 .createTime(localDateTime == null ? LocalDateTime.now() : localDateTime)
                 .createUser(Long.valueOf(procurementRecordOutAdd.getUserId()))
                 .createBy(sysUser.getNickName())
@@ -118,4 +119,16 @@
     public IPage<ProcurementRecordOutPageDto> listPageByCustom(Page page, ProcurementRecordOutPageDto procurementDto) {
         return procurementRecordOutMapper.listPageByCustom(page, procurementDto);
     }
+
+    @Override
+    public IPage<ProcurementRecordOutPageDto> listPageByPurchaseReturn(Page page, ProcurementRecordOutPageDto procurementDto) {
+        return procurementRecordOutMapper.listPageByPurchaseReturn(page, procurementDto);
+    }
+
+    @Override
+    public void exportPurchaseReturn(HttpServletResponse response) {
+        List<ProcurementRecordOutPageDto> list = procurementRecordOutMapper.listPurchaseReturn();
+        ExcelUtil<ProcurementRecordOutPageDto> util = new ExcelUtil<>(ProcurementRecordOutPageDto.class);
+        util.exportExcel(response, list, "閫�璐у嚭搴撳彴璐�");
+    }
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
index 9a141a4..2896718 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -34,6 +34,7 @@
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -703,7 +704,7 @@
         }
         LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
         procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect)
-                .eq(ProcurementRecordOut::getType, 1);
+                .in(ProcurementRecordOut::getType, Arrays.asList(1, 5));
         List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
         if(CollectionUtils.isEmpty( procurementRecords)){
             return procurementPageDtoIPage;
@@ -743,7 +744,7 @@
         }
         LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
         procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
-        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType,1);
+        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getType, Arrays.asList(1, 5));
         List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
         if(CollectionUtils.isEmpty( procurementRecords)){
             return procurementPageDtoCopyIPage;
@@ -751,7 +752,7 @@
         for (ProcurementPageDtoCopy dto : procurementPageDtoCopyList) {
             // 鏍规嵁閲囪喘鍙拌处ID绛涢�夊搴旂殑鍑哄簱璁板綍
             List<ProcurementRecordOut> collect1 = procurementRecords.stream()
-                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()) && ProcurementRecordOut.getType().equals(1))
+                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()) && (ProcurementRecordOut.getType().equals(1) || ProcurementRecordOut.getType().equals(5)))
                     .collect(Collectors.toList());
 
             // 濡傛灉娌℃湁鐩稿叧鐨勫嚭搴撹褰曪紝璺宠繃璇ユ潯鏁版嵁
diff --git a/src/main/java/com/ruoyi/staff/controller/StaffContractController.java b/src/main/java/com/ruoyi/staff/controller/StaffContractController.java
new file mode 100644
index 0000000..70b1f4a
--- /dev/null
+++ b/src/main/java/com/ruoyi/staff/controller/StaffContractController.java
@@ -0,0 +1,97 @@
+package com.ruoyi.staff.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.staff.pojo.StaffContract;
+import com.ruoyi.staff.service.IStaffContractService;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 鍚堝悓绠$悊锛堝憳宸ュ姵鍔ㄥ悎鍚岋級
+ */
+@RestController
+@RequestMapping("/staff/contract")
+public class StaffContractController {
+
+    @Resource
+    private IStaffContractService staffContractService;
+
+    /**
+     * 鍚堝悓鍙拌处鍒嗛〉鏌ヨ
+     */
+    @GetMapping("/listPage")
+    public AjaxResult listPage(Page page, StaffContract req) {
+        return AjaxResult.success(staffContractService.listPage(page, req));
+    }
+
+    /**
+     * 鍚堝悓璇︽儏
+     */
+    @GetMapping("/{id}")
+    public AjaxResult detail(@PathVariable Long id) {
+        return AjaxResult.success(staffContractService.getById(id));
+    }
+
+    /**
+     * 鏂板鍚堝悓
+     */
+    @PostMapping("/add")
+    @Log(title = "鍚堝悓绠$悊-鏂板", businessType = BusinessType.INSERT)
+    public AjaxResult add(@RequestBody StaffContract staffContract) {
+        staffContract.setId(null);
+        if (staffContract.getStatus() == null) {
+            staffContract.setStatus(0);
+        }
+        return staffContractService.save(staffContract) ? AjaxResult.success() : AjaxResult.error("鏂板澶辫触");
+    }
+
+    /**
+     * 淇敼鍚堝悓
+     */
+    @PostMapping("/update")
+    @Log(title = "鍚堝悓绠$悊-淇敼", businessType = BusinessType.UPDATE)
+    public AjaxResult update(@RequestBody StaffContract staffContract) {
+        return staffContractService.updateById(staffContract) ? AjaxResult.success() : AjaxResult.error("淇敼澶辫触");
+    }
+
+    /**
+     * 鍒犻櫎鍚堝悓
+     */
+    @DeleteMapping("/del")
+    @Log(title = "鍚堝悓绠$悊-鍒犻櫎", businessType = BusinessType.DELETE)
+    public AjaxResult del(@RequestBody List<Long> ids) {
+        return staffContractService.removeByIds(ids) ? AjaxResult.success() : AjaxResult.error("鍒犻櫎澶辫触");
+    }
+
+    /**
+     * 缁鍚堝悓
+     */
+    @PostMapping("/renew/{id}")
+    @Log(title = "鍚堝悓绠$悊-缁", businessType = BusinessType.UPDATE)
+    public AjaxResult renew(@PathVariable Long id, @RequestBody StaffContract staffContract) {
+        return staffContractService.renew(id, staffContract) > 0 ? AjaxResult.success() : AjaxResult.error("缁澶辫触");
+    }
+
+    /**
+     * 瑙i櫎鍚堝悓
+     */
+    @PostMapping("/terminate/{id}")
+    @Log(title = "鍚堝悓绠$悊-瑙i櫎", businessType = BusinessType.UPDATE)
+    public AjaxResult terminate(@PathVariable Long id, @RequestBody StaffContract staffContract) {
+        return staffContractService.terminate(id, staffContract) > 0 ? AjaxResult.success() : AjaxResult.error("瑙i櫎澶辫触");
+    }
+
+    /**
+     * 鍚堝悓瀵煎嚭
+     */
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, StaffContract req) {
+        staffContractService.export(response, req);
+    }
+}
diff --git a/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java b/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
index 7d73759..f5c9850 100644
--- a/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
+++ b/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
@@ -79,5 +79,51 @@
         staffOnJobService.staffOnJobExport(response, staffOnJob);
     }
 
+    /**
+     * 鏂板鍦ㄨ亴鍛樺伐
+     */
+    @PostMapping
+    public AjaxResult add(@RequestBody StaffOnJob staffOnJob) {
+        if (staffOnJob.getStaffState() == null) {
+            staffOnJob.setStaffState(1);
+        }
+        return staffOnJobService.save(staffOnJob) ? AjaxResult.success() : AjaxResult.error("鏂板澶辫触");
+    }
+
+    /**
+     * 淇敼鍦ㄨ亴鍛樺伐
+     */
+    @PutMapping("/{id}")
+    public AjaxResult update(@PathVariable Long id, @RequestBody StaffOnJob staffOnJob) {
+        staffOnJob.setId(id);
+        return staffOnJobService.updateById(staffOnJob) ? AjaxResult.success() : AjaxResult.error("淇敼澶辫触");
+    }
+
+    /**
+     * 鍒犻櫎鍦ㄨ亴鍛樺伐
+     */
+    @DeleteMapping("/del")
+    public AjaxResult del(@RequestBody List<Long> ids) {
+        return staffOnJobService.removeByIds(ids) ? AjaxResult.success() : AjaxResult.error("鍒犻櫎澶辫触");
+    }
+
+    /**
+     * 鍦ㄨ亴鍛樺伐缁熻锛堝湪鑱屼汉鏁� / 钖祫鍚堣锛�
+     */
+    @GetMapping("/statistics")
+    public AjaxResult statistics() {
+        List<StaffOnJob> list = staffOnJobService.list();
+        long onJobCount = list.stream()
+                .filter(s -> s.getStaffState() != null && s.getStaffState() == 1).count();
+        java.math.BigDecimal salaryTotal = list.stream()
+                .filter(s -> s.getStaffState() != null && s.getStaffState() == 1 && s.getSalary() != null)
+                .map(StaffOnJob::getSalary)
+                .reduce(java.math.BigDecimal.ZERO, java.math.BigDecimal::add);
+        java.util.Map<String, Object> map = new java.util.HashMap<>();
+        map.put("onJobCount", onJobCount);
+        map.put("salaryTotal", salaryTotal);
+        return AjaxResult.success(map);
+    }
+
 
 }
diff --git a/src/main/java/com/ruoyi/staff/mapper/StaffContractMapper.java b/src/main/java/com/ruoyi/staff/mapper/StaffContractMapper.java
new file mode 100644
index 0000000..50174de
--- /dev/null
+++ b/src/main/java/com/ruoyi/staff/mapper/StaffContractMapper.java
@@ -0,0 +1,18 @@
+package com.ruoyi.staff.mapper;
+
+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.staff.pojo.StaffContract;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface StaffContractMapper extends BaseMapper<StaffContract> {
+
+    IPage<StaffContract> listPage(Page page, @Param("req") StaffContract req);
+
+    List<StaffContract> list(@Param("req") StaffContract req);
+}
diff --git a/src/main/java/com/ruoyi/staff/pojo/StaffContract.java b/src/main/java/com/ruoyi/staff/pojo/StaffContract.java
new file mode 100644
index 0000000..c11d6f4
--- /dev/null
+++ b/src/main/java/com/ruoyi/staff/pojo/StaffContract.java
@@ -0,0 +1,134 @@
+package com.ruoyi.staff.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.dto.DateQueryDto;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * 浜哄憳绠$悊--鍔冲姩鍚堝悓
+ * staff_contract
+ */
+@TableName(value = "staff_contract")
+@Data
+public class StaffContract extends DateQueryDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 搴忓彿
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 鍛樺伐缂栧彿
+     */
+    @Excel(name = "鍛樺伐缂栧彿")
+    private String staffNo;
+
+    /**
+     * 鍛樺伐濮撳悕
+     */
+    @Excel(name = "鍛樺伐濮撳悕")
+    private String staffName;
+
+    /**
+     * 宀椾綅
+     */
+    @Excel(name = "宀椾綅")
+    private String postJob;
+
+    /**
+     * 绛捐鏃ユ湡
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "绛捐鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date signDate;
+
+    /**
+     * 鍚堝悓寮�濮嬫棩鏈�
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "鍚堝悓寮�濮嬫棩鏈�", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date startDate;
+
+    /**
+     * 鍚堝悓缁撴潫鏃ユ湡
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "鍚堝悓缁撴潫鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date endDate;
+
+    /**
+     * 鍚堝悓骞撮檺
+     */
+    @Excel(name = "鍚堝悓骞撮檺")
+    private Integer contractTerm;
+
+    /**
+     * 鍚堝悓鍐呭
+     */
+    @Excel(name = "鍚堝悓鍐呭")
+    private String contractContent;
+
+    /**
+     * 鐘舵�� 0鏈夋晥 1宸茬画绛� 2宸茶В闄�
+     */
+    @ApiModelProperty(value = "鐘舵�� 0鏈夋晥 1宸茬画绛� 2宸茶В闄�")
+    private Integer status;
+
+    /**
+     * 缁鏃ユ湡
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "缁鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date renewDate;
+
+    /**
+     * 缁鍚庡埌鏈熸棩鏈�
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "缁鍚庡埌鏈熸棩鏈�", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date renewEndDate;
+
+    /**
+     * 瑙i櫎鏃ユ湡
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "瑙i櫎鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date terminateDate;
+
+    /**
+     * 瑙i櫎鍘熷洜
+     */
+    @Excel(name = "瑙i櫎鍘熷洜")
+    private String terminateReason;
+
+    private String remark;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "鍒涘缓鐢ㄦ埛")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty(value = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "淇敼鐢ㄦ埛")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty(value = "绉熸埛ID")
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+}
diff --git a/src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java b/src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java
index 8de0b69..f41f9c9 100644
--- a/src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java
+++ b/src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java
@@ -141,6 +141,25 @@
     @Excel(name = "鍚堝悓缁撴潫鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
     private Date contractEndTime;
 
+    /**
+     * 绂昏亴鏃ユ湡
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "绂昏亴鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date leaveDate;
+
+    /**
+     * 绂昏亴鍘熷洜
+     */
+    @Excel(name = "绂昏亴鍘熷洜")
+    private String leaveReason;
+
+    /**
+     * 宸ヤ綔浜ゆ帴鎯呭喌
+     */
+    @Excel(name = "宸ヤ綔浜ゆ帴鎯呭喌")
+    private String handoverInfo;
+
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
     @TableField(fill = FieldFill.INSERT)
     private LocalDateTime createTime;
diff --git a/src/main/java/com/ruoyi/staff/pojo/StaffOnJob.java b/src/main/java/com/ruoyi/staff/pojo/StaffOnJob.java
index dc17ed2..8cc22a0 100644
--- a/src/main/java/com/ruoyi/staff/pojo/StaffOnJob.java
+++ b/src/main/java/com/ruoyi/staff/pojo/StaffOnJob.java
@@ -123,6 +123,19 @@
     @Excel(name = "鍚堝悓鍒版湡鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
     private Date contractExpireTime;
 
+    /**
+     * 鍏ヨ亴鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "鍏ヨ亴鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date entryDate;
+
+    /**
+     * 钖祫
+     */
+    @Excel(name = "钖祫")
+    private java.math.BigDecimal salary;
+
 
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
     @TableField(fill = FieldFill.INSERT)
diff --git a/src/main/java/com/ruoyi/staff/service/IStaffContractService.java b/src/main/java/com/ruoyi/staff/service/IStaffContractService.java
new file mode 100644
index 0000000..b12f6e4
--- /dev/null
+++ b/src/main/java/com/ruoyi/staff/service/IStaffContractService.java
@@ -0,0 +1,19 @@
+package com.ruoyi.staff.service;
+
+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.staff.pojo.StaffContract;
+
+import javax.servlet.http.HttpServletResponse;
+
+public interface IStaffContractService extends IService<StaffContract> {
+
+    IPage<StaffContract> listPage(Page page, StaffContract req);
+
+    int renew(Long id, StaffContract req);
+
+    int terminate(Long id, StaffContract req);
+
+    void export(HttpServletResponse response, StaffContract req);
+}
diff --git a/src/main/java/com/ruoyi/staff/service/impl/StaffContractServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/StaffContractServiceImpl.java
new file mode 100644
index 0000000..127c81c
--- /dev/null
+++ b/src/main/java/com/ruoyi/staff/service/impl/StaffContractServiceImpl.java
@@ -0,0 +1,74 @@
+package com.ruoyi.staff.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.exception.base.BaseException;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.staff.mapper.StaffContractMapper;
+import com.ruoyi.staff.pojo.StaffContract;
+import com.ruoyi.staff.service.IStaffContractService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+@Service
+@AllArgsConstructor
+@Transactional(rollbackFor = Exception.class)
+public class StaffContractServiceImpl extends ServiceImpl<StaffContractMapper, StaffContract> implements IStaffContractService {
+
+    private StaffContractMapper staffContractMapper;
+
+    @Override
+    public IPage<StaffContract> listPage(Page page, StaffContract req) {
+        return staffContractMapper.listPage(page, req);
+    }
+
+    /**
+     * 缁锛氳褰曠画绛炬棩鏈�/缁鍚庡埌鏈熸棩鏈燂紝鐘舵�佺疆"宸茬画绛�"锛屽苟鏇存柊鍚堝悓缁撴潫鏃ユ湡
+     */
+    @Override
+    public int renew(Long id, StaffContract req) {
+        StaffContract contract = staffContractMapper.selectById(id);
+        if (contract == null) {
+            throw new BaseException("鍚堝悓涓嶅瓨鍦�");
+        }
+        contract.setStatus(1);
+        if (req.getRenewDate() != null) {
+            contract.setRenewDate(req.getRenewDate());
+        }
+        if (req.getRenewEndDate() != null) {
+            contract.setRenewEndDate(req.getRenewEndDate());
+            contract.setEndDate(req.getRenewEndDate());
+        }
+        if (req.getContractTerm() != null) {
+            contract.setContractTerm(req.getContractTerm());
+        }
+        return staffContractMapper.updateById(contract);
+    }
+
+    /**
+     * 瑙i櫎锛氳褰曡В闄ゆ棩鏈�/鍘熷洜锛岀姸鎬佺疆"宸茶В闄�"
+     */
+    @Override
+    public int terminate(Long id, StaffContract req) {
+        StaffContract contract = staffContractMapper.selectById(id);
+        if (contract == null) {
+            throw new BaseException("鍚堝悓涓嶅瓨鍦�");
+        }
+        contract.setStatus(2);
+        contract.setTerminateDate(req.getTerminateDate());
+        contract.setTerminateReason(req.getTerminateReason());
+        return staffContractMapper.updateById(contract);
+    }
+
+    @Override
+    public void export(HttpServletResponse response, StaffContract req) {
+        List<StaffContract> list = staffContractMapper.list(req);
+        ExcelUtil<StaffContract> util = new ExcelUtil<StaffContract>(StaffContract.class);
+        util.exportExcel(response, list, "鍚堝悓绠$悊");
+    }
+}
diff --git a/src/main/resources/mapper/envaccess/EnvAccessVehicleMapper.xml b/src/main/resources/mapper/envaccess/EnvAccessVehicleMapper.xml
new file mode 100644
index 0000000..d7dce2d
--- /dev/null
+++ b/src/main/resources/mapper/envaccess/EnvAccessVehicleMapper.xml
@@ -0,0 +1,37 @@
+<?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.envaccess.mapper.EnvAccessVehicleMapper">
+    <select id="listPage" resultType="com.ruoyi.envaccess.pojo.EnvAccessVehicle">
+        SELECT * FROM env_access_vehicle
+        <where>
+            <if test="req.vehicleType != null">
+                AND vehicle_type = #{req.vehicleType}
+            </if>
+            <if test="req.plateNo != null and req.plateNo != ''">
+                AND plate_no LIKE CONCAT('%',#{req.plateNo},'%')
+            </if>
+            <if test="req.driverName != null and req.driverName != ''">
+                AND driver_name LIKE CONCAT('%',#{req.driverName},'%')
+            </if>
+            <if test="req.entryDateStart != null and req.entryDateStart != ''">
+                AND occur_time &gt;= #{req.entryDateStart}
+            </if>
+            <if test="req.entryDateEnd != null and req.entryDateEnd != ''">
+                AND occur_time &lt;= CONCAT(#{req.entryDateEnd},' 23:59:59')
+            </if>
+        </where>
+        ORDER BY id DESC
+    </select>
+    <select id="list" resultType="com.ruoyi.envaccess.pojo.EnvAccessVehicle">
+        SELECT * FROM env_access_vehicle
+        <where>
+            <if test="req.vehicleType != null">
+                AND vehicle_type = #{req.vehicleType}
+            </if>
+            <if test="req.plateNo != null and req.plateNo != ''">
+                AND plate_no LIKE CONCAT('%',#{req.plateNo},'%')
+            </if>
+        </where>
+        ORDER BY id DESC
+    </select>
+</mapper>
diff --git a/src/main/resources/mapper/envaccess/EnvInspectionMapper.xml b/src/main/resources/mapper/envaccess/EnvInspectionMapper.xml
new file mode 100644
index 0000000..ebec707
--- /dev/null
+++ b/src/main/resources/mapper/envaccess/EnvInspectionMapper.xml
@@ -0,0 +1,34 @@
+<?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.envaccess.mapper.EnvInspectionMapper">
+    <select id="listPage" resultType="com.ruoyi.envaccess.pojo.EnvInspection">
+        SELECT * FROM env_inspection
+        <where>
+            <if test="req.inspectionName != null and req.inspectionName != ''">
+                AND inspection_name LIKE CONCAT('%',#{req.inspectionName},'%')
+            </if>
+            <if test="req.inspectionType != null">
+                AND inspection_type = #{req.inspectionType}
+            </if>
+            <if test="req.status != null">
+                AND status = #{req.status}
+            </if>
+            <if test="req.entryDateStart != null and req.entryDateStart != ''">
+                AND plan_start_time &gt;= #{req.entryDateStart}
+            </if>
+            <if test="req.entryDateEnd != null and req.entryDateEnd != ''">
+                AND plan_start_time &lt;= CONCAT(#{req.entryDateEnd},' 23:59:59')
+            </if>
+        </where>
+        ORDER BY id DESC
+    </select>
+    <select id="list" resultType="com.ruoyi.envaccess.pojo.EnvInspection">
+        SELECT * FROM env_inspection
+        <where>
+            <if test="req.inspectionName != null and req.inspectionName != ''">
+                AND inspection_name LIKE CONCAT('%',#{req.inspectionName},'%')
+            </if>
+        </where>
+        ORDER BY id DESC
+    </select>
+</mapper>
diff --git a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
index dd03d4d..8bb1831 100644
--- a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
@@ -55,7 +55,7 @@
         from  procurement_record_storage t1
                   left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 2
                   left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
-        left join procurement_record_out t4 on t1.id = t4.procurement_record_storage_id and t4.type = 1
+        left join procurement_record_out t4 on t1.id = t4.procurement_record_storage_id and t4.type in (1, 5)
         <where>
             t1.type = 1
             <if test="req.supplierName != null and req.supplierName != ''">
@@ -151,9 +151,9 @@
         from  procurement_record_storage t1
         left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 2
         left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
-        left join procurement_record_out t4 on t1.id = t4.procurement_record_storage_id and t4.type = 1
+        left join procurement_record_out t4 on t1.id = t4.procurement_record_storage_id and t4.type in (1, 5)
         <where>
-            t1.type = 1 and t4.type = 1
+            t1.type = 1 and t4.type in (1, 5)
             <if test="req.supplierName != null and req.supplierName != ''">
                 and t3.supplier_name like  concat('%',#{req.supplierName},'%')
             </if>
diff --git a/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml b/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml
index 21117a3..2b530fe 100644
--- a/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml
@@ -170,4 +170,61 @@
         </where>
         order by t1.create_time desc
     </select>
+    <select id="listPageByPurchaseReturn" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto">
+        select
+        t3.supplier_name,
+        t3.purchase_contract_number,
+        t2.product_category,
+        t1.id,
+        t1.code,
+        t2.specification_model,
+        t2.unit,
+        t2.tax_rate,
+        t2.tax_inclusive_unit_price,
+        t2.tax_inclusive_total_price,
+        t2.tax_exclusive_total_price,
+        t1.inbound_num,
+        t1.create_time,
+        t1.create_by,
+        t4.unit_price,
+        t4.unit_price * t1.inbound_num as totalPrice
+        from procurement_record_out t1
+        left join procurement_record_storage t4 on t4.id = t1.procurement_record_storage_id
+        left join sales_ledger_product t2 on t2.id = t4.sales_ledger_product_id and t2.type = 2
+        left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
+        <where>
+            t1.type = 5
+            <if test="req.supplierName != null and req.supplierName != ''">
+                and t3.supplier_name like concat('%',#{req.supplierName},'%')
+            </if>
+            <if test="req.productCategory != null and req.productCategory != ''">
+                and t2.product_category like concat('%',#{req.productCategory},'%')
+            </if>
+            <if test="req.timeStr != null and req.timeStr != ''">
+                and t1.create_time like concat('%',#{req.timeStr},'%')
+            </if>
+        </where>
+        order by t1.create_time desc
+    </select>
+    <select id="listPurchaseReturn" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto">
+        select
+            t3.supplier_name,
+            t2.product_category,
+            t1.id,
+            t2.specification_model,
+            t2.unit,
+            t2.tax_rate,
+            t2.tax_inclusive_unit_price,
+            t2.tax_inclusive_total_price,
+            t2.tax_exclusive_total_price,
+            t1.inbound_num,
+            t1.create_time,
+            t1.create_time as time,
+            t1.create_by
+        from procurement_record_out t1
+            left join procurement_record_storage t4 on t4.id = t1.procurement_record_storage_id
+            left join sales_ledger_product t2 on t2.id = t4.sales_ledger_product_id and t2.type = 2
+            left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
+        where t1.type = 5
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/staff/StaffContractMapper.xml b/src/main/resources/mapper/staff/StaffContractMapper.xml
new file mode 100644
index 0000000..fc55f42
--- /dev/null
+++ b/src/main/resources/mapper/staff/StaffContractMapper.xml
@@ -0,0 +1,37 @@
+<?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.staff.mapper.StaffContractMapper">
+    <select id="listPage" resultType="com.ruoyi.staff.pojo.StaffContract">
+        SELECT * FROM staff_contract
+        <where>
+            <if test="req.staffName != null and req.staffName != ''">
+                AND staff_name LIKE CONCAT('%',#{req.staffName},'%')
+            </if>
+            <if test="req.staffNo != null and req.staffNo != ''">
+                AND staff_no = #{req.staffNo}
+            </if>
+            <if test="req.status != null">
+                AND status = #{req.status}
+            </if>
+            <if test="req.entryDateStart != null and req.entryDateStart != ''">
+                AND end_date &gt;= #{req.entryDateStart}
+            </if>
+            <if test="req.entryDateEnd != null and req.entryDateEnd != ''">
+                AND end_date &lt;= #{req.entryDateEnd}
+            </if>
+        </where>
+        ORDER BY id DESC
+    </select>
+    <select id="list" resultType="com.ruoyi.staff.pojo.StaffContract">
+        SELECT * FROM staff_contract
+        <where>
+            <if test="req.staffName != null and req.staffName != ''">
+                AND staff_name LIKE CONCAT('%',#{req.staffName},'%')
+            </if>
+            <if test="req.status != null">
+                AND status = #{req.status}
+            </if>
+        </where>
+        ORDER BY id DESC
+    </select>
+</mapper>

--
Gitblit v1.9.3