From 8438d50aef0bb78e5e6c41ca1c1bc09b4e61add1 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 29 七月 2026 09:18:29 +0800
Subject: [PATCH] feat(customer): 添加公海客户归属查看权限控制
---
src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java | 163 +++++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 135 insertions(+), 28 deletions(-)
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 d826a94..4404387 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
@@ -10,20 +10,25 @@
import com.ruoyi.basic.dto.CustomerDto;
import com.ruoyi.basic.dto.CustomerFollowUpDto;
import com.ruoyi.basic.mapper.CustomerMapper;
-import com.ruoyi.basic.pojo.*;
-import com.ruoyi.basic.service.CustomerFollowUpFileService;
-import com.ruoyi.basic.service.CustomerFollowUpService;
-import com.ruoyi.basic.service.CustomerReturnVisitService;
-import com.ruoyi.basic.service.CustomerUserService;
-import com.ruoyi.basic.service.ICustomerService;
+import com.ruoyi.basic.pojo.Customer;
+import com.ruoyi.basic.pojo.CustomerFollowUp;
+import com.ruoyi.basic.pojo.CustomerFollowUpFile;
+import com.ruoyi.basic.pojo.CustomerUser;
+import com.ruoyi.basic.service.*;
import com.ruoyi.basic.vo.CustomerVo;
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.framework.web.domain.R;
+import com.ruoyi.procurementrecord.mapper.ReturnManagementMapper;
+import com.ruoyi.procurementrecord.pojo.ReturnManagement;
import com.ruoyi.sales.mapper.SalesLedgerMapper;
+import com.ruoyi.sales.mapper.SalesQuotationMapper;
import com.ruoyi.sales.pojo.SalesLedger;
+import com.ruoyi.sales.pojo.SalesQuotation;
+import com.ruoyi.sales.vo.CustomerTransactionsDetailsVo;
+import com.ruoyi.sales.vo.CustomerTransactionsVo;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
@@ -49,7 +54,11 @@
@Slf4j
public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> implements ICustomerService {
@Autowired
- private SalesLedgerMapper salesLedgerMapper;
+ private SalesLedgerMapper salesLedgerMapper;
+ @Autowired
+ private SalesQuotationMapper salesQuotationMapper;
+ @Autowired
+ private ReturnManagementMapper returnManagementMapper;
@Autowired
private CustomerMapper customerMapper;
@@ -121,7 +130,8 @@
public IPage<CustomerVo> selectCustomerList(Page<CustomerDto> page, CustomerDto customer) {
LoginUser loginUser = SecurityUtils.getLoginUser();
Long loginUserId = loginUser.getUserId();
- IPage<CustomerVo> customerPage = customerMapper.listPage(page, customer, loginUserId);
+ boolean isAdmin = SecurityUtils.hasPermi("customer:viewAll");
+ IPage<CustomerVo> customerPage = customerMapper.listPage(page, customer, loginUserId, isAdmin);
List<CustomerVo> records = customerPage.getRecords();
if (CollectionUtils.isEmpty(records)) {
@@ -190,7 +200,21 @@
LoginUser loginUser = SecurityUtils.getLoginUser();
Long tenantId = loginUser.getTenantId();
customer.setTenantId(tenantId);
- return customerMapper.insert(customer);
+ int result = customerMapper.insert(customer);
+
+ // 绉佹捣鏂板鏃跺悓姝ヤ竴鏉″埌鍏捣
+ if (customer.getType() != null && customer.getType() == 0) {
+ Customer publicSeaCustomer = new Customer();
+ BeanUtils.copyProperties(customer, publicSeaCustomer);
+ publicSeaCustomer.setId(null);
+ publicSeaCustomer.setType(1);
+ publicSeaCustomer.setIsAssigned(0);
+ publicSeaCustomer.setUsageUser(loginUser.getUserId());
+ publicSeaCustomer.setUsageStatus(1L);
+ customerMapper.insert(publicSeaCustomer);
+ }
+
+ return result;
}
/**
@@ -203,6 +227,7 @@
public int updateCustomer(Customer customer) {
LoginUser loginUser = SecurityUtils.getLoginUser();
Long tenantId = loginUser.getTenantId();
+ validateCustomerEditPermission(customer.getId());
customer.setTenantId(tenantId);
return customerMapper.updateById(customer);
}
@@ -217,10 +242,24 @@
@Transactional(rollbackFor = Exception.class)
public int deleteCustomerByIds(Long[] ids) {
List<Long> idList = Arrays.asList(ids);
+ // 妫�鏌ユ槸鍚︽湁閿�鍞彴璐﹀叧鑱�
List<SalesLedger> salesLedgers = salesLedgerMapper.selectList(new QueryWrapper<SalesLedger>().lambda().in(SalesLedger::getCustomerId, idList));
if (!salesLedgers.isEmpty()) {
- throw new RuntimeException("瀹㈡埛妗f涓嬫湁閿�鍞悎鍚岋紝璇峰厛鍒犻櫎閿�鍞悎鍚�");
+ throw new RuntimeException("瀹㈡埛妗f涓嬫湁閿�鍞彴璐︼紝璇峰厛鍒犻櫎閿�鍞彴璐�");
}
+
+ // 妫�鏌ユ槸鍚︽湁閿�鍞��璐у叧鑱�
+ List<ReturnManagement> returnManagements = returnManagementMapper.selectList(new QueryWrapper<ReturnManagement>().lambda().in(ReturnManagement::getCustomerId, idList));
+ if (!returnManagements.isEmpty()) {
+ throw new RuntimeException("瀹㈡埛妗f涓嬫湁閿�鍞��璐э紝璇峰厛鍒犻櫎閿�鍞��璐�");
+ }
+
+ // 妫�鏌ユ槸鍚︽湁閿�鍞姤浠峰叧鑱�
+ List<SalesQuotation> salesQuotations = salesQuotationMapper.selectList(new QueryWrapper<SalesQuotation>().lambda().in(SalesQuotation::getCustomerId, idList));
+ if (!salesQuotations.isEmpty()) {
+ throw new RuntimeException("瀹㈡埛妗f涓嬫湁閿�鍞姤浠凤紝璇峰厛鍒犻櫎閿�鍞姤浠�");
+ }
+
// 鏌ヨ鏄惁鏈夊凡鍒嗛厤鐨勫叕娴峰鎴�
List<Customer> assignedPools = customerMapper.selectList(
new QueryWrapper<Customer>().lambda()
@@ -257,16 +296,17 @@
public List<CustomerVo> selectCustomerLists(CustomerDto customer) {
LoginUser loginUser = SecurityUtils.getLoginUser();
Long loginUserId = loginUser.getUserId();
- return customerMapper.list(customer, loginUserId);
+ boolean isAdmin = SecurityUtils.hasPermi("customer:viewAll");
+ return customerMapper.list(customer, loginUserId, isAdmin);
}
@Override
- public AjaxResult importData(MultipartFile file, Integer type) {
+ public R importData(MultipartFile file, Integer type) {
try {
ExcelUtil<Customer> util = new ExcelUtil<Customer>(Customer.class);
List<Customer> userList = util.importExcel(file.getInputStream());
if (CollectionUtils.isEmpty(userList)) {
- return AjaxResult.warn("妯℃澘閿欒鎴栧鍏ユ暟鎹负绌�");
+ return R.fail("妯℃澘閿欒鎴栧鍏ユ暟鎹负绌�");
}
// 鏍规嵁 type 鍙傛暟璁剧疆瀹㈡埛绫诲瀷锛堢娴�/鍏捣锛�
@@ -276,28 +316,37 @@
});
}
this.saveOrUpdateBatch(userList);
- return AjaxResult.success(true);
+ return R.ok(true);
} catch (Exception e) {
e.printStackTrace();
- return AjaxResult.error("瀵煎叆澶辫触");
+ return R.fail("瀵煎叆澶辫触");
}
}
@Override
public List<Map<String, Object>> customerList(Customer customer) {
- LambdaQueryWrapper<Customer> queryWrapper = Wrappers.lambdaQuery();
- queryWrapper.select(Customer::getId, Customer::getCustomerName, Customer::getTaxpayerIdentificationNumber);
+ LoginUser loginUser = SecurityUtils.getLoginUser();
+ Long loginUserId = loginUser.getUserId();
+ boolean isAdmin = SecurityUtils.hasPermi("customer:viewAll");
+ CustomerDto query = new CustomerDto();
+ if (customer != null) {
+ BeanUtils.copyProperties(customer, query);
+ }
- // 鑾峰彇鍘熷鏌ヨ缁撴灉
- List<Map<String, Object>> result = customerMapper.selectMaps(queryWrapper);
+ // 澶嶇敤瀹㈡埛鍒楄〃鐨勫彲瑙佹�ц鍒欙紝閬垮厤鎶婂埆浜虹殑绉佹捣瀹㈡埛鏆撮湶缁欏綋鍓嶈处鍙�
+ List<CustomerVo> visibleCustomers = customerMapper.list(query, loginUserId, isAdmin);
+ if (CollectionUtils.isEmpty(visibleCustomers)) {
+ return Collections.emptyList();
+ }
- // 灏嗕笅鍒掔嚎鍛藉悕杞崲涓洪┘宄板懡鍚�
- return result.stream().map(map -> map.entrySet().stream()
- .collect(Collectors.toMap(
- entry -> underlineToCamel(entry.getKey()),
- Map.Entry::getValue))
- ).collect(Collectors.toList());
+ return visibleCustomers.stream().map(item -> {
+ Map<String, Object> map = new LinkedHashMap<>();
+ map.put("id", item.getId());
+ map.put("customerName", item.getCustomerName());
+ map.put("taxpayerIdentificationNumber", item.getTaxpayerIdentificationNumber());
+ return map;
+ }).collect(Collectors.toList());
}
// 鍒嗛厤鍏捣瀹㈡埛缁欑娴�
@@ -318,11 +367,12 @@
public void recycleCustomer(CustomerDto customerDto) {
Customer customer = customerMapper.selectById(customerDto.getId());
if (customer.getType() == 1 && customer.getIsAssigned() == 1) { // 鍏捣涓斿凡鍒嗛厤
+ validatePublicSeaRecyclePermission(customer.getId());
customer.setIsAssigned(0);
customer.setUsageStatus(0L);
customer.setUsageUser(0L);
customerMapper.updateById(customer);
-
+
// 鍒犻櫎璇ュ鎴风殑鎵�鏈夊叡浜叧绯�
customerUserService.remove(
new QueryWrapper<CustomerUser>().lambda()
@@ -371,6 +421,63 @@
customerUserService.saveBatch(customerUsers);
}
+ @Override
+ public Boolean back(Long id) {
+ //灏嗗鎴风殑type鏀逛负1 涓旂洿鎺ュ垎閰嶇粰褰撳墠鐢ㄦ埛
+ Customer customer = customerMapper.selectById(id);
+ customer.setType(1);
+ customer.setIsAssigned(0);
+ return this.updateById(customer);
+ }
+
+ private void validateCustomerEditPermission(Long customerId) {
+ Customer customer = customerMapper.selectById(customerId);
+ if (customer == null) {
+ throw new RuntimeException("瀹㈡埛妗f涓嶅瓨鍦�");
+ }
+ if (!hasSalesModuleReference(customerId)) {
+ return;
+ }
+ if (Objects.equals(customer.getType(), 0)) {
+ throw new RuntimeException("宸茶閿�鍞ā鍧楀紩鐢ㄧ殑绉佹捣瀹㈡埛涓嶈兘缂栬緫");
+ }
+ if (Objects.equals(customer.getType(), 1) && Objects.equals(customer.getIsAssigned(), 1)) {
+ throw new RuntimeException("宸查鐢ㄥ苟涓旇閿�鍞ā鍧楀紩鐢ㄧ殑鍏捣瀹㈡埛涓嶈兘缂栬緫");
+ }
+ }
+
+ private void validatePublicSeaRecyclePermission(Long customerId) {
+ if (hasSalesModuleReference(customerId)) {
+ throw new RuntimeException("宸查鐢ㄥ苟涓旇閿�鍞ā鍧楀紩鐢ㄧ殑鍏捣瀹㈡埛涓嶈兘鍥炴敹");
+ }
+ }
+
+ private boolean hasSalesModuleReference(Long customerId) {
+ Long salesLedgerCount = salesLedgerMapper.selectCount(new QueryWrapper<SalesLedger>().lambda()
+ .eq(SalesLedger::getCustomerId, customerId));
+ if (salesLedgerCount != null && salesLedgerCount > 0) {
+ return true;
+ }
+ Long salesQuotationCount = salesQuotationMapper.selectCount(new QueryWrapper<SalesQuotation>().lambda()
+ .eq(SalesQuotation::getCustomerId, customerId));
+ if (salesQuotationCount != null && salesQuotationCount > 0) {
+ return true;
+ }
+ Long returnManagementCount = returnManagementMapper.selectCount(new QueryWrapper<ReturnManagement>().lambda()
+ .eq(ReturnManagement::getCustomerId, customerId));
+ return returnManagementCount != null && returnManagementCount > 0;
+ }
+
+ @Override
+ public IPage<CustomerTransactionsVo> customewTransactions(Page page, String customerName) {
+ return customerMapper.customewTransactions(page, customerName);
+ }
+
+ @Override
+ public IPage<CustomerTransactionsDetailsVo> customewTransactionsDetails(Page page, Long customerId) {
+ return customerMapper.customewTransactionsDetails(page, customerId);
+ }
+
/**
* 涓嬪垝绾垮懡鍚嶈浆椹煎嘲鍛藉悕
*/
@@ -392,4 +499,4 @@
}
return sb.toString();
}
-}
\ No newline at end of file
+}
--
Gitblit v1.9.3