feat: 优化关联首付分期政策列表显示字段\n\n- 精简列表只显示政策名称、已售面积、已售套数、已售底价总价、生效日期、失效日期\n- 移除序号、首付比例、付款方式、房源套数、楼栋范围、备注等字段\n- 隐藏表头标题,数据改为纯文本显示\n- 调整新增按钮位置和样式

This commit is contained in:
Admin
2025-09-15 15:56:11 +08:00
parent adb75b01dd
commit 5c8ba42850
21 changed files with 2516 additions and 793 deletions

View File

@ -0,0 +1,84 @@
package org.dromara.system.controller;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.system.domain.bo.CompositePeriodicPolicyBo;
import org.dromara.system.service.IPeriodicPolicyCompositeService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* 组合分期方案控制器 - 一次性保存分期方案、分期政策、付款明细
*
* @author System
* @date 2025-01-15
*/
@Slf4j
@RestController
@RequestMapping("/system/composite/periodicpolicy")
@RequiredArgsConstructor
public class CompositePeriodicPolicyController {
private final IPeriodicPolicyCompositeService compositeService;
/**
* 组合保存分期方案及其关联数据
*
* @param compositeBo 组合分期方案业务对象
* @return 保存结果
*/
@Log(title = "组合分期方案", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/save")
public R<String> saveComposite(@Validated(AddGroup.class) @RequestBody CompositePeriodicPolicyBo compositeBo) {
try {
log.info("开始组合保存分期方案数据");
String schemeId = compositeService.saveCompositePeriodicPolicy(
compositeBo.getPeriodicpolicy(),
compositeBo.getPolicies(),
compositeBo.getPaymentDetails()
);
log.info("组合保存分期方案数据成功方案ID: {}", schemeId);
return R.ok(schemeId);
} catch (Exception e) {
log.error("组合保存分期方案数据失败", e);
return R.fail("保存失败: " + e.getMessage());
}
}
/**
* 组合更新分期方案及其关联数据
*
* @param compositeBo 组合分期方案业务对象
* @return 更新结果
*/
@Log(title = "组合分期方案", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping("/update")
public R<Void> updateComposite(@Validated(EditGroup.class) @RequestBody CompositePeriodicPolicyBo compositeBo) {
try {
log.info("开始组合更新分期方案数据");
boolean success = compositeService.updateCompositePeriodicPolicy(
compositeBo.getPeriodicpolicy(),
compositeBo.getPolicies(),
compositeBo.getPaymentDetails()
);
if (success) {
log.info("组合更新分期方案数据成功");
return R.ok();
} else {
log.error("组合更新分期方案数据失败");
return R.fail("更新失败");
}
} catch (Exception e) {
log.error("组合更新分期方案数据失败", e);
return R.fail("更新失败: " + e.getMessage());
}
}
}

View File

@ -99,8 +99,8 @@ public class TPolicy extends TenantEntity {
/**
* 首付比例
*/
@TableField("downPaymentRatio")
private BigDecimal downPaymentRatio;
@TableField("down_payment_ratio")
private String downPaymentRatio;
/**
* 删除标志0存在 1删除

View File

@ -0,0 +1,44 @@
package org.dromara.system.domain.bo;
import lombok.Data;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import java.util.List;
/**
* 组合分期方案业务对象 - 用于一次性保存分期方案、分期政策、付款明细
*
* @author System
* @date 2025-01-15
*/
@Data
public class CompositePeriodicPolicyBo {
/**
* 分期方案信息
*/
@Valid
@NotNull(message = "分期方案信息不能为空", groups = {AddGroup.class, EditGroup.class})
private TPeriodicpolicyBo periodicpolicy;
/**
* 分期政策列表
*/
@Valid
private List<TPolicyBo> policies;
/**
* 付款明细列表(按政策分组)
* 每个元素对应一个政策的付款明细列表
*/
@Valid
private List<List<TPaymentDetailsBo>> paymentDetails;
/**
* 是否为编辑模式
*/
private boolean editMode = false;
}

View File

@ -147,6 +147,6 @@ public class TPolicyBo extends BaseEntity {
/**
* 首付比例
*/
private BigDecimal downPaymentRatio;
private String downPaymentRatio;
}

View File

@ -120,7 +120,7 @@ public class TPolicyVo implements Serializable {
* 首付比例
*/
@ExcelProperty(value = "首付比例")
private BigDecimal downPaymentRatio;
private String downPaymentRatio;
}

View File

@ -0,0 +1,40 @@
package org.dromara.system.service;
import org.dromara.system.domain.bo.TPeriodicpolicyBo;
import org.dromara.system.domain.bo.TPolicyBo;
import org.dromara.system.domain.bo.TPaymentDetailsBo;
import java.util.List;
/**
* 分期方案组合服务接口
*
* @author System
* @date 2025-01-15
*/
public interface IPeriodicPolicyCompositeService {
/**
* 组合保存分期方案及其关联的分期政策和付款明细
*
* @param periodicpolicyBo 分期方案业务对象
* @param policyBos 分期政策业务对象列表
* @param paymentDetailsBos 付款明细业务对象列表(按政策分组)
* @return 保存成功的分期方案ID
*/
String saveCompositePeriodicPolicy(TPeriodicpolicyBo periodicpolicyBo,
List<TPolicyBo> policyBos,
List<List<TPaymentDetailsBo>> paymentDetailsBos);
/**
* 组合更新分期方案及其关联的分期政策和付款明细
*
* @param periodicpolicyBo 分期方案业务对象
* @param policyBos 分期政策业务对象列表
* @param paymentDetailsBos 付款明细业务对象列表(按政策分组)
* @return 是否更新成功
*/
boolean updateCompositePeriodicPolicy(TPeriodicpolicyBo periodicpolicyBo,
List<TPolicyBo> policyBos,
List<List<TPaymentDetailsBo>> paymentDetailsBos);
}

View File

@ -0,0 +1,186 @@
package org.dromara.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.domain.bo.TPeriodicpolicyBo;
import org.dromara.system.domain.bo.TPolicyBo;
import org.dromara.system.domain.bo.TPaymentDetailsBo;
import org.dromara.system.domain.TPeriodicpolicy;
import org.dromara.system.domain.TPolicy;
import org.dromara.system.domain.TPaymentDetails;
import org.dromara.system.mapper.TPeriodicpolicyMapper;
import org.dromara.system.mapper.TPolicyMapper;
import org.dromara.system.mapper.TPaymentDetailsMapper;
import org.dromara.system.service.IPeriodicPolicyCompositeService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* 分期方案组合服务 - 将分期方案、分期政策、付款明细放在同一个事务下保存
*
* @author System
* @date 2025-01-15
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class PeriodicPolicyCompositeServiceImpl implements IPeriodicPolicyCompositeService {
private final TPeriodicpolicyMapper periodicpolicyMapper;
private final TPolicyMapper policyMapper;
private final TPaymentDetailsMapper paymentDetailsMapper;
/**
* 组合保存分期方案及其关联的分期政策和付款明细
*
* @param periodicpolicyBo 分期方案业务对象
* @param policyBos 分期政策业务对象列表
* @param paymentDetailsBos 付款明细业务对象列表(按政策分组)
* @return 保存成功的分期方案ID
*/
@Override
@Transactional(rollbackFor = Exception.class)
public String saveCompositePeriodicPolicy(TPeriodicpolicyBo periodicpolicyBo,
List<TPolicyBo> policyBos,
List<List<TPaymentDetailsBo>> paymentDetailsBos) {
try {
log.info("开始组合保存分期方案数据");
// 1. 保存分期方案
TPeriodicpolicy periodicpolicy = MapstructUtils.convert(periodicpolicyBo, TPeriodicpolicy.class);
// 设置当前登录用户为创建人
periodicpolicy.setCreator(LoginHelper.getUsername());
periodicpolicyMapper.insert(periodicpolicy);
String schemeId = periodicpolicy.getId();
log.info("分期方案保存成功ID: {}", schemeId);
// 2. 保存分期政策及其付款明细
if (policyBos != null && !policyBos.isEmpty()) {
for (int i = 0; i < policyBos.size(); i++) {
TPolicyBo policyBo = policyBos.get(i);
policyBo.setPeriodicPolicyId(schemeId); // 设置关联的分期方案ID
TPolicy policy = MapstructUtils.convert(policyBo, TPolicy.class);
// 设置当前登录用户为创建人
policy.setCreator(LoginHelper.getUsername());
policyMapper.insert(policy);
String policyId = policy.getId();
log.info("分期政策保存成功ID: {}", policyId);
// 3. 保存该政策的付款明细
if (paymentDetailsBos != null && i < paymentDetailsBos.size()) {
List<TPaymentDetailsBo> detailsForPolicy = paymentDetailsBos.get(i);
if (detailsForPolicy != null && !detailsForPolicy.isEmpty()) {
for (TPaymentDetailsBo paymentDetailsBo : detailsForPolicy) {
paymentDetailsBo.setPolicyid(policyId); // 设置关联的政策ID
TPaymentDetails paymentDetails = MapstructUtils.convert(paymentDetailsBo, TPaymentDetails.class);
// 设置当前登录用户为创建人
paymentDetails.setCreator(LoginHelper.getUsername());
// 设置创建人ID
paymentDetails.setCreatorid(LoginHelper.getUserIdStr());
paymentDetailsMapper.insert(paymentDetails);
}
log.info("政策 {} 的付款明细保存成功,共 {} 条", policyId, detailsForPolicy.size());
}
}
}
}
log.info("组合保存分期方案数据完成方案ID: {}", schemeId);
return schemeId;
} catch (Exception e) {
log.error("组合保存分期方案数据失败", e);
throw new RuntimeException("保存分期方案数据失败: " + e.getMessage(), e);
}
}
/**
* 组合更新分期方案及其关联的分期政策和付款明细
*
* @param periodicpolicyBo 分期方案业务对象
* @param policyBos 分期政策业务对象列表
* @param paymentDetailsBos 付款明细业务对象列表(按政策分组)
* @return 是否更新成功
*/
@Override
@Transactional(rollbackFor = Exception.class)
public boolean updateCompositePeriodicPolicy(TPeriodicpolicyBo periodicpolicyBo,
List<TPolicyBo> policyBos,
List<List<TPaymentDetailsBo>> paymentDetailsBos) {
try {
log.info("开始组合更新分期方案数据方案ID: {}", periodicpolicyBo.getId());
String schemeId = periodicpolicyBo.getId();
// 1. 更新分期方案
TPeriodicpolicy periodicpolicy = MapstructUtils.convert(periodicpolicyBo, TPeriodicpolicy.class);
// 设置当前登录用户为创建人
periodicpolicy.setCreator(LoginHelper.getUsername());
periodicpolicyMapper.updateById(periodicpolicy);
log.info("分期方案更新成功ID: {}", schemeId);
// 2. 删除原有的分期政策和付款明细
// 先获取关联的政策ID列表
List<Object> policyIds = policyMapper.selectObjs(Wrappers.<TPolicy>lambdaQuery()
.eq(TPolicy::getPeriodicPolicyId, schemeId)
.select(TPolicy::getId));
// 如果有政策ID才删除对应的付款明细
if (policyIds != null && !policyIds.isEmpty()) {
paymentDetailsMapper.delete(Wrappers.<TPaymentDetails>lambdaQuery()
.in(TPaymentDetails::getPolicyid, policyIds));
}
// 再删除分期政策
policyMapper.delete(Wrappers.<TPolicy>lambdaQuery()
.eq(TPolicy::getPeriodicPolicyId, schemeId));
log.info("原有的分期政策和付款明细已删除");
// 3. 重新保存分期政策及其付款明细
if (policyBos != null && !policyBos.isEmpty()) {
for (int i = 0; i < policyBos.size(); i++) {
TPolicyBo policyBo = policyBos.get(i);
policyBo.setPeriodicPolicyId(schemeId);
TPolicy policy = MapstructUtils.convert(policyBo, TPolicy.class);
// 设置当前登录用户为创建人
policy.setCreator(LoginHelper.getUsername());
policyMapper.insert(policy);
String policyId = policy.getId();
// 保存该政策的付款明细
if (paymentDetailsBos != null && i < paymentDetailsBos.size()) {
List<TPaymentDetailsBo> detailsForPolicy = paymentDetailsBos.get(i);
if (detailsForPolicy != null && !detailsForPolicy.isEmpty()) {
for (TPaymentDetailsBo paymentDetailsBo : detailsForPolicy) {
paymentDetailsBo.setPolicyid(policyId);
TPaymentDetails paymentDetails = MapstructUtils.convert(paymentDetailsBo, TPaymentDetails.class);
// 设置当前登录用户为创建人
paymentDetails.setCreator(LoginHelper.getUsername());
// 设置创建人ID
paymentDetails.setCreatorid(LoginHelper.getUserIdStr());
paymentDetailsMapper.insert(paymentDetails);
}
log.info("政策 {} 的付款明细更新成功,共 {} 条", policyId, detailsForPolicy.size());
}
}
}
}
log.info("组合更新分期方案数据完成方案ID: {}", schemeId);
return true;
} catch (Exception e) {
log.error("组合更新分期方案数据失败", e);
throw new RuntimeException("更新分期方案数据失败: " + e.getMessage(), e);
}
}
}