1cf91e355038837f30f2d727507b2229263d7de7..94e23a3d587846f10ea9517bd2e6705093d6a99a
2026-01-28 zss
Merge remote-tracking branch 'origin/dev_New' into dev_New
94e23a 对比 | 目录
2026-01-28 zss
消息跳转路由变更
a6c0d7 对比 | 目录
2026-01-28 maven
Merge remote-tracking branch 'origin/dev_New' into dev_New
bee041 对比 | 目录
2026-01-28 maven
yys 来票登记修改,回款登记修改
32cd47 对比 | 目录
2026-01-28 zss
Merge remote-tracking branch 'origin/dev_New' into dev_New
7a9bd9 对比 | 目录
2026-01-28 zss
添加类型8危险作业审批
1682c3 对比 | 目录
2026-01-28 huminmin
新增离职后,对应用户停用
bbff5b 对比 | 目录
2026-01-28 liyong
refactor(sales): 删除无效的引入
64f0f2 对比 | 目录
2026-01-28 liyong
refactor(home): 删除质检信息,删除销售信息,回滚对应的库存信息
7b4fdb 对比 | 目录
2026-01-28 gongchunyi
Merge remote-tracking branch 'origin/dev_New' into dev_New
cca82e 对比 | 目录
2026-01-28 gongchunyi
feat: 进销存大屏数据分析接口
8b6616 对比 | 目录
2026-01-28 zss
Merge remote-tracking branch 'origin/dev_New' into dev_New
ee672b 对比 | 目录
2026-01-28 gongchunyi
fix: 旧库存进行判空处理
83bfb1 对比 | 目录
2026-01-28 zss
Merge remote-tracking branch 'origin/dev_New' into dev_New
177027 对比 | 目录
2026-01-28 zss
安全生产--事故上报记录
7adb23 对比 | 目录
2026-01-28 gongchunyi
fix: 被订单锁定数量进行判空处理
1a294d 对比 | 目录
2026-01-28 zss
安全生产--应急预案查阅
b46efc 对比 | 目录
2026-01-28 maven
Merge remote-tracking branch 'origin/dev_New' into dev_New
f6e755 对比 | 目录
2026-01-28 maven
yys 来票登记修改
6aca42 对比 | 目录
2026-01-28 zss
安全生产--危险物料管控
1c54d0 对比 | 目录
2026-01-28 zss
Merge remote-tracking branch 'origin/dev_New' into dev_New
5c998c 对比 | 目录
2026-01-28 zss
安全生产--隐患排查上报
f12b84 对比 | 目录
2026-01-28 liyong
refactor(home): 质检合格入库赋值错误
258917 对比 | 目录
2026-01-28 liyong
refactor(home): 修改首页当日入库数量查询逻辑 refactor(quality): 更新质量检验控制器依赖注入和删除逻辑 feat(s...
100f5e 对比 | 目录
2026-01-28 maven
Merge remote-tracking branch 'origin/dev_New' into dev_New
be43a6 对比 | 目录
2026-01-28 maven
yys 新增采购报表导出接口
386372 对比 | 目录
2026-01-28 zss
安全生产--危险源台账
fdd43b 对比 | 目录
2026-01-28 zss
Merge remote-tracking branch 'origin/dev_New' into dev_New
7f642b 对比 | 目录
2026-01-28 zss
安全生产--安全规程与资质管理
3e806d 对比 | 目录
2026-01-28 maven
yys 新增采购报表导出接口
55ab62 对比 | 目录
2026-01-28 zss
旧版查询库存方法去掉
5a662d 对比 | 目录
已添加53个文件
已修改31个文件
2856 ■■■■■ 文件已修改
doc/20260128_add_unique_to_staff_on_job.sql 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/home/controller/HomeController.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/home/mapper/HomeMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/home/service/HomeService.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java 234 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/other/controller/TempFileController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/other/service/TempFileService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/controller/ProcurementBusinessSummaryController.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/dto/ProcurementBusinessSummaryDto.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/pojo/ProductRecord.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/ProcurementBusinessSummaryServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/ProductRecordServiceImpl.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/controller/QualityInspectController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/controller/SafeAccidentController.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/controller/SafeCertificationController.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/controller/SafeCertificationFileController.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/controller/SafeContingencyPlanController.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/controller/SafeHazardController.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/controller/SafeHazardRecordController.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/controller/SafeHiddenController.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/controller/SafeHiddenFileController.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/dto/SafeHazardRecordDto.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/dto/SafeHiddenDto.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/mapper/SafeAccidentMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/mapper/SafeCertificationFileMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/mapper/SafeCertificationMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/mapper/SafeContingencyPlanMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/mapper/SafeHazardMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/mapper/SafeHazardRecordMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/mapper/SafeHiddenFileMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/mapper/SafeHiddenMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/pojo/SafeAccident.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/pojo/SafeCertification.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/pojo/SafeCertificationFile.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/pojo/SafeContingencyPlan.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/pojo/SafeHazard.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/pojo/SafeHazardRecord.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/pojo/SafeHidden.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/pojo/SafeHiddenFile.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/service/SafeAccidentService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/service/SafeCertificationFileService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/service/SafeCertificationService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/service/SafeContingencyPlanService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/service/SafeHazardRecordService.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/service/SafeHazardService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/service/SafeHiddenFileService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/service/SafeHiddenService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/service/impl/SafeAccidentServiceImpl.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/service/impl/SafeCertificationFileServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/service/impl/SafeCertificationServiceImpl.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/service/impl/SafeContingencyPlanServiceImpl.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/service/impl/SafeHazardRecordServiceImpl.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/service/impl/SafeHazardServiceImpl.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/service/impl/SafeHiddenFileServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/service/impl/SafeHiddenServiceImpl.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/ReceiptPaymentServiceImpl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/StaffLeaveServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/home/HomeMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/safe/SafeAccidentMapper.xml 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/safe/SafeCertificationFileMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/safe/SafeCertificationMapper.xml 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/safe/SafeContingencyPlanMapper.xml 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/safe/SafeHazardMapper.xml 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/safe/SafeHazardRecordMapper.xml 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/safe/SafeHiddenFileMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/safe/SafeHiddenMapper.xml 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/SalesLedgerProductMapper.xml 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/stock/StockInventoryMapper.xml 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/20260128_add_unique_to_staff_on_job.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
ALTER TABLE staff_on_job ADD unique (staff_no);
src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
@@ -127,7 +127,7 @@
    private Long tenantId;
    /**
     * å®¡æ‰¹ç±»åž‹ 1-公出管理 2-请假管理 3-出差管理 4-报销管理 5-采购审批 6-报价审批 7-发货审批
     * å®¡æ‰¹ç±»åž‹ 1-公出管理 2-请假管理 3-出差管理 4-报销管理 5-采购审批 6-报价审批 7-发货审批 8-危险作业审批
     */
    private Integer approveType;
src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
@@ -334,10 +334,17 @@
        tempFileService.migrateTempFilesToFormal(approve.getId(), approveGetAndUpdateVo.getTempFileIds(), FileNameType.ApproveProcess.getValue());
        /*消息通知*/
        String id = approve.getApproveUserIds().split(",")[0];
        sysNoticeService.simpleNoticeByUser(approveProcessType(approve.getApproveType()),
                approve.getApproveId() + "流程编号的审批需要您审核!!!!!",
                Arrays.asList(Long.valueOf(id)),
                "/collaborativeApproval/approvalProcess?approveType=" + approve.getApproveType() + "&approveId=" + approve.getApproveId());
        if (approve.getApproveType()==8){
            sysNoticeService.simpleNoticeByUser(approveProcessType(approve.getApproveType()),
                    approve.getApproveId() + "流程编号的审批需要您审核!!!!!",
                    Arrays.asList(Long.valueOf(id)),
                    "/safeProduction/safeWorkApproval?approveType=" + approve.getApproveType() + "&approveId=" + approve.getApproveId());
        }else {
            sysNoticeService.simpleNoticeByUser(approveProcessType(approve.getApproveType()),
                    approve.getApproveId() + "流程编号的审批需要您审核!!!!!",
                    Arrays.asList(Long.valueOf(id)),
                    "/collaborativeApproval/approvalProcess?approveType=" + approve.getApproveType() + "&approveId=" + approve.getApproveId());
        }
    }
@@ -358,7 +365,9 @@
            case 6:
                return "报价审批";
            case 7:
                return "出库审批";
                return "发货审批";
            case 8:
                return "危险作业审批";
        }
        return null;
    }
src/main/java/com/ruoyi/home/controller/HomeController.java
@@ -7,6 +7,7 @@
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.home.dto.*;
import com.ruoyi.home.service.HomeService;
import com.ruoyi.dto.MapDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@@ -96,6 +97,41 @@
        return AjaxResult.success(list);
    }
    @GetMapping("/productSalesAnalysis")
    @ApiOperation("各产品销售金额分析")
    public AjaxResult productSalesAnalysis() {
        List<MapDto> list = homeService.productSalesAnalysis();
        return AjaxResult.success(list);
    }
    @GetMapping("/rawMaterialPurchaseAmountRatio")
    @ApiOperation("原材料采购金额占比")
    public AjaxResult rawMaterialPurchaseAmountRatio(){
        List<MapDto> list = homeService.rawMaterialPurchaseAmountRatio();
        return AjaxResult.success(list);
    }
    @GetMapping("/salesPurchaseStorageProductCount")
    @ApiOperation("销售-采购-储存产品数")
    public AjaxResult salesPurchaseStorageProductCount(){
        List<MapDto> list = homeService.salesPurchaseStorageProductCount();
        return AjaxResult.success(list);
    }
    @GetMapping("/productInOutAnalysis")
    @ApiOperation("产品出入库分析")
    public AjaxResult productInOutAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type){
        List<Map<String, Object>> result = homeService.productInOutAnalysis(type);
        return AjaxResult.success(result);
    }
    @GetMapping("/productTurnoverDays")
    @ApiOperation("产品周转天数")
    public AjaxResult productTurnoverDays(){
        List<MapDto> list = homeService.productTurnoverDays();
        return AjaxResult.success(list);
    }
    /********************************************************营销采购类**************************************************/
    @GetMapping("/business")
    @Log(title = "销售-采购-库存数据", businessType = BusinessType.OTHER)
@@ -130,6 +166,7 @@
    }
    /********************************************************质量类*****************************************************/
    @GetMapping("/qualityStatistics")
    @Log(title = "质量分析", businessType = BusinessType.OTHER)
src/main/java/com/ruoyi/home/mapper/HomeMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.home.mapper;
import com.ruoyi.dto.MapDto;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
 * é¦–页统计 Mapper
 *
 * @author antigravity
 */
@Mapper
public interface HomeMapper {
    /**
     * æŸ¥è¯¢äº§å“å‘¨è½¬å¤©æ•°
     *
     * @return äº§å“å‘¨è½¬å¤©æ•°åˆ—表
     */
    List<MapDto> productTurnoverDays();
}
src/main/java/com/ruoyi/home/service/HomeService.java
@@ -1,9 +1,8 @@
package com.ruoyi.home.service;
import com.ruoyi.approve.pojo.ApproveProcess;
import com.ruoyi.dto.MapDto;
import com.ruoyi.home.dto.*;
import com.ruoyi.production.dto.ProductOrderDto;
import com.ruoyi.production.dto.ProductWorkOrderDto;
import java.text.ParseException;
import java.util.List;
@@ -45,4 +44,14 @@
    ProductCategoryDistributionDto productCategoryDistribution();
    List<CustomerContributionRankingDto> customerContributionRanking(Integer type);
    List<MapDto> productSalesAnalysis();
    List<MapDto> rawMaterialPurchaseAmountRatio();
    List<MapDto> salesPurchaseStorageProductCount();
    List<Map<String, Object>> productInOutAnalysis(Integer type);
    List<MapDto> productTurnoverDays();
}
src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -2,8 +2,8 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.home.mapper.HomeMapper;
import com.ruoyi.approve.mapper.ApproveProcessMapper;
import com.ruoyi.approve.pojo.ApproveProcess;
import com.ruoyi.basic.mapper.CustomerMapper;
@@ -12,7 +12,6 @@
import com.ruoyi.basic.mapper.SupplierManageMapper;
import com.ruoyi.basic.pojo.Customer;
import com.ruoyi.basic.pojo.Product;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.basic.pojo.SupplierManage;
import com.ruoyi.collaborativeApproval.mapper.NoticeMapper;
import com.ruoyi.collaborativeApproval.pojo.Notice;
@@ -86,6 +85,9 @@
    private SalesLedgerProductMapper salesLedgerProductMapper;
    @Autowired
    private StockInventoryMapper stockInventoryMapper;
    @Autowired
    private ProcurementRecordMapper procurementRecordStorageMapper;
    @Autowired
@@ -125,7 +127,9 @@
    private SysUserMapper sysUserMapper;
    @Autowired
    private SysUserDeptMapper sysUserDeptMapper;
    private StockInventoryMapper stockInventoryMapper;
    @Autowired
    private HomeMapper homeMapper;
    @Override
    public HomeBusinessDto business() {
@@ -179,38 +183,13 @@
            homeBusinessDto.setMonthPurchaseHaveMoney(unReceiptPaymentAmount.setScale(2, RoundingMode.HALF_UP).toString());
        }
        // ç»Ÿè®¡åº“å­˜
