From 7a1128f3162ac170492a8cb576139511ce6edc52 Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Fri, 20 Jun 2025 15:45:53 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9B=88=E4=BA=8F=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oa/controller/SysOaProjectController.java | 19 ++++++++- .../oa/service/ISysOaProjectService.java | 7 +++- .../service/impl/SysOaProjectServiceImpl.java | 39 +++++++++++++++---- .../mapper/oa/SysOaProjectMapper.xml | 10 +++-- 4 files changed, 62 insertions(+), 13 deletions(-) diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaProjectController.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaProjectController.java index ef61eda..56911fc 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaProjectController.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaProjectController.java @@ -1,5 +1,6 @@ package com.ruoyi.oa.controller; +import java.math.BigDecimal; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Date; @@ -232,14 +233,28 @@ public class SysOaProjectController extends BaseController { */ @GetMapping("/projectProfit") public TableDataInfo projectProfit( + @RequestParam(required = false) String projectName, + @RequestParam(required = false) String projectNum, + @RequestParam(required = false) String projectStatus, + @RequestParam(required = false) String isDomestic, // 国内外 + @RequestParam(required = false) BigDecimal minContractAmount, + @RequestParam(required = false) BigDecimal maxContractAmount, + @RequestParam(required = false) BigDecimal minProfitLoss, + @RequestParam(required = false) BigDecimal maxProfitLoss, + @RequestParam(required = false) String beginTimeStart, + @RequestParam(required = false) String beginTimeEnd, + @RequestParam(required = false) String profitType, // "profit" 只看盈利, "loss" 只看亏损, null看全部 @RequestParam(required = false, defaultValue = "profit_loss") String sortField, @RequestParam(required = false, defaultValue = "desc") String sortOrder, PageQuery pageQuery ) { - // 这里PageQuery会自动带上orderByColumn和isAsc pageQuery.setOrderByColumn(sortField); pageQuery.setIsAsc(sortOrder); - return iSysOaProjectService.getProjectProfitLossList(sortField, sortOrder, pageQuery); + return iSysOaProjectService.getProjectProfitLossList( + projectName, projectNum, projectStatus, isDomestic, + minContractAmount, maxContractAmount, + minProfitLoss, maxProfitLoss, + beginTimeStart, beginTimeEnd, profitType,sortField, sortOrder, pageQuery); } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaProjectService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaProjectService.java index 7d3e42e..c29f73d 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaProjectService.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaProjectService.java @@ -7,7 +7,9 @@ import com.ruoyi.oa.domain.vo.*; import com.ruoyi.oa.domain.bo.SysOaProjectBo; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.domain.PageQuery; +import org.springframework.web.bind.annotation.RequestParam; +import java.math.BigDecimal; import java.util.Collection; import java.util.Date; import java.util.List; @@ -22,7 +24,10 @@ public interface ISysOaProjectService { /** * 项目盈亏排序 */ - TableDataInfo getProjectProfitLossList(String sortField, String sortOrder, PageQuery pageQuery); + TableDataInfo getProjectProfitLossList(String projectName,String projectNum,String projectStatus,String isDomestic, + BigDecimal minContractAmount,BigDecimal maxContractAmount,BigDecimal minProfitLoss, + BigDecimal maxProfitLoss,String beginTimeStart,String beginTimeEnd,String profitType, + String sortField, String sortOrder, PageQuery pageQuery); /** * 查询项目管理 */ diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaProjectServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaProjectServiceImpl.java index d61f2df..f9e02ed 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaProjectServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaProjectServiceImpl.java @@ -50,18 +50,43 @@ public class SysOaProjectServiceImpl implements ISysOaProjectService { @Override - public TableDataInfo getProjectProfitLossList(String sortField, String sortOrder, PageQuery pageQuery) { - // 1. 构建分页对象 + public TableDataInfo getProjectProfitLossList( + String projectName, String projectNum, String projectStatus, String isDomestic, + BigDecimal minContractAmount, BigDecimal maxContractAmount, + BigDecimal minProfitLoss, BigDecimal maxProfitLoss, + String beginTimeStart, String beginTimeEnd, String profitType, + String sortField, String sortOrder, + PageQuery pageQuery + ) { Page page = pageQuery.build(); - - // 2. 构建查询条件(可根据bo添加筛选) QueryWrapper wrapper = new QueryWrapper<>(); + // 基础条件 + wrapper.like(StringUtils.isNotBlank(projectName), "p.project_name", projectName); + wrapper.like(StringUtils.isNotBlank(projectNum), "p.project_num", projectNum); + wrapper.eq(StringUtils.isNotBlank(projectStatus), "p.project_status", projectStatus); + wrapper.eq(StringUtils.isNotBlank(isDomestic), "p.is_domestic", isDomestic); + wrapper.ge(minContractAmount != null, "p.funds", minContractAmount); + wrapper.le(maxContractAmount != null, "p.funds", maxContractAmount); + wrapper.ge(StringUtils.isNotBlank(beginTimeStart), "p.begin_time", beginTimeStart); + wrapper.le(StringUtils.isNotBlank(beginTimeEnd), "p.begin_time", beginTimeEnd); + + // 盈亏区间 + if (minProfitLoss != null) { + wrapper.apply("p.funds - COALESCE(wd.total_warehouse_cost,0) - COALESCE(hr.total_hr_cost,0) >= {0}", minProfitLoss); + } + if (maxProfitLoss != null) { + wrapper.apply("p.funds - COALESCE(wd.total_warehouse_cost,0) - COALESCE(hr.total_hr_cost,0) <= {0}", maxProfitLoss); + } + + // 盈利/亏损筛选 + if ("profit".equals(profitType)) { + wrapper.apply("p.funds - COALESCE(wd.total_warehouse_cost,0) - COALESCE(hr.total_hr_cost,0) > 0"); + } else if ("loss".equals(profitType)) { + wrapper.apply("p.funds - COALESCE(wd.total_warehouse_cost,0) - COALESCE(hr.total_hr_cost,0) < 0"); + } - // 3. 调用自定义Mapper方法 Page result = baseMapper.selectProfitLossPage(page, wrapper); - - // 4. 返回分页数据 return TableDataInfo.build(result); } diff --git a/ruoyi-oa/src/main/resources/mapper/oa/SysOaProjectMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/SysOaProjectMapper.xml index c3b1ba3..073a5bc 100644 --- a/ruoyi-oa/src/main/resources/mapper/oa/SysOaProjectMapper.xml +++ b/ruoyi-oa/src/main/resources/mapper/oa/SysOaProjectMapper.xml @@ -826,6 +826,7 @@ (p.funds - COALESCE(wd.total_warehouse_cost, 0) - COALESCE(hr.total_hr_cost, 0)) AS profit_loss FROM sys_oa_project p LEFT JOIN ( + -- 物料成本子查询 SELECT project_id, SUM(amount * sign_price) AS total_warehouse_cost @@ -834,16 +835,19 @@ GROUP BY project_id ) wd ON p.project_id = wd.project_id LEFT JOIN ( + -- 人力成本子查询(日薪转小时计算) SELECT a.project_id, SUM( CASE - WHEN a.hour > 0 THEN a.hour * u.labor_cost - ELSE a.day_length * 8 * u.labor_cost + -- 当小时数存在时,使用日薪/8计算小时薪资 + WHEN a.hour > 0 THEN a.hour * (COALESCE(u.labor_cost, 0) DIV 8) + -- 当日数存在时,使用日薪×天数 + ELSE a.day_length * COALESCE(u.labor_cost, 0) END ) AS total_hr_cost FROM sys_oa_attendance a - JOIN sys_user u ON a.user_id = u.user_id + LEFT JOIN sys_user u ON a.user_id = u.user_id WHERE a.del_flag = 0 GROUP BY a.project_id ) hr ON p.project_id = hr.project_id