盈亏排序
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
package com.ruoyi.oa.controller;
|
package com.ruoyi.oa.controller;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
@@ -232,14 +233,28 @@ public class SysOaProjectController extends BaseController {
|
|||||||
*/
|
*/
|
||||||
@GetMapping("/projectProfit")
|
@GetMapping("/projectProfit")
|
||||||
public TableDataInfo<ProjectProfitLossVO> projectProfit(
|
public TableDataInfo<ProjectProfitLossVO> 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 = "profit_loss") String sortField,
|
||||||
@RequestParam(required = false, defaultValue = "desc") String sortOrder,
|
@RequestParam(required = false, defaultValue = "desc") String sortOrder,
|
||||||
PageQuery pageQuery
|
PageQuery pageQuery
|
||||||
) {
|
) {
|
||||||
// 这里PageQuery会自动带上orderByColumn和isAsc
|
|
||||||
pageQuery.setOrderByColumn(sortField);
|
pageQuery.setOrderByColumn(sortField);
|
||||||
pageQuery.setIsAsc(sortOrder);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,9 @@ import com.ruoyi.oa.domain.vo.*;
|
|||||||
import com.ruoyi.oa.domain.bo.SysOaProjectBo;
|
import com.ruoyi.oa.domain.bo.SysOaProjectBo;
|
||||||
import com.ruoyi.common.core.page.TableDataInfo;
|
import com.ruoyi.common.core.page.TableDataInfo;
|
||||||
import com.ruoyi.common.core.domain.PageQuery;
|
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.Collection;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -22,7 +24,10 @@ public interface ISysOaProjectService {
|
|||||||
/**
|
/**
|
||||||
* 项目盈亏排序
|
* 项目盈亏排序
|
||||||
*/
|
*/
|
||||||
TableDataInfo<ProjectProfitLossVO> getProjectProfitLossList(String sortField, String sortOrder, PageQuery pageQuery);
|
TableDataInfo<ProjectProfitLossVO> 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);
|
||||||
/**
|
/**
|
||||||
* 查询项目管理
|
* 查询项目管理
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -50,18 +50,43 @@ public class SysOaProjectServiceImpl implements ISysOaProjectService {
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TableDataInfo<ProjectProfitLossVO> getProjectProfitLossList(String sortField, String sortOrder, PageQuery pageQuery) {
|
public TableDataInfo<ProjectProfitLossVO> getProjectProfitLossList(
|
||||||
// 1. 构建分页对象
|
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<ProjectProfitLossVO> page = pageQuery.build();
|
Page<ProjectProfitLossVO> page = pageQuery.build();
|
||||||
|
|
||||||
// 2. 构建查询条件(可根据bo添加筛选)
|
|
||||||
QueryWrapper<SysOaProject> wrapper = new QueryWrapper<>();
|
QueryWrapper<SysOaProject> 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<ProjectProfitLossVO> result = baseMapper.selectProfitLossPage(page, wrapper);
|
Page<ProjectProfitLossVO> result = baseMapper.selectProfitLossPage(page, wrapper);
|
||||||
|
|
||||||
// 4. 返回分页数据
|
|
||||||
return TableDataInfo.build(result);
|
return TableDataInfo.build(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -826,6 +826,7 @@
|
|||||||
(p.funds - COALESCE(wd.total_warehouse_cost, 0) - COALESCE(hr.total_hr_cost, 0)) AS profit_loss
|
(p.funds - COALESCE(wd.total_warehouse_cost, 0) - COALESCE(hr.total_hr_cost, 0)) AS profit_loss
|
||||||
FROM sys_oa_project p
|
FROM sys_oa_project p
|
||||||
LEFT JOIN (
|
LEFT JOIN (
|
||||||
|
-- 物料成本子查询
|
||||||
SELECT
|
SELECT
|
||||||
project_id,
|
project_id,
|
||||||
SUM(amount * sign_price) AS total_warehouse_cost
|
SUM(amount * sign_price) AS total_warehouse_cost
|
||||||
@@ -834,16 +835,19 @@
|
|||||||
GROUP BY project_id
|
GROUP BY project_id
|
||||||
) wd ON p.project_id = wd.project_id
|
) wd ON p.project_id = wd.project_id
|
||||||
LEFT JOIN (
|
LEFT JOIN (
|
||||||
|
-- 人力成本子查询(日薪转小时计算)
|
||||||
SELECT
|
SELECT
|
||||||
a.project_id,
|
a.project_id,
|
||||||
SUM(
|
SUM(
|
||||||
CASE
|
CASE
|
||||||
WHEN a.hour > 0 THEN a.hour * u.labor_cost
|
-- 当小时数存在时,使用日薪/8计算小时薪资
|
||||||
ELSE a.day_length * 8 * u.labor_cost
|
WHEN a.hour > 0 THEN a.hour * (COALESCE(u.labor_cost, 0) DIV 8)
|
||||||
|
-- 当日数存在时,使用日薪×天数
|
||||||
|
ELSE a.day_length * COALESCE(u.labor_cost, 0)
|
||||||
END
|
END
|
||||||
) AS total_hr_cost
|
) AS total_hr_cost
|
||||||
FROM sys_oa_attendance a
|
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
|
WHERE a.del_flag = 0
|
||||||
GROUP BY a.project_id
|
GROUP BY a.project_id
|
||||||
) hr ON p.project_id = hr.project_id
|
) hr ON p.project_id = hr.project_id
|
||||||
|
|||||||
Reference in New Issue
Block a user