//        List<ProcurementRecordStorage> procurementRecordStorages = procurementRecordStorageMapper.selectList(null);
//        BigDecimal stockAmount = procurementRecordStorages.stream()
//                .map(ProcurementRecordStorage::getInboundNum)
//                .filter(Objects::nonNull)
//                .reduce(BigDecimal.ZERO, BigDecimal::add);
//        // è‡ªå®šä¹‰åº“å­˜
//        List<CustomStorage> customStorages = customStorageMapper.selectList(null);
//        BigDecimal customStockAmount = customStorages.stream()
//                .map(CustomStorage::getInboundNum)
//                .filter(Objects::nonNull)
//                .reduce(BigDecimal.ZERO, BigDecimal::add);
//        List<ProcurementRecordOut> procurementRecordOuts = procurementRecordOutMapper.selectList(null);
//        BigDecimal outboundAmount = procurementRecordOuts.stream()
//                .map(ProcurementRecordOut::getInboundNum)
//                .filter(Objects::nonNull)
//                .reduce(BigDecimal.ZERO, BigDecimal::add);
//        BigDecimal stock = stockAmount.add(customStockAmount).subtract(outboundAmount);
        BigDecimal stockQuantityTotal = stockInventoryMapper.selectTotal();
        homeBusinessDto.setInventoryNum(stockQuantityTotal.setScale(2, RoundingMode.HALF_UP).toString());
        // èŽ·å–å½“å¤©å…¥åº“æ•°é‡
        LambdaQueryWrapper<ProcurementRecordStorage> procurementRecordStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordStorageLambdaQueryWrapper.ge(ProcurementRecordStorage::getCreateTime, now)  // å¤§äºŽç­‰äºŽå½“天
                .lt(ProcurementRecordStorage::getCreateTime, now.plusDays(1)); // å°äºŽæ˜Žå¤©
        List<ProcurementRecordStorage> procurementRecordStorages1 = procurementRecordStorageMapper.selectList(procurementRecordStorageLambdaQueryWrapper);
        BigDecimal stockAmount1 = procurementRecordStorages1.stream()
                .map(ProcurementRecordStorage::getInboundNum)
                .filter(Objects::nonNull)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
//        homeBusinessDto.setInventoryNum(stock.setScale(2, RoundingMode.HALF_UP).toString());
        homeBusinessDto.setTodayInventoryNum(stockAmount1.setScale(2, RoundingMode.HALF_UP).toString());
        BigDecimal bigDecimal = stockInventoryMapper.selectTotalByDate(LocalDate.now());
        homeBusinessDto.setTodayInventoryNum(bigDecimal.setScale(2, RoundingMode.HALF_UP).toString());
        return homeBusinessDto;
    }
