From 41b041d72e7451595f9d3e2c25549e57444164fa Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期五, 27 三月 2026 14:03:33 +0800
Subject: [PATCH] feat: 客户档案修改为按照地区进行区分
---
src/main/resources/mapper/basic/CustomerRegionsMapper.xml | 13 +
src/main/java/com/ruoyi/basic/mapper/CustomerRegionsMapper.java | 16 +
src/main/java/com/ruoyi/basic/pojo/Customer.java | 9
src/main/java/com/ruoyi/basic/controller/CustomerRegionsController.java | 58 +++++
src/main/java/com/ruoyi/basic/service/impl/CustomerRegionsServiceImpl.java | 216 +++++++++++++++++++++
src/main/java/com/ruoyi/basic/pojo/CustomerRegions.java | 45 ++++
src/main/java/com/ruoyi/basic/service/ICustomerService.java | 5
doc/河南鹤壁天沐钢化玻璃厂.sql | 25 ++
src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java | 121 ++++++------
src/main/java/com/ruoyi/basic/dto/CustomerDto.java | 7
src/main/java/com/ruoyi/basic/dto/CustomerRegionsTreeDto.java | 43 ++++
src/main/java/com/ruoyi/basic/controller/CustomerController.java | 10
src/main/java/com/ruoyi/basic/service/ICustomerRegionsService.java | 28 ++
13 files changed, 520 insertions(+), 76 deletions(-)
diff --git "a/doc/\346\262\263\345\215\227\351\271\244\345\243\201\345\244\251\346\262\220\351\222\242\345\214\226\347\216\273\347\222\203\345\216\202.sql" "b/doc/\346\262\263\345\215\227\351\271\244\345\243\201\345\244\251\346\262\220\351\222\242\345\214\226\347\216\273\347\222\203\345\216\202.sql"
index bfad117..4971c0a 100644
--- "a/doc/\346\262\263\345\215\227\351\271\244\345\243\201\345\244\251\346\262\220\351\222\242\345\214\226\347\216\273\347\222\203\345\216\202.sql"
+++ "b/doc/\346\262\263\345\215\227\351\271\244\345\243\201\345\244\251\346\262\220\351\222\242\345\214\226\347\216\273\347\222\203\345\216\202.sql"
@@ -61,4 +61,27 @@
ALTER TABLE `product-inventory-management-hbtmblc`.`process_route_item`
MODIFY COLUMN `product_model_id` bigint NULL DEFAULT 0 COMMENT '浜у搧id' AFTER `route_id`,
MODIFY COLUMN `process_id` bigint NULL DEFAULT 0 COMMENT '宸ュ簭id' AFTER `product_model_id`,
- ADD COLUMN `process_name` varchar(255) NULL COMMENT '宸ュ簭鍚嶇О' AFTER `process_id`;
\ No newline at end of file
+ ADD COLUMN `process_name` varchar(255) NULL COMMENT '宸ュ簭鍚嶇О' AFTER `process_id`;
+
+-- ----------------------------
+-- Table structure for customer_regions
+-- ----------------------------
+DROP TABLE IF EXISTS `customer_regions`;
+CREATE TABLE `customer_regions`
+(
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '涓婚敭ID',
+ `parent_id` bigint NULL DEFAULT NULL COMMENT '鐖剁被ID',
+ `regions_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '鍦板尯鍚嶇О',
+ `tenant_id` bigint NULL DEFAULT NULL COMMENT '绉熸埛ID',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB
+ CHARACTER SET = utf8mb3
+ COLLATE = utf8mb3_general_ci
+ ROW_FORMAT = Dynamic;
+
+SET FOREIGN_KEY_CHECKS = 1;
+
+ALTER TABLE `product-inventory-management-hbtmblc`.`customer_regions` COMMENT = '瀹㈡埛鍦板尯琛�';
+
+ALTER TABLE `product-inventory-management-hbtmblc`.`customer`
+ ADD COLUMN `regions_id` bigint NULL COMMENT '鍦板尯ID' AFTER `regions`;
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/basic/controller/CustomerController.java b/src/main/java/com/ruoyi/basic/controller/CustomerController.java
index 6801abf..033c5ec 100644
--- a/src/main/java/com/ruoyi/basic/controller/CustomerController.java
+++ b/src/main/java/com/ruoyi/basic/controller/CustomerController.java
@@ -2,6 +2,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.pojo.Customer;
import com.ruoyi.basic.service.ICustomerService;
import com.ruoyi.common.utils.poi.ExcelUtil;
@@ -9,7 +10,6 @@
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
-import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -33,7 +33,7 @@
* 鏌ヨ瀹㈡埛妗f鍒楄〃
*/
@GetMapping("/list")
- public IPage<Customer> list(Page<Customer> page, Customer customer) {
+ public IPage<CustomerDto> list(Page<Customer> page, Customer customer) {
return customerService.selectCustomerList(page, customer);
}
@@ -118,10 +118,4 @@
return customerService.customerList(customer);
}
- @GetMapping("/regions")
- @ApiOperation("鑾峰彇瀹㈡埛鍦板尯")
- public AjaxResult getRegions() {
- List<String> regionsList = customerService.regionsList();
- return AjaxResult.success(regionsList);
- }
}
diff --git a/src/main/java/com/ruoyi/basic/controller/CustomerRegionsController.java b/src/main/java/com/ruoyi/basic/controller/CustomerRegionsController.java
new file mode 100644
index 0000000..bdfb014
--- /dev/null
+++ b/src/main/java/com/ruoyi/basic/controller/CustomerRegionsController.java
@@ -0,0 +1,58 @@
+package com.ruoyi.basic.controller;
+
+
+import com.ruoyi.basic.dto.CustomerRegionsTreeDto;
+import com.ruoyi.basic.pojo.CustomerRegions;
+import com.ruoyi.basic.service.ICustomerRegionsService;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 瀹㈡埛鍦板尯琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-27
+ */
+@RestController
+@RequestMapping("/customerRegions")
+public class CustomerRegionsController {
+
+ @Autowired
+ private ICustomerRegionsService customerRegionsService;
+
+ @GetMapping("list")
+ @ApiOperation("瀹㈡埛鍦板尯-鍒楄〃")
+ public AjaxResult customerRegionsList(CustomerRegions customerRegions) {
+ List<CustomerRegionsTreeDto> list = customerRegionsService.customerRegionsList(customerRegions);
+ return AjaxResult.success(list);
+ }
+
+ @PostMapping("/add")
+ @ApiOperation("瀹㈡埛鍦板尯-鏂板")
+ public AjaxResult addCustomerRegions(@RequestBody CustomerRegions customerRegions) {
+ customerRegionsService.addCustomerRegions(customerRegions);
+ return AjaxResult.success();
+ }
+
+ @PutMapping("/update")
+ @ApiOperation("瀹㈡埛鍦板尯-鏇存柊")
+ public AjaxResult updateCustomerRegions(@RequestBody CustomerRegions customerRegions) {
+ customerRegionsService.updateCustomerRegions(customerRegions);
+ return AjaxResult.success();
+ }
+
+ @DeleteMapping("/{id}")
+ @ApiOperation("瀹㈡埛鍦板尯-鍒犻櫎")
+ public AjaxResult delCustomerRegions(@PathVariable Long id) {
+ customerRegionsService.delCustomerRegions(id);
+ return AjaxResult.success();
+ }
+
+
+}
diff --git a/src/main/java/com/ruoyi/basic/dto/CustomerDto.java b/src/main/java/com/ruoyi/basic/dto/CustomerDto.java
index a8161da..bdd0a2d 100644
--- a/src/main/java/com/ruoyi/basic/dto/CustomerDto.java
+++ b/src/main/java/com/ruoyi/basic/dto/CustomerDto.java
@@ -1,6 +1,7 @@
package com.ruoyi.basic.dto;
import com.ruoyi.basic.pojo.Customer;
+import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -21,4 +22,10 @@
private List<CustomerFollowUpDto> followUpList;
+ /**
+ * 鍦板尯
+ */
+ @ApiModelProperty("鍦板尯")
+ private String regionsName;
+
}
diff --git a/src/main/java/com/ruoyi/basic/dto/CustomerRegionsTreeDto.java b/src/main/java/com/ruoyi/basic/dto/CustomerRegionsTreeDto.java
new file mode 100644
index 0000000..8ec8143
--- /dev/null
+++ b/src/main/java/com/ruoyi/basic/dto/CustomerRegionsTreeDto.java
@@ -0,0 +1,43 @@
+package com.ruoyi.basic.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * <br>
+ * 瀹㈡埛鍦板尯鏍戝舰Dto
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/27 11:41
+ */
+@Data
+public class CustomerRegionsTreeDto {
+
+ /**
+ * ID
+ */
+ private Long id;
+
+ /**
+ * 鐖剁被ID
+ */
+ private Long parentId;
+
+ /**
+ * 鍦板尯鍚嶇О
+ */
+ private String regionsName;
+
+ /**
+ * 鍦板尯鏍囩
+ */
+ private String label;
+
+ /**
+ * 瀛愬湴鍖�
+ */
+ private List<CustomerRegionsTreeDto> children;
+}
diff --git a/src/main/java/com/ruoyi/basic/mapper/CustomerRegionsMapper.java b/src/main/java/com/ruoyi/basic/mapper/CustomerRegionsMapper.java
new file mode 100644
index 0000000..aebcaa3
--- /dev/null
+++ b/src/main/java/com/ruoyi/basic/mapper/CustomerRegionsMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.basic.mapper;
+
+import com.ruoyi.basic.pojo.CustomerRegions;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 瀹㈡埛鍦板尯琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-27
+ */
+public interface CustomerRegionsMapper extends BaseMapper<CustomerRegions> {
+
+}
diff --git a/src/main/java/com/ruoyi/basic/pojo/Customer.java b/src/main/java/com/ruoyi/basic/pojo/Customer.java
index af85029..19a0d01 100644
--- a/src/main/java/com/ruoyi/basic/pojo/Customer.java
+++ b/src/main/java/com/ruoyi/basic/pojo/Customer.java
@@ -29,6 +29,12 @@
private Long id;
/**
+ * 鍦板尯ID
+ */
+ @ApiModelProperty("鍦板尯ID")
+ private Long regionsId;
+
+ /**
* 瀹㈡埛鍚嶇О
*/
@Excel(name = "瀹㈡埛鍚嶇О")
@@ -117,7 +123,4 @@
@Excel(name = "寮�鎴疯鍙�")
private String bankCode;
- @ApiModelProperty("鍦板尯")
- @Excel(name = "鍦板尯")
- private String regions;
}
diff --git a/src/main/java/com/ruoyi/basic/pojo/CustomerRegions.java b/src/main/java/com/ruoyi/basic/pojo/CustomerRegions.java
new file mode 100644
index 0000000..a4bcc24
--- /dev/null
+++ b/src/main/java/com/ruoyi/basic/pojo/CustomerRegions.java
@@ -0,0 +1,45 @@
+package com.ruoyi.basic.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 瀹㈡埛鍦板尯琛�
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("customer_regions")
+@ApiModel(value = "CustomerRegions瀵硅薄", description = "瀹㈡埛鍦板尯琛�")
+public class CustomerRegions implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "涓婚敭ID")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ @ApiModelProperty(value = "鐖剁被ID")
+ private Long parentId;
+
+ @ApiModelProperty(value = "鍦板尯鍚嶇О")
+ private String regionsName;
+
+ @ApiModelProperty(value = "绉熸埛ID")
+ @TableField(fill = FieldFill.INSERT)
+ private Long tenantId;
+
+
+}
diff --git a/src/main/java/com/ruoyi/basic/service/ICustomerRegionsService.java b/src/main/java/com/ruoyi/basic/service/ICustomerRegionsService.java
new file mode 100644
index 0000000..ba2a41c
--- /dev/null
+++ b/src/main/java/com/ruoyi/basic/service/ICustomerRegionsService.java
@@ -0,0 +1,28 @@
+package com.ruoyi.basic.service;
+
+import com.ruoyi.basic.dto.CustomerRegionsTreeDto;
+import com.ruoyi.basic.pojo.CustomerRegions;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 瀹㈡埛鍦板尯琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-27
+ */
+public interface ICustomerRegionsService extends IService<CustomerRegions> {
+
+ List<CustomerRegionsTreeDto> customerRegionsList(CustomerRegions customerRegions);
+
+ void addCustomerRegions(CustomerRegions customerRegions);
+
+ void updateCustomerRegions(CustomerRegions customerRegions);
+
+ void delCustomerRegions(Long id);
+
+ List<Long> regionsChildrenIds(Long regionsId);
+}
diff --git a/src/main/java/com/ruoyi/basic/service/ICustomerService.java b/src/main/java/com/ruoyi/basic/service/ICustomerService.java
index 595407c..1ba4f51 100644
--- a/src/main/java/com/ruoyi/basic/service/ICustomerService.java
+++ b/src/main/java/com/ruoyi/basic/service/ICustomerService.java
@@ -40,7 +40,7 @@
* @param customer 瀹㈡埛妗f
* @return 瀹㈡埛妗f闆嗗悎
*/
- IPage<Customer> selectCustomerList(Page<Customer> page, Customer customer);
+ IPage<CustomerDto> selectCustomerList(Page<Customer> page, Customer customer);
/**
* 鏂板瀹㈡埛妗f
@@ -78,7 +78,4 @@
List<Customer> selectCustomerLists(Customer customer);
AjaxResult importData(MultipartFile file);
-
- List<String> regionsList();
-
}
diff --git a/src/main/java/com/ruoyi/basic/service/impl/CustomerRegionsServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/CustomerRegionsServiceImpl.java
new file mode 100644
index 0000000..bafb590
--- /dev/null
+++ b/src/main/java/com/ruoyi/basic/service/impl/CustomerRegionsServiceImpl.java
@@ -0,0 +1,216 @@
+package com.ruoyi.basic.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.dto.CustomerRegionsTreeDto;
+import com.ruoyi.basic.mapper.CustomerMapper;
+import com.ruoyi.basic.mapper.CustomerRegionsMapper;
+import com.ruoyi.basic.pojo.Customer;
+import com.ruoyi.basic.pojo.CustomerRegions;
+import com.ruoyi.basic.service.ICustomerRegionsService;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 瀹㈡埛鍦板尯琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-27
+ */
+@Service
+public class CustomerRegionsServiceImpl extends ServiceImpl<CustomerRegionsMapper, CustomerRegions> implements ICustomerRegionsService {
+
+ @Autowired
+ private CustomerMapper customerMapper;
+
+ /**
+ * 鏌ヨ鏍戝舰鍦板尯鍒楄〃
+ */
+ @Override
+ public List<CustomerRegionsTreeDto> customerRegionsList(CustomerRegions customerRegions) {
+ List<CustomerRegions> allRegions = baseMapper.selectList(null);
+ if (allRegions == null || allRegions.isEmpty()) {
+ return new ArrayList<>();
+ }
+
+ Map<Long, CustomerRegionsTreeDto> nodeMap = new HashMap<>();
+ List<CustomerRegionsTreeDto> allDtoList = new ArrayList<>();
+
+ for (CustomerRegions region : allRegions) {
+ CustomerRegionsTreeDto dto = new CustomerRegionsTreeDto();
+ dto.setId(region.getId());
+ dto.setParentId(region.getParentId());
+ dto.setRegionsName(region.getRegionsName());
+ dto.setLabel(region.getRegionsName()); // 缁熶竴 label 瀛楁
+ dto.setChildren(new ArrayList<>());
+ nodeMap.put(dto.getId(), dto);
+ allDtoList.add(dto);
+ }
+
+ List<CustomerRegionsTreeDto> treeList = new ArrayList<>();
+ for (CustomerRegionsTreeDto node : allDtoList) {
+ Long parentId = node.getParentId();
+ // 濡傛灉鏄牴鑺傜偣 (parentId 涓� 0 鎴� null) 鎴� 鎵句笉鍒扮埗鑺傜偣锛屽垯浣滀负椤剁骇鑺傜偣
+ if (parentId == null || parentId == 0 || !nodeMap.containsKey(parentId)) {
+ treeList.add(node);
+ } else {
+ // 鍚﹀垯灏嗗叾娣诲姞鍒扮埗鑺傜偣鐨� children 涓�
+ nodeMap.get(parentId).getChildren().add(node);
+ }
+ }
+
+ String keyword = customerRegions != null ? customerRegions.getRegionsName() : null;
+ if (StringUtils.isNotEmpty(keyword)) {
+ return filterTree(treeList, keyword);
+ }
+
+ return treeList;
+ }
+
+ /**
+ * 閫掑綊杩囨护鏍戣妭鐐�
+ */
+ private List<CustomerRegionsTreeDto> filterTree(List<CustomerRegionsTreeDto> list, String keyword) {
+ List<CustomerRegionsTreeDto> filteredList = new ArrayList<>();
+ for (CustomerRegionsTreeDto node : list) {
+ // 閫掑綊澶勭悊瀛愯妭鐐�
+ List<CustomerRegionsTreeDto> filteredChildren = filterTree(node.getChildren(), keyword);
+ node.setChildren(filteredChildren);
+
+ // 濡傛灉褰撳墠鑺傜偣鍚嶇О鍖呭惈鍏抽敭瀛楋紝鎴栬�呭瓙鑺傜偣杩囨护鍚庝笉涓虹┖锛屽垯淇濈暀璇ヨ妭鐐�
+ if (node.getRegionsName().contains(keyword) || !filteredChildren.isEmpty()) {
+ filteredList.add(node);
+ }
+ }
+ return filteredList;
+ }
+
+ /**
+ * 娣诲姞鍦板尯
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void addCustomerRegions(CustomerRegions customerRegions) {
+ validateRegion(customerRegions);
+ checkUnique(customerRegions);
+ if (baseMapper.insert(customerRegions) <= 0) {
+ throw new ServiceException("娣诲姞澶辫触");
+ }
+ }
+
+ /**
+ * 淇敼鍦板尯
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void updateCustomerRegions(CustomerRegions customerRegions) {
+ if (customerRegions.getId() == null) {
+ throw new ServiceException("淇敼澶辫触, ID涓嶈兘涓虹┖");
+ }
+ validateRegion(customerRegions);
+ if (customerRegions.getId().equals(customerRegions.getParentId())) {
+ throw new ServiceException("淇敼澶辫触, 涓婄骇鍦板尯涓嶈兘鏄嚜宸�");
+ }
+ checkUnique(customerRegions);
+ if (baseMapper.updateById(customerRegions) <= 0) {
+ throw new ServiceException("淇敼澶辫触");
+ }
+ }
+
+ /**
+ * 鍒犻櫎鍦板尯
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void delCustomerRegions(Long id) {
+ if (id == null) {
+ throw new ServiceException("鍒犻櫎澶辫触, ID涓嶈兘涓虹┖");
+ }
+ boolean hasChildren = baseMapper.selectCount(new LambdaQueryWrapper<CustomerRegions>()
+ .eq(CustomerRegions::getParentId, id)) > 0;
+ if (hasChildren) {
+ throw new ServiceException("鍒犻櫎澶辫触, 璇ュ湴鍖轰笅瀛樺湪瀛愬湴鍖�");
+ }
+
+ boolean isUsedByCustomer = customerMapper.selectCount(new LambdaQueryWrapper<Customer>()
+ .eq(Customer::getRegionsId, id)) > 0;
+ if (isUsedByCustomer) {
+ throw new ServiceException("鍒犻櫎澶辫触, 璇ュ湴鍖哄凡琚鎴锋。妗堝紩鐢�");
+ }
+
+ if (baseMapper.deleteById(id) <= 0) {
+ throw new ServiceException("鍒犻櫎澶辫触, 鏁版嵁涓嶅瓨鍦�");
+ }
+ }
+
+ /**
+ * 鏌ヨ褰撳墠鍦板尯鍙婂叾鎵�鏈夊瓙闆嗙殑 ID 闆嗗悎
+ */
+ @Override
+ public List<Long> regionsChildrenIds(Long regionsId) {
+ List<Long> childIds = new ArrayList<>();
+ if (regionsId == null) {
+ return childIds;
+ }
+
+ List<CustomerRegions> allRegions = baseMapper.selectList(null);
+ if (allRegions == null || allRegions.isEmpty()) {
+ return childIds;
+ }
+ childIds.add(regionsId);
+ findAllChildren(allRegions, regionsId, childIds);
+
+ return childIds;
+ }
+
+ /**
+ * 閫掑綊鍦板尯鏂规硶
+ *
+ * @param allRegions 鎵�鏈夊湴鍖哄垪琛�
+ * @param parentId 褰撳墠鐖剁骇 ID
+ * @param result 瀛樻斁缁撴灉鐨勯泦鍚�
+ */
+ private void findAllChildren(List<CustomerRegions> allRegions, Long parentId, List<Long> result) {
+ for (CustomerRegions region : allRegions) {
+ // 鍒ゆ柇 parentId 鏄惁鍖归厤
+ if (parentId.equals(region.getParentId())) {
+ result.add(region.getId());
+ // 缁х画閫掑綊鏌ユ壘璇ヨ妭鐐圭殑瀛愯妭鐐�
+ findAllChildren(allRegions, region.getId(), result);
+ }
+ }
+ }
+
+ private void validateRegion(CustomerRegions region) {
+ if (region == null) {
+ throw new ServiceException("鎿嶄綔澶辫触, 鏁版嵁涓嶈兘涓虹┖");
+ }
+ if (StringUtils.isEmpty(region.getRegionsName())) {
+ throw new ServiceException("鎿嶄綔澶辫触, 鍦板尯鍚嶇О涓嶈兘涓虹┖");
+ }
+ if (region.getParentId() == null) {
+ region.setParentId(0L);
+ }
+ }
+
+ private void checkUnique(CustomerRegions region) {
+ CustomerRegions existing = baseMapper.selectOne(new LambdaQueryWrapper<CustomerRegions>()
+ .eq(CustomerRegions::getRegionsName, region.getRegionsName())
+ .eq(CustomerRegions::getParentId, region.getParentId())
+ .ne(region.getId() != null, CustomerRegions::getId, region.getId()));
+
+ if (existing != null) {
+ throw new ServiceException("璇ュ眰绾т笅宸插瓨鍦ㄥ悕涓� [" + region.getRegionsName() + "] 鐨勫湴鍖�");
+ }
+ }
+}
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 8b6e26e..b00f79a 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
@@ -1,8 +1,6 @@
package com.ruoyi.basic.service.impl;
-import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.date.LocalDateTimeUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -15,16 +13,13 @@
import com.ruoyi.basic.pojo.Customer;
import com.ruoyi.basic.pojo.CustomerFollowUp;
import com.ruoyi.basic.pojo.CustomerFollowUpFile;
-import com.ruoyi.basic.service.CustomerFollowUpFileService;
-import com.ruoyi.basic.service.CustomerFollowUpService;
-import com.ruoyi.basic.service.CustomerReturnVisitService;
-import com.ruoyi.basic.service.ICustomerService;
+import com.ruoyi.basic.pojo.CustomerRegions;
+import com.ruoyi.basic.service.*;
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.project.system.domain.SysUser;
import com.ruoyi.sales.mapper.SalesLedgerMapper;
import com.ruoyi.sales.pojo.SalesLedger;
import lombok.AllArgsConstructor;
@@ -35,9 +30,10 @@
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
-import java.time.LocalDate;
-import java.time.ZoneId;
-import java.util.*;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
import java.util.stream.Collectors;
@@ -59,6 +55,8 @@
private CustomerFollowUpFileService customerFollowUpFileService;
private CustomerReturnVisitService customerReturnVisitService;
+
+ private final ICustomerRegionsService customerRegionsService;
/**
* 鏌ヨ瀹㈡埛妗f
@@ -111,73 +109,87 @@
dto.setFollowUpList(followUpDtoList);
}
-
+ // 鍦板尯鍚嶇О
+ CustomerRegions customerRegions = customerRegionsService.getById(customer.getRegionsId());
+ dto.setRegionsName(customerRegions.getRegionsName());
return dto;
}
/**
* 鏌ヨ瀹㈡埛妗f鍒楄〃
*
- * @param customer 瀹㈡埛妗f
- * @return 瀹㈡埛妗f
+ * @param page 鍒嗛〉瀵硅薄
+ * @param customer 瀹㈡埛鏌ヨ鏉′欢
+ * @return 瀹㈡埛妗f鍒嗛〉鍒楄〃
*/
@Override
- public IPage<Customer> selectCustomerList(Page<Customer> page, Customer customer) {
- // 1. 澶勭悊绌哄�煎満鏅紙鍙傛暟鏍¢獙锛�
- if (page == null) {
- page = Page.of(1, 10); // 榛樿绗�1椤碉紝姣忛〉10鏉℃暟鎹�
- }
- if (customer == null) {
- customer = new Customer(); // 閬垮厤绌哄璞″鑷寸殑NPE
- }
+ public IPage<CustomerDto> selectCustomerList(Page<Customer> page, Customer customer) {
+ if (page == null) page = Page.of(1, 10);
+ if (customer == null) customer = new Customer();
- // 2. 鏋勫缓鏌ヨ鏉′欢锛堝寮虹┖鍊煎畨鍏級
LambdaQueryWrapper<Customer> queryWrapper = new LambdaQueryWrapper<>();
String customerName = customer.getCustomerName();
String customerType = customer.getCustomerType();
+ Long regionsId = customer.getRegionsId();
+
if (StringUtils.isNotBlank(customerName)) {
queryWrapper.like(Customer::getCustomerName, customerName);
}
if (StringUtils.isNotBlank(customerType)) {
- queryWrapper.like(Customer::getCustomerType, customerType);
+ queryWrapper.eq(Customer::getCustomerType, customerType);
}
- // 3. 鎵ц鍒嗛〉鏌ヨ锛堜繚鐣欏垎椤靛厓鏁版嵁锛�
+ if (regionsId != null) {
+ // 璋冪敤 regionsService 鑾峰彇褰撳墠鍦板尯鍙婂叾鎵�鏈夊悗浠g殑 ID 闆嗗悎
+ List<Long> allRegionsIds = customerRegionsService.regionsChildrenIds(regionsId);
+ if (!CollectionUtils.isEmpty(allRegionsIds)) {
+ queryWrapper.in(Customer::getRegionsId, allRegionsIds);
+ } else {
+ queryWrapper.eq(Customer::getRegionsId, regionsId);
+ }
+ }
+
IPage<Customer> customerPage = customerMapper.selectPage(page, queryWrapper);
- // 4. 鏁版嵁澶勭悊锛堝寮虹┖鍊煎畨鍏� & 浠g爜鍙鎬э級
- List<Customer> processedList = customerPage.getRecords().stream()
- .filter(Objects::nonNull) // 杩囨护绌哄璞★紙閬垮厤鍚庣画鎿嶄綔NPE锛�
- .peek(c -> {
- // 瀹夊叏鑾峰彇瀛楁锛岄伩鍏峮ull鍊兼嫾鎺�
+ List<CustomerDto> dtoList = customerPage.getRecords().stream()
+ .filter(Objects::nonNull)
+ .map(c -> {
+ CustomerDto dto = new CustomerDto();
+ BeanUtils.copyProperties(c, dto);
+
+ // 鍦板潃鐢佃瘽鎷兼帴
String address = StringUtils.defaultString(c.getCompanyAddress(), "");
String phone = StringUtils.defaultString(c.getCompanyPhone(), "");
- c.setAddressPhone(address + "(" + phone + ")");
+ dto.setAddressPhone(address + "(" + phone + ")");
+
+ // 濉厖鍦板尯鍚嶇О
+ if (c.getRegionsId() != null) {
+ CustomerRegions regions = customerRegionsService.getById(c.getRegionsId());
+ if (regions != null) {
+ dto.setRegionsName(regions.getRegionsName());
+ }
+ }
// 鏌ヨ鏈�鏂扮殑璺熻繘璁板綍
- CustomerFollowUp followUp = customerFollowUpService.getOne(
- new LambdaQueryWrapper<CustomerFollowUp>()
- .eq(CustomerFollowUp::getCustomerId, c.getId())
- .orderByDesc(CustomerFollowUp::getFollowUpTime)
- .last("LIMIT 1")
- );
-
- if (followUp != null) {
- c.setFollowUpLevel(followUp.getFollowUpLevel());
- c.setFollowUpTime(
- Date.from(
- followUp.getFollowUpTime().atZone(ZoneId.systemDefault()).toInstant()
- )
- );
- }
+// CustomerFollowUp followUp = customerFollowUpService.getOne(
+// new LambdaQueryWrapper<CustomerFollowUp>()
+// .eq(CustomerFollowUp::getCustomerId, c.getId())
+// .orderByDesc(CustomerFollowUp::getFollowUpTime)
+// .last("LIMIT 1")
+// );
+//
+// if (followUp != null) {
+// dto.setFollowUpLevel(followUp.getFollowUpLevel());
+// dto.setFollowUpTime(Date.from(followUp.getFollowUpTime().atZone(ZoneId.systemDefault()).toInstant()));
+// }
+ return dto;
})
.collect(Collectors.toList());
- // 5. 鏇存柊鍒嗛〉缁撴灉涓殑鏁版嵁锛堜繚鎸佸垎椤典俊鎭畬鏁达級
- IPage<Customer> resultPage = new Page<>(customerPage.getCurrent(), customerPage.getSize(), customerPage.getTotal());
- resultPage.setRecords(processedList);
+ IPage<CustomerDto> resultPage = new Page<>(customerPage.getCurrent(), customerPage.getSize(), customerPage.getTotal());
+ resultPage.setRecords(dtoList);
- return customerPage; // 杩斿洖鍖呭惈鍒嗛〉淇℃伅鐨処Page瀵硅薄
+ return resultPage;
}
/**
@@ -274,17 +286,6 @@
entry -> underlineToCamel(entry.getKey()),
Map.Entry::getValue))
).collect(Collectors.toList());
- }
-
- @Override
- public List<String> regionsList() {
- return this.baseMapper.selectObjs(new QueryWrapper<Customer>()
- .select("DISTINCT regions")
- .isNotNull("regions")
- .ne("regions", "")
- ).stream()
- .map(Object::toString)
- .collect(Collectors.toList());
}
/**
diff --git a/src/main/resources/mapper/basic/CustomerRegionsMapper.xml b/src/main/resources/mapper/basic/CustomerRegionsMapper.xml
new file mode 100644
index 0000000..88e3c2a
--- /dev/null
+++ b/src/main/resources/mapper/basic/CustomerRegionsMapper.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.basic.mapper.CustomerRegionsMapper">
+
+ <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+ <resultMap id="BaseResultMap" type="com.ruoyi.basic.pojo.CustomerRegions">
+ <id column="id" property="id" />
+ <result column="parent_id" property="parentId" />
+ <result column="regions_name" property="regionsName" />
+ <result column="tenant_id" property="tenantId" />
+ </resultMap>
+
+</mapper>
--
Gitblit v1.9.3