package com.zzg.system.service.state.impl;
|
|
import cn.hutool.core.util.ObjectUtil;
|
import com.alibaba.fastjson2.JSON;
|
import com.alibaba.fastjson2.JSONObject;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.github.pagehelper.PageInfo;
|
import com.zzg.common.core.domain.entity.state.StateAgreement;
|
import com.zzg.common.core.domain.entity.state.StateAsset;
|
import com.zzg.common.core.domain.entity.state.StateHousehold;
|
import com.zzg.common.core.domain.entity.state.StateProject;
|
import com.zzg.common.core.domain.entity.state.StateSettlement;
|
import com.zzg.common.core.domain.entity.system.SysDept;
|
import com.zzg.common.enums.AgreementTypeEnum;
|
import com.zzg.common.enums.CompensationCategoryEnum;
|
import com.zzg.common.enums.DeleteFlagEnum;
|
import com.zzg.common.enums.ProcessCategoryEnum;
|
import com.zzg.common.enums.StateProjectStatusEnum;
|
import com.zzg.common.enums.SubmitStatusEnum;
|
import com.zzg.common.exception.GlobalException;
|
import com.zzg.common.utils.PageUtils;
|
import com.zzg.common.utils.SecurityUtils;
|
import com.zzg.system.domain.bo.AssetDetailBO;
|
import com.zzg.system.domain.bo.FileBO;
|
import com.zzg.system.domain.bo.ProcessStartBO;
|
import com.zzg.system.domain.bo.StateAssetBO;
|
import com.zzg.system.domain.vo.StateAssetDetailVO;
|
import com.zzg.system.mapper.state.StateAssetMapper;
|
import com.zzg.system.service.state.StateAgreementService;
|
import com.zzg.system.service.state.StateAssetService;
|
import com.zzg.system.service.state.StateHouseholdService;
|
import com.zzg.system.service.state.StateProcessTemplateService;
|
import com.zzg.system.service.state.StateProjectService;
|
import com.zzg.system.service.state.StateSettlementService;
|
import com.zzg.system.service.system.ISysDeptService;
|
import lombok.RequiredArgsConstructor;
|
import org.springframework.context.annotation.Lazy;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import javax.annotation.Resource;
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.util.ArrayList;
|
import java.util.Collections;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.Objects;
|
import java.util.function.Function;
|
import java.util.stream.Collectors;
|
|
@Service
|
@RequiredArgsConstructor
|
|
public class StateAssetServiceImpl extends ServiceImpl<StateAssetMapper, StateAsset> implements StateAssetService {
|
|
|
private final StateAgreementService agreementService;
|
private final StateAssetMapper assetMapper;
|
private final StateSettlementService settlementService;
|
@Lazy
|
@Resource
|
private final StateProjectService stateProjectService;
|
@Lazy
|
@Resource
|
private final StateHouseholdService stateHouseholdService;
|
@Lazy
|
@Resource
|
private final StateProcessTemplateService stateProcessTemplateService;
|
@Lazy
|
@Resource
|
private final ISysDeptService deptService;
|
|
/**
|
* 项目资金点击上方符号查询
|
* @param assetDetailBO
|
* @return
|
*/
|
@Override
|
public PageInfo<StateAssetDetailVO> listAssetDetail(AssetDetailBO assetDetailBO) {
|
//查询项目信息
|
StateProject stateProject = stateProjectService.getById(assetDetailBO.getProjectId());
|
Integer currentStatus = stateProject.getStatus();
|
|
PageUtils.startPage();
|
//查询项目预算资金详情
|
List<StateAssetDetailVO> assetDetailVOList = assetMapper.listAssetDetail(assetDetailBO, currentStatus);
|
if (CollectionUtils.isEmpty(assetDetailVOList)) {
|
return new PageInfo<>();
|
}
|
PageInfo<StateAssetDetailVO> stateAssetDetailVOPageInfo = new PageInfo<>(assetDetailVOList);
|
stateAssetDetailVOPageInfo.setList(assetDetailVOList);
|
Map<String, List<StateAssetDetailVO>> listMap = stateAssetDetailVOPageInfo.getList().stream().collect(Collectors.groupingBy(StateAssetDetailVO::getHouseId));
|
|
List<StateAssetDetailVO> result = new ArrayList<>();
|
|
for (String houseId : listMap.keySet()) {
|
List<StateAssetDetailVO> stateAssetDetailVOList = listMap.get(houseId);
|
StateAssetDetailVO assetDetailVO = stateAssetDetailVOList.get(0);
|
result.add(assetDetailVO);
|
}
|
//国有项目协议查询条件
|
LambdaQueryWrapper<StateAgreement> stateAgreementLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
stateAgreementLambdaQueryWrapper.in(StateAgreement::getStateHouseholdId, result.stream().map(StateAssetDetailVO::getHouseId).collect(Collectors.toList()));
|
//根据项目状态查询协议 这一个项目状态只有一种 随便取出来即可
|
if (ObjectUtil.isNotEmpty(result) && Objects.nonNull(result.get(0).getProjectStatus())) {
|
Integer projectStatus = result.get(0).getProjectStatus();
|
if (Objects.equals(projectStatus, StateProjectStatusEnum.SIMULATE.getKey())) {
|
stateAgreementLambdaQueryWrapper.eq(StateAgreement::getAgreementFileType, AgreementTypeEnum.VIRTUAL_STATE_AGREEMENT.getValue());
|
} else if (Objects.equals(projectStatus, StateProjectStatusEnum.LEVY.getKey())
|
|| Objects.equals(projectStatus, StateProjectStatusEnum.SUCCESS.getKey())) {
|
stateAgreementLambdaQueryWrapper.eq(StateAgreement::getAgreementFileType, AgreementTypeEnum.STATE_AGREEMENT.getValue());
|
}
|
}
|
stateAgreementLambdaQueryWrapper.isNotNull(StateAgreement::getAgreementNumber);
|
//查询协议列表
|
List<StateAgreement> stateAgreements = agreementService.list(stateAgreementLambdaQueryWrapper);
|
if (CollectionUtils.isEmpty(stateAgreements)) {
|
stateAssetDetailVOPageInfo.setList(result);
|
return stateAssetDetailVOPageInfo;
|
}
|
Map<String, StateAgreement> stateAgreementMap = stateAgreements.stream()
|
.collect(Collectors.toMap(StateAgreement::getStateHouseholdId, Function.identity()));
|
|
//设置合同金额
|
result.forEach(data -> {
|
if (stateAgreementMap.containsKey(data.getHouseId())) {
|
data.setAgreementMoney(BigDecimal.valueOf(stateAgreementMap.get(data.getHouseId()).getMoney()).setScale(4, RoundingMode.HALF_UP));
|
}
|
});
|
|
//设置结算金额
|
LambdaQueryWrapper<StateSettlement> stateSettlementLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
stateSettlementLambdaQueryWrapper.in(StateSettlement::getStateHouseholdId,
|
result.stream().map(StateAssetDetailVO::getHouseId).collect(Collectors.toList()));
|
//查询已结算金额
|
List<StateSettlement> stateSettlementList = settlementService.list(stateSettlementLambdaQueryWrapper);
|
|
|
Map<String, StateSettlement> stateSettlementMap = stateSettlementList.stream()
|
.collect(Collectors.toMap(StateSettlement::getStateHouseholdId, Function.identity()));
|
//赋值结算金额
|
result.forEach(data -> {
|
StateSettlement stateSettlement = stateSettlementMap.get(data.getHouseId());
|
if (Objects.isNull(stateSettlement)) {
|
return;
|
}
|
//TODO 置换后金额含义
|
// 结算金额
|
Double dbSettleMoney = Objects.nonNull(stateSettlement.getSettlementMoney()) ? stateSettlement.getSettlementMoney() : 0;
|
//置换后金额
|
Double dbExchangeMoney = Objects.nonNull(stateSettlement.getExchangeMoney()) ? stateSettlement.getExchangeMoney() : 0;
|
BigDecimal settleMoney = BigDecimal.valueOf(dbSettleMoney + dbExchangeMoney).setScale(4, RoundingMode.HALF_UP);
|
data.setSettleMoney(settleMoney);
|
Number agreementMoney = Objects.nonNull(data.getAgreementMoney()) ? data.getAgreementMoney() : 0;
|
settleMoney = Objects.nonNull(data.getSettleMoney()) ? data.getSettleMoney() : BigDecimal.ZERO;
|
data.setDiffMoney(BigDecimal.valueOf(agreementMoney.doubleValue()).subtract(settleMoney));
|
data.setPaidOffTime(Objects.nonNull(stateSettlement.getPaidTime()) ? stateSettlement.getPaidTime() : null);
|
});
|
|
stateAssetDetailVOPageInfo.setList(result);
|
return stateAssetDetailVOPageInfo;
|
}
|
|
/**
|
* 项目资金 上方统计数据
|
* @param projectId
|
* @return
|
*/
|
@Override
|
public JSONObject sumAsset(String projectId) {
|
JSONObject jsonObject = new JSONObject();
|
//查询项目信息
|
StateProject stateProject = stateProjectService.getProjectById(projectId);
|
// TODO 未将逻辑删除的字段过滤
|
LambdaQueryWrapper<StateAsset> stateAssetQueryWrapper = new LambdaQueryWrapper<>();
|
stateAssetQueryWrapper.eq(StateAsset::getStateProjectId, projectId);
|
//查询项目预算资金
|
List<StateAsset> stateAssets = this.list(stateAssetQueryWrapper);
|
|
//预算金额
|
double budgetAmount = stateAssets.stream()
|
.filter(Objects::nonNull).filter(data -> Objects.nonNull(data.getVirtualMoney())).mapToDouble(asset -> asset.getVirtualMoney().doubleValue())
|
.sum();
|
String roundedBudgetAmount = BigDecimal.valueOf(budgetAmount)
|
.setScale(4, RoundingMode.HALF_UP).toPlainString();
|
jsonObject.put("budgetAmount", roundedBudgetAmount);
|
//合同金额
|
LambdaQueryWrapper<StateHousehold> stateHouseholdLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
stateHouseholdLambdaQueryWrapper.eq(StateHousehold::getStateProjectId, projectId);
|
stateHouseholdLambdaQueryWrapper.eq(StateHousehold::getDelFlag, DeleteFlagEnum.NOT_DELETED.getKey());
|
stateHouseholdLambdaQueryWrapper.isNotNull(StateHousehold::getAgreementStatus);
|
//根据项目id查询房产数据
|
List<StateHousehold> stateHouseholds = stateHouseholdService.list(stateHouseholdLambdaQueryWrapper);
|
|
if (CollectionUtils.isEmpty(stateHouseholds)) {
|
return jsonObject;
|
}
|
List<String> houseIds = stateHouseholds.stream().filter(Objects::nonNull).map(StateHousehold::getId).collect(Collectors.toList());
|
LambdaQueryWrapper<StateAgreement> stateAgreementLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<StateAgreement> componseTypeAgreementLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
//根据项目状态查询协议 这一个项目状态只有一种 随便取出来即可
|
if (Objects.nonNull(stateProject.getStatus())) {
|
Integer projectStatus = stateProject.getStatus();
|
if (Objects.equals(projectStatus, StateProjectStatusEnum.SIMULATE.getKey())) {
|
stateAgreementLambdaQueryWrapper.eq(StateAgreement::getAgreementFileType, AgreementTypeEnum.VIRTUAL_STATE_AGREEMENT.getValue());
|
componseTypeAgreementLambdaQueryWrapper.eq(StateAgreement::getAgreementFileType, AgreementTypeEnum.VIRTUAL_STATE_AGREEMENT.getValue());
|
} else if (Objects.equals(projectStatus, StateProjectStatusEnum.LEVY.getKey())
|
|| Objects.equals(projectStatus, StateProjectStatusEnum.SUCCESS.getKey())) {
|
stateAgreementLambdaQueryWrapper.eq(StateAgreement::getAgreementFileType, AgreementTypeEnum.STATE_AGREEMENT.getValue());
|
componseTypeAgreementLambdaQueryWrapper.eq(StateAgreement::getAgreementFileType, AgreementTypeEnum.STATE_AGREEMENT.getValue());
|
}
|
}
|
|
stateAgreementLambdaQueryWrapper.isNotNull(StateAgreement::getAgreementNumber);
|
stateAgreementLambdaQueryWrapper.in(StateAgreement::getStateHouseholdId, houseIds);
|
//查询协议信息
|
List<StateAgreement> stateAgreements = agreementService.list(stateAgreementLambdaQueryWrapper);
|
if (CollectionUtils.isNotEmpty(stateAgreements)) {
|
Integer projectStatus = stateProject.getStatus();
|
if (Objects.equals(projectStatus, StateProjectStatusEnum.SIMULATE.getKey())) {
|
stateAgreementLambdaQueryWrapper.eq(StateAgreement::getAgreementFileType, AgreementTypeEnum.VIRTUAL_STATE_AGREEMENT.getValue());
|
stateAgreements = stateAgreements.stream().filter(e -> e.getAgreementFileType().equals(AgreementTypeEnum.VIRTUAL_STATE_AGREEMENT.getValue())).collect(Collectors.toList());
|
} else if (Objects.equals(projectStatus, StateProjectStatusEnum.LEVY.getKey())
|
|| Objects.equals(projectStatus, StateProjectStatusEnum.SUCCESS.getKey())) {
|
stateAgreementLambdaQueryWrapper.eq(StateAgreement::getAgreementFileType, AgreementTypeEnum.STATE_AGREEMENT.getValue());
|
stateAgreements = stateAgreements.stream().filter(e -> e.getAgreementFileType().equals(AgreementTypeEnum.STATE_AGREEMENT.getValue())).collect(Collectors.toList());
|
}
|
// 协议金额
|
double agreementMoney = stateAgreements.stream()
|
.filter(Objects::nonNull)
|
.filter(data -> Objects.nonNull(data.getMoney())).mapToDouble(StateAgreement::getMoney).sum();
|
|
String agreementMoneyBig = BigDecimal.valueOf(agreementMoney)
|
.setScale(4, RoundingMode.HALF_UP).toPlainString();
|
|
jsonObject.put("agreementMoney", agreementMoneyBig);
|
}
|
//将该项目下面的房产数据类型为产权置换的房产id筛选出来
|
List<String> componseTypeHouseIds = stateHouseholds.stream().filter(data -> ObjectUtil.isNotEmpty(data.getCompensationType())
|
&& data.getCompensationType().equals(CompensationCategoryEnum.PROPERTY_SWAP_2.getCode())).map(StateHousehold::getId).collect(Collectors.toList());
|
//产权置换下的合金额
|
BigDecimal roundedAgreementMoney = BigDecimal.ZERO;
|
if (ObjectUtil.isNotEmpty(componseTypeHouseIds)) {
|
componseTypeAgreementLambdaQueryWrapper.isNotNull(StateAgreement::getAgreementNumber);
|
componseTypeAgreementLambdaQueryWrapper.in(StateAgreement::getStateHouseholdId, componseTypeHouseIds);
|
//根据房产id查询协议列表
|
List<StateAgreement> stateAgreementsInDb = agreementService.list(componseTypeAgreementLambdaQueryWrapper);
|
if (CollectionUtils.isNotEmpty(stateAgreementsInDb)) {
|
double agreementMoney = stateAgreementsInDb.stream()
|
.filter(Objects::nonNull)
|
.filter(data -> Objects.nonNull(data.getMoney())).mapToDouble(StateAgreement::getMoney).sum();
|
|
roundedAgreementMoney = BigDecimal.valueOf(agreementMoney)
|
.setScale(4, RoundingMode.HALF_UP);
|
}
|
}
|
//设置结算金额
|
LambdaQueryWrapper<StateSettlement> stateSettlementLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
stateSettlementLambdaQueryWrapper.in(StateSettlement::getStateHouseholdId, houseIds);
|
stateSettlementLambdaQueryWrapper.isNotNull(StateSettlement::getAuditStatus);
|
List<StateSettlement> stateSettlementList = settlementService.list(stateSettlementLambdaQueryWrapper);
|
jsonObject.put("settlementMoney", 0);
|
if (CollectionUtils.isNotEmpty(stateSettlementList)) {
|
Double settlementMoney = stateSettlementList.stream()
|
.mapToDouble(stateSettlement -> {
|
Double settlementMoneyValue = stateSettlement.getSettlementMoney();
|
// 如果结算金额或交换金额为 null,则视为 0
|
return settlementMoneyValue != null ? settlementMoneyValue : 0;
|
})
|
.sum();
|
|
//产权置换后金额
|
double cqxhMoney = stateSettlementList.stream().mapToDouble(settlement -> Objects.nonNull(settlement.getExchangeMoney()) ? settlement.getExchangeMoney() : 0.0).sum();
|
//合同金额-产权置换后的金额=价值差
|
cqxhMoney = roundedAgreementMoney.doubleValue() - cqxhMoney;
|
|
//结算金额=货币补偿+产权置换价值差
|
settlementMoney = settlementMoney + cqxhMoney;
|
|
// 四舍五入保留两位小数
|
String roundedSettlementMoney = BigDecimal.valueOf(settlementMoney)
|
.setScale(4, RoundingMode.HALF_UP).toPlainString();
|
jsonObject.put("settlementMoney", roundedSettlementMoney);
|
}
|
jsonObject.put("status", stateProject.getStatus());
|
return jsonObject;
|
}
|
|
/**
|
* 新增和修改 项目资金
|
* @param asset
|
* @return
|
*/
|
@Transactional
|
@Override
|
public boolean saveAsset(StateAssetBO asset) {
|
String deptId = SecurityUtils.getLoginUser().getUser().getDept().getDeptId();
|
//根据当前登录人部门id查询部门信息
|
Map<String, SysDept> stringSysDeptMap = deptService.selectMapDeptById(Collections.singletonList(deptId));
|
asset.setSubmittedBy(stringSysDeptMap.values().stream().map(SysDept::getDeptName).collect(Collectors.joining(",")));
|
|
if (CollectionUtils.isNotEmpty(asset.getFileBOList())) {
|
asset.setFileUrl(JSON.toJSONString(asset.getFileBOList()));
|
String appendFileName = asset.getFileBOList().stream().map(FileBO::getOriginalFilename).collect(Collectors.joining(","));
|
asset.setAppendFileName(appendFileName);
|
}
|
asset.setStatus(SubmitStatusEnum.PENDING_REVIEW.getValue());
|
if (ObjectUtil.isNotEmpty(asset.getId())) {
|
StateAsset old = this.getById(asset.getId());
|
if (ObjectUtil.isNotEmpty(old) && old.getDelFlag().equals(DeleteFlagEnum.NOT_DELETED.getKey())) {
|
if (ObjectUtil.isNotEmpty(old.getStatus()) && old.getStatus() == SubmitStatusEnum.PENDING_REVIEW.getValue()) {
|
throw new GlobalException("审核中,不能修改");
|
}
|
}
|
}
|
boolean result = this.saveOrUpdate(asset);
|
//发起审核(资金管理-预算资金)
|
ProcessStartBO processStartBO = new ProcessStartBO();
|
processStartBO.setCategory(ProcessCategoryEnum.CATEGORY4.getValue().toString());
|
processStartBO.setModuleName("资金管理-预算资金");
|
|
StateProject stateProject = stateProjectService.getProjectById(asset.getStateProjectId());
|
String name = ObjectUtil.isEmpty(stateProject) ? "" : stateProject.getProjectName();
|
processStartBO.setName(name);
|
|
String remark = String.format("【镇/街】:%s,【征收实施单位】:%s,【预算金额】:%s万元", asset.getStreet(), SecurityUtils.getLoginUser().getUser().getDept().getDeptName(), asset.getVirtualMoney());
|
processStartBO.setRemark(remark);
|
Map<String, Object> variable = new HashMap<>();
|
variable.put("assetId", asset.getId());
|
//前端跳转详情页用
|
variable.put("projectId", asset.getStateProjectId());
|
variable.put("street", asset.getStreet());
|
processStartBO.setVariable(variable);
|
//启动工作流
|
stateProcessTemplateService.start(processStartBO);
|
return result;
|
}
|
|
@Override
|
public void updateAssetStatus(String assetId, Integer status) {
|
LambdaUpdateWrapper<StateAsset> updateWrapper = new LambdaUpdateWrapper<>();
|
updateWrapper.eq(StateAsset::getId, assetId)
|
.set(StateAsset::getStatus, status);
|
this.update(updateWrapper);
|
}
|
}
|