@@ -924,4 +903,199 @@
        }
        return result;
    }
    @Override
    public List<MapDto> productSalesAnalysis() {
        // èŽ·å–æ‰€æœ‰äº§å“å¤§ç±»çš„é”€å”®é¢
        List<Map<String, Object>> analysisResults = salesLedgerProductMapper.selectProductSalesAnalysis();
        if (CollectionUtils.isEmpty(analysisResults)) {
            return new ArrayList<>();
        }
        // è®¡ç®—总销售额
        BigDecimal totalSalesAmount = analysisResults.stream()
                .map(r -> (BigDecimal) r.get("value"))
                .filter(Objects::nonNull)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        return analysisResults.stream()
                .map(result -> {
                    MapDto mapDto = new MapDto();
                    String name = (String) result.get("name");
                    BigDecimal value = (BigDecimal) result.get("value");
                    mapDto.setName(name);
                    mapDto.setValue(value != null ? value.setScale(2, RoundingMode.HALF_UP).toString() : "0.00");
                    if (totalSalesAmount.compareTo(BigDecimal.ZERO) == 0 || value == null) {
                        mapDto.setRate("0.00");
                    } else {
                        String rate = value.divide(totalSalesAmount, 4, RoundingMode.HALF_UP)
                                .multiply(new BigDecimal("100"))
                                .setScale(2, RoundingMode.HALF_UP)
                                .toString();
                        mapDto.setRate(rate);
                    }
                    return mapDto;
                })
                .collect(Collectors.toList());
    }
    @Override
    public List<MapDto> rawMaterialPurchaseAmountRatio() {
        // èŽ·å–æ‰€æœ‰åŽŸææ–™çš„é‡‡è´­é¢
        List<Map<String, Object>> analysisResults = salesLedgerProductMapper.selectRawMaterialPurchaseAnalysis();
        if (CollectionUtils.isEmpty(analysisResults)) {
            return new ArrayList<>();
        }
        // è®¡ç®—总采购额
        BigDecimal totalPurchaseAmount = analysisResults.stream()
                .map(r -> (BigDecimal) r.get("value"))
                .filter(Objects::nonNull)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        return analysisResults.stream()
                .map(result -> {
                    MapDto mapDto = new MapDto();
                    String name = (String) result.get("name");
                    BigDecimal value = (BigDecimal) result.get("value");
                    mapDto.setName(name);
                    mapDto.setValue(value != null ? value.setScale(2, RoundingMode.HALF_UP).toString() : "0.00");
                    if (totalPurchaseAmount.compareTo(BigDecimal.ZERO) == 0 || value == null) {
                        mapDto.setRate("0.00");
                    } else {
                        String rate = value.divide(totalPurchaseAmount, 4, RoundingMode.HALF_UP)
                                .multiply(new BigDecimal("100"))
                                .setScale(2, RoundingMode.HALF_UP)
                                .toString();
                        mapDto.setRate(rate);
                    }
                    return mapDto;
                })
                .collect(Collectors.toList());
    }
    @Override
    public List<MapDto> salesPurchaseStorageProductCount() {
        LocalDate now = LocalDate.now();
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String currentMonthStart = now.with(TemporalAdjusters.firstDayOfMonth()).format(dtf);
        String currentMonthNow = now.format(dtf);
        LocalDate lastMonth = now.minusMonths(1);
        String lastMonthStart = lastMonth.with(TemporalAdjusters.firstDayOfMonth()).format(dtf);
        String lastMonthEnd = lastMonth.with(TemporalAdjusters.lastDayOfMonth()).format(dtf);
        // é”€å”®
        int currentSales = salesLedgerProductMapper.selectProductCountByTypeAndDate(1, currentMonthStart, currentMonthNow);
        int lastSales = salesLedgerProductMapper.selectProductCountByTypeAndDate(1, lastMonthStart, lastMonthEnd);
        // é‡‡è´­
        int currentPurchase = salesLedgerProductMapper.selectProductCountByTypeAndDate(2, currentMonthStart, currentMonthNow);
        int lastPurchase = salesLedgerProductMapper.selectProductCountByTypeAndDate(2, lastMonthStart, lastMonthEnd);
        // å‚¨å­˜
        int currentStorage = stockInventoryMapper.selectStorageProductCountByDate(currentMonthStart, currentMonthNow);
        int lastStorage = stockInventoryMapper.selectStorageProductCountByDate(lastMonthStart, lastMonthEnd);
        List<MapDto> list = new ArrayList<>();
        list.add(createMapDto("销售产品数", currentSales, lastSales));
        list.add(createMapDto("采购产品数", currentPurchase, lastPurchase));
        list.add(createMapDto("储存产品数", currentStorage, lastStorage));
        return list;
    }
    private MapDto createMapDto(String name, int current, int last) {
        MapDto dto = new MapDto();
        dto.setName(name);
        dto.setValue(String.valueOf(current));
        if (last == 0) {
            dto.setRate(current > 0 ? "100.00" : "0.00");
        } else {
            BigDecimal curDec = new BigDecimal(current);
            BigDecimal lastDec = new BigDecimal(last);
            // å¢žé•¿çއ
            String rate = curDec.subtract(lastDec)
                    .divide(lastDec, 4, RoundingMode.HALF_UP)
                    .multiply(new BigDecimal("100"))
                    .setScale(2, RoundingMode.HALF_UP)
                    .toString();
            dto.setRate(rate);
        }
        return dto;
    }
    @Override
    public List<Map<String, Object>> productInOutAnalysis(Integer type) {
        String targetName;
        if (type == 1) {
            targetName = "原材料";
        } else if (type == 2) {
            targetName = "成品";
        } else if (type == 3) {
            targetName = "半成品";
        } else {
            return new ArrayList<>();
        }
        LambdaQueryWrapper<Product> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Product::getProductName, targetName).isNull(Product::getParentId);
        Product rootCategory = productMapper.selectOne(queryWrapper);
        if (rootCategory == null) {
            log.warn("未找到名称为 {} çš„顶级产品分类", targetName);
            return new ArrayList<>();
        }
        Long rootCategoryId = rootCategory.getId();
        LocalDate now = LocalDate.now();
        DateTimeFormatter displayDtf = DateTimeFormatter.ofPattern("M/d");
        String startDate = now.minusDays(6).toString();
        String endDate = now.toString();
        List<Map<String, Object>> inCounts = stockInventoryMapper.selectDailyStockInCounts(rootCategoryId, startDate, endDate + " 23:59:59");
        List<Map<String, Object>> outCounts = stockInventoryMapper.selectDailyStockOutCounts(rootCategoryId, startDate, endDate + " 23:59:59");
        Map<LocalDate, BigDecimal> inMap = inCounts.stream()
                .collect(Collectors.toMap(
                        m -> ((java.sql.Date) m.get("date")).toLocalDate(),
                        m -> (BigDecimal) m.get("count"),
                        BigDecimal::add
                ));
        Map<LocalDate, BigDecimal> outMap = outCounts.stream()
                .collect(Collectors.toMap(
                        m -> ((java.sql.Date) m.get("date")).toLocalDate(),
                        m -> (BigDecimal) m.get("count"),
                        BigDecimal::add
                ));
        List<Map<String, Object>> result = new ArrayList<>();
        for (int i = 6; i >= 0; i--) {
            LocalDate date = now.minusDays(i);
            Map<String, Object> dataPoint = new LinkedHashMap<>();
            dataPoint.put("date", date.format(displayDtf)); // 1/23
            dataPoint.put("inCount", inMap.getOrDefault(date, BigDecimal.ZERO));
            dataPoint.put("outCount", outMap.getOrDefault(date, BigDecimal.ZERO));
            result.add(dataPoint);
        }
        return result;
    }
    @Override
    public List<MapDto> productTurnoverDays() {
        return homeMapper.productTurnoverDays();
    }
}
src/main/java/com/ruoyi/other/controller/TempFileController.java
@@ -33,6 +33,15 @@
        }
    }
    @PostMapping("/uploadByCommon")
    public AjaxResult uploadByCommon(MultipartFile file, Integer type, Long id) {
        try {
            return AjaxResult.success(tempFileService.uploadByCommon(file, type,id));
        } catch (Exception e) {
            return AjaxResult.error(e.getMessage());
        }
    }
    @PostMapping("uploadFile")
    public AjaxResult uploadFile(@RequestBody ProductRecordDto productRecordDto) {
        try {
src/main/java/com/ruoyi/other/service/TempFileService.java
@@ -7,4 +7,6 @@
public interface TempFileService {
    TempFile uploadFile(MultipartFile file,Integer type) throws IOException;
    String uploadByCommon(MultipartFile file, Integer type, Long id) throws IOException;
}
src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java
@@ -26,6 +26,7 @@
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
@@ -76,10 +77,19 @@
        tempFileRecord.setExpireTime(LocalDateTime.now().plusHours(2)); // 2小时后过期
        tempFileRecord.setType(type);
        tempFileMapper.insert(tempFileRecord);
        return tempFileRecord;
    }
    @Override
    public String uploadByCommon(MultipartFile file, Integer type, Long id) throws  IOException{
        TempFile tempFile = uploadFile(file, type);
        if (tempFile != null) {
            migrateTempFilesToFormal(id, Collections.singletonList(tempFile.getTempId()), type);
            return tempFile.getTempPath();
        }
        return null;
    }
    /**
     * å°†ä¸´æ—¶æ–‡ä»¶è¿ç§»åˆ°æ­£å¼ç›®å½•
     *
src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
@@ -7,10 +7,13 @@
import com.ruoyi.stock.dto.StockInventoryDto;
import com.ruoyi.stock.dto.StockUninventoryDto;
import com.ruoyi.stock.pojo.StockInRecord;
import com.ruoyi.stock.pojo.StockOutRecord;
import com.ruoyi.stock.service.StockInRecordService;
import com.ruoyi.stock.service.StockInventoryService;
import com.ruoyi.stock.service.StockOutRecordService;
import com.ruoyi.stock.service.StockUninventoryService;
import com.ruoyi.stock.service.impl.StockInRecordServiceImpl;
import com.ruoyi.stock.service.impl.StockOutRecordServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
@@ -27,21 +30,7 @@
    private final StockUninventoryService stockUninventoryService;
    private final StockInventoryService stockInventoryService;
    private final StockInRecordService stockInRecordService;
    // èŽ·å–å•†å“å…¥åº“æ•°é‡,出库数量,剩余库存
//    public Map<String, BigDecimal> getStockQuantity(Long productModelId) {
//        // å…¥åº“数量
//        BigDecimal sumQuantity = procurementRecordMapper.getSumQuantity(productModelId);
//        // å‡ºåº“数量
//        BigDecimal outQuantity = procurementRecordOutMapper.getSumQuantity(productModelId);
//        // å‰©ä½™åº“å­˜
//        BigDecimal stockQuantity = outQuantity.compareTo(sumQuantity) > 0 ? BigDecimal.ZERO : sumQuantity.subtract(outQuantity);
//        Map<String, BigDecimal> stockMap = new HashMap<>();
//        stockMap.put("inboundNum", sumQuantity);
//        stockMap.put("outboundNum", outQuantity);
//        stockMap.put("stockQuantity", stockQuantity);
//        return stockMap;
//    }
    private final StockOutRecordService stockOutRecordService;
    /**
     * ä¸åˆæ ¼å…¥åº“
@@ -108,11 +97,18 @@
    }
    //不合格库存删除
    public void deleteStockRecord(Long recordId, String recordType) {
    public void deleteStockInRecord(Long recordId, String recordType) {
        StockInRecord one = stockInRecordService.getOne(new QueryWrapper<StockInRecord>()
                .lambda().eq(StockInRecord::getRecordId, recordId)
                .eq(StockInRecord::getRecordType, recordType));
        stockInRecordService.batchDelete(Collections.singletonList(one.getId()));
    }
    public void deleteStockOutRecord(Long recordId, String recordType) {
        StockOutRecord one = stockOutRecordService.getOne(new QueryWrapper<StockOutRecord>()
                .lambda().eq(StockOutRecord::getRecordId, recordId)
                .eq(StockOutRecord::getRecordType, recordType));
        stockOutRecordService.batchDelete(Collections.singletonList(one.getId()));
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -287,9 +287,9 @@
        productionProductInputMapper.delete(new LambdaQueryWrapper<ProductionProductInput>()
                .eq(ProductionProductInput::getProductMainId, productionProductMain.getId()));
        //删除报废的入库记录
        stockUtils.deleteStockRecord(productionProductMain.getId(), StockUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
        stockUtils.deleteStockInRecord(productionProductMain.getId(), StockUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
        //删除投入对应的出库记录
        stockUtils.deleteStockRecord(productionProductMain.getId(), StockQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
        stockUtils.deleteStockOutRecord(productionProductMain.getId(), StockQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
        // åˆ é™¤ä¸»è¡¨
        productionProductMainMapper.deleteById(productionProductMain.getId());
        return true;
src/main/java/com/ruoyi/purchase/controller/ProcurementBusinessSummaryController.java
@@ -1,15 +1,25 @@
package com.ruoyi.purchase.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.purchase.dto.ProcurementBusinessSummaryDto;
import com.ruoyi.purchase.pojo.PurchaseLedger;
import com.ruoyi.purchase.service.impl.ProcurementBusinessSummaryServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * @author :yys
@@ -26,7 +36,19 @@
    @GetMapping("/listPage")
    public AjaxResult listPage(Page page, ProcurementBusinessSummaryDto procurementBusinessSummaryDto) {
        return procurementBusinessSummaryService.listPage(page, procurementBusinessSummaryDto);
        return AjaxResult.success(procurementBusinessSummaryService.listPage(page, procurementBusinessSummaryDto));
    }
    /**
     * å¯¼å‡ºé‡‡è´­å°è´¦åˆ—表
     */
    @Log(title = "导出采购报表", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, ProcurementBusinessSummaryDto procurementBusinessSummaryDto) {
        Page page = new Page(-1,-1);
        IPage<ProcurementBusinessSummaryDto> list = procurementBusinessSummaryService.listPage(page, procurementBusinessSummaryDto);
        ExcelUtil<ProcurementBusinessSummaryDto> util = new ExcelUtil<ProcurementBusinessSummaryDto>(ProcurementBusinessSummaryDto.class);
        util.exportExcel(response, list.getRecords(), "采购报表");
    }
}
src/main/java/com/ruoyi/purchase/dto/ProcurementBusinessSummaryDto.java
@@ -24,11 +24,13 @@
@ApiModel
public class ProcurementBusinessSummaryDto {
    @Excel(name = "产品大类")
    private String productCategory;
    /**
     * è§„格型号
     */
    @Excel(name = "规格型号")
    private String specificationModel;
    @ApiModelProperty(value = "开始时间")
@@ -44,33 +46,40 @@
    /**
     * é‡‡è´­æ•°é‡
     */
    @Excel(name = "采购数量")
    private BigDecimal purchaseNum;
    /**
     * é‡‡è´­é‡‘额
     */
    @Excel(name = "采购金额")
    private BigDecimal purchaseAmount;
    /**
     * é‡‡è´­æ¬¡æ•°
     */
    @Excel(name = "采购次数")
    private Integer purchaseTimes;
    /**
     * å¹³å‡å•ä»·
     */
    @Excel(name = "平均单价")
    private BigDecimal averagePrice;
    /**
     * ä¾›åº”商名称
     */
    @Excel(name = "供应商名称")
    private String supplierName;
    /**
     * å½•入日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "录入日期", width = 30, dateFormat = "yyyy-MM-dd")
    private Date entryDate;
}
src/main/java/com/ruoyi/purchase/pojo/ProductRecord.java
@@ -102,12 +102,12 @@
    /**
     * æœªæ¥ç¥¨æ•°
     */
    private BigDecimal futureTickets;
    private BigDecimal futureTickets = BigDecimal.ZERO;
    /**
     * æœªæ¥ç¥¨é‡‘额(元)
     */
    private BigDecimal futureTicketsAmount;
    private BigDecimal futureTicketsAmount = BigDecimal.ZERO;
    /**
     * äº§å“id
src/main/java/com/ruoyi/purchase/service/impl/ProcurementBusinessSummaryServiceImpl.java
@@ -1,5 +1,6 @@
package com.ruoyi.purchase.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.purchase.dto.ProcurementBusinessSummaryDto;
@@ -20,7 +21,7 @@
    @Autowired
    private SalesLedgerProductMapper salesLedgerProductMapper;
    public AjaxResult listPage(Page page, ProcurementBusinessSummaryDto procurementBusinessSummaryDto) {
        return AjaxResult.success(salesLedgerProductMapper.procurementBusinessSummaryListPage(page, procurementBusinessSummaryDto));
    public IPage<ProcurementBusinessSummaryDto> listPage(Page page, ProcurementBusinessSummaryDto procurementBusinessSummaryDto) {
        return salesLedgerProductMapper.procurementBusinessSummaryListPage(page, procurementBusinessSummaryDto);
    }
}
src/main/java/com/ruoyi/purchase/service/impl/ProductRecordServiceImpl.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.enums.FileNameType;
@@ -24,7 +25,9 @@
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -66,7 +69,7 @@
        page.setSize(productRecordDtoIPage1.getTotal());
        IPage<ProductRecordDto> productRecordDtoIPage = productRecordMapper.productRecordPage(page, ticketRegistrationDto);
        productRecordDtoIPage.getRecords().forEach(productRecordDto -> {
            productRecordDto.setCommonFiles(commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>().eq(CommonFile::getCommonId, productRecordDto.getTicketRegistrationId())
            productRecordDto.setCommonFiles(commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>().eq(CommonFile::getCommonId, productRecordDto.getId())
                    .eq(CommonFile::getType, FileNameType.PURCHASELEDGER.getValue())));
        });
        return productRecordDtoIPage;
@@ -75,6 +78,7 @@
    private final TicketRegistrationMapper ticketRegistrationMapper;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult updateRecord(ProductRecordDto productRecordDto) {
        SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(productRecordDto.getSaleLedgerProjectId());
        ProductRecord productRecord = productRecordMapper.selectById(productRecordDto.getId());
@@ -89,30 +93,39 @@
        if (purchaseLedger != null) {
            purchaseLedger.setReceiptPaymentAmount(purchaseLedger.getReceiptPaymentAmount());
        }
        BeanUtils.copyProperties(productRecordDto,productRecord);
        productRecord.setFutureTicketsAmount(productRecord.getFutureTickets().multiply(productRecord.getTaxInclusiveUnitPrice()));
        productRecordMapper.updateById(productRecord);
        // ä¿®æ”¹å‘票号
        TicketRegistration ticketRegistration = ticketRegistrationMapper.selectById(productRecord.getTicketRegistrationId());
        if(ticketRegistration != null){
            ticketRegistration.setInvoiceNumber(productRecordDto.getInvoiceNumber());
            ticketRegistration.setInvoiceAmount(productRecordDto.getTicketsAmount());
            ticketRegistrationMapper.updateById(ticketRegistration);
        }
        BeanUtils.copyProperties(productRecordDto,productRecord);
        productRecord.setFutureTicketsAmount(productRecord.getFutureTickets().multiply(productRecord.getTaxInclusiveUnitPrice()));
        productRecordMapper.updateById(productRecord);
        return AjaxResult.success("修改成功");
    }
     @Override
    public ProductRecordDto getProductRecordById(ProductRecordDto productRecordDto) {
        List<ProductRecordDto> productRecordDtoList = productRecordMapper.getProductRecordById(productRecordDto);
        if(productRecordDtoList != null && productRecordDtoList.size() > 0){
            ProductRecordDto productRecordDto1 = productRecordDtoList.get(productRecordDtoList.size() - 1);
        if(CollectionUtils.isNotEmpty(productRecordDtoList)){
            ProductRecordDto productRecordDto1 = productRecordDtoList.stream()
                    .filter(item -> item.getId().equals(productRecordDto.getId()))
                    .findFirst()
                    .orElse(null);
            // è¿‡æ»¤å‡ºä¸Žä¼ å…¥çš„ productRecordDto ä¸»é”®ç›¸åŒçš„记录
            ProductRecordDto productRecordDto2 = productRecordDtoList.stream().filter(item ->
                            item.getId().equals(productRecordDto.getId()))
                    .findFirst().orElse(null);
            productRecordDto2.setFutureTickets(productRecordDto1.getFutureTickets());
            productRecordDto2.setFutureTicketsAmount(productRecordDto1.getFutureTicketsAmount());
            return productRecordDto2;
            BigDecimal reduce = productRecordDtoList
                    .stream()
                    .filter(item -> item.getProductModelId().equals(productRecordDto.getProductModelId()))
                    .map(ProductRecordDto::getTicketsNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            if(productRecordDto1 != null){
                productRecordDto1.setFutureTickets(productRecordDto1.getQuantity().subtract(reduce));
                productRecordDto1.setFutureTicketsAmount(productRecordDto1.getFutureTickets().multiply(productRecordDto1.getTaxInclusiveUnitPrice()));
            }
            return productRecordDto1;
        }
        return null;
    }
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -433,6 +433,7 @@
        //批量删除检验标准
        LambdaQueryWrapper<QualityInspect> materialInspectLambdaQueryWrapper = new LambdaQueryWrapper<>();
        materialInspectLambdaQueryWrapper.in(QualityInspect::getPurchaseLedgerId, ids);
        List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(materialInspectLambdaQueryWrapper);
        qualityInspects.stream().forEach(qualityInspect -> {
            if (ObjectUtils.isNotEmpty(qualityInspect.getInspectState())&&qualityInspect.getInspectState().equals(1)) {
src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
@@ -2,10 +2,12 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import com.ruoyi.procurementrecord.service.ProcurementRecordService;
import com.ruoyi.procurementrecord.service.impl.ProcurementRecordServiceImpl;
import com.ruoyi.procurementrecord.utils.StockUtils;
import com.ruoyi.quality.dto.QualityInspectDto;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.quality.pojo.QualityInspectFile;
@@ -40,6 +42,8 @@
    private IQualityInspectFileService qualityInspectFileService;
    @Autowired
    private ProcurementRecordService procurementRecordService;
    @Autowired
    private StockUtils stockUtils;
    /**
@@ -69,7 +73,9 @@
        qualityInspectFileService.remove(Wrappers.<QualityInspectFile>lambdaQuery()
        .in(QualityInspectFile::getInspectId,ids));
        //删除入库记录
        procurementRecordService.remove(Wrappers.<ProcurementRecordStorage>lambdaQuery().in(ProcurementRecordStorage::getQualityInspectId,ids));
        for (Integer id : ids) {
            stockUtils.deleteStockInRecord(Long.valueOf(id), StockQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode());
        }
        //删除检验单
        return AjaxResult.success(qualityInspectService.removeBatchByIds(ids));
    }
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -93,7 +93,7 @@
            qualityUnqualifiedMapper.insert(qualityUnqualified);
        } else {
            //合格直接入库
            stockUtils.addStock(inspect.getProductModelId(), inspect.getQuantity(), StockQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(), inspect.getId());
            stockUtils.addStock(qualityInspect.getProductModelId(), qualityInspect.getQuantity(), StockQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(), qualityInspect.getId());
        }
        qualityInspect.setInspectState(1);//已提交
        return qualityInspectMapper.updateById(qualityInspect);
src/main/java/com/ruoyi/safe/controller/SafeAccidentController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package com.ruoyi.safe.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.safe.pojo.SafeAccident;
import com.ruoyi.safe.pojo.SafeContingencyPlan;
import com.ruoyi.safe.service.SafeAccidentService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--事故上报记录 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 02:40:31
 */
@RestController
@RequestMapping("/safeAccident")
@Api(tags = "安全生产--事故上报记录")
public class SafeAccidentController {
    @Autowired
    private SafeAccidentService safeAccidentService;
    @GetMapping("/page")
    @ApiOperation("分页查询")
    public R page(Page page, SafeAccident safeAccident) {
        return R.ok(safeAccidentService.pageSafeAccident(page, safeAccident));
    }
    @ApiOperation("新增事故上报记录")
    @PostMapping()
    public R add(@RequestBody SafeAccident safeAccident) {
        return R.ok(safeAccidentService.save(safeAccident));
    }
    @ApiOperation("修改事故上报记录")
    @PutMapping ()
    public R update(@RequestBody  SafeAccident safeAccident) {
        return R.ok(safeAccidentService.updateById(safeAccident));
    }
    @ApiOperation("删除事故上报记录")
    @DeleteMapping("/{ids}")
    public R delSafeCertification(@RequestBody List<Integer> ids) {
        return R.ok(safeAccidentService.removeBatchByIds(ids));
    }
}
src/main/java/com/ruoyi/safe/controller/SafeCertificationController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
package com.ruoyi.safe.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProcessRouteDto;
import com.ruoyi.production.pojo.ProcessRoute;
import com.ruoyi.safe.pojo.SafeCertification;
import com.ruoyi.safe.service.SafeCertificationService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--安全规程与资质管理 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 09:26:33
 */
@RestController
@RequestMapping("/safeCertification")
@Api(tags = "安全生产--安全规程与资质管理")
public class SafeCertificationController {
    @Autowired
    private SafeCertificationService safeCertificationService;
    @GetMapping("/page")
    @ApiOperation("分页查询")
    public R page(Page<SafeCertification> page, SafeCertification safeCertification) {
        return R.ok(safeCertificationService.pageSafeCertification(page, safeCertification));
    }
    @ApiOperation("新增安全规程与资质管理")
    @PostMapping()
    public R add(@RequestBody SafeCertification safeCertification) {
        return R.ok(safeCertificationService.save(safeCertification));
    }
    @ApiOperation("修改安全规程与资质管理")
    @PutMapping ()
    public R update(@RequestBody  SafeCertification safeCertification) {
        return R.ok(safeCertificationService.updateById(safeCertification));
    }
    @ApiOperation("删除安全规程与资质管理")
    @DeleteMapping("/{ids}")
    public R delSafeCertification(@RequestBody List<Integer> ids) {
        return R.ok(safeCertificationService.removeBatchByIds(ids));
    }
}
src/main/java/com/ruoyi/safe/controller/SafeCertificationFileController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
package com.ruoyi.safe.controller;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.pojo.ProductWorkOrderFile;
import com.ruoyi.production.service.ProductWorkOrderFileService;
import com.ruoyi.safe.pojo.SafeCertificationFile;
import com.ruoyi.safe.service.SafeCertificationFileService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--安全规程与资质管理--附件 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 09:45:20
 */
@RestController
@RequestMapping("/safeCertificationFile")
@Api(tags = "安全生产--安全规程与资质管理--附件")
public class SafeCertificationFileController {
    @Resource
    private SafeCertificationFileService safeCertificationFileService;
    /**
     * æ–°å¢ž
     * @param safeCertificationFile
     * @return
     */
    @PostMapping("/add")
    @ApiOperation("新增")
    public R add(@RequestBody SafeCertificationFile safeCertificationFile) {
        return R.ok(safeCertificationFileService.save(safeCertificationFile));
    }
    /**
     * åˆ é™¤
     * @param ids
     * @return
     */
    @DeleteMapping("/del")
    @ApiOperation("删除")
    public R delSafeCertificationFile(@RequestBody List<Integer> ids) {
        if(CollectionUtils.isEmpty(ids)){
            return R.fail("请选择至少一条数据");
        }
        //删除检验附件
        return R.ok(safeCertificationFileService.removeBatchByIds(ids));
    }
    /**
     *分页查询
     * @param page
     * @param safeCertificationFile
     * @return
     */
    @GetMapping("/listPage")
    @ApiOperation("分页查询")
    public R listPage(Page page, SafeCertificationFile safeCertificationFile) {
        return R.ok(safeCertificationFileService.page(page, Wrappers.<SafeCertificationFile>lambdaQuery().eq(SafeCertificationFile::getSafeCertificationId,safeCertificationFile.getSafeCertificationId())));
    }
}
src/main/java/com/ruoyi/safe/controller/SafeContingencyPlanController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package com.ruoyi.safe.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.safe.pojo.SafeCertification;
import com.ruoyi.safe.pojo.SafeContingencyPlan;
import com.ruoyi.safe.service.SafeCertificationService;
import com.ruoyi.safe.service.SafeContingencyPlanService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--应急预案查阅 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 02:07:29
 */
@RestController
@RequestMapping("/safeContingencyPlan")
@Api(tags = "安全生产--应急预案查阅")
public class SafeContingencyPlanController {
    @Autowired
    private SafeContingencyPlanService safeContingencyPlanService;
    @GetMapping("/page")
    @ApiOperation("分页查询")
    public R page(Page page, SafeContingencyPlan safeContingencyPlan) {
        return R.ok(safeContingencyPlanService.pageSafeContingencyPlan(page, safeContingencyPlan));
    }
    @ApiOperation("新增应急预案查阅")
    @PostMapping()
    public R add(@RequestBody SafeContingencyPlan safeContingencyPlan) {
        return R.ok(safeContingencyPlanService.save(safeContingencyPlan));
    }
    @ApiOperation("修改应急预案查阅")
    @PutMapping ()
    public R update(@RequestBody  SafeContingencyPlan safeContingencyPlan) {
        return R.ok(safeContingencyPlanService.updateById(safeContingencyPlan));
    }
    @ApiOperation("删除应急预案查阅")
    @DeleteMapping("/{ids}")
    public R delSafeCertification(@RequestBody List<Integer> ids) {
        return R.ok(safeContingencyPlanService.removeBatchByIds(ids));
    }
}
src/main/java/com/ruoyi/safe/controller/SafeHazardController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package com.ruoyi.safe.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.safe.pojo.SafeCertification;
import com.ruoyi.safe.pojo.SafeHazard;
import com.ruoyi.safe.service.SafeCertificationService;
import com.ruoyi.safe.service.SafeHazardService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--危险源台账 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 10:09:24
 */
@RestController
@RequestMapping("/safeHazard")
@Api(tags = "安全生产--危险源台账")
public class SafeHazardController {
    @Autowired
    private SafeHazardService safeHazardService;
    @GetMapping("/page")
    @ApiOperation("分页查询")
    public R page(Page page, SafeHazard safeHazard) {
        return R.ok(safeHazardService.pageSafeHazard(page, safeHazard));
    }
    @ApiOperation("新增危险源台账")
    @PostMapping()
    public R add(@RequestBody SafeHazard safeHazard) {
        return R.ok(safeHazardService.save(safeHazard));
    }
    @ApiOperation("修改危险源台账")
    @PutMapping ()
    public R update(@RequestBody  SafeHazard safeHazard) {
        return R.ok(safeHazardService.updateById(safeHazard));
    }
    @ApiOperation("删除危险源台账")
    @DeleteMapping("/{ids}")
    public R delSafeHazard(@RequestBody List<Integer> ids) {
        return R.ok(safeHazardService.removeBatchByIds(ids));
    }
}
src/main/java/com/ruoyi/safe/controller/SafeHazardRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
package com.ruoyi.safe.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.safe.dto.SafeHazardRecordDto;
import com.ruoyi.safe.pojo.SafeHazard;
import com.ruoyi.safe.pojo.SafeHazardRecord;
import com.ruoyi.safe.service.SafeHazardRecordService;
import com.ruoyi.safe.service.SafeHazardService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--危险物料管控 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 01:13:40
 */
@RestController
@RequestMapping("/safeHazardRecord")
@Api(tags = "安全生产--危险物料管控")
public class SafeHazardRecordController {
    @Autowired
    private SafeHazardRecordService safeHazardRecordService;
    @GetMapping("/page")
    @ApiOperation("分页查询")
    public R page(Page page, SafeHazardRecordDto safeHazardRecordDto) {
        return R.ok(safeHazardRecordService.pageSafeHazardRecord(page, safeHazardRecordDto));
    }
    @ApiOperation("领用")
    @PostMapping("/borrow")
    public R borrow(@RequestBody SafeHazardRecord safeHazardRecord) {
        return R.ok(safeHazardRecordService.borrow(safeHazardRecord));
    }
    @ApiOperation("归还")
    @PutMapping("/return")
    public R returnSafeHazardRecord(@RequestBody  SafeHazardRecord safeHazardRecord) {
        return R.ok(safeHazardRecordService.returnSafeHazardRecord(safeHazardRecord));
    }
    @ApiOperation("删除")
    @DeleteMapping("/{ids}")
    public R delSafeHazardRecord(@RequestBody List<Integer> ids) {
        return R.ok(safeHazardRecordService.delSafeHazardRecord(ids));
    }
}
src/main/java/com/ruoyi/safe/controller/SafeHiddenController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
package com.ruoyi.safe.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.safe.dto.SafeHiddenDto;
import com.ruoyi.safe.pojo.SafeHazard;
import com.ruoyi.safe.pojo.SafeHidden;
import com.ruoyi.safe.service.SafeHazardService;
import com.ruoyi.safe.service.SafeHiddenService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--隐患排查上报 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 11:10:54
 */
@RestController
@RequestMapping("/safeHidden")
@Api(tags = "安全生产--隐患排查上报")
public class SafeHiddenController {
    @Autowired
    private SafeHiddenService safeHiddenService;
    @GetMapping("/page")
    @ApiOperation("分页查询")
    public R page(Page page, SafeHiddenDto safeHiddenDto) {
        return R.ok(safeHiddenService.pageSafeHidden(page, safeHiddenDto));
    }
    @ApiOperation("新增隐患排查")
    @PostMapping()
    public R add(@RequestBody SafeHidden safeHidden) {
        return R.ok(safeHiddenService.add(safeHidden));
    }
    @ApiOperation("修改隐患排查(整改/验收)")
    @PutMapping ()
    public R update(@RequestBody SafeHidden safeHidden) {
        return R.ok(safeHiddenService.updateById(safeHidden));
    }
    @ApiOperation("删除隐患排查")
    @DeleteMapping("/{ids}")
    public R delSafeHidden(@RequestBody List<Integer> ids) {
        return R.ok(safeHiddenService.delSafeHidden(ids));
    }
}
src/main/java/com/ruoyi/safe/controller/SafeHiddenFileController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,71 @@
package com.ruoyi.safe.controller;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.safe.pojo.SafeHiddenFile;
import com.ruoyi.safe.service.SafeHiddenFileService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--隐患排查上报--附件 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 11:50:05
 */
@RestController
@RequestMapping("/safeHiddenFile")
@Api(tags = "安全生产--隐患排查上报--附件")
public class SafeHiddenFileController {
    @Resource
    private SafeHiddenFileService safeHiddenFileService;
    /**
     * æ–°å¢ž
     * @param safeHiddenFile
     * @return
     */
    @PostMapping("/add")
    @ApiOperation("新增")
    public R add(@RequestBody SafeHiddenFile safeHiddenFile) {
        return R.ok(safeHiddenFileService.save(safeHiddenFile));
    }
    /**
     * åˆ é™¤
     * @param ids
     * @return
     */
    @DeleteMapping("/del")
    @ApiOperation("删除")
    public R delSafeHiddenFile(@RequestBody List<Integer> ids) {
        if(CollectionUtils.isEmpty(ids)){
            return R.fail("请选择至少一条数据");
        }
        //删除检验附件
        return R.ok(safeHiddenFileService.removeBatchByIds(ids));
    }
    /**
     *分页查询
     * @param page
     * @param safeHiddenFile
     * @return
     */
    @GetMapping("/listPage")
    @ApiOperation("分页查询")
    public R listPage(Page page, SafeHiddenFile safeHiddenFile) {
        return R.ok(safeHiddenFileService.page(page, Wrappers.<SafeHiddenFile>lambdaQuery().eq(SafeHiddenFile::getSafeHiddenId,safeHiddenFile.getSafeHiddenId())));
    }
}
src/main/java/com/ruoyi/safe/dto/SafeHazardRecordDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
package com.ruoyi.safe.dto;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.safe.pojo.SafeHazardRecord;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
public class SafeHazardRecordDto extends SafeHazardRecord {
    @ApiModelProperty("领用人")
    private String applyUserName;
    @ApiModelProperty("归还人")
    private String returnUserName;
    @ApiModelProperty("危险源名称")
    private String name;
    @ApiModelProperty("危险源编码")
    private String code;
    @ApiModelProperty("危险源类型")
    private String type;
    @ApiModelProperty("风险等级")
    private String riskLevel;
    @ApiModelProperty("所在位置")
    private String location;
}
src/main/java/com/ruoyi/safe/dto/SafeHiddenDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.safe.dto;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.safe.pojo.SafeHidden;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
public class SafeHiddenDto extends SafeHidden {
    @ApiModelProperty("上报人")
    private String createUserName;
    @ApiModelProperty("整改责任人")
    private String rectifyUserName;
    @ApiModelProperty("验收人")
    private String verifyUserName;
}
src/main/java/com/ruoyi/safe/mapper/SafeAccidentMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.safe.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safe.pojo.SafeAccident;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--事故上报记录 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 02:40:31
 */
@Mapper
public interface SafeAccidentMapper extends BaseMapper<SafeAccident> {
    IPage<SafeAccident> pageSafeAccident(Page page, @Param("c") SafeAccident safeAccident);
}
src/main/java/com/ruoyi/safe/mapper/SafeCertificationFileMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.safe.mapper;
import com.ruoyi.safe.pojo.SafeCertificationFile;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--安全规程与资质管理--附件 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 09:45:20
 */
@Mapper
public interface SafeCertificationFileMapper extends BaseMapper<SafeCertificationFile> {
}
src/main/java/com/ruoyi/safe/mapper/SafeCertificationMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.safe.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safe.pojo.SafeCertification;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--安全规程与资质管理 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 09:26:33
 */
@Mapper
public interface SafeCertificationMapper extends BaseMapper<SafeCertification> {
    IPage<SafeCertification> pageSafeCertification(Page<SafeCertification> page, @Param("c") SafeCertification safeCertification);
}
src/main/java/com/ruoyi/safe/mapper/SafeContingencyPlanMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.safe.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safe.pojo.SafeContingencyPlan;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--应急预案查阅 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 02:07:29
 */
@Mapper
public interface SafeContingencyPlanMapper extends BaseMapper<SafeContingencyPlan> {
    IPage<SafeContingencyPlan> pageSafeContingencyPlan(Page page, @Param("c") SafeContingencyPlan safeContingencyPlan);
}
src/main/java/com/ruoyi/safe/mapper/SafeHazardMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.safe.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safe.pojo.SafeHazard;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--危险源台账 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 10:09:24
 */
@Mapper
public interface SafeHazardMapper extends BaseMapper<SafeHazard> {
    IPage<SafeHazard> pageSafeHazard(Page page, @Param("c") SafeHazard safeHazard);
}
src/main/java/com/ruoyi/safe/mapper/SafeHazardRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.safe.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safe.dto.SafeHazardRecordDto;
import com.ruoyi.safe.pojo.SafeHazardRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--危险物料管控 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 01:13:40
 */
@Mapper
public interface SafeHazardRecordMapper extends BaseMapper<SafeHazardRecord> {
    IPage<SafeHazardRecordDto> pageSafeHazardRecord(Page page, @Param("c") SafeHazardRecordDto safeHazardRecordDto);
}
src/main/java/com/ruoyi/safe/mapper/SafeHiddenFileMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.safe.mapper;
import com.ruoyi.safe.pojo.SafeHiddenFile;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--隐患排查上报--附件 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 11:50:05
 */
@Mapper
public interface SafeHiddenFileMapper extends BaseMapper<SafeHiddenFile> {
}
src/main/java/com/ruoyi/safe/mapper/SafeHiddenMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.safe.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safe.dto.SafeHiddenDto;
import com.ruoyi.safe.pojo.SafeHidden;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--隐患排查上报 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 11:10:54
 */
@Mapper
public interface SafeHiddenMapper extends BaseMapper<SafeHidden> {
    IPage<SafeHiddenDto> pageSafeHidden(Page page, @Param("c") SafeHiddenDto safeHiddenDto);
}
src/main/java/com/ruoyi/safe/pojo/SafeAccident.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,106 @@
package com.ruoyi.safe.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
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.math.BigDecimal;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--事故上报记录
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 02:40:31
 */
@Getter
@Setter
@TableName("safe_accident")
@ApiModel(value = "SafeAccident对象", description = "安全生产--事故上报记录")
public class SafeAccident implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("事故编号")
    private String accidentCode;
    @ApiModelProperty("事故名称")
    private String accidentName;
    @ApiModelProperty("事故类型")
    private String accidentType;
    @ApiModelProperty("事故发生时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime happenTime;
    @ApiModelProperty("事故发生位置")
    private String happenLocation;
    @ApiModelProperty("事故等级")
    private String accidentGrade;
    @ApiModelProperty("事故直接原因")
    private String accidentCause;
    @ApiModelProperty("事故根本原因")
    private String rootCause;
    @ApiModelProperty("人员损失情况")
    private String personLoss;
    @ApiModelProperty("直接财产损失(元)    ")
    private BigDecimal assetLoss;
    @ApiModelProperty("生产影响情况")
    private String productionLoss;
    @ApiModelProperty("现场应急处置措施")
    private String handleMeasures;
    @ApiModelProperty("事故责任人")
    private String responsiblePerson;
    @ApiModelProperty("备注")
    private String remark;
    @ApiModelProperty("上报时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty("上报人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("上报人")
    @TableField(exist = false)
    private String createUserName;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT)
    private Integer tenantId;
}
src/main/java/com/ruoyi/safe/pojo/SafeCertification.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
package com.ruoyi.safe.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
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.LocalDate;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--安全规程与资质管理
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 09:26:33
 */
@Getter
@Setter
@TableName("safe_certification")
@ApiModel(value = "SafeCertification对象", description = "安全生产--安全规程与资质管理")
public class SafeCertification implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("规程资质名称")
    private String name;
    @ApiModelProperty("规程资质编号")
    private String code;
    @ApiModelProperty("规程资质类型")
    private String type;
    @ApiModelProperty("版本号")
    private String version;
    @ApiModelProperty("备注")
    private String remark;
    @ApiModelProperty("有效期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate effectiveTime;
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT)
    private Integer tenantId;
}
src/main/java/com/ruoyi/safe/pojo/SafeCertificationFile.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
package com.ruoyi.safe.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
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;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--安全规程与资质管理--附件
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 09:45:20
 */
