重新修改盈亏逻辑
This commit is contained in:
@@ -815,6 +815,7 @@
|
||||
</select>
|
||||
<!-- SysOaProjectMapper.xml -->
|
||||
|
||||
<!-- SysOaProjectMapper.xml -->
|
||||
<select id="selectProfitLossPage" resultType="com.ruoyi.oa.domain.vo.ProjectProfitLossVO">
|
||||
SELECT
|
||||
p.project_id,
|
||||
@@ -824,54 +825,46 @@
|
||||
p.project_status,
|
||||
p.funds AS original_funds,
|
||||
p.remark AS project_remark,
|
||||
COALESCE(wd.total_warehouse_cost, 0) AS warehouse_cost,
|
||||
COALESCE(hr.total_hr_cost, 0) AS hr_cost,
|
||||
COALESCE(finance_details.total_income, 0) AS detail_income,
|
||||
COALESCE(finance_details.total_expenditure, 0) AS total_expenditure,
|
||||
CASE
|
||||
WHEN p.remark LIKE '%美元%' OR p.remark LIKE '%美金%' THEN 1
|
||||
ELSE 0
|
||||
END AS is_usd,
|
||||
-- 核心盈亏计算逻辑
|
||||
(
|
||||
-- 首先计算总收入
|
||||
CASE
|
||||
WHEN p.remark LIKE '%美元%' OR p.remark LIKE '%美金%'
|
||||
THEN p.funds * #{exchangeRate}
|
||||
ELSE p.funds
|
||||
-- 场景1: 如果项目有合同额, 则总收入为合同额 (需考虑汇率)
|
||||
WHEN p.funds IS NOT NULL AND p.funds > 0
|
||||
THEN
|
||||
CASE
|
||||
WHEN p.remark LIKE '%美元%' OR p.remark LIKE '%美金%'
|
||||
THEN p.funds * #{exchangeRate}
|
||||
ELSE p.funds
|
||||
END
|
||||
-- 场景2: 如果项目没有合同额, 则总收入为财务明细中的入账总和
|
||||
ELSE COALESCE(finance_details.total_income, 0)
|
||||
END
|
||||
- COALESCE(wd.total_warehouse_cost, 0)
|
||||
- COALESCE(hr.total_hr_cost, 0)
|
||||
-- 减去总支出
|
||||
- COALESCE(finance_details.total_expenditure, 0)
|
||||
) AS profit_loss
|
||||
FROM
|
||||
sys_oa_project p
|
||||
LEFT JOIN (
|
||||
-- 将财务主表和明细表关联,一次性计算出每个项目的总收入和总支出
|
||||
SELECT
|
||||
project_id,
|
||||
SUM(amount * sign_price) AS total_warehouse_cost
|
||||
f.project_id,
|
||||
SUM(CASE WHEN f.finance_type = '1' THEN d.price ELSE 0 END) AS total_income,
|
||||
SUM(CASE WHEN f.finance_type = '0' THEN d.price ELSE 0 END) AS total_expenditure
|
||||
FROM
|
||||
sys_oa_warehouse_detail
|
||||
WHERE
|
||||
del_flag = 0
|
||||
GROUP BY
|
||||
project_id
|
||||
) wd ON p.project_id = wd.project_id
|
||||
LEFT JOIN (
|
||||
SELECT
|
||||
a.project_id,
|
||||
SUM(
|
||||
CASE
|
||||
-- 当小时数存在时,使用日薪/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
|
||||
sys_oa_finance f
|
||||
JOIN
|
||||
sys_user u ON a.user_id = u.user_id
|
||||
WHERE
|
||||
a.del_flag = 0
|
||||
sys_oa_detail d ON f.finance_id = d.finance_id
|
||||
WHERE f.project_id > 0
|
||||
GROUP BY
|
||||
a.project_id
|
||||
) hr ON p.project_id = hr.project_id
|
||||
f.project_id
|
||||
) AS finance_details ON p.project_id = finance_details.project_id
|
||||
${ew.customSqlSegment}
|
||||
</select>
|
||||
</mapper>
|
||||
|
||||
Reference in New Issue
Block a user