修正双员工夫妻家庭专项核查口径
This commit is contained in:
@@ -82,7 +82,7 @@
|
|||||||
<result property="spouseTotalAsset" column="asset_spouse_total_asset"/>
|
<result property="spouseTotalAsset" column="asset_spouse_total_asset"/>
|
||||||
<result property="totalAsset" column="asset_total_asset"/>
|
<result property="totalAsset" column="asset_total_asset"/>
|
||||||
<collection property="items"
|
<collection property="items"
|
||||||
column="{projectId=project_id,staffIdCard=staff_id_card,spouseIdCard=spouse_id_card}"
|
column="{projectId=project_id,staffIdCard=staff_id_card,spouseIdCard=spouse_id_card,spouseIsStaff=spouse_is_staff}"
|
||||||
ofType="com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetItemVO"
|
ofType="com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetItemVO"
|
||||||
select="selectFamilyAssetItemsByScope"/>
|
select="selectFamilyAssetItemsByScope"/>
|
||||||
</association>
|
</association>
|
||||||
@@ -93,7 +93,7 @@
|
|||||||
<result property="spouseTotalDebt" column="debt_spouse_total_debt"/>
|
<result property="spouseTotalDebt" column="debt_spouse_total_debt"/>
|
||||||
<result property="totalDebt" column="debt_total_debt"/>
|
<result property="totalDebt" column="debt_total_debt"/>
|
||||||
<collection property="items"
|
<collection property="items"
|
||||||
column="{projectId=project_id,staffIdCard=staff_id_card,spouseIdCard=spouse_id_card}"
|
column="{projectId=project_id,staffIdCard=staff_id_card,spouseIdCard=spouse_id_card,spouseIsStaff=spouse_is_staff}"
|
||||||
ofType="com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyDebtItemVO"
|
ofType="com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyDebtItemVO"
|
||||||
select="selectFamilyDebtItemsByScope"/>
|
select="selectFamilyDebtItemsByScope"/>
|
||||||
</association>
|
</association>
|
||||||
@@ -144,15 +144,39 @@
|
|||||||
|
|
||||||
<sql id="spouseRelationSql">
|
<sql id="spouseRelationSql">
|
||||||
select
|
select
|
||||||
person_id,
|
relation_pair.person_id,
|
||||||
max(relation_name) as spouse_name,
|
max(relation_pair.spouse_name) as spouse_name,
|
||||||
min(relation_cert_no) as spouse_id_card,
|
min(relation_pair.spouse_id_card) as spouse_id_card,
|
||||||
max(annual_income) as spouse_income
|
max(coalesce(spouse_staff.annual_income, relation_pair.spouse_relation_income, 0)) as spouse_income,
|
||||||
from ccdi_staff_fmy_relation
|
max(case when spouse_staff.id_card is not null then 1 else 0 end) as spouse_is_staff
|
||||||
where status = 1
|
from (
|
||||||
and is_emp_family = 1
|
select
|
||||||
and relation_type = '配偶'
|
relation.person_id,
|
||||||
group by person_id
|
relation.relation_name as spouse_name,
|
||||||
|
relation.relation_cert_no as spouse_id_card,
|
||||||
|
relation.annual_income as spouse_relation_income
|
||||||
|
from ccdi_staff_fmy_relation relation
|
||||||
|
where relation.status = 1
|
||||||
|
and relation.is_emp_family = 1
|
||||||
|
and relation.relation_type = '配偶'
|
||||||
|
union all
|
||||||
|
select
|
||||||
|
relation.relation_cert_no as person_id,
|
||||||
|
base_staff.name as spouse_name,
|
||||||
|
relation.person_id as spouse_id_card,
|
||||||
|
null as spouse_relation_income
|
||||||
|
from ccdi_staff_fmy_relation relation
|
||||||
|
inner join ccdi_base_staff current_staff
|
||||||
|
on current_staff.id_card = relation.relation_cert_no
|
||||||
|
left join ccdi_base_staff base_staff
|
||||||
|
on base_staff.id_card = relation.person_id
|
||||||
|
where relation.status = 1
|
||||||
|
and relation.is_emp_family = 1
|
||||||
|
and relation.relation_type = '配偶'
|
||||||
|
) relation_pair
|
||||||
|
left join ccdi_base_staff spouse_staff
|
||||||
|
on spouse_staff.id_card = relation_pair.spouse_id_card
|
||||||
|
group by relation_pair.person_id
|
||||||
</sql>
|
</sql>
|
||||||
|
|
||||||
<select id="selectFamilyAssetLiabilityList" resultMap="FamilyAssetLiabilityListItemResultMap">
|
<select id="selectFamilyAssetLiabilityList" resultMap="FamilyAssetLiabilityListItemResultMap">
|
||||||
@@ -166,14 +190,14 @@
|
|||||||
aggregated.total_debt,
|
aggregated.total_debt,
|
||||||
aggregated.comparison_amount,
|
aggregated.comparison_amount,
|
||||||
case
|
case
|
||||||
when aggregated.self_asset_record_count = 0 or aggregated.self_debt_record_count = 0 then 'MISSING_INFO'
|
when aggregated.missing_asset_info = 1 or aggregated.missing_debt_info = 1 then 'MISSING_INFO'
|
||||||
when comparison_amount <= total_asset * 1.5 then 'NORMAL'
|
when comparison_amount <= total_asset * 1.5 then 'NORMAL'
|
||||||
when comparison_amount > total_asset * 1.5 and comparison_amount <= total_asset * 3 then 'RISK'
|
when comparison_amount > total_asset * 1.5 and comparison_amount <= total_asset * 3 then 'RISK'
|
||||||
when comparison_amount > total_asset * 3 then 'HIGH'
|
when comparison_amount > total_asset * 3 then 'HIGH'
|
||||||
else 'HIGH'
|
else 'HIGH'
|
||||||
end as risk_level_code,
|
end as risk_level_code,
|
||||||
case
|
case
|
||||||
when aggregated.self_asset_record_count = 0 or aggregated.self_debt_record_count = 0 then '缺少信息'
|
when aggregated.missing_asset_info = 1 or aggregated.missing_debt_info = 1 then '缺少信息'
|
||||||
when comparison_amount <= total_asset * 1.5 then '正常'
|
when comparison_amount <= total_asset * 1.5 then '正常'
|
||||||
when comparison_amount > total_asset * 1.5 and comparison_amount <= total_asset * 3 then '存在风险'
|
when comparison_amount > total_asset * 1.5 and comparison_amount <= total_asset * 3 then '存在风险'
|
||||||
when comparison_amount > total_asset * 3 then '高风险'
|
when comparison_amount > total_asset * 3 then '高风险'
|
||||||
@@ -181,122 +205,106 @@
|
|||||||
end as risk_level_name
|
end as risk_level_name
|
||||||
from (
|
from (
|
||||||
select
|
select
|
||||||
scope.staff_id_card,
|
source.*,
|
||||||
scope.staff_code,
|
|
||||||
scope.staff_name,
|
|
||||||
scope.dept_name,
|
|
||||||
coalesce(base_staff.annual_income, 0) + coalesce(spouse.spouse_income, 0) as total_income,
|
|
||||||
coalesce((
|
|
||||||
select count(1)
|
|
||||||
from ccdi_asset_info asset
|
|
||||||
where asset.family_id = scope.staff_id_card
|
|
||||||
and asset.person_id = scope.staff_id_card
|
|
||||||
), 0) as self_asset_record_count,
|
|
||||||
coalesce((
|
|
||||||
select count(1)
|
|
||||||
from ccdi_debts_info debt
|
|
||||||
where debt.person_id = scope.staff_id_card
|
|
||||||
), 0) as self_debt_record_count,
|
|
||||||
coalesce((
|
|
||||||
select sum(coalesce(asset.current_value, 0))
|
|
||||||
from ccdi_asset_info asset
|
|
||||||
where asset.family_id = scope.staff_id_card
|
|
||||||
and (
|
|
||||||
asset.person_id = scope.staff_id_card
|
|
||||||
or (spouse.spouse_id_card is not null and asset.person_id = spouse.spouse_id_card)
|
|
||||||
)
|
|
||||||
), 0) as total_asset,
|
|
||||||
coalesce((
|
|
||||||
select sum(coalesce(debt.principal_balance, 0))
|
|
||||||
from ccdi_debts_info debt
|
|
||||||
where debt.person_id = scope.staff_id_card
|
|
||||||
or (spouse.spouse_id_card is not null and debt.person_id = spouse.spouse_id_card)
|
|
||||||
), 0) as total_debt,
|
|
||||||
coalesce(base_staff.annual_income, 0)
|
|
||||||
+ coalesce(spouse.spouse_income, 0)
|
|
||||||
+ coalesce((
|
|
||||||
select sum(coalesce(debt.principal_balance, 0))
|
|
||||||
from ccdi_debts_info debt
|
|
||||||
where debt.person_id = scope.staff_id_card
|
|
||||||
or (spouse.spouse_id_card is not null and debt.person_id = spouse.spouse_id_card)
|
|
||||||
), 0) as comparison_amount,
|
|
||||||
case
|
case
|
||||||
when coalesce((
|
when source.self_asset_record_count = 0
|
||||||
|
or source.spouse_staff_asset_record_count = 0 then 1
|
||||||
|
else 0
|
||||||
|
end as missing_asset_info,
|
||||||
|
case
|
||||||
|
when source.self_debt_record_count = 0
|
||||||
|
or source.spouse_staff_debt_record_count = 0 then 1
|
||||||
|
else 0
|
||||||
|
end as missing_debt_info,
|
||||||
|
case
|
||||||
|
when source.self_asset_record_count = 0
|
||||||
|
or source.spouse_staff_asset_record_count = 0
|
||||||
|
or source.self_debt_record_count = 0
|
||||||
|
or source.spouse_staff_debt_record_count = 0 then 4
|
||||||
|
when source.comparison_amount <= source.total_asset * 1.5 then 1
|
||||||
|
when source.comparison_amount <= source.total_asset * 3 then 2
|
||||||
|
when source.comparison_amount > source.total_asset * 3 then 3
|
||||||
|
else 3
|
||||||
|
end as risk_level_sort
|
||||||
|
from (
|
||||||
|
select
|
||||||
|
scope.staff_id_card,
|
||||||
|
scope.staff_code,
|
||||||
|
scope.staff_name,
|
||||||
|
scope.dept_name,
|
||||||
|
coalesce(base_staff.annual_income, 0) + coalesce(spouse.spouse_income, 0) as total_income,
|
||||||
|
coalesce((
|
||||||
select count(1)
|
select count(1)
|
||||||
from ccdi_asset_info asset
|
from ccdi_asset_info asset
|
||||||
where asset.family_id = scope.staff_id_card
|
where asset.family_id = scope.staff_id_card
|
||||||
and asset.person_id = scope.staff_id_card
|
and asset.person_id = scope.staff_id_card
|
||||||
), 0) = 0
|
), 0) as self_asset_record_count,
|
||||||
or coalesce((
|
case
|
||||||
|
when spouse.spouse_is_staff = 1 then coalesce((
|
||||||
|
select count(1)
|
||||||
|
from ccdi_asset_info asset
|
||||||
|
where asset.family_id = spouse.spouse_id_card
|
||||||
|
and asset.person_id = spouse.spouse_id_card
|
||||||
|
), 0)
|
||||||
|
else 1
|
||||||
|
end as spouse_staff_asset_record_count,
|
||||||
|
coalesce((
|
||||||
|
select count(1)
|
||||||
|
from ccdi_debts_info debt
|
||||||
|
where debt.person_id = scope.staff_id_card
|
||||||
|
), 0) as self_debt_record_count,
|
||||||
|
case
|
||||||
|
when spouse.spouse_is_staff = 1 then coalesce((
|
||||||
select count(1)
|
select count(1)
|
||||||
from ccdi_debts_info debt
|
from ccdi_debts_info debt
|
||||||
where debt.person_id = scope.staff_id_card
|
where debt.person_id = spouse.spouse_id_card
|
||||||
), 0) = 0 then 4
|
), 0)
|
||||||
when (
|
else 1
|
||||||
coalesce(base_staff.annual_income, 0)
|
end as spouse_staff_debt_record_count,
|
||||||
|
coalesce((
|
||||||
|
select sum(coalesce(asset.current_value, 0))
|
||||||
|
from ccdi_asset_info asset
|
||||||
|
where (asset.family_id = scope.staff_id_card and asset.person_id = scope.staff_id_card)
|
||||||
|
or (
|
||||||
|
spouse.spouse_id_card is not null
|
||||||
|
and (
|
||||||
|
(
|
||||||
|
spouse.spouse_is_staff = 1
|
||||||
|
and asset.family_id = spouse.spouse_id_card
|
||||||
|
and asset.person_id = spouse.spouse_id_card
|
||||||
|
)
|
||||||
|
or (
|
||||||
|
(spouse.spouse_is_staff is null or spouse.spouse_is_staff != 1)
|
||||||
|
and asset.family_id = scope.staff_id_card
|
||||||
|
and asset.person_id = spouse.spouse_id_card
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
), 0) as total_asset,
|
||||||
|
coalesce((
|
||||||
|
select sum(coalesce(debt.principal_balance, 0))
|
||||||
|
from ccdi_debts_info debt
|
||||||
|
where debt.person_id = scope.staff_id_card
|
||||||
|
or (spouse.spouse_id_card is not null and debt.person_id = spouse.spouse_id_card)
|
||||||
|
), 0) as total_debt,
|
||||||
|
coalesce(base_staff.annual_income, 0)
|
||||||
+ coalesce(spouse.spouse_income, 0)
|
+ coalesce(spouse.spouse_income, 0)
|
||||||
+ coalesce((
|
+ coalesce((
|
||||||
select sum(coalesce(debt.principal_balance, 0))
|
select sum(coalesce(debt.principal_balance, 0))
|
||||||
from ccdi_debts_info debt
|
from ccdi_debts_info debt
|
||||||
where debt.person_id = scope.staff_id_card
|
where debt.person_id = scope.staff_id_card
|
||||||
or (spouse.spouse_id_card is not null and debt.person_id = spouse.spouse_id_card)
|
or (spouse.spouse_id_card is not null and debt.person_id = spouse.spouse_id_card)
|
||||||
), 0)
|
), 0) as comparison_amount
|
||||||
) <= coalesce((
|
from (
|
||||||
select sum(coalesce(asset.current_value, 0))
|
<include refid="projectEmployeeScopeSql"/>
|
||||||
from ccdi_asset_info asset
|
) scope
|
||||||
where asset.family_id = scope.staff_id_card
|
left join ccdi_base_staff base_staff
|
||||||
and (
|
on base_staff.id_card = scope.staff_id_card
|
||||||
asset.person_id = scope.staff_id_card
|
left join (
|
||||||
or (spouse.spouse_id_card is not null and asset.person_id = spouse.spouse_id_card)
|
<include refid="spouseRelationSql"/>
|
||||||
)
|
) spouse
|
||||||
), 0) * 1.5 then 1
|
on spouse.person_id = scope.staff_id_card
|
||||||
when (
|
) source
|
||||||
coalesce(base_staff.annual_income, 0)
|
|
||||||
+ coalesce(spouse.spouse_income, 0)
|
|
||||||
+ coalesce((
|
|
||||||
select sum(coalesce(debt.principal_balance, 0))
|
|
||||||
from ccdi_debts_info debt
|
|
||||||
where debt.person_id = scope.staff_id_card
|
|
||||||
or (spouse.spouse_id_card is not null and debt.person_id = spouse.spouse_id_card)
|
|
||||||
), 0)
|
|
||||||
) <= coalesce((
|
|
||||||
select sum(coalesce(asset.current_value, 0))
|
|
||||||
from ccdi_asset_info asset
|
|
||||||
where asset.family_id = scope.staff_id_card
|
|
||||||
and (
|
|
||||||
asset.person_id = scope.staff_id_card
|
|
||||||
or (spouse.spouse_id_card is not null and asset.person_id = spouse.spouse_id_card)
|
|
||||||
)
|
|
||||||
), 0) * 3 then 2
|
|
||||||
when (
|
|
||||||
coalesce(base_staff.annual_income, 0)
|
|
||||||
+ coalesce(spouse.spouse_income, 0)
|
|
||||||
+ coalesce((
|
|
||||||
select sum(coalesce(debt.principal_balance, 0))
|
|
||||||
from ccdi_debts_info debt
|
|
||||||
where debt.person_id = scope.staff_id_card
|
|
||||||
or (spouse.spouse_id_card is not null and debt.person_id = spouse.spouse_id_card)
|
|
||||||
), 0)
|
|
||||||
) > coalesce((
|
|
||||||
select sum(coalesce(asset.current_value, 0))
|
|
||||||
from ccdi_asset_info asset
|
|
||||||
where asset.family_id = scope.staff_id_card
|
|
||||||
and (
|
|
||||||
asset.person_id = scope.staff_id_card
|
|
||||||
or (spouse.spouse_id_card is not null and asset.person_id = spouse.spouse_id_card)
|
|
||||||
)
|
|
||||||
), 0) * 3 then 3
|
|
||||||
else 3
|
|
||||||
end as risk_level_sort
|
|
||||||
from (
|
|
||||||
<include refid="projectEmployeeScopeSql"/>
|
|
||||||
) scope
|
|
||||||
left join ccdi_base_staff base_staff
|
|
||||||
on base_staff.id_card = scope.staff_id_card
|
|
||||||
left join (
|
|
||||||
<include refid="spouseRelationSql"/>
|
|
||||||
) spouse
|
|
||||||
on spouse.person_id = scope.staff_id_card
|
|
||||||
) aggregated
|
) aggregated
|
||||||
order by risk_level_sort desc, comparison_amount desc, staff_name asc
|
order by risk_level_sort desc, comparison_amount desc, staff_name asc
|
||||||
</select>
|
</select>
|
||||||
@@ -306,6 +314,7 @@
|
|||||||
aggregated.project_id,
|
aggregated.project_id,
|
||||||
aggregated.staff_id_card,
|
aggregated.staff_id_card,
|
||||||
aggregated.spouse_id_card,
|
aggregated.spouse_id_card,
|
||||||
|
aggregated.spouse_is_staff,
|
||||||
aggregated.staff_code,
|
aggregated.staff_code,
|
||||||
aggregated.staff_name,
|
aggregated.staff_name,
|
||||||
aggregated.dept_name,
|
aggregated.dept_name,
|
||||||
@@ -344,89 +353,136 @@
|
|||||||
end as summary_risk_level_name
|
end as summary_risk_level_name
|
||||||
from (
|
from (
|
||||||
select
|
select
|
||||||
#{projectId} as project_id,
|
source.*,
|
||||||
scope.staff_id_card,
|
|
||||||
scope.staff_code,
|
|
||||||
scope.staff_name,
|
|
||||||
scope.dept_name,
|
|
||||||
spouse.spouse_id_card,
|
|
||||||
coalesce(base_staff.annual_income, 0) as self_income,
|
|
||||||
coalesce(spouse.spouse_income, 0) as spouse_income,
|
|
||||||
coalesce(base_staff.annual_income, 0) + coalesce(spouse.spouse_income, 0) as total_income,
|
|
||||||
case
|
case
|
||||||
when coalesce((
|
when source.self_asset_record_count = 0
|
||||||
|
or source.spouse_staff_asset_record_count = 0 then 1
|
||||||
|
else 0
|
||||||
|
end as missing_self_asset_info,
|
||||||
|
case
|
||||||
|
when source.self_debt_record_count = 0
|
||||||
|
or source.spouse_staff_debt_record_count = 0 then 1
|
||||||
|
else 0
|
||||||
|
end as missing_self_debt_info
|
||||||
|
from (
|
||||||
|
select
|
||||||
|
#{projectId} as project_id,
|
||||||
|
scope.staff_id_card,
|
||||||
|
scope.staff_code,
|
||||||
|
scope.staff_name,
|
||||||
|
scope.dept_name,
|
||||||
|
spouse.spouse_id_card,
|
||||||
|
spouse.spouse_is_staff,
|
||||||
|
coalesce(base_staff.annual_income, 0) as self_income,
|
||||||
|
coalesce(spouse.spouse_income, 0) as spouse_income,
|
||||||
|
coalesce(base_staff.annual_income, 0) + coalesce(spouse.spouse_income, 0) as total_income,
|
||||||
|
coalesce((
|
||||||
select count(1)
|
select count(1)
|
||||||
from ccdi_asset_info asset
|
from ccdi_asset_info asset
|
||||||
where asset.family_id = scope.staff_id_card
|
where asset.family_id = scope.staff_id_card
|
||||||
and asset.person_id = scope.staff_id_card
|
and asset.person_id = scope.staff_id_card
|
||||||
), 0) = 0 then 1
|
), 0) as self_asset_record_count,
|
||||||
else 0
|
case
|
||||||
end as missing_self_asset_info,
|
when spouse.spouse_is_staff = 1 then coalesce((
|
||||||
coalesce((
|
select count(1)
|
||||||
select sum(coalesce(asset.current_value, 0))
|
from ccdi_asset_info asset
|
||||||
from ccdi_asset_info asset
|
where asset.family_id = spouse.spouse_id_card
|
||||||
where asset.family_id = scope.staff_id_card
|
and asset.person_id = spouse.spouse_id_card
|
||||||
and asset.person_id = scope.staff_id_card
|
), 0)
|
||||||
), 0) as self_total_asset,
|
else 1
|
||||||
coalesce((
|
end as spouse_staff_asset_record_count,
|
||||||
select sum(coalesce(asset.current_value, 0))
|
coalesce((
|
||||||
from ccdi_asset_info asset
|
select sum(coalesce(asset.current_value, 0))
|
||||||
where asset.family_id = scope.staff_id_card
|
from ccdi_asset_info asset
|
||||||
and spouse.spouse_id_card is not null
|
where asset.family_id = scope.staff_id_card
|
||||||
and asset.person_id = spouse.spouse_id_card
|
and asset.person_id = scope.staff_id_card
|
||||||
), 0) as spouse_total_asset,
|
), 0) as self_total_asset,
|
||||||
coalesce((
|
coalesce((
|
||||||
select sum(coalesce(asset.current_value, 0))
|
select sum(coalesce(asset.current_value, 0))
|
||||||
from ccdi_asset_info asset
|
from ccdi_asset_info asset
|
||||||
where asset.family_id = scope.staff_id_card
|
where spouse.spouse_id_card is not null
|
||||||
and (
|
and (
|
||||||
asset.person_id = scope.staff_id_card
|
(
|
||||||
or (spouse.spouse_id_card is not null and asset.person_id = spouse.spouse_id_card)
|
spouse.spouse_is_staff = 1
|
||||||
)
|
and asset.family_id = spouse.spouse_id_card
|
||||||
), 0) as total_asset,
|
and asset.person_id = spouse.spouse_id_card
|
||||||
case
|
)
|
||||||
when coalesce((
|
or (
|
||||||
|
(spouse.spouse_is_staff is null or spouse.spouse_is_staff != 1)
|
||||||
|
and asset.family_id = scope.staff_id_card
|
||||||
|
and asset.person_id = spouse.spouse_id_card
|
||||||
|
)
|
||||||
|
)
|
||||||
|
), 0) as spouse_total_asset,
|
||||||
|
coalesce((
|
||||||
|
select sum(coalesce(asset.current_value, 0))
|
||||||
|
from ccdi_asset_info asset
|
||||||
|
where (asset.family_id = scope.staff_id_card and asset.person_id = scope.staff_id_card)
|
||||||
|
or (
|
||||||
|
spouse.spouse_id_card is not null
|
||||||
|
and (
|
||||||
|
(
|
||||||
|
spouse.spouse_is_staff = 1
|
||||||
|
and asset.family_id = spouse.spouse_id_card
|
||||||
|
and asset.person_id = spouse.spouse_id_card
|
||||||
|
)
|
||||||
|
or (
|
||||||
|
(spouse.spouse_is_staff is null or spouse.spouse_is_staff != 1)
|
||||||
|
and asset.family_id = scope.staff_id_card
|
||||||
|
and asset.person_id = spouse.spouse_id_card
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
), 0) as total_asset,
|
||||||
|
coalesce((
|
||||||
select count(1)
|
select count(1)
|
||||||
from ccdi_debts_info debt
|
from ccdi_debts_info debt
|
||||||
where debt.person_id = scope.staff_id_card
|
where debt.person_id = scope.staff_id_card
|
||||||
), 0) = 0 then 1
|
), 0) as self_debt_record_count,
|
||||||
else 0
|
case
|
||||||
end as missing_self_debt_info,
|
when spouse.spouse_is_staff = 1 then coalesce((
|
||||||
coalesce((
|
select count(1)
|
||||||
select sum(coalesce(debt.principal_balance, 0))
|
from ccdi_debts_info debt
|
||||||
from ccdi_debts_info debt
|
where debt.person_id = spouse.spouse_id_card
|
||||||
where debt.person_id = scope.staff_id_card
|
), 0)
|
||||||
), 0) as self_total_debt,
|
else 1
|
||||||
coalesce((
|
end as spouse_staff_debt_record_count,
|
||||||
select sum(coalesce(debt.principal_balance, 0))
|
coalesce((
|
||||||
from ccdi_debts_info debt
|
select sum(coalesce(debt.principal_balance, 0))
|
||||||
where spouse.spouse_id_card is not null
|
from ccdi_debts_info debt
|
||||||
and debt.person_id = spouse.spouse_id_card
|
where debt.person_id = scope.staff_id_card
|
||||||
), 0) as spouse_total_debt,
|
), 0) as self_total_debt,
|
||||||
coalesce((
|
coalesce((
|
||||||
select sum(coalesce(debt.principal_balance, 0))
|
select sum(coalesce(debt.principal_balance, 0))
|
||||||
from ccdi_debts_info debt
|
from ccdi_debts_info debt
|
||||||
where debt.person_id = scope.staff_id_card
|
where spouse.spouse_id_card is not null
|
||||||
or (spouse.spouse_id_card is not null and debt.person_id = spouse.spouse_id_card)
|
and debt.person_id = spouse.spouse_id_card
|
||||||
), 0) as total_debt,
|
), 0) as spouse_total_debt,
|
||||||
coalesce(base_staff.annual_income, 0)
|
coalesce((
|
||||||
+ coalesce(spouse.spouse_income, 0)
|
|
||||||
+ coalesce((
|
|
||||||
select sum(coalesce(debt.principal_balance, 0))
|
select sum(coalesce(debt.principal_balance, 0))
|
||||||
from ccdi_debts_info debt
|
from ccdi_debts_info debt
|
||||||
where debt.person_id = scope.staff_id_card
|
where debt.person_id = scope.staff_id_card
|
||||||
or (spouse.spouse_id_card is not null and debt.person_id = spouse.spouse_id_card)
|
or (spouse.spouse_id_card is not null and debt.person_id = spouse.spouse_id_card)
|
||||||
), 0) as comparison_amount
|
), 0) as total_debt,
|
||||||
from (
|
coalesce(base_staff.annual_income, 0)
|
||||||
<include refid="projectEmployeeScopeSql"/>
|
+ coalesce(spouse.spouse_income, 0)
|
||||||
) scope
|
+ coalesce((
|
||||||
left join ccdi_base_staff base_staff
|
select sum(coalesce(debt.principal_balance, 0))
|
||||||
on base_staff.id_card = scope.staff_id_card
|
from ccdi_debts_info debt
|
||||||
left join (
|
where debt.person_id = scope.staff_id_card
|
||||||
<include refid="spouseRelationSql"/>
|
or (spouse.spouse_id_card is not null and debt.person_id = spouse.spouse_id_card)
|
||||||
) spouse
|
), 0) as comparison_amount
|
||||||
on spouse.person_id = scope.staff_id_card
|
from (
|
||||||
where scope.staff_id_card = #{staffIdCard}
|
<include refid="projectEmployeeScopeSql"/>
|
||||||
|
) scope
|
||||||
|
left join ccdi_base_staff base_staff
|
||||||
|
on base_staff.id_card = scope.staff_id_card
|
||||||
|
left join (
|
||||||
|
<include refid="spouseRelationSql"/>
|
||||||
|
) spouse
|
||||||
|
on spouse.person_id = scope.staff_id_card
|
||||||
|
where scope.staff_id_card = #{staffIdCard}
|
||||||
|
) source
|
||||||
) aggregated
|
) aggregated
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
@@ -437,7 +493,15 @@
|
|||||||
asset.asset_sub_type,
|
asset.asset_sub_type,
|
||||||
case
|
case
|
||||||
when asset.person_id = #{staffIdCard} then base_staff.name
|
when asset.person_id = #{staffIdCard} then base_staff.name
|
||||||
else spouse.relation_name
|
else coalesce(holder_staff.name, (
|
||||||
|
select max(relation.relation_name)
|
||||||
|
from ccdi_staff_fmy_relation relation
|
||||||
|
where relation.person_id = #{staffIdCard}
|
||||||
|
and relation.relation_cert_no = asset.person_id
|
||||||
|
and relation.status = 1
|
||||||
|
and relation.is_emp_family = 1
|
||||||
|
and relation.relation_type = '配偶'
|
||||||
|
))
|
||||||
end as holder_name,
|
end as holder_name,
|
||||||
asset.person_id as holder_id_card,
|
asset.person_id as holder_id_card,
|
||||||
asset.current_value,
|
asset.current_value,
|
||||||
@@ -445,16 +509,24 @@
|
|||||||
from ccdi_asset_info asset
|
from ccdi_asset_info asset
|
||||||
left join ccdi_base_staff base_staff
|
left join ccdi_base_staff base_staff
|
||||||
on base_staff.id_card = #{staffIdCard}
|
on base_staff.id_card = #{staffIdCard}
|
||||||
left join ccdi_staff_fmy_relation spouse
|
left join ccdi_base_staff holder_staff
|
||||||
on spouse.person_id = #{staffIdCard}
|
on holder_staff.id_card = asset.person_id
|
||||||
and spouse.status = 1
|
where (asset.family_id = #{staffIdCard} and asset.person_id = #{staffIdCard})
|
||||||
and spouse.relation_type = '配偶'
|
or (
|
||||||
and spouse.relation_cert_no = asset.person_id
|
#{spouseIdCard} is not null
|
||||||
where asset.family_id = #{staffIdCard}
|
and (
|
||||||
and (
|
(
|
||||||
asset.person_id = #{staffIdCard}
|
#{spouseIsStaff} = 1
|
||||||
or (#{spouseIdCard} is not null and asset.person_id = #{spouseIdCard})
|
and asset.family_id = #{spouseIdCard}
|
||||||
)
|
and asset.person_id = #{spouseIdCard}
|
||||||
|
)
|
||||||
|
or (
|
||||||
|
(#{spouseIsStaff} is null or #{spouseIsStaff} != 1)
|
||||||
|
and asset.family_id = #{staffIdCard}
|
||||||
|
and asset.person_id = #{spouseIdCard}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
order by
|
order by
|
||||||
case when asset.person_id = #{staffIdCard} then 1 else 2 end,
|
case when asset.person_id = #{staffIdCard} then 1 else 2 end,
|
||||||
asset.valuation_date desc,
|
asset.valuation_date desc,
|
||||||
@@ -469,7 +541,15 @@
|
|||||||
debt.creditor_type,
|
debt.creditor_type,
|
||||||
case
|
case
|
||||||
when debt.person_id = #{staffIdCard} then base_staff.name
|
when debt.person_id = #{staffIdCard} then base_staff.name
|
||||||
else spouse.relation_name
|
else coalesce(owner_staff.name, (
|
||||||
|
select max(relation.relation_name)
|
||||||
|
from ccdi_staff_fmy_relation relation
|
||||||
|
where relation.person_id = #{staffIdCard}
|
||||||
|
and relation.relation_cert_no = debt.person_id
|
||||||
|
and relation.status = 1
|
||||||
|
and relation.is_emp_family = 1
|
||||||
|
and relation.relation_type = '配偶'
|
||||||
|
))
|
||||||
end as owner_name,
|
end as owner_name,
|
||||||
debt.person_id as owner_id_card,
|
debt.person_id as owner_id_card,
|
||||||
debt.principal_balance,
|
debt.principal_balance,
|
||||||
@@ -477,11 +557,8 @@
|
|||||||
from ccdi_debts_info debt
|
from ccdi_debts_info debt
|
||||||
left join ccdi_base_staff base_staff
|
left join ccdi_base_staff base_staff
|
||||||
on base_staff.id_card = #{staffIdCard}
|
on base_staff.id_card = #{staffIdCard}
|
||||||
left join ccdi_staff_fmy_relation spouse
|
left join ccdi_base_staff owner_staff
|
||||||
on spouse.person_id = #{staffIdCard}
|
on owner_staff.id_card = debt.person_id
|
||||||
and spouse.status = 1
|
|
||||||
and spouse.relation_type = '配偶'
|
|
||||||
and spouse.relation_cert_no = debt.person_id
|
|
||||||
where debt.person_id = #{staffIdCard}
|
where debt.person_id = #{staffIdCard}
|
||||||
or (#{spouseIdCard} is not null and debt.person_id = #{spouseIdCard})
|
or (#{spouseIdCard} is not null and debt.person_id = #{spouseIdCard})
|
||||||
order by
|
order by
|
||||||
|
|||||||
@@ -17,6 +17,13 @@ class CcdiProjectSpecialCheckMapperDetailSqlTest {
|
|||||||
assertTrue(xml.contains("select id=\"selectFamilyAssetItemsByScope\""));
|
assertTrue(xml.contains("select id=\"selectFamilyAssetItemsByScope\""));
|
||||||
assertTrue(xml.contains("select id=\"selectFamilyDebtItemsByScope\""));
|
assertTrue(xml.contains("select id=\"selectFamilyDebtItemsByScope\""));
|
||||||
assertTrue(xml.contains("scope.staff_id_card = #{staffIdCard}"));
|
assertTrue(xml.contains("scope.staff_id_card = #{staffIdCard}"));
|
||||||
|
assertTrue(xml.contains("spouseIsStaff=spouse_is_staff"));
|
||||||
|
assertTrue(xml.contains("relation.relation_cert_no as person_id"));
|
||||||
|
assertTrue(xml.contains("spouse_staff.annual_income"));
|
||||||
|
assertTrue(xml.contains("spouse.spouse_is_staff = 1"));
|
||||||
|
assertTrue(xml.contains("asset.family_id = spouse.spouse_id_card"));
|
||||||
|
assertTrue(xml.contains("source.spouse_staff_asset_record_count = 0"));
|
||||||
|
assertTrue(xml.contains("source.spouse_staff_debt_record_count = 0"));
|
||||||
assertTrue(xml.contains("incomeDetail"));
|
assertTrue(xml.contains("incomeDetail"));
|
||||||
assertTrue(xml.contains("assetDetail"));
|
assertTrue(xml.contains("assetDetail"));
|
||||||
assertTrue(xml.contains("debtDetail"));
|
assertTrue(xml.contains("debtDetail"));
|
||||||
@@ -31,6 +38,9 @@ class CcdiProjectSpecialCheckMapperDetailSqlTest {
|
|||||||
assertTrue(xml.contains("asset_main_type"));
|
assertTrue(xml.contains("asset_main_type"));
|
||||||
assertTrue(xml.contains("asset_sub_type"));
|
assertTrue(xml.contains("asset_sub_type"));
|
||||||
assertTrue(xml.contains("holder_name"));
|
assertTrue(xml.contains("holder_name"));
|
||||||
|
assertTrue(xml.contains("holder_staff.name"));
|
||||||
|
assertTrue(xml.contains("select max(relation.relation_name)"));
|
||||||
|
assertTrue(xml.contains("relation.relation_cert_no = asset.person_id"));
|
||||||
assertTrue(xml.contains("current_value"));
|
assertTrue(xml.contains("current_value"));
|
||||||
assertTrue(xml.contains("valuation_date"));
|
assertTrue(xml.contains("valuation_date"));
|
||||||
assertTrue(xml.contains("debt_name"));
|
assertTrue(xml.contains("debt_name"));
|
||||||
@@ -38,6 +48,8 @@ class CcdiProjectSpecialCheckMapperDetailSqlTest {
|
|||||||
assertTrue(xml.contains("debt_sub_type"));
|
assertTrue(xml.contains("debt_sub_type"));
|
||||||
assertTrue(xml.contains("creditor_type"));
|
assertTrue(xml.contains("creditor_type"));
|
||||||
assertTrue(xml.contains("owner_name"));
|
assertTrue(xml.contains("owner_name"));
|
||||||
|
assertTrue(xml.contains("owner_staff.name"));
|
||||||
|
assertTrue(xml.contains("relation.relation_cert_no = debt.person_id"));
|
||||||
assertTrue(xml.contains("principal_balance"));
|
assertTrue(xml.contains("principal_balance"));
|
||||||
assertTrue(xml.contains("query_date"));
|
assertTrue(xml.contains("query_date"));
|
||||||
assertFalse(xml.contains("ccdi_project_overview_employee_result"));
|
assertFalse(xml.contains("ccdi_project_overview_employee_result"));
|
||||||
|
|||||||
@@ -19,11 +19,25 @@ class CcdiProjectSpecialCheckMapperListSqlTest {
|
|||||||
assertTrue(xml.contains("ccdi_base_staff"));
|
assertTrue(xml.contains("ccdi_base_staff"));
|
||||||
assertTrue(xml.contains("ccdi_staff_fmy_relation"));
|
assertTrue(xml.contains("ccdi_staff_fmy_relation"));
|
||||||
assertTrue(xml.contains("relation_type = '配偶'"));
|
assertTrue(xml.contains("relation_type = '配偶'"));
|
||||||
|
assertTrue(xml.contains("union all"));
|
||||||
|
assertTrue(xml.contains("relation.relation_cert_no as person_id"));
|
||||||
|
assertTrue(xml.contains("inner join ccdi_base_staff current_staff"));
|
||||||
|
assertTrue(xml.contains("spouse_staff.annual_income"));
|
||||||
|
assertTrue(xml.contains("spouse_is_staff"));
|
||||||
assertTrue(xml.contains("annual_income"));
|
assertTrue(xml.contains("annual_income"));
|
||||||
assertTrue(xml.contains("current_value"));
|
assertTrue(xml.contains("current_value"));
|
||||||
assertTrue(xml.contains("principal_balance"));
|
assertTrue(xml.contains("principal_balance"));
|
||||||
assertTrue(listSql.contains("self_asset_record_count"));
|
assertTrue(listSql.contains("self_asset_record_count"));
|
||||||
|
assertTrue(listSql.contains("spouse_staff_asset_record_count"));
|
||||||
assertTrue(listSql.contains("self_debt_record_count"));
|
assertTrue(listSql.contains("self_debt_record_count"));
|
||||||
|
assertTrue(listSql.contains("spouse_staff_debt_record_count"));
|
||||||
|
assertTrue(listSql.contains("source.self_asset_record_count = 0"));
|
||||||
|
assertTrue(listSql.contains("source.spouse_staff_asset_record_count = 0"));
|
||||||
|
assertTrue(listSql.contains("source.self_debt_record_count = 0"));
|
||||||
|
assertTrue(listSql.contains("source.spouse_staff_debt_record_count = 0"));
|
||||||
|
assertTrue(listSql.contains("asset.family_id = spouse.spouse_id_card"));
|
||||||
|
assertTrue(listSql.contains("asset.person_id = spouse.spouse_id_card"));
|
||||||
|
assertTrue(listSql.contains("debt.person_id = spouse.spouse_id_card"));
|
||||||
assertTrue(listSql.contains("then 'MISSING_INFO'"));
|
assertTrue(listSql.contains("then 'MISSING_INFO'"));
|
||||||
assertTrue(listSql.contains("then '缺少信息'"));
|
assertTrue(listSql.contains("then '缺少信息'"));
|
||||||
assertTrue(listSql.contains("comparison_amount"));
|
assertTrue(listSql.contains("comparison_amount"));
|
||||||
|
|||||||
@@ -0,0 +1,57 @@
|
|||||||
|
# 双员工夫妻家庭专项核查实施记录
|
||||||
|
|
||||||
|
- 保存路径:`docs/reports/implementation/2026-05-26-double-staff-spouse-family-special-check.md`
|
||||||
|
- 实施日期:2026-05-26
|
||||||
|
- 变更范围:后端专项核查家庭资产负债聚合 SQL 与对应 Mapper SQL 结构测试
|
||||||
|
|
||||||
|
## 修改内容
|
||||||
|
|
||||||
|
1. 调整 `CcdiProjectSpecialCheckMapper.xml` 的配偶识别口径:
|
||||||
|
- 支持 `本人 -> 配偶` 的直接关系。
|
||||||
|
- 支持 `配偶员工 -> 本人` 的反向推导,覆盖只维护单向配偶关系但双方都是员工的情况。
|
||||||
|
- 增加 `spouse_is_staff` 标识,配偶为员工时收入优先取 `ccdi_base_staff.annual_income`。
|
||||||
|
|
||||||
|
2. 调整家庭资产、负债与缺少信息口径:
|
||||||
|
- 双员工夫妻家庭中,本人资产取 `family_id = 本人身份证号 AND person_id = 本人身份证号`。
|
||||||
|
- 配偶为员工时,配偶资产取 `family_id = 配偶身份证号 AND person_id = 配偶身份证号`。
|
||||||
|
- 配偶不是员工时,配偶资产仍取 `family_id = 本人身份证号 AND person_id = 配偶身份证号`。
|
||||||
|
- 负债继续按本人和配偶证件号从 `ccdi_debts_info` 汇总。
|
||||||
|
- 配偶为员工时,任一公司员工成员缺少本人资产或本人负债记录,风险结果按“缺少信息”处理。
|
||||||
|
|
||||||
|
3. 调整详情明细展示查询:
|
||||||
|
- 资产明细按 `spouse_is_staff` 选择员工本人资产或亲属资产,避免把员工配偶作为亲属资产重复计入。
|
||||||
|
- 资产持有人和负债归属人名称优先取员工主档,非员工配偶再从亲属关系中取名,避免双向配偶关系导致明细行重复。
|
||||||
|
|
||||||
|
4. 补充 Mapper SQL 结构测试断言:
|
||||||
|
- 校验双向配偶识别、员工配偶收入来源、员工配偶资产归属、员工配偶负债缺失判断和明细查询参数传递。
|
||||||
|
|
||||||
|
## 影响范围
|
||||||
|
|
||||||
|
- 接口路径和返回结构不变:
|
||||||
|
- `GET /ccdi/project/special-check/family-asset-liability/list`
|
||||||
|
- `GET /ccdi/project/special-check/family-asset-liability/detail`
|
||||||
|
- 前端页面无需调整,仍按员工展示列表。
|
||||||
|
- 不新增数据库表和字段。
|
||||||
|
|
||||||
|
## 验证结果
|
||||||
|
|
||||||
|
1. 主代码编译:
|
||||||
|
- 命令:`mvn -DskipTests compile`
|
||||||
|
- 目录:`ccdi-project`
|
||||||
|
- 结果:通过。
|
||||||
|
|
||||||
|
2. Mapper XML 格式校验:
|
||||||
|
- 命令:`xmllint --noout ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectSpecialCheckMapper.xml`
|
||||||
|
- 结果:通过。
|
||||||
|
|
||||||
|
3. 本次变更空白检查:
|
||||||
|
- 命令:`git diff --check -- ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectSpecialCheckMapper.xml ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckMapperListSqlTest.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckMapperDetailSqlTest.java`
|
||||||
|
- 结果:通过。
|
||||||
|
|
||||||
|
4. 双员工夫妻 Mapper 关键口径文本校验:
|
||||||
|
- 命令:Ruby 读取 Mapper XML 并检查反向配偶、员工配偶收入、员工配偶资产、员工配偶负债和明细参数关键片段。
|
||||||
|
- 结果:通过,输出 `double-staff spouse mapper checks passed`。
|
||||||
|
|
||||||
|
5. 专项 JUnit:
|
||||||
|
- 命令:`mvn test -Dtest=CcdiProjectSpecialCheckMapperListSqlTest,CcdiProjectSpecialCheckMapperDetailSqlTest`
|
||||||
|
- 结果:未完成执行。当前模块测试编译阶段被既有无关测试错误阻断,错误集中在 `CcdiBankStatementTest` 与 `CcdiFileUploadServiceImplTest` 中旧接口签名不匹配,本次未修改这些文件。
|
||||||
Reference in New Issue
Block a user