功能修改

This commit is contained in:
2026-05-28 15:06:32 +08:00
parent 4e1026d04a
commit 4721490132
16 changed files with 186 additions and 66 deletions
@@ -1,36 +1,79 @@
package com.nbport.zgwl.common;
import com.baomidou.mybatisplus.core.metadata.IPage;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.annotation.JsonView;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* 分页查询返回结果包装类
*
* @author mac
*/
@Data
@NoArgsConstructor
public class PageResult<T> implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private Long pageNo;
/**
* 当前第几页
*/
@JsonView(Views.Public.class)
private long pageNo;
private Long pageSize;
/**
* 当前页条数
*/
@JsonView(Views.Public.class)
private long pageSize;
private Long total;
/**
* 总条数
*/
@JsonView(Views.Public.class)
private long totalSize;
private Long totalPage;
/**
* 当前总共有几页
*/
@JsonView(Views.Public.class)
private long totalPage;
private List<T> records = new ArrayList<>();
/**
* 分页数据
*/
@JsonView(Views.Public.class)
private List<T> data;
public PageResult(IPage<T> page) {
public PageResult() {
}
public PageResult(Page<T> page) {
this.pageNo = page.getCurrent();
this.pageSize = page.getSize();
this.total = page.getTotal();
this.totalSize = page.getTotal();
this.totalPage = page.getPages();
this.records = page.getRecords();
this.data = page.getRecords();
}
public PageResult(Page<?> page, List<T> list) {
this.pageNo = page.getCurrent();
this.pageSize = page.getSize();
this.totalSize = page.getTotal();
this.totalPage = page.getPages();
this.data = list;
}
public PageResult(Page<?> page, Class<T> cls) {
this.pageNo = page.getCurrent();
this.pageSize = page.getSize();
this.totalSize = page.getTotal();
this.totalPage = page.getPages();
this.data = BeanUtil.copyToList(page.getRecords(), cls);
}
}
@@ -45,10 +45,6 @@ public class ContractTemplateManage implements Serializable {
@TableField("CONTRACT_TYPE")
private String contractType;
/** 我方地位:甲方/乙方/丙方 */
@TableField("SELF_PARTY_ROLE")
private String selfPartyRole;
/** 版本号 */
@TableField("VERSION")
private String version;
@@ -45,10 +45,6 @@ public class ContractTemplateDto implements Serializable {
/** 合同类型(如 买卖合同、服务合同 等) */
private String contractType;
/**
* 我方地位:甲方 / 乙方 / 丙方
*/
private String selfPartyRole;
/** 版本号 */
private String version;
@@ -29,7 +29,6 @@ public class ContractTemplateDataHandler {
template.setTemplateName(StrUtil.trim(template.getTemplateName()));
template.setSource(StrUtil.trim(template.getSource()));
template.setContractType(StrUtil.trim(template.getContractType()));
template.setSelfPartyRole(StrUtil.trim(template.getSelfPartyRole()));
template.setVersion(StrUtil.trim(template.getVersion()));
template.setDescription(StrUtil.trim(template.getDescription()));
template.setUsageTip(StrUtil.trim(template.getUsageTip()));
@@ -86,9 +85,6 @@ public class ContractTemplateDataHandler {
if (StrUtil.isBlank(template.getContractType())) {
throw new ServiceException("合同类型不能为空");
}
if (StrUtil.isBlank(template.getSelfPartyRole())) {
throw new ServiceException("我方地位不能为空");
}
if (StrUtil.isBlank(template.getVersion())) {
throw new ServiceException("版本号不能为空");
}
@@ -35,8 +35,9 @@ public class ContractTemplateServiceImpl implements ContractTemplateService {
@Override
public PageResult<ContractTemplateDto> queryTemplateList(ContractTemplateQueryDto queryDto) {
Page<ContractTemplateDto> page = new Page<>(queryDto.getPageNo(), queryDto.getPageSize());
PageResult<ContractTemplateDto> pageResult = new PageResult<>(contractTemplateMapper.selectTemplatePage(page, queryDto));
contractTemplateDataHandler.fillUiFields(pageResult.getRecords());
Page<ContractTemplateDto> resultPage = (Page<ContractTemplateDto>) contractTemplateMapper.selectTemplatePage(page, queryDto);
PageResult<ContractTemplateDto> pageResult = new PageResult<>(resultPage);
contractTemplateDataHandler.fillUiFields(pageResult.getData());
return pageResult;
}
@@ -158,7 +158,7 @@ public class IldmFeeCustomerInfo implements Serializable {
/** 组织体系对应的公司编码 */
@TableField("ORG_ID")
private String orgId;
private Long orgId;
/** 邮箱地址 */
@TableField("EMAIL_ADDRESS")
@@ -11,6 +11,7 @@ import lombok.EqualsAndHashCode;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
@@ -113,7 +113,7 @@ public class PartnerManageDto implements Serializable {
private String systemType;
/** 组织体系对应的公司编码 */
private String orgId;
private Long orgId;
/** 邮箱地址 */
private String emailAddress;
@@ -16,12 +16,25 @@ import java.util.stream.Collectors;
/**
* 相对方数据处理器
*
* 核心逻辑:相对方有 4 种性质(境内组织/境内个人/境外组织/境外个人),
* 不同性质需要填写的字段完全不同。这里集中处理字段清洗、校验和默认值填充,
* 避免 Service 层代码臃肿。
*/
@Component
public class PartnerDataHandler {
/** 保存前数据清洗(去空格、按性质清空不相关字段、设置默认值) */
/**
* 保存前数据清洗。
*
* 根据相对方性质分类,把不需要的字段置空。比如境内组织不需要填 TIN 号,
* 境外组织不需要填统一社会信用代码。最后给缺失的字段补上默认值。
*
* oppositeCharacter 对照:
* "1" = 境内组织, "2" = 境内个人, "3" = 境外组织, "4" = 境外个人
*/
public void normalizeBeforeSave(PartnerManageDto partner) {
// ========== 所有字段去前后空格 ==========
partner.setCustomerNameC(StrUtil.trim(partner.getCustomerNameC()));
partner.setCustomerTaxno(StrUtil.trim(partner.getCustomerTaxno()));
partner.setCustomerRegaddr(StrUtil.trim(partner.getCustomerRegaddr()));
@@ -38,44 +51,62 @@ public class PartnerDataHandler {
partner.setRemark(StrUtil.trim(partner.getRemark()));
partner.setSyncMessage(StrUtil.trim(partner.getSyncMessage()));
// ========== 按相对方性质,清空不相关的字段 ==========
// 组织性质不是"企业"(QY)时,企业二级分类没有意义,直接清掉
if (!"QY".equals(partner.getNatureOfEnterpriseOrg())) {
partner.setNatureOfEnterpriseOrgLev(null);
}
// 只有境内组织才需要统一社会信用代码和法定代表人,其他性质清空
if (!isDomesticOrg(partner)) {
partner.setCustomerTaxno(null);
partner.setLegalPersonName(null);
}
// 只有个人(境内或境外)才需要证件类型和证件号,组织类清空
if (!isDomesticPerson(partner) && !isForeignPerson(partner)) {
partner.setCertificateType(null);
partner.setCertificateNum(null);
}
// 只有境外组织才需要 TIN 号(税务识别号)
if (!isForeignOrg(partner)) {
partner.setTinCode(null);
}
// 非境外(组织或个人都不属于)时,国家和国家名称不需要
if (!isForeignOrg(partner) && !isForeignPerson(partner)) {
partner.setCountry(null);
partner.setCountryName(null);
}
// 个人类型(境内/境外)不需要注册地址和注册资本
if (!isDomesticOrg(partner) && !isForeignOrg(partner)) {
partner.setCustomerRegaddr(null);
partner.setRegCapital(null);
partner.setRegisteredCapital(null);
}
// 只有境内组织/个人才显示涉港澳台选项,境外不涉及
if (!showGatFlag(partner)) {
partner.setGatFlag(PartnerManageConstants.GAT_FLAG_NO);
}
// ========== 字段默认值填充(前端没传就用默认值) ==========
// 是否集团内,默认 "N"(否)
partner.setGroupFlag(StrUtil.blankToDefault(partner.getGroupFlag(), PartnerManageConstants.GROUP_FLAG_NO));
// 是否涉港澳台,默认 "N"(否)
partner.setGatFlag(StrUtil.blankToDefault(partner.getGatFlag(), PartnerManageConstants.GAT_FLAG_NO));
// 同步状态,默认 "unsynced"(未同步)
partner.setSyncStatus(StrUtil.blankToDefault(partner.getSyncStatus(), PartnerManageConstants.SYNC_STATUS_UNSYNCED));
// 相对方状态,默认 "EFFECTUAL"(有效)
partner.setOppositeStatus(StrUtil.blankToDefault(partner.getOppositeStatus(), PartnerManageConstants.OPPOSITE_STATUS_EFFECTUAL));
// 删除标记,默认 "N"(未删除)
partner.setIsDeleted(StrUtil.blankToDefault(partner.getIsDeleted(), PartnerManageConstants.PARTNER_IS_DELETED_NORMAL));
// isSgat 和 isJtn 由 gatFlag / groupFlag 自动推导(法务系统需要的冗余字段)
partner.setIsSgat(PartnerManageConstants.GAT_FLAG_YES.equals(partner.getGatFlag())
? PartnerManageConstants.FLAG_ONE
: PartnerManageConstants.FLAG_ZERO);
@@ -83,17 +114,30 @@ public class PartnerDataHandler {
? PartnerManageConstants.FLAG_ONE
: PartnerManageConstants.FLAG_ZERO);
// ========== 清洗联系人数据 ==========
List<PartnerContactDto> contacts = partner.getContacts() == null ? new ArrayList<>() : partner.getContacts();
contacts = contacts.stream()
.filter(Objects::nonNull)
.peek(this::normalizeContact)
.filter(this::hasAnyContactValue)
.filter(Objects::nonNull) // 去掉空对象
.peek(this::normalizeContact) // 逐个清洗(去空格、设默认值)
.filter(this::hasAnyContactValue) // 去掉全空的联系人
.collect(Collectors.toList());
partner.setContacts(contacts);
}
/** 保存前数据校验(必填项校验、格式校验、联系人校验) */
/**
* 保存前数据校验。
*
* 根据相对方不同性质,校验对应的必填字段。规则与 normalizeBeforeSave 对应:
* - 境内组织:必填 统一社会信用代码、法定代表人、注册地址、注册资本
* - 境内个人:必填 证件类型、证件号码
* - 境外组织:必填 TIN号、国家、注册地址、注册资本
* - 境外个人:必填 国家
* - 组织类型(境内/境外组织):必填 联系人和邮箱
*
* 所有性质通用必填:公司名称、公司类型、公司性质、组织性质、是否集团内
*/
public void validateForSave(PartnerManageDto partner) {
// ========== 通用必填校验 ==========
if (StrUtil.isBlank(partner.getCustomerNameC())) {
throw new ServiceException("公司名称不能为空");
}
@@ -106,12 +150,15 @@ public class PartnerDataHandler {
if (StrUtil.isBlank(partner.getNatureOfEnterpriseOrg())) {
throw new ServiceException("组织性质不能为空");
}
// 如果组织性质选了"企业",必须选企业二级分类(如国企/民企/外企)
if ("QY".equals(partner.getNatureOfEnterpriseOrg()) && StrUtil.isBlank(partner.getNatureOfEnterpriseOrgLev())) {
throw new ServiceException("组织性质选择企业时,组织性质企业二级不能为空");
}
if (StrUtil.isBlank(partner.getGroupFlag())) {
throw new ServiceException("是否集团内不能为空");
}
// ========== 按性质校验专属必填字段 ==========
if (isDomesticOrg(partner) && StrUtil.isBlank(partner.getCustomerTaxno())) {
throw new ServiceException("境内组织必须填写统一社会信用代码");
}
@@ -133,12 +180,15 @@ public class PartnerDataHandler {
if (isDomesticOrg(partner) && StrUtil.isBlank(partner.getLegalPersonName())) {
throw new ServiceException("境内组织必须填写法定代表人或负责人");
}
// 组织类型(不论境内境外)都需要注册地址和注册资本
if ((isDomesticOrg(partner) || isForeignOrg(partner)) && StrUtil.isBlank(partner.getCustomerRegaddr())) {
throw new ServiceException("组织类型必须填写注册地址");
}
if ((isDomesticOrg(partner) || isForeignOrg(partner)) && StrUtil.isBlank(partner.getRegCapital())) {
throw new ServiceException("组织类型必须填写注册资本");
}
// ========== 校验联系人 ==========
validateContacts(partner);
}
@@ -209,18 +259,34 @@ public class PartnerDataHandler {
return isDomesticOrg(partner) || isDomesticPerson(partner);
}
/**
* 相对方是否属于境内组织。
* oppositeCharacter = "1" 时表示境内组织。
*/
private boolean isDomesticOrg(PartnerManageDto partner) {
return "1".equals(partner.getOppositeCharacter());
}
/**
* 相对方是否属于境内个人。
* oppositeCharacter = "2" 时表示境内个人。
*/
private boolean isDomesticPerson(PartnerManageDto partner) {
return "2".equals(partner.getOppositeCharacter());
}
/**
* 相对方是否属于境外组织。
* oppositeCharacter = "3" 时表示境外组织。
*/
private boolean isForeignOrg(PartnerManageDto partner) {
return "3".equals(partner.getOppositeCharacter());
}
/**
* 相对方是否属于境外个人。
* oppositeCharacter = "4" 时表示境外个人。
*/
private boolean isForeignPerson(PartnerManageDto partner) {
return "4".equals(partner.getOppositeCharacter());
}
@@ -2,7 +2,6 @@ package com.nbport.zgwl.partner.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nbport.zgwl.common.PageResult;
import com.nbport.zgwl.contractpush.dto.PushPayloadDTO;
import com.nbport.zgwl.exception.ServiceException;
import com.nbport.zgwl.partner.dto.PartnerContactDto;
import com.nbport.zgwl.partner.dto.PartnerManageDto;
@@ -40,9 +39,9 @@ public class PartnerManageServiceImpl implements PartnerManageService {
@Override
public PageResult<PartnerManageDto> queryPartnerList(PartnerQueryDto queryDto) {
Page<PartnerManageDto> page = new Page<>(queryDto.getPageNo(), queryDto.getPageSize());
PageResult<PartnerManageDto> pageResult = new PageResult<>(
partnerManageMapper.selectPartnerPage(page, queryDto));
attachContacts(pageResult.getRecords());
Page<PartnerManageDto> resultPage = (Page<PartnerManageDto>) partnerManageMapper.selectPartnerPage(page, queryDto);
PageResult<PartnerManageDto> pageResult = new PageResult<>(resultPage);
attachContacts(pageResult.getData());
return pageResult;
}
@@ -78,6 +77,7 @@ public class PartnerManageServiceImpl implements PartnerManageService {
partner.setUpdateTime(now);
partner.setIsDeleted(PartnerManageConstants.PARTNER_IS_DELETED_NORMAL);
partnerManageMapper.insertPartner(partner);
saveContacts(partner.getCustomerSysid(), partner.getContacts(), now);
return partner.getCustomerSysid();
@@ -29,7 +29,8 @@ public class StudentService {
try {
log.info("学生分页查询,user={}, queryDto={}", user, queryDto);
Page<Map<String, Object>> page = new Page<>(queryDto.getPageNo(), queryDto.getPageSize());
return new PageResult<>(studentMapper.queryList(page, queryDto));
Page<Map<String, Object>> resultPage = (Page<Map<String, Object>>) studentMapper.queryList(page, queryDto);
return new PageResult<>(resultPage);
} catch (Exception e) {
log.error("分页查询学生失败", e);
throw new ServiceException("分页查询失败");
@@ -12,7 +12,6 @@
<result property="templateName" column="template_name"/>
<result property="source" column="source"/>
<result property="contractType" column="contract_type"/>
<result property="selfPartyRole" column="self_party_role"/>
<result property="version" column="version"/>
<result property="status" column="status"/>
<result property="variableCount" column="variable_count"/>
@@ -82,7 +81,7 @@
)
values
(
#{id}, #{templateCode}, #{templateName}, #{source}, #{contractType}, #{selfPartyRole},
#{id}, #{templateCode}, #{templateName}, #{source}, #{contractType},
#{version}, #{status}, #{variableCount}, #{description}, #{usageTip},
#{templateFileName}, #{templateFilePath},
#{publishOrgIdsJson}, #{publishOrgNamesJson}, #{variableMappingsJson},
@@ -96,7 +95,6 @@
template_name = #{templateName},
source = #{source},
contract_type = #{contractType},
self_party_role = #{selfPartyRole},
version = #{version},
status = #{status},
variable_count = #{variableCount},