From 86966e75d9d8366d1e1e2610284d7a52c08428e9 Mon Sep 17 00:00:00 2001 From: zhangwenzan Date: Tue, 29 Jul 2025 16:14:18 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E6=95=B0=E6=8D=AE=E5=8A=A0?= =?UTF-8?q?=E5=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/security/EncryptionService.java | 2 +- .../converter/SensitiveDataConverter.java | 12 +++-- .../kakarote/crm/constant/CrmCodeEnum.java | 1 + .../kakarote/crm/entity/PO/CrmContacts.java | 7 +++ .../crm/service/ICrmOpenApiService.java | 2 +- .../service/impl/CrmCustomerServiceImpl.java | 50 ++++++++++++++--- .../service/impl/CrmOpenApiServiceImpl.java | 54 +++++++++++++++---- 7 files changed, 106 insertions(+), 22 deletions(-) diff --git a/core/src/main/java/com/kakarote/core/security/EncryptionService.java b/core/src/main/java/com/kakarote/core/security/EncryptionService.java index 4bf10e7..1b2ba04 100644 --- a/core/src/main/java/com/kakarote/core/security/EncryptionService.java +++ b/core/src/main/java/com/kakarote/core/security/EncryptionService.java @@ -78,7 +78,7 @@ public class EncryptionService { // 解码Base64密文 byte[] decoded = Base64.getDecoder().decode(ciphertext); - // 提取IV + // 提取IV(固定取前12字节) byte[] iv = new byte[GCM_IV_LENGTH]; System.arraycopy(decoded, 0, iv, 0, iv.length); diff --git a/core/src/main/java/com/kakarote/core/security/converter/SensitiveDataConverter.java b/core/src/main/java/com/kakarote/core/security/converter/SensitiveDataConverter.java index bbb288d..9382b18 100644 --- a/core/src/main/java/com/kakarote/core/security/converter/SensitiveDataConverter.java +++ b/core/src/main/java/com/kakarote/core/security/converter/SensitiveDataConverter.java @@ -48,7 +48,8 @@ public class SensitiveDataConverter extends AbstractJsonTypeHandler impl @Override public void setNonNullParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException { if (s != null && !s.isEmpty() && !s.startsWith(Const.ENCRYPTED_PREFIX)) { - s = getEncryptionService().encryptAes(s); + // 加密后添加前缀标识 + s = Const.ENCRYPTED_PREFIX + getEncryptionService().encryptAes(s); } preparedStatement.setString(i, s); } @@ -57,7 +58,8 @@ public class SensitiveDataConverter extends AbstractJsonTypeHandler impl public String getNullableResult(ResultSet resultSet, String s) throws SQLException { String value = resultSet.getString(s); if (value != null && value.startsWith(Const.ENCRYPTED_PREFIX)) { - value = getEncryptionService().decryptAes(value); + // 修复:移除前缀后再解密 + value = getEncryptionService().decryptAes(value.substring(Const.ENCRYPTED_PREFIX.length())); } return value; } @@ -66,7 +68,8 @@ public class SensitiveDataConverter extends AbstractJsonTypeHandler impl public String getNullableResult(ResultSet resultSet, int i) throws SQLException { String value = resultSet.getString(i); if (value != null && value.startsWith(Const.ENCRYPTED_PREFIX)) { - value = getEncryptionService().decryptAes(value); + // 修复:移除前缀后再解密 + value = getEncryptionService().decryptAes(value.substring(Const.ENCRYPTED_PREFIX.length())); } return value; } @@ -75,7 +78,8 @@ public class SensitiveDataConverter extends AbstractJsonTypeHandler impl public String getNullableResult(CallableStatement callableStatement, int i) throws SQLException { String value = callableStatement.getString(i); if (value != null && value.startsWith(Const.ENCRYPTED_PREFIX)) { - value = getEncryptionService().decryptAes(value); + // 修复:移除前缀后再解密 + value = getEncryptionService().decryptAes(value.substring(Const.ENCRYPTED_PREFIX.length())); } return value; } diff --git a/crm/src/main/java/com/kakarote/crm/constant/CrmCodeEnum.java b/crm/src/main/java/com/kakarote/crm/constant/CrmCodeEnum.java index a145c7e..6b86a2e 100644 --- a/crm/src/main/java/com/kakarote/crm/constant/CrmCodeEnum.java +++ b/crm/src/main/java/com/kakarote/crm/constant/CrmCodeEnum.java @@ -99,6 +99,7 @@ public enum CrmCodeEnum implements ResultCode { THE_FIELD_DETAIL_TABLE_FORMAT_ERROR(2089,"清设置表格内的具体字段!"), CRM_RECEIVABLES_PLAN_ADD_ERROR(2090,"只有审核通过或审核中的合同才可以添加回款计划!"), CRM_CUSTOMER_POOL_NOT_IS_ADMIN(2091, "没有该公海权限,不能进行操作"), + CUSTOMER_XX_Y(2092, "客户信息已存在,无法重复添加"), ; diff --git a/crm/src/main/java/com/kakarote/crm/entity/PO/CrmContacts.java b/crm/src/main/java/com/kakarote/crm/entity/PO/CrmContacts.java index 9deab68..ba5ed77 100644 --- a/crm/src/main/java/com/kakarote/crm/entity/PO/CrmContacts.java +++ b/crm/src/main/java/com/kakarote/crm/entity/PO/CrmContacts.java @@ -1,11 +1,13 @@ package com.kakarote.crm.entity.PO; import com.baomidou.mybatisplus.annotation.*; +import com.kakarote.core.security.converter.SensitiveDataConverter; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import org.apache.ibatis.type.JdbcType; import java.io.Serializable; import java.util.Date; @@ -37,12 +39,17 @@ public class CrmContacts implements Serializable { private Date nextTime; @ApiModelProperty(value = "手机") + @TableField(typeHandler = SensitiveDataConverter.class, jdbcType = JdbcType.VARCHAR) private String mobile; @ApiModelProperty(value = "电话") + @TableField(typeHandler = SensitiveDataConverter.class, jdbcType = JdbcType.VARCHAR) + private String telephone; @ApiModelProperty(value = "电子邮箱") + @TableField(typeHandler = SensitiveDataConverter.class, jdbcType = JdbcType.VARCHAR) + private String email; @ApiModelProperty(value = "职务") diff --git a/crm/src/main/java/com/kakarote/crm/service/ICrmOpenApiService.java b/crm/src/main/java/com/kakarote/crm/service/ICrmOpenApiService.java index 00a9adc..f07ac1d 100644 --- a/crm/src/main/java/com/kakarote/crm/service/ICrmOpenApiService.java +++ b/crm/src/main/java/com/kakarote/crm/service/ICrmOpenApiService.java @@ -8,7 +8,7 @@ public interface ICrmOpenApiService { Integer openAddCustomerBo(CrmAddCustomerBo crmAddCustomerBo); //添加用户 - void crmAddCustomer(CrmBusinessSaveBO crmModel,String source); + Integer crmAddCustomer(CrmBusinessSaveBO crmModel, String source); CrmBusinessSaveBO assemblyRequestData(CrmQdInfoBo crmModel); } diff --git a/crm/src/main/java/com/kakarote/crm/service/impl/CrmCustomerServiceImpl.java b/crm/src/main/java/com/kakarote/crm/service/impl/CrmCustomerServiceImpl.java index 0591c7a..ca6776c 100644 --- a/crm/src/main/java/com/kakarote/crm/service/impl/CrmCustomerServiceImpl.java +++ b/crm/src/main/java/com/kakarote/crm/service/impl/CrmCustomerServiceImpl.java @@ -334,8 +334,7 @@ public class CrmCustomerServiceImpl extends BaseServiceImpl queryContacts(CrmContactsPageBO pageEntity) { BasePage contactsBasePage = pageEntity.parse(); String conditions = AuthUtil.getCrmAuthSql(CrmEnum.CONTACTS, 1,CrmAuthEnum.READ); - return getBaseMapper().queryContacts(contactsBasePage, pageEntity.getCustomerId(), pageEntity.getSearch(), conditions); + BasePage result = getBaseMapper().queryContacts(contactsBasePage, pageEntity.getCustomerId(), pageEntity.getSearch(), conditions); + + // 手动解密敏感数据 + for (CrmContacts contacts : result.getList()) { + // 恢复前缀检查并增加异常处理 + if (contacts.getMobile() != null && contacts.getMobile().startsWith(Const.ENCRYPTED_PREFIX)) { + try { + contacts.setMobile(encryptionService.decryptAes(contacts.getMobile())); + } catch (Exception e) { + log.error("解密mobile失败: {}", contacts.getContactsId(), e); + contacts.setMobile(null); // 或保留原始值 + } + } + // 对telephone和email字段执行相同修复 + if (contacts.getTelephone() != null && contacts.getTelephone().startsWith(Const.ENCRYPTED_PREFIX)) { + try { + contacts.setTelephone(encryptionService.decryptAes(contacts.getTelephone())); + } catch (Exception e) { + log.error("解密telephone失败: {}", contacts.getContactsId(), e); + contacts.setTelephone(null); + } + } + if (contacts.getEmail() != null && contacts.getEmail().startsWith(Const.ENCRYPTED_PREFIX)) { + try { + contacts.setEmail(encryptionService.decryptAes(contacts.getEmail())); + } catch (Exception e) { + log.error("解密email失败: {}", contacts.getContactsId(), e); + contacts.setEmail(null); + } + } + } + + return result; } @Autowired diff --git a/crm/src/main/java/com/kakarote/crm/service/impl/CrmOpenApiServiceImpl.java b/crm/src/main/java/com/kakarote/crm/service/impl/CrmOpenApiServiceImpl.java index 3edc346..f18d513 100644 --- a/crm/src/main/java/com/kakarote/crm/service/impl/CrmOpenApiServiceImpl.java +++ b/crm/src/main/java/com/kakarote/crm/service/impl/CrmOpenApiServiceImpl.java @@ -1,14 +1,9 @@ package com.kakarote.crm.service.impl; -import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.kakarote.core.exception.CrmException; -import com.kakarote.crm.entity.BO.CrmAddCustomerBo; -import com.kakarote.crm.entity.BO.CrmBusinessSaveBO; -import com.kakarote.crm.entity.BO.CrmCustomerPoolBO; -import com.kakarote.crm.entity.BO.CrmQdInfoBo; -import com.kakarote.crm.entity.PO.CrmCustomer; +import com.kakarote.crm.entity.BO.*; import com.kakarote.crm.entity.VO.CrmModelFiledVO; -import com.kakarote.crm.mapper.CrmFieldMapper; +import com.kakarote.crm.service.ICrmContactsService; import com.kakarote.crm.service.ICrmCustomerService; import com.kakarote.crm.service.ICrmOpenApiService; import lombok.extern.slf4j.Slf4j; @@ -18,6 +13,7 @@ import org.springframework.stereotype.Service; import java.util.*; import static com.kakarote.core.common.SystemCodeEnum.SYSTEM_NO_AUTH; +import static com.kakarote.crm.constant.CrmCodeEnum.CUSTOMER_XX_Y; import static com.kakarote.crm.constant.CrmPoolEnum.GSMGWZKH; import static com.kakarote.crm.constant.CrmPoolEnum.PXQDMDPOOL; @@ -27,6 +23,9 @@ public class CrmOpenApiServiceImpl implements ICrmOpenApiService { @Autowired private ICrmCustomerService customerService; + @Autowired + private ICrmContactsService contactsService; + //V1 @Override public Integer openAddCustomerBo(CrmAddCustomerBo crmAddCustomerBo) { @@ -174,16 +173,50 @@ public class CrmOpenApiServiceImpl implements ICrmOpenApiService { list.add(fliedBcethz); crmBusinessSaveBO.setField(list); //添加数据 - crmAddCustomer(crmBusinessSaveBO,crmModel.getSource()); + Integer customerId = crmAddCustomer(crmBusinessSaveBO, crmModel.getSource()); + //添加联系人 + CrmContactsSaveBO contactsSaveBO = new CrmContactsSaveBO(); + Map contacts = new HashMap<>(); + contacts.put("customerId",customerId); + contacts.put("name",crmModel.getUserName()); + contacts.put("mobile",crmModel.getMobile()); + contacts.put("telephone",crmModel.getMobile()); + contacts.put("address",crmModel.getAddress()); + contacts.put("email",""); + contacts.put("post",""); + contacts.put("nextTime",""); + contacts.put("remark",""); + contactsSaveBO.setEntity(contacts); + + List modelFileds = new ArrayList<>(); + + CrmModelFiledVO policymakers =new CrmModelFiledVO(); + policymakers.setFieldId(1101853); + policymakers.setFieldName("policymakers"); + policymakers.setName("是否关键决策人"); + policymakers.setFieldType(2); + policymakers.setType(3); + modelFileds.add(policymakers); + + CrmModelFiledVO sex =new CrmModelFiledVO(); + sex.setFieldId(1101857); + sex.setFieldName("sex"); + sex.setName("性别"); + sex.setFieldType(2); + sex.setType(3); + modelFileds.add(sex); + + contactsSaveBO.setField(modelFileds); + contactsService.addOrUpdate(contactsSaveBO,false); return crmBusinessSaveBO; } - public void crmAddCustomer(CrmBusinessSaveBO crmModel,String source){ + public Integer crmAddCustomer(CrmBusinessSaveBO crmModel, String source){ //判断企业是否存在 Integer customerByQyjbxx = customerService.getCustomerByQyjbxx(crmModel); //存在用户 if (customerByQyjbxx >0){ - + throw new CrmException(CUSTOMER_XX_Y); }else { //添加客户 Map stringObjectMap = customerService.addOrUpdate(crmModel, false, null); @@ -199,6 +232,7 @@ public class CrmOpenApiServiceImpl implements ICrmOpenApiService { poolBO.setPoolId(GSMGWZKH.getId()); } customerService.updateCustomerByIds(poolBO); + return customerId; } }