@Getter
@Setter
@TableName("safe_certification_file")
@ApiModel(value = "SafeCertificationFile对象", description = "安全生产--安全规程与资质管理--附件")
public class SafeCertificationFile implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("关联安全生产资质id")
    @NotBlank(message = "关联安全生产资质id不能为空")
    private Integer safeCertificationId;
    private String name;
    private String url;
    private Object fileSize;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT)
    private Integer tenantId;
}
src/main/java/com/ruoyi/safe/pojo/SafeContingencyPlan.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
package com.ruoyi.safe.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
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.LocalDate;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--应急预案查阅
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 02:07:29
 */
@Getter
@Setter
@TableName("safe_contingency_plan")
@ApiModel(value = "SafeContingencyPlan对象", description = "安全生产--应急预案查阅")
public class SafeContingencyPlan implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("应急预案编码")
    private String planCode;
    @ApiModelProperty("应急预案名称")
    private String planName;
    @ApiModelProperty("预案类型")
    private String planType;
    @ApiModelProperty("适用范围")
    private String applyScope;
    @ApiModelProperty("核心责任人")
    private Integer coreResponsorUserId;
    @ApiModelProperty("核心责任人")
    @TableField(exist = false)
    private String coreResponsorUserName;
    @ApiModelProperty("应急处置步骤")
    private String execSteps;
    @ApiModelProperty("发布生效时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate publishTime;
    @ApiModelProperty("备注")
    private String remark;
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("最后修订时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT)
    private Integer tenantId;
}
src/main/java/com/ruoyi/safe/pojo/SafeHazard.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
package com.ruoyi.safe.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
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.math.BigDecimal;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--危险源台账
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 10:09:24
 */
@Getter
@Setter
@TableName("safe_hazard")
@ApiModel(value = "SafeHazard对象", description = "安全生产--危险源台账")
public class SafeHazard implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("危险源名称")
    private String name;
    @ApiModelProperty("危险源编码")
    private String code;
    @ApiModelProperty("危险源类型")
    private String type;
    @ApiModelProperty("风险等级")
    private String riskLevel;
    @ApiModelProperty("所在位置")
    private String location;
    @ApiModelProperty("规格 / é£Žé™©æè¿°")
    private String specInfo;
    @ApiModelProperty("管控措施")
    private String controlMeasures;
    @ApiModelProperty("管控责任人 ID")
    private Integer principalUserId;
    @ApiModelProperty("管控责任人")
    @TableField(exist = false)
    private String principalUser;
    @ApiModelProperty("责任人联系电话")
    private String principalMobile;
    @ApiModelProperty("库存数量")
    private BigDecimal stockQty;
    @ApiModelProperty("备注")
    private String remark;
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT)
    private Integer tenantId;
}
src/main/java/com/ruoyi/safe/pojo/SafeHazardRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,88 @@
package com.ruoyi.safe.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
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.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--危险物料管控
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 01:13:40
 */
@Getter
@Setter
@TableName("safe_hazard_record")
@ApiModel(value = "SafeHazardRecord对象", description = "安全生产--危险物料管控")
public class SafeHazardRecord implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("单号")
    private String materialRecordCode;
    @ApiModelProperty("关联危险源台账 ID")
    private Integer safeHazardId;
    @ApiModelProperty("领用人 ID")
    private Integer applyUserId;
    @ApiModelProperty("领用时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate applyTime;
    @ApiModelProperty("领用数量")
    private BigDecimal applyQty;
    @ApiModelProperty("领用用途")
    private String applyPurpose;
    @ApiModelProperty("归还人 ID")
    private Integer returnUserId;
    @ApiModelProperty("归还时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate returnTime;
    @ApiModelProperty("归还情况说明")
    private String returnRemark;
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT)
    private Integer tenantId;
}
src/main/java/com/ruoyi/safe/pojo/SafeHidden.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,110 @@
package com.ruoyi.safe.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
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.LocalDate;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotBlank;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--隐患排查上报
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 11:10:54
 */
@Getter
@Setter
@TableName("safe_hidden")
@ApiModel(value = "SafeHidden对象", description = "安全生产--隐患排查上报")
public class SafeHidden implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("隐患编号")
    private String hiddenCode;
    @ApiModelProperty("隐患类型")
    private String type;
    @ApiModelProperty("隐患风险等级")
    private String riskLevel;
    @ApiModelProperty("隐患具体位置")
    private String location;
    @ApiModelProperty("隐患描述")
    private String hiddenDesc;
    @ApiModelProperty("整改责任人 ID")
    @NotBlank(message = "整改责任人不能为空")
    private Integer rectifyUserId;
    @ApiModelProperty("整改人联系电话")
    private String rectifyUserMobile;
    @ApiModelProperty("整改完成期限(日期)")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @NotBlank(message = "整改完成期限不能为空")
    private LocalDate rectifyTime;
    @ApiModelProperty("整改具体措施")
    private String rectifyMeasures;
    @ApiModelProperty("实际整改完成时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate rectifyActualTime;
    @ApiModelProperty("验收人 ID")
    private Integer verifyUserId;
    @ApiModelProperty("验收结果")
    private String verifyResult;
    @ApiModelProperty("验收意见")
    private String verifyRemark;
    @ApiModelProperty("验收时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate verifyTime;
    @ApiModelProperty("上报时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty("上报人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT)
    private Integer tenantId;
}
src/main/java/com/ruoyi/safe/pojo/SafeHiddenFile.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
package com.ruoyi.safe.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
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 èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 11:50:05
 */
@Getter
@Setter
@TableName("safe_hidden_file")
@ApiModel(value = "SafeHiddenFile对象", description = "安全生产--隐患排查上报--附件")
public class SafeHiddenFile implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("关联隐患排查上报id")
    private Integer safeHiddenId;
    private String name;
    private String url;
    private Object fileSize;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT)
    private Integer tenantId;
}
src/main/java/com/ruoyi/safe/service/SafeAccidentService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.safe.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safe.pojo.SafeAccident;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--事故上报记录 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 02:40:31
 */
public interface SafeAccidentService extends IService<SafeAccident> {
    IPage<SafeAccident> pageSafeAccident(Page page, SafeAccident safeAccident);
}
src/main/java/com/ruoyi/safe/service/SafeCertificationFileService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.safe.service;
import com.ruoyi.safe.pojo.SafeCertificationFile;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--安全规程与资质管理--附件 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 09:45:20
 */
public interface SafeCertificationFileService extends IService<SafeCertificationFile> {
}
src/main/java/com/ruoyi/safe/service/SafeCertificationService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.safe.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safe.pojo.SafeCertification;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--安全规程与资质管理 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 09:26:33
 */
public interface SafeCertificationService extends IService<SafeCertification> {
    IPage<SafeCertification> pageSafeCertification(Page<SafeCertification> page, SafeCertification safeCertification);
}
src/main/java/com/ruoyi/safe/service/SafeContingencyPlanService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.safe.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safe.pojo.SafeContingencyPlan;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--应急预案查阅 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 02:07:29
 */
public interface SafeContingencyPlanService extends IService<SafeContingencyPlan> {
    IPage<SafeContingencyPlan> pageSafeContingencyPlan(Page page, SafeContingencyPlan safeContingencyPlan);
}
src/main/java/com/ruoyi/safe/service/SafeHazardRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.safe.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safe.dto.SafeHazardRecordDto;
import com.ruoyi.safe.pojo.SafeHazardRecord;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--危险物料管控 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 01:13:40
 */
public interface SafeHazardRecordService extends IService<SafeHazardRecord> {
    IPage<SafeHazardRecordDto> pageSafeHazardRecord(Page page, SafeHazardRecordDto safeHazardRecordDto);
    int borrow(SafeHazardRecord safeHazardRecord);
    int returnSafeHazardRecord(SafeHazardRecord safeHazardRecord);
    int delSafeHazardRecord(List<Integer> ids);
}
src/main/java/com/ruoyi/safe/service/SafeHazardService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.safe.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safe.pojo.SafeHazard;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--危险源台账 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 10:09:24
 */
public interface SafeHazardService extends IService<SafeHazard> {
    IPage<SafeHazard> pageSafeHazard(Page page, SafeHazard safeHazard);
}
src/main/java/com/ruoyi/safe/service/SafeHiddenFileService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.safe.service;
import com.ruoyi.safe.pojo.SafeHiddenFile;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--隐患排查上报--附件 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 11:50:05
 */
public interface SafeHiddenFileService extends IService<SafeHiddenFile> {
}
src/main/java/com/ruoyi/safe/service/SafeHiddenService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.safe.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safe.dto.SafeHiddenDto;
import com.ruoyi.safe.pojo.SafeHidden;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--隐患排查上报 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 11:10:54
 */
public interface SafeHiddenService extends IService<SafeHidden> {
    IPage<SafeHiddenDto> pageSafeHidden(Page page, SafeHiddenDto safeHiddenDto);
    int add(SafeHidden safeHidden);
    int delSafeHidden(List<Integer> ids);
}
src/main/java/com/ruoyi/safe/service/impl/SafeAccidentServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.ruoyi.safe.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safe.pojo.SafeAccident;
import com.ruoyi.safe.mapper.SafeAccidentMapper;
import com.ruoyi.safe.service.SafeAccidentService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--事故上报记录 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 02:40:31
 */
@Service
public class SafeAccidentServiceImpl extends ServiceImpl<SafeAccidentMapper, SafeAccident> implements SafeAccidentService {
    @Autowired
    private SafeAccidentMapper safeAccidentMapper;
    @Override
    public IPage<SafeAccident> pageSafeAccident(Page page, SafeAccident safeAccident) {
        return safeAccidentMapper.pageSafeAccident(page, safeAccident);
    }
}
src/main/java/com/ruoyi/safe/service/impl/SafeCertificationFileServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.safe.service.impl;
import com.ruoyi.safe.pojo.SafeCertificationFile;
import com.ruoyi.safe.mapper.SafeCertificationFileMapper;
import com.ruoyi.safe.service.SafeCertificationFileService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--安全规程与资质管理--附件 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 09:45:20
 */
@Service
public class SafeCertificationFileServiceImpl extends ServiceImpl<SafeCertificationFileMapper, SafeCertificationFile> implements SafeCertificationFileService {
}
src/main/java/com/ruoyi/safe/service/impl/SafeCertificationServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ruoyi.safe.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safe.pojo.SafeCertification;
import com.ruoyi.safe.mapper.SafeCertificationMapper;
import com.ruoyi.safe.service.SafeCertificationService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--安全规程与资质管理 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 09:26:33
 */
@Service
public class SafeCertificationServiceImpl extends ServiceImpl<SafeCertificationMapper, SafeCertification> implements SafeCertificationService {
    @Autowired
    private SafeCertificationMapper safeCertificationMapper;
    @Override
    public IPage<SafeCertification> pageSafeCertification(Page<SafeCertification> page, SafeCertification safeCertification) {
        return safeCertificationMapper.pageSafeCertification(page, safeCertification);
    }
}
src/main/java/com/ruoyi/safe/service/impl/SafeContingencyPlanServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.ruoyi.safe.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safe.pojo.SafeContingencyPlan;
import com.ruoyi.safe.mapper.SafeContingencyPlanMapper;
import com.ruoyi.safe.service.SafeContingencyPlanService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--应急预案查阅 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 02:07:29
 */
@Service
public class SafeContingencyPlanServiceImpl extends ServiceImpl<SafeContingencyPlanMapper, SafeContingencyPlan> implements SafeContingencyPlanService {
    @Autowired
    private SafeContingencyPlanMapper safeContingencyPlanMapper;
    @Override
    public IPage<SafeContingencyPlan> pageSafeContingencyPlan(Page page, SafeContingencyPlan safeContingencyPlan) {
        return safeContingencyPlanMapper.pageSafeContingencyPlan(page, safeContingencyPlan);
    }
}
src/main/java/com/ruoyi/safe/service/impl/SafeHazardRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
package com.ruoyi.safe.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.safe.dto.SafeHazardRecordDto;
import com.ruoyi.safe.mapper.SafeHazardMapper;
import com.ruoyi.safe.pojo.SafeHazard;
import com.ruoyi.safe.pojo.SafeHazardRecord;
import com.ruoyi.safe.mapper.SafeHazardRecordMapper;
import com.ruoyi.safe.service.SafeHazardRecordService;
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.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--危险物料管控 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 01:13:40
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class SafeHazardRecordServiceImpl extends ServiceImpl<SafeHazardRecordMapper, SafeHazardRecord> implements SafeHazardRecordService {
    @Autowired
    private SafeHazardRecordMapper safeHazardRecordMapper;
    @Autowired
    private SafeHazardMapper safeHazardMapper;
    @Override
    public IPage<SafeHazardRecordDto> pageSafeHazardRecord(Page page, SafeHazardRecordDto safeHazardRecordDto) {
        return safeHazardRecordMapper.pageSafeHazardRecord(page, safeHazardRecordDto);
    }
    @Override
    public int borrow(SafeHazardRecord safeHazardRecord) {
        //判断数量是否满足
        SafeHazard safeHazard = safeHazardMapper.selectById(safeHazardRecord.getSafeHazardId());
        if (safeHazard.getStockQty().compareTo(safeHazardRecord.getApplyQty())<0) {
            throw new RuntimeException("库存数量不足");
        }
        //领用
        safeHazardRecord.setApplyUserId(SecurityUtils.getUserId().intValue());
        safeHazardRecord.setApplyTime(LocalDate.now());
        safeHazardRecordMapper.insert(safeHazardRecord);
        String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        String no = "LY" + String.format("%s%03d", datePrefix, safeHazardRecord.getId());
        safeHazardRecord.setMaterialRecordCode(no);
        safeHazardRecordMapper.updateById(safeHazardRecord);
        //减库存
        safeHazard.setStockQty(safeHazard.getStockQty().subtract(safeHazardRecord.getApplyQty()));
        safeHazardMapper.updateById(safeHazard);
        return 0;
    }
    @Override
    public int returnSafeHazardRecord(SafeHazardRecord safeHazardRecord) {
        SafeHazard safeHazard = safeHazardMapper.selectById(safeHazardRecord.getSafeHazardId());
        //归还
        safeHazardRecord.setReturnUserId(SecurityUtils.getUserId().intValue());
        safeHazardRecord.setReturnTime(LocalDate.now());
        safeHazardRecordMapper.updateById(safeHazardRecord);
        //增库存
        safeHazard.setStockQty(safeHazard.getStockQty().add(safeHazardRecord.getApplyQty()));
        safeHazardMapper.updateById(safeHazard);
        return 0;
    }
    @Override
    public int delSafeHazardRecord(List<Integer> ids) {
        List<SafeHazardRecord> safeHazardRecords = safeHazardRecordMapper.selectBatchIds(ids);
        for (SafeHazardRecord safeHazardRecord : safeHazardRecords) {
            //判断是否有归还
            if (ObjectUtils.isNull(safeHazardRecord.getReturnUserId())){
                //没有归还,删除领用记录需要增加库存
                SafeHazard safeHazard = safeHazardMapper.selectById(safeHazardRecord.getSafeHazardId());
                safeHazard.setStockQty(safeHazard.getStockQty().add(safeHazardRecord.getApplyQty()));
                safeHazardMapper.updateById(safeHazard);
            }
        }
        safeHazardRecordMapper.deleteBatchIds(ids);
        return 0;
    }
}
src/main/java/com/ruoyi/safe/service/impl/SafeHazardServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.ruoyi.safe.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safe.pojo.SafeHazard;
import com.ruoyi.safe.mapper.SafeHazardMapper;
import com.ruoyi.safe.service.SafeHazardService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--危险源台账 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 10:09:24
 */
@Service
public class SafeHazardServiceImpl extends ServiceImpl<SafeHazardMapper, SafeHazard> implements SafeHazardService {
    @Autowired
    private SafeHazardMapper safeHazardMapper;
    @Override
    public IPage<SafeHazard> pageSafeHazard(Page page, SafeHazard safeHazard) {
        return safeHazardMapper.pageSafeHazard(page, safeHazard);
    }
}
src/main/java/com/ruoyi/safe/service/impl/SafeHiddenFileServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.safe.service.impl;
import com.ruoyi.safe.pojo.SafeHiddenFile;
import com.ruoyi.safe.mapper.SafeHiddenFileMapper;
import com.ruoyi.safe.service.SafeHiddenFileService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--隐患排查上报--附件 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 11:50:05
 */
@Service
public class SafeHiddenFileServiceImpl extends ServiceImpl<SafeHiddenFileMapper, SafeHiddenFile> implements SafeHiddenFileService {
}
src/main/java/com/ruoyi/safe/service/impl/SafeHiddenServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
package com.ruoyi.safe.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.project.system.domain.SysNotice;
import com.ruoyi.project.system.mapper.SysNoticeMapper;
import com.ruoyi.project.system.service.ISysNoticeService;
import com.ruoyi.project.system.service.impl.SysNoticeServiceImpl;
import com.ruoyi.safe.dto.SafeHiddenDto;
import com.ruoyi.safe.pojo.SafeHidden;
import com.ruoyi.safe.mapper.SafeHiddenMapper;
import com.ruoyi.safe.service.SafeHiddenService;
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.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
/**
 * <p>
 * å®‰å…¨ç”Ÿäº§--隐患排查上报 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-28 11:10:54
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class SafeHiddenServiceImpl extends ServiceImpl<SafeHiddenMapper, SafeHidden> implements SafeHiddenService {
    @Autowired
    private SafeHiddenMapper safeHiddenMapper;
    @Autowired
    private ISysNoticeService sysNoticeService;
    @Override
    public IPage<SafeHiddenDto> pageSafeHidden(Page page, SafeHiddenDto safeHiddenDto) {
        return safeHiddenMapper.pageSafeHidden(page, safeHiddenDto);
    }
    @Override
    public int add(SafeHidden safeHidden) {
        safeHiddenMapper.insert(safeHidden);
        String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        String no = "YH" + String.format("%s%03d", datePrefix, safeHidden.getId());
        safeHidden.setHiddenCode(no);
        safeHiddenMapper.updateById(safeHidden);
        //消息通知
        sysNoticeService.simpleNoticeByUser("隐患排查上报整改",
                "隐患类型:"+safeHidden.getType()+"\n"+
                        "隐患风险等级:"+safeHidden.getRiskLevel()+"\n"+
                        "隐患具体位置:"+safeHidden.getLocation()+"\n"+
                        "隐患描述:"+safeHidden.getHiddenDesc()+"\n"+
                        "整改完成期限(日期):"+safeHidden.getRectifyTime(),
                Arrays.asList(Long.valueOf(safeHidden.getRectifyUserId())),
                "/safeProduction/dangerInvestigation?id=" + safeHidden.getId());
        return 0;
    }
    @Override
    public int delSafeHidden(List<Integer> ids) {
        List<SafeHidden> safeHiddens = safeHiddenMapper.selectBatchIds(ids);
        for (SafeHidden safeHidden : safeHiddens) {
            //  åˆ é™¤å¯¹åº”的消息通知
            sysNoticeService.remove(new LambdaQueryWrapper<SysNotice>()
                    .eq(SysNotice::getNoticeTitle, "隐患排查上报整改")
                    .eq(SysNotice::getSenderId, safeHidden.getCreateUser())
                    .apply("CAST(notice_content AS CHAR) LIKE CONCAT('%', {0}, '%')", safeHidden.getId()));
        }
        safeHiddenMapper.deleteBatchIds(ids);
        return 0;
    }
}
src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java
@@ -12,6 +12,7 @@
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
/**
 * äº§å“ä¿¡æ¯Mapper接口
@@ -33,4 +34,10 @@
    IPage<ProcurementBusinessSummaryDto> procurementBusinessSummaryListPage(Page page,@Param("req") ProcurementBusinessSummaryDto procurementBusinessSummaryDto);
    List<LossProductModelDto> selectProductBomStructure(@Param("salesLedegerId") Long salesLedegerId);
    List<Map<String, Object>> selectProductSalesAnalysis();
    List<Map<String, Object>> selectRawMaterialPurchaseAnalysis();
    int selectProductCountByTypeAndDate(@Param("type") Integer type, @Param("startDate") String startDate, @Param("endDate") String endDate);
}
src/main/java/com/ruoyi/sales/service/impl/ReceiptPaymentServiceImpl.java
@@ -69,8 +69,8 @@
            // å·²å›žæ¬¾é‡‘额
            SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(receiptPayment.getSalesLedgerProductId());
            if(null==salesLedgerProduct) throw new RuntimeException("未找到销售单产品");
            if (salesLedgerProduct.getPendingInvoiceTotal().compareTo(receiptPayment.getReceiptPaymentAmount())<0){
                throw new RuntimeException("本次回款金额不能大于待回款金额");
            if (salesLedgerProduct.getPendingInvoiceTotal().add(receiptPayment.getReceiptPaymentAmount()).compareTo(byId.getReceiptPaymentAmount())<0){
                throw new RuntimeException("本次回款金额不能大于待回款金额+回款金额");
            }
            if(null==receiptPayment.getId()){
                salesLedgerProduct.setInvoiceTotal(salesLedgerProduct.getInvoiceTotal().add(receiptPayment.getReceiptPaymentAmount()));
@@ -90,7 +90,7 @@
                accountIncome.setBusinessType(1);
                accountIncomeService.save(accountIncome);
            }else {
                BigDecimal subtract = receiptPayment.getReceiptPaymentAmount().subtract(byId.getReceiptPaymentAmount());
                BigDecimal subtract = byId.getReceiptPaymentAmount().subtract(receiptPayment.getReceiptPaymentAmount());
                salesLedgerProduct.setInvoiceTotal(salesLedgerProduct.getInvoiceTotal().add(subtract));
                salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(salesLedgerProduct.getInvoiceTotal()));
                receiptPayment.setReceiptPaymentAmount(byId.getReceiptPaymentAmount());
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -7,6 +7,8 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockUnQualifiedRecordTypeEnum;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.procurementrecord.utils.StockUtils;
@@ -388,6 +390,13 @@
                                new LambdaQueryWrapper<QualityInspect>()
                                        .in(QualityInspect::getProductMainId, productMainIds)
                        );
                        //删除出库记录
                        for (Long productMainId : productMainIds) {
                            //删除生产出库记录
                            stockUtils.deleteStockOutRecord(productMainId, StockQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
                            //删除报废的入库记录
                            stockUtils.deleteStockInRecord(productMainId, StockUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
                        }
                        qualityInspects.forEach(qualityInspect -> {
                            //inspectState=1 å·²æäº¤ ä¸èƒ½åˆ é™¤
                            if (qualityInspect.getInspectState() == 1) {
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -1,7 +1,6 @@
package com.ruoyi.sales.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
@@ -9,14 +8,11 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.pojo.AccountIncome;
import com.ruoyi.account.service.AccountIncomeService;
import com.ruoyi.basic.mapper.CustomerMapper;
import com.ruoyi.basic.mapper.ProductMapper;
import com.ruoyi.basic.mapper.ProductModelMapper;
import com.ruoyi.basic.pojo.Customer;
import com.ruoyi.basic.pojo.Product;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.common.enums.FileNameType;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.DateUtils;
@@ -27,7 +23,6 @@
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.other.mapper.TempFileMapper;
import com.ruoyi.other.pojo.TempFile;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.mapper.*;
import com.ruoyi.production.pojo.*;
import com.ruoyi.project.system.domain.SysDept;
@@ -151,6 +146,7 @@
    private ProductMapper productMapper;
    @Autowired
    private ProductStructureMapper productStructureMapper;
;
    @Override
    public List<SalesLedger> selectSalesLedgerList(SalesLedgerDto salesLedgerDto) {
src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -8,7 +8,6 @@
import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
import com.ruoyi.common.enums.FileNameType;
import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.other.service.impl.TempFileServiceImpl;
import com.ruoyi.procurementrecord.utils.StockUtils;
import com.ruoyi.sales.dto.ShippingInfoDto;
@@ -16,7 +15,6 @@
import com.ruoyi.sales.mapper.ShippingInfoMapper;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.pojo.ShippingInfo;
import com.ruoyi.sales.service.ICommonFileService;
import com.ruoyi.sales.service.ShippingInfoService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
@@ -88,7 +86,7 @@
        // æ‰£å·²å‘货库存
        for (ShippingInfo shippingInfo : shippingInfos) {
            if("已发货".equals(shippingInfo.getStatus())) {
                stockUtils.deleteStockRecord(shippingInfo.getId(), StockQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode());
                stockUtils.deleteStockOutRecord(shippingInfo.getId(), StockQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode());
            }
        }
        // åˆ é™¤å‘货审批
src/main/java/com/ruoyi/staff/service/impl/StaffLeaveServiceImpl.java
@@ -5,6 +5,8 @@
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.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.staff.dto.StaffLeaveDto;
import com.ruoyi.staff.mapper.StaffLeaveMapper;
import com.ruoyi.staff.mapper.StaffOnJobMapper;
@@ -29,6 +31,9 @@
    @Autowired
    private StaffOnJobMapper staffOnJobMapper;
    @Autowired
    private SysUserMapper sysUserMapper;
    //新增离职列表分页查询
    @Override
@@ -61,6 +66,12 @@
        }
        staffLeaveMapper.insert(staffLeave);
        // æ›´æ–°å¯¹åº”用户状态为停用
        // æ ¹æ®å‘˜å·¥ç¼–号查询用户
        SysUser sysUser = sysUserMapper.selectUserByUserName(staffOnJob.getStaffNo());
        sysUser.setStatus("1");
        sysUserMapper.updateUser(sysUser);
        // æ›´æ–°ç¦»èŒçŠ¶æ€ä¸ºç¦»èŒ
        staffOnJob.setStaffState(0);
       return staffOnJobMapper.updateById(staffOnJob);
src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
@@ -11,7 +11,9 @@
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
/**
 * <p>
@@ -39,4 +41,11 @@
    BigDecimal selectTotal();
    int selectStorageProductCountByDate(@Param("startDate") String startDate, @Param("endDate") String endDate);
    List<Map<String, Object>> selectDailyStockInCounts(@Param("rootCategoryId") Long rootCategoryId, @Param("startDate") String startDate, @Param("endDate") String endDate);
    List<Map<String, Object>> selectDailyStockOutCounts(@Param("rootCategoryId") Long rootCategoryId, @Param("startDate") String startDate, @Param("endDate") String endDate);
    BigDecimal selectTotalByDate( @Param("now") LocalDate now);
}
src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
@@ -29,7 +29,7 @@
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    private Long id;
    @ApiModelProperty("入库批次")
    private String outboundBatches;
src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -80,7 +80,7 @@
                    StockInventoryDto stockInRecordDto = new StockInventoryDto();
                    stockInRecordDto.setProductModelId(stockInventory.getProductModelId());
                    stockInRecordDto.setQualitity(stockInRecord.getStockInNum());
                    stockInventoryMapper.updateAddStockInventory(stockInRecordDto);
                    stockInventoryMapper.updateSubtractStockInventory(stockInRecordDto);
                }
            }else if (stockInRecord.getType().equals("1")) {
                StockUninventory stockUninventory = stockUninventoryMapper.selectOne(new LambdaQueryWrapper<StockUninventory>().eq(StockUninventory::getProductModelId, stockInRecord.getProductModelId()));
@@ -90,7 +90,7 @@
                    StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
                    stockUninventoryDto.setProductModelId(stockUninventory.getProductModelId());
                    stockUninventoryDto.setQualitity(stockInRecord.getStockInNum());
                    stockUninventoryMapper.updateAddStockUnInventory(stockUninventoryDto);
                    stockUninventoryMapper.updateSubtractStockUnInventory(stockUninventoryDto);
                }
            }
        }
src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -25,6 +25,7 @@
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@@ -83,7 +84,7 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean subtractStockInventory(StockInventoryDto stockInventoryDto) {
            //  æ–°å¢žå‡ºåº“记录
        //  æ–°å¢žå‡ºåº“记录
        StockOutRecordDto stockOutRecordDto = new StockOutRecordDto();
        stockOutRecordDto.setRecordId(stockInventoryDto.getRecordId());
        stockOutRecordDto.setRecordType(stockInventoryDto.getRecordType());
@@ -92,14 +93,18 @@
        stockOutRecordDto.setType("0");
        stockOutRecordService.add(stockOutRecordDto);
        StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>().lambda().eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId()));
        if (stockInventoryDto.getQualitity().compareTo( oldStockInventory.getQualitity().subtract(oldStockInventory.getLockedQuantity()))>0) {
            throw new RuntimeException("库存不足无法出库");
        }
        if (ObjectUtils.isEmpty(oldStockInventory)) {
            throw new RuntimeException("产品库存不存在");
        }else {
            stockInventoryMapper.updateSubtractStockInventory(stockInventoryDto);
        }
        BigDecimal lockedQty = oldStockInventory.getLockedQuantity();
        if (lockedQty == null) {
            lockedQty = BigDecimal.ZERO;
        }
        if (stockInventoryDto.getQualitity().compareTo(oldStockInventory.getQualitity().subtract(lockedQty)) > 0) {
            throw new RuntimeException("库存不足无法出库");
        }
        stockInventoryMapper.updateSubtractStockInventory(stockInventoryDto);
        return true;
    }
src/main/resources/mapper/home/HomeMapper.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.ruoyi.home.mapper.HomeMapper">
    <select id="productTurnoverDays" resultType="com.ruoyi.dto.MapDto">
        SELECT p.product_name                                                      AS name,
               DATEDIFF(IFNULL(MAX(sor.create_time), NOW()), MAX(sir.create_time)) AS value
        FROM product p
                 JOIN product_model pm ON p.id = pm.product_id
                 JOIN stock_in_record sir ON pm.id = sir.product_model_id
                 LEFT JOIN stock_out_record sor ON pm.id = sor.product_model_id
        GROUP BY p.id, p.product_name
    </select>
</mapper>
src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
@@ -18,8 +18,8 @@
        pl.supplier_name,
        pl.project_name,
        pl.contract_amount,
        sum(tr.invoice_amount)as receipt_payment_amount,
        pl.contract_amount-sum(tr.invoice_amount) AS unReceipt_payment_amount,
        IFNULL(sum(tr.invoice_amount),0) as receipt_payment_amount,
        pl.contract_amount-IFNULL(sum(tr.invoice_amount),0) AS unReceipt_payment_amount,
        pl.entry_date,
        pl.execution_date,
        pl.recorder_id,
src/main/resources/mapper/safe/SafeAccidentMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
<?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.safe.mapper.SafeAccidentMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.safe.pojo.SafeAccident">
        <id column="id" property="id" />
        <result column="accident_code" property="accidentCode" />
        <result column="accident_name" property="accidentName" />
        <result column="accident_type" property="accidentType" />
        <result column="happen_time" property="happenTime" />
        <result column="happen_location" property="happenLocation" />
        <result column="accident_grade" property="accidentGrade" />
        <result column="accident_cause" property="accidentCause" />
        <result column="root_cause" property="rootCause" />
        <result column="person_loss" property="personLoss" />
        <result column="asset_loss" property="assetLoss" />
        <result column="production_loss" property="productionLoss" />
        <result column="handle_measures" property="handleMeasures" />
        <result column="responsible_person" property="responsiblePerson" />
        <result column="remark" property="remark" />
        <result column="create_time" property="createTime" />
        <result column="create_user" property="createUser" />
        <result column="update_time" property="updateTime" />
        <result column="update_user" property="updateUser" />
        <result column="tenant_id" property="tenantId" />
    </resultMap>
    <select id="pageSafeAccident" resultType="com.ruoyi.safe.pojo.SafeAccident">
        select sa.*,
               su.nick_name createUserName,
        from safe_accident sa
        left join sys_user su on sa.create_user = su.user_id
        where 1=1
        <if test="c.accidentCode != null and c.accidentCode != ''">
            and sa.accident_code like concat('%', #{c.accidentCode}, '%')
        </if>
        <if test="c.accidentName != null and c.accidentName != ''">
            and sa.accident_name like concat('%', #{accidentName}, '%')
        </if>
        <if test="c.accidentType != null and c.accidentType != ''">
            and sa.accident_type like concat('%', #{accidentType}, '%')
        </if>
        <if test="c.accidentGrade != null and c.accidentGrade != ''">
            and sa.accident_grade like concat('%', #{accidentGrade}, '%')
        </if>
    </select>
</mapper>
src/main/resources/mapper/safe/SafeCertificationFileMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.safe.mapper.SafeCertificationFileMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.safe.pojo.SafeCertificationFile">
        <id column="id" property="id" />
        <result column="safe_certification_id" property="safeCertificationId" />
        <result column="name" property="name" />
        <result column="url" property="url" />
        <result column="file_size" property="fileSize" />
        <result column="create_time" property="createTime" />
        <result column="create_user" property="createUser" />
        <result column="update_time" property="updateTime" />
        <result column="update_user" property="updateUser" />
        <result column="tenant_id" property="tenantId" />
    </resultMap>
</mapper>
src/main/resources/mapper/safe/SafeCertificationMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
<?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.safe.mapper.SafeCertificationMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.safe.pojo.SafeCertification">
        <id column="id" property="id" />
        <result column="name" property="name" />
        <result column="code" property="code" />
        <result column="type" property="type" />
        <result column="version" property="version" />
        <result column="remark" property="remark" />
        <result column="effective_time" property="effectiveTime" />
        <result column="create_time" property="createTime" />
        <result column="create_user" property="createUser" />
        <result column="update_time" property="updateTime" />
        <result column="update_user" property="updateUser" />
        <result column="tenant_id" property="tenantId" />
    </resultMap>
    <select id="pageSafeCertification" resultType="com.ruoyi.safe.pojo.SafeCertification">
        select sc.*
        from safe_certification sc
        where 1=1
        <if test="c.name != null and c.name != ''">
            and sc.name like concat('%', #{c.name}, '%')
        </if>
        <if test="c.code != null and c.code != ''">
            and sc.code like concat('%', #{c.code}, '%')
        </if>
        <if test="c.type != null and c.type != ''">
            and sc.type like concat('%', #{c.type}, '%')
        </if>
    </select>
</mapper>
src/main/resources/mapper/safe/SafeContingencyPlanMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
<?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.safe.mapper.SafeContingencyPlanMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.safe.pojo.SafeContingencyPlan">
        <id column="id" property="id" />
        <result column="plan_code" property="planCode" />
        <result column="plan_name" property="planName" />
        <result column="plan_type" property="planType" />
        <result column="apply_scope" property="applyScope" />
        <result column="core_responsor_user_id" property="coreResponsorUserId" />
        <result column="exec_steps" property="execSteps" />
        <result column="publish_time" property="publishTime" />
        <result column="remark" property="remark" />
        <result column="create_time" property="createTime" />
        <result column="create_user" property="createUser" />
        <result column="update_time" property="updateTime" />
        <result column="update_user" property="updateUser" />
        <result column="tenant_id" property="tenantId" />
    </resultMap>
    <select id="pageSafeContingencyPlan" resultType="com.ruoyi.safe.pojo.SafeContingencyPlan">
         select scp.*, su.nick_name coreResponsorUserName
        from safe_contingency_plan scp
        left join sys_user su on scp.core_responsor_user_id = su.user_id
        where 1=1
        <if test="c.planCode != null and c.planCode != ''">
            and scp.plan_code like concat('%', #{c.planCode}, '%')
        </if>
        <if test="c.planName != null and c.planName != ''">
            and scp.plan_name like concat('%', #{c.planName}, '%')
        </if>
        <if test="c.planType != null and c.planType != ''">
            and scp.plan_type like concat('%', #{c.planType}, '%')
        </if>
    </select>
</mapper>
src/main/resources/mapper/safe/SafeHazardMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
<?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.safe.mapper.SafeHazardMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.safe.pojo.SafeHazard">
        <id column="id" property="id" />
        <result column="name" property="name" />
        <result column="code" property="code" />
        <result column="type" property="type" />
        <result column="risk_level" property="riskLevel" />
        <result column="location" property="location" />
        <result column="spec_info" property="specInfo" />
        <result column="control_measures" property="controlMeasures" />
        <result column="principal_user_id" property="principalUserId" />
        <result column="principal_mobile" property="principalMobile" />
        <result column="stock_qty" property="stockQty" />
        <result column="remark" property="remark" />
        <result column="create_time" property="createTime" />
        <result column="create_user" property="createUser" />
        <result column="update_time" property="updateTime" />
        <result column="update_user" property="updateUser" />
        <result column="tenant_id" property="tenantId" />
    </resultMap>
    <select id="pageSafeHazard" resultType="com.ruoyi.safe.pojo.SafeHazard">
        select sh.*, su.nick_name principalUser
        from safe_hazard sh
        left join sys_user su on sh.principal_user_id = su.user_id
        where 1=1
        <if test="c.name != null and c.name != ''">
            and sh.name like concat('%', #{c.name}, '%')
        </if>
        <if test="c.code != null and c.code != ''">
            and sh.code like concat('%', #{c.code}, '%')
        </if>
        <if test="c.type != null and c.type != ''">
            and sh.type like concat('%', #{c.type}, '%')
        </if>
        <if test="c.riskLevel != null and c.riskLevel != ''">
            and sh.risk_level like concat('%', #{c.riskLevel}, '%')
        </if>
    </select>
</mapper>
src/main/resources/mapper/safe/SafeHazardRecordMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
<?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.safe.mapper.SafeHazardRecordMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.safe.pojo.SafeHazardRecord">
        <id column="id" property="id" />
        <result column="material_record_code" property="materialRecordCode" />
        <result column="safe_hazard_id" property="safeHazardId" />
        <result column="apply_user_id" property="applyUserId" />
        <result column="apply_time" property="applyTime" />
        <result column="apply_qty" property="applyQty" />
        <result column="apply_purpose" property="applyPurpose" />
        <result column="return_user_id" property="returnUserId" />
        <result column="return_time" property="returnTime" />
        <result column="return_remark" property="returnRemark" />
        <result column="create_time" property="createTime" />
        <result column="create_user" property="createUser" />
        <result column="update_time" property="updateTime" />
        <result column="update_user" property="updateUser" />
        <result column="tenant_id" property="tenantId" />
    </resultMap>
    <select id="pageSafeHazardRecord" resultType="com.ruoyi.safe.dto.SafeHazardRecordDto">
        select shr.*,
               su1.nick_name applyUserName,
               su2.nick_name returnUserName,
               sh.name,
               sh.code,
               sh.type,
               sh.risk_level,
               sh.location
               from safe_hazard_record shr
        left join sys_user su1 on shr.apply_user_id = su1.user_id
        left join sys_user su2 on shr.return_user_id = su2.user_id
        left join safe_hazard sh on shr.safe_hazard_id = sh.id
        where 1=1
        <if test="c.materialRecordCode != null and c.materialRecordCode != ''">
            and shr.material_record_code like concat('%', #{c.materialRecordCode}, '%')
        </if>
         <if test="c.name != null and c.name != ''">
            and sh.name like concat('%', #{c.name}, '%')
        </if>
        <if test="c.code != null and c.code != ''">
            and sh.code like concat('%', #{c.code}, '%')
        </if>
        <if test="c.type != null and c.type != ''">
            and sh.type like concat('%', #{c.type}, '%')
        </if>
        <if test="c.riskLevel != null and c.riskLevel != ''">
            and sh.risk_level like concat('%', #{c.riskLevel}, '%')
        </if>
    </select>
</mapper>
src/main/resources/mapper/safe/SafeHiddenFileMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.safe.mapper.SafeHiddenFileMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.safe.pojo.SafeHiddenFile">
        <id column="id" property="id" />
        <result column="safe_hidden_id" property="safeHiddenId" />
        <result column="name" property="name" />
        <result column="url" property="url" />
        <result column="file_size" property="fileSize" />
        <result column="create_time" property="createTime" />
        <result column="create_user" property="createUser" />
        <result column="update_time" property="updateTime" />
        <result column="update_user" property="updateUser" />
        <result column="tenant_id" property="tenantId" />
    </resultMap>
</mapper>
src/main/resources/mapper/safe/SafeHiddenMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
<?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.safe.mapper.SafeHiddenMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.safe.pojo.SafeHidden">
        <id column="id" property="id" />
        <result column="hidden_code" property="hiddenCode" />
        <result column="type" property="type" />
        <result column="risk_level" property="riskLevel" />
        <result column="location" property="location" />
        <result column="hidden_desc" property="hiddenDesc" />
        <result column="rectify_user_id" property="rectifyUserId" />
        <result column="rectify_user_mobile" property="rectifyUserMobile" />
        <result column="rectify_time" property="rectifyTime" />
        <result column="rectify_measures" property="rectifyMeasures" />
        <result column="rectify_actual_time" property="rectifyActualTime" />
        <result column="verify_user_id" property="verifyUserId" />
        <result column="verify_result" property="verifyResult" />
        <result column="verify_remark" property="verifyRemark" />
        <result column="verify_time" property="verifyTime" />
        <result column="create_time" property="createTime" />
        <result column="create_user" property="createUser" />
        <result column="update_time" property="updateTime" />
        <result column="update_user" property="updateUser" />
        <result column="tenant_id" property="tenantId" />
    </resultMap>
    <select id="pageSafeHidden" resultType="com.ruoyi.safe.dto.SafeHiddenDto">
        select sh.*,
               su1.nick_name createUserName,
               su2.nick_name rectifyUserName,
               su3.nick_name verifyUserName
        from safe_hidden sh
        left join sys_user su1 on sh.create_user = su1.user_id
        left join sys_user su2 on sh.rectify_user_id = su2.user_id
        left join sys_user su3 on sh.verify_user_id = su3.user_id
        where 1=1
        <if test="c.type != null and c.type != ''">
            and sh.type like concat('%', #{c.type}, '%')
        </if>
        <if test="c.riskLevel != null and c.riskLevel != ''">
            and sh.risk_level like concat('%', #{c.riskLevel}, '%')
        </if>
    </select>
</mapper>
src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -147,7 +147,7 @@
                       LEFT JOIN product_structure ps ON pb.id = ps.bom_id
                       LEFT JOIN product_model pm1 ON pm1.id = ps.product_model_id
                       LEFT JOIN product p ON p.id = pm1.product_id
              WHERE sl.id = #{salesLedegerId}) A
               WHERE sl.id = #{salesLedegerId}) A
        group by a.model, a.product_name, a.unit
    </select>
    <select id="selectProduct" resultType="com.ruoyi.sales.pojo.SalesLedgerProduct">
@@ -158,4 +158,46 @@
        from product_model pm
        left join product p on pm.product_id = p.id
    </select>
</mapper>
    <select id="selectProductSalesAnalysis" resultType="java.util.LinkedHashMap">
        SELECT
            product_category as name,
            SUM( tax_inclusive_total_price ) AS value
        FROM
            sales_ledger_product
        WHERE
            type = 1
        GROUP BY
            product_category
        ORDER BY
            value DESC
        LIMIT 5
    </select>
    <select id="selectRawMaterialPurchaseAnalysis" resultType="java.util.LinkedHashMap">
        SELECT
            pr.product_name AS name,
            SUM( slp.tax_inclusive_total_price ) AS value
        FROM
            sales_ledger_product slp
            JOIN product pr ON slp.product_id = pr.id
        WHERE
            slp.type = 2
            AND pr.parent_id = ( SELECT id FROM product WHERE product_name = '原材料' )
        GROUP BY
            pr.id,
            pr.product_name
        ORDER BY
            value DESC
        LIMIT 5
    </select>
    <select id="selectProductCountByTypeAndDate" resultType="int">
        SELECT COUNT(*)
        FROM sales_ledger_product
        WHERE type = #{type}
        AND register_date &gt;= #{startDate}
        AND register_date &lt;= #{endDate}
    </select>
</mapper>
src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -185,8 +185,51 @@
        p.product_name
    </select>
    <select id="selectTotal" resultType="java.math.BigDecimal">
        select ifnull(sum(qualitity), 0)
        from stock_inventory
    </select>
    <select id="selectTotalByDate" resultType="java.math.BigDecimal">
        select sum(qualitity)
        from stock_inventory
        where
           create_time &gt;= #{now} and create_time &lt; DATE_ADD(#{now}, INTERVAL 1 DAY)
    </select>
    <select id="selectStorageProductCountByDate" resultType="int">
        SELECT COUNT(*)
        FROM (SELECT create_time
              FROM stock_inventory
              UNION ALL
              SELECT create_time
              FROM stock_uninventory) combined
        WHERE create_time &gt;= #{startDate}
          AND create_time &lt;= #{endDate}
    </select>
    <select id="selectDailyStockInCounts" resultType="java.util.Map">
        SELECT DATE(sir.create_time) AS date,
               SUM(sir.stock_in_num) AS count
        FROM stock_in_record sir
                 JOIN product_model pm ON sir.product_model_id = pm.id
                 JOIN product p ON pm.product_id = p.id
        WHERE (p.parent_id = #{rootCategoryId} OR p.id = #{rootCategoryId})
          AND sir.create_time &gt;= #{startDate}
          AND sir.create_time &lt;= #{endDate}
        GROUP BY DATE(sir.create_time)
        ORDER BY DATE(sir.create_time) ASC
    </select>
    <select id="selectDailyStockOutCounts" resultType="java.util.Map">
        SELECT DATE(sor.create_time)  AS date,
               SUM(sor.stock_out_num) AS count
        FROM stock_out_record sor
                 JOIN product_model pm ON sor.product_model_id = pm.id
                 JOIN product p ON pm.product_id = p.id
        WHERE (p.parent_id = #{rootCategoryId} OR p.id = #{rootCategoryId})
          AND sor.create_time &gt;= #{startDate}
          AND sor.create_time &lt;= #{endDate}
        GROUP BY DATE(sor.create_time)
        ORDER BY DATE(sor.create_time) ASC
    </select>
</mapper>