| | |
| | | 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; |
| | |
| | | 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; |
| | | |
| | | |
| | |
| | | @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; |
| | | |
| | |
| | | LoginUser loginUser = SecurityUtils.getLoginUser(); |
| | | Long tenantId = loginUser.getTenantId(); |
| | | customer.setTenantId(tenantId); |
| | | validateCustomerNameUnique(customer, null); |
| | | return customerMapper.insert(customer); |
| | | } |
| | | |
| | |
| | | LoginUser loginUser = SecurityUtils.getLoginUser(); |
| | | Long tenantId = loginUser.getTenantId(); |
| | | customer.setTenantId(tenantId); |
| | | validateCustomerNameUnique(customer, customer.getId()); |
| | | return customerMapper.updateById(customer); |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | @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); |
| | | } |
| | | |
| | | /** |
| | | * æ âxx-xx-xxâ å±çº§è§£æå°åºï¼ä¸åå¨åæç¶çº§é级å建ã |
| | | */ |
| | | 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 |