From ff41f9a13e981b543c114336058150c940110393 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期五, 17 四月 2026 16:24:25 +0800
Subject: [PATCH] fix: 修复客户档案的导入、新增、编辑的的数据验证
---
src/main/java/com/ruoyi/basic/dto/CustomerImportDto.java | 109 +++++++++++++++++++++
src/main/java/com/ruoyi/basic/controller/CustomerController.java | 9 +
src/main/java/com/ruoyi/basic/service/ICustomerService.java | 2
src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java | 140 ++++++++++++++++++++++++---
4 files changed, 239 insertions(+), 21 deletions(-)
diff --git a/src/main/java/com/ruoyi/basic/controller/CustomerController.java b/src/main/java/com/ruoyi/basic/controller/CustomerController.java
index 033c5ec..e5dc224 100644
--- a/src/main/java/com/ruoyi/basic/controller/CustomerController.java
+++ b/src/main/java/com/ruoyi/basic/controller/CustomerController.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.CustomerDto;
+import com.ruoyi.basic.dto.CustomerImportDto;
import com.ruoyi.basic.pojo.Customer;
import com.ruoyi.basic.service.ICustomerService;
import com.ruoyi.common.utils.poi.ExcelUtil;
@@ -50,14 +51,14 @@
} else {
list = customerService.selectCustomerLists(customer);
}
- ExcelUtil<Customer> util = new ExcelUtil<Customer>(Customer.class);
+ ExcelUtil<Customer> util = new ExcelUtil<>(Customer.class);
util.exportExcel(response, list, "瀹㈡埛妗f鏁版嵁");
}
@PostMapping("/downloadTemplate")
@Log(title = "瀹㈡埛妗f-涓嬭浇妯℃澘", businessType = BusinessType.EXPORT)
public void downloadTemplate(HttpServletResponse response) {
- ExcelUtil<Customer> util = new ExcelUtil<Customer>(Customer.class);
+ ExcelUtil<CustomerImportDto> util = new ExcelUtil<>(CustomerImportDto.class);
util.importTemplateExcel(response, "瀹㈡埛妗f妯℃澘");
}
@@ -68,8 +69,8 @@
@Log(title = "瀹㈡埛妗f", businessType = BusinessType.IMPORT)
@PostMapping("/importData")
public AjaxResult importData(MultipartFile file) throws Exception {
-
- return customerService.importData(file);
+ customerService.importData(file);
+ return AjaxResult.success();
}
/**
diff --git a/src/main/java/com/ruoyi/basic/dto/CustomerImportDto.java b/src/main/java/com/ruoyi/basic/dto/CustomerImportDto.java
new file mode 100644
index 0000000..0bb8792
--- /dev/null
+++ b/src/main/java/com/ruoyi/basic/dto/CustomerImportDto.java
@@ -0,0 +1,109 @@
+package com.ruoyi.basic.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <br>
+ * 瀹㈡埛瀵煎叆Dto
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/4/17 15:15
+ */
+@Data
+@ApiModel(value = "CustomerImportDto", description = "瀹㈡埛瀵煎叆Dto")
+public class CustomerImportDto implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 瀹㈡埛鍚嶇О
+ */
+ @Excel(name = "瀹㈡埛鍚嶇О")
+ @ApiModelProperty("绾崇◣浜鸿瘑鍒彿")
+ private String customerName;
+
+
+ /**
+ * 瀹㈡埛鍦板尯
+ */
+ @Excel(name = "瀹㈡埛鍦板尯(澶氱骇浠�-鍒嗗壊)")
+ @ApiModelProperty("瀹㈡埛鍦板尯")
+ private String customRegions;
+
+ /**
+ * 瀹㈡埛鍒嗙被锛氶浂鍞鎴凤紝杩涢攢鍟嗗鎴�
+ */
+ @Excel(name = "瀹㈡埛鍒嗙被")
+ @ApiModelProperty("绾崇◣浜鸿瘑鍒彿")
+ private String customerType;
+
+ /**
+ * 绾崇◣浜鸿瘑鍒彿
+ */
+ @Excel(name = "绾崇◣浜鸿瘑鍒彿")
+ @ApiModelProperty("绾崇◣浜鸿瘑鍒彿")
+ private String taxpayerIdentificationNumber;
+
+ /**
+ * 鍏徃鍦板潃
+ */
+ @Excel(name = "鍏徃鍦板潃")
+ @ApiModelProperty("鍏徃鍦板潃")
+ private String companyAddress;
+
+ /**
+ * 鍏徃鐢佃瘽
+ */
+ @Excel(name = "鍏徃鐢佃瘽")
+ @ApiModelProperty("鍏徃鐢佃瘽")
+ private String companyPhone;
+
+ /**
+ * 鑱旂郴浜�
+ */
+ @Excel(name = "鑱旂郴浜�")
+ @ApiModelProperty("鑱旂郴浜�")
+ private String contactPerson;
+
+ /**
+ * 鑱旂郴鐢佃瘽
+ */
+ @ApiModelProperty("鑱旂郴鐢佃瘽")
+ @Excel(name = "鑱旂郴鐢佃瘽", cellType = Excel.ColumnType.STRING)
+ private String contactPhone;
+
+ /**
+ * 缁存姢浜�
+ */
+ @Excel(name = "缁存姢浜�")
+ @ApiModelProperty("缁存姢浜�")
+ private String maintainer;
+
+ /**
+ * 缁存姢鏃堕棿
+ */
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ @Excel(name = "缁存姢鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd")
+ private Date maintenanceTime;
+
+ @ApiModelProperty(value = "閾惰鍩烘湰鎴�")
+ @Excel(name = "閾惰鍩烘湰鎴�")
+ private String basicBankAccount;
+
+ @ApiModelProperty(value = "閾惰璐﹀彿")
+ @Excel(name = "閾惰璐﹀彿")
+ private String bankAccount;
+
+ @ApiModelProperty(value = "寮�鎴疯鍙�")
+ @Excel(name = "寮�鎴疯鍙�")
+ private String bankCode;
+
+}
diff --git a/src/main/java/com/ruoyi/basic/service/ICustomerService.java b/src/main/java/com/ruoyi/basic/service/ICustomerService.java
index 1ba4f51..c87b14f 100644
--- a/src/main/java/com/ruoyi/basic/service/ICustomerService.java
+++ b/src/main/java/com/ruoyi/basic/service/ICustomerService.java
@@ -77,5 +77,5 @@
List<Customer> selectCustomerLists(Customer customer);
- AjaxResult importData(MultipartFile file);
+ void importData(MultipartFile file);
}
diff --git a/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
index 20ede93..5083192 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
@@ -8,18 +8,16 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.dto.CustomerDto;
-import com.ruoyi.basic.dto.CustomerFollowUpDto;
+import com.ruoyi.basic.dto.CustomerImportDto;
import com.ruoyi.basic.mapper.CustomerMapper;
import com.ruoyi.basic.pojo.Customer;
-import com.ruoyi.basic.pojo.CustomerFollowUp;
-import com.ruoyi.basic.pojo.CustomerFollowUpFile;
import com.ruoyi.basic.pojo.CustomerRegions;
import com.ruoyi.basic.service.*;
+import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.security.LoginUser;
-import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.sales.mapper.SalesLedgerMapper;
import com.ruoyi.sales.pojo.SalesLedger;
import lombok.AllArgsConstructor;
@@ -30,10 +28,7 @@
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
import java.util.stream.Collectors;
@@ -47,6 +42,7 @@
@AllArgsConstructor
@Slf4j
public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> implements ICustomerService {
+ private static final Set<String> ALLOWED_CUSTOMER_TYPES = new HashSet<>(Arrays.asList("闆跺敭瀹㈡埛", "杩涢攢鍟嗗鎴�"));
private final SalesLedgerMapper salesLedgerMapper;
private CustomerMapper customerMapper;
@@ -205,6 +201,7 @@
LoginUser loginUser = SecurityUtils.getLoginUser();
Long tenantId = loginUser.getTenantId();
customer.setTenantId(tenantId);
+ validateCustomerNameUnique(customer, null);
return customerMapper.insert(customer);
}
@@ -219,6 +216,7 @@
LoginUser loginUser = SecurityUtils.getLoginUser();
Long tenantId = loginUser.getTenantId();
customer.setTenantId(tenantId);
+ validateCustomerNameUnique(customer, customer.getId());
return customerMapper.updateById(customer);
}
@@ -258,20 +256,130 @@
}
@Override
- public AjaxResult importData(MultipartFile file) {
+ @Transactional(rollbackFor = Exception.class)
+ public void importData(MultipartFile file) {
+ List<CustomerImportDto> userList;
try {
- ExcelUtil<Customer> util = new ExcelUtil<Customer>(Customer.class);
- List<Customer> userList = util.importExcel(file.getInputStream());
+ ExcelUtil<CustomerImportDto> util = new ExcelUtil<>(CustomerImportDto.class);
+ userList = util.importExcel(file.getInputStream());
if (CollectionUtils.isEmpty(userList)) {
- return AjaxResult.warn("妯℃澘閿欒鎴栧鍏ユ暟鎹负绌�");
+ throw new ServiceException("妯℃澘閿欒鎴栧鍏ユ暟鎹负绌�");
}
- this.saveOrUpdateBatch(userList);
- return AjaxResult.success(true);
} catch (Exception e) {
- e.printStackTrace();
- return AjaxResult.error("瀵煎叆澶辫触");
+ log.error("瀹㈡埛瀵煎叆澶辫触: {}", e.getMessage());
+ throw new ServiceException("瀵煎叆澶辫触");
}
+ List<Customer> customers = new ArrayList<>();
+ Customer customer;
+ int rowIndex = 1;
+ Set<String> importedCustomerRegionNames = new HashSet<>();
+ for (CustomerImportDto user : userList) {
+ customer = new Customer();
+ if (user == null) {
+ throw new ServiceException("瀵煎叆澶辫触,绗��" + rowIndex + "銆戣鏁版嵁涓嶈兘涓虹┖");
+ }
+ if (StringUtils.isEmpty(user.getCustomerName())) {
+ throw new ServiceException("瀵煎叆澶辫触,绗�" + rowIndex + "琛屾暟鎹�愬鎴峰悕绉般�戜笉鑳戒负绌�");
+ }
+ String customerName = user.getCustomerName().trim();
+ customer.setCustomerName(customerName);
+ String customerType = user.getCustomerType() == null ? null : user.getCustomerType().trim();
+ if (!StringUtils.isEmpty(customerType) && !ALLOWED_CUSTOMER_TYPES.contains(customerType)) {
+ throw new ServiceException("瀵煎叆澶辫触,绗�" + rowIndex + "琛屾暟鎹�愬鎴峰垎绫汇�戜粎鏀寔锛氶浂鍞鎴枫�佽繘閿�鍟嗗鎴�");
+ }
+ customer.setCustomerType(customerType);
+ customer.setTaxpayerIdentificationNumber(user.getTaxpayerIdentificationNumber());
+ customer.setCompanyAddress(user.getCompanyAddress());
+ customer.setCompanyPhone(user.getCompanyPhone());
+ customer.setContactPerson(user.getContactPerson());
+ customer.setContactPhone(user.getContactPhone());
+ customer.setMaintainer(user.getMaintainer());
+ customer.setMaintenanceTime(user.getMaintenanceTime());
+ customer.setBasicBankAccount(user.getBasicBankAccount());
+ customer.setBankAccount(user.getBankAccount());
+ customer.setBankCode(user.getBankCode());
+ if (StringUtils.isEmpty(user.getCustomRegions())) {
+ throw new ServiceException("瀵煎叆澶辫触,绗�" + rowIndex + "琛屾暟鎹�愬鎴峰湴鍖恒�戜笉鑳戒负绌�");
+ }
+ Long regionsId = resolveRegionId(user.getCustomRegions(), rowIndex);
+ customer.setRegionsId(regionsId);
+ String importUniqueKey = customerName + "_" + (customer.getRegionsId() == null ? "NULL" : customer.getRegionsId());
+ if (importedCustomerRegionNames.contains(importUniqueKey)) {
+ throw new ServiceException("瀵煎叆澶辫触,绗�" + rowIndex + "琛屾暟鎹�愬悓鍦板尯瀹㈡埛鍚嶇О銆戦噸澶�");
+ }
+ importedCustomerRegionNames.add(importUniqueKey);
+ validateCustomerNameUnique(customer, null);
+ customers.add(customer);
+ rowIndex++;
+ }
+ if (CollectionUtils.isEmpty(customers)) {
+ throw new ServiceException("瀵煎叆澶辫触,鏈瘑鍒埌鍙鍏ョ殑鏁版嵁");
+ }
+ this.saveBatch(customers);
+ }
+
+ /**
+ * 鎸� 鈥渪x-xx-xx鈥� 灞傜骇瑙f瀽鍦板尯锛屼笉瀛樺湪鍒欐寜鐖剁骇閫愮骇鍒涘缓銆�
+ */
+ private Long resolveRegionId(String regionsPath, int rowIndex) {
+ if (StringUtils.isEmpty(regionsPath)) {
+ throw new ServiceException("瀵煎叆澶辫触,绗�" + rowIndex + "琛屾暟鎹�愬鎴峰湴鍖恒�戜笉鑳戒负绌�");
+ }
+ String normalizedPath = regionsPath.trim().replace("鈥�", "-").replace("锛�", "-");
+ if (!normalizedPath.matches("^[^-]+(?:-[^-]+)*$")) {
+ throw new ServiceException("瀵煎叆澶辫触,绗�" + rowIndex + "琛屾暟鎹�愬鎴峰湴鍖恒�戞牸寮忛敊璇�,浠呮敮鎸侊細xxx 鎴� xxx-xxx-xxx");
+ }
+ String[] regionParts = normalizedPath.split("-");
+ Long parentId = 0L;
+ Long currentId = null;
+ for (String rawPart : regionParts) {
+ String regionName = rawPart == null ? null : rawPart.trim();
+ if (StringUtils.isEmpty(regionName)) {
+ throw new ServiceException("瀵煎叆澶辫触,绗�" + rowIndex + "琛屾暟鎹�愬鎴峰湴鍖恒�戞牸寮忛敊璇�");
+ }
+ CustomerRegions region = customerRegionsService.getOne(new LambdaQueryWrapper<CustomerRegions>()
+ .eq(CustomerRegions::getRegionsName, regionName)
+ .last("limit 1"));
+ if (region == null) {
+ region = new CustomerRegions();
+ region.setParentId(parentId);
+ region.setRegionsName(regionName);
+ if (!customerRegionsService.save(region)) {
+ throw new ServiceException("瀵煎叆澶辫触,绗�" + rowIndex + "琛屾暟鎹�愬鎴峰湴鍖恒�戝垱寤哄け璐�");
+ }
+ }
+ currentId = region.getId();
+ parentId = currentId;
+ }
+ return currentId;
+ }
+
+ private void validateCustomerNameUnique(Customer customer, Long excludeId) {
+ if (customer == null || StringUtils.isEmpty(customer.getCustomerName())) {
+ throw new ServiceException("瀹㈡埛鍚嶇О涓嶈兘涓虹┖");
+ }
+ if (customer.getRegionsId() == null) {
+ throw new ServiceException("瀹㈡埛鍦板尯涓嶈兘涓虹┖");
+ }
+ String customerName = customer.getCustomerName().trim();
+ LambdaQueryWrapper<Customer> queryWrapper = new LambdaQueryWrapper<Customer>().eq(Customer::getCustomerName, customerName);
+ if (customer.getRegionsId() == null) {
+ queryWrapper.isNull(Customer::getRegionsId);
+ } else {
+ queryWrapper.eq(Customer::getRegionsId, customer.getRegionsId());
+ }
+ if (customer.getTenantId() != null) {
+ queryWrapper.eq(Customer::getTenantId, customer.getTenantId());
+ }
+ if (excludeId != null) {
+ queryWrapper.ne(Customer::getId, excludeId);
+ }
+ Long exists = customerMapper.selectCount(queryWrapper);
+ if (exists != null && exists > 0) {
+ throw new ServiceException("鍚屽湴鍖轰笅瀹㈡埛鍚嶇О宸插瓨鍦�,璇峰嬁閲嶅");
+ }
+ customer.setCustomerName(customerName);
}
@Override
--
Gitblit v1.9.3