diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/controller/CusMainController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/controller/CusMainController.java index 325eb69..943d82e 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/controller/CusMainController.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/controller/CusMainController.java @@ -124,7 +124,7 @@ public class CusMainController extends BaseController { /** * 客户信息导入 * - * @param file TODO + * @param file {@link MultipartFile} * @return com.ruoyi.common.core.domain.AjaxResult * @author PQZ * @date 14:29 2025/11/19 @@ -138,6 +138,23 @@ public class CusMainController extends BaseController { return cusImportService.importCusAndContacts(file); } + /** + * 公海客户信息导入 + * + * @param file {@link MultipartFile} + * @return com.ruoyi.common.core.domain.AjaxResult + * @author PQZ + * @date 14:40 2025/11/24 + **/ + @Log(title = "公海客户信息导入", businessType = BusinessType.IMPORT) + @PostMapping("/importCusSeas") + public AjaxResult importCusSeasAndContacts(@RequestParam("file") MultipartFile file) throws IOException { + if (file.isEmpty()) { + return AjaxResult.error("上传文件不能为空"); + } + return cusImportService.importCusAndContacts(file); + } + /** * 获取客户信息详细信息--编辑 */ @@ -174,7 +191,7 @@ public class CusMainController extends BaseController { * 更新客户标签 */ @PostMapping("/setLabels") - public AjaxResult setLabels(@RequestBody MainVO cusMainVO){ + public AjaxResult setLabels(@RequestBody MainVO cusMainVO) { CusMain cusMain = new CusMain(); cusMain.setId(cusMainVO.getId()); cusMain.setCusLabels(JSON.toJSONString(cusMainVO.getCusLabelList())); @@ -187,7 +204,7 @@ public class CusMainController extends BaseController { List cusLabelList = new ArrayList<>(); JSONArray cusLabelArray = JSON.parseArray(cusMain.getCusLabels()); - for(int i = 0; i < cusLabelArray.size(); i++){ + for (int i = 0; i < cusLabelArray.size(); i++) { JSONObject jsonObj = cusLabelArray.getJSONObject(i); cusLabelList.add(jsonObj.getString("name")); } @@ -201,13 +218,13 @@ public class CusMainController extends BaseController { * 更新是否星标客户 */ @PostMapping("/setIfStar") - public AjaxResult setIfStar(@RequestBody CusMain cusMain){ + public AjaxResult setIfStar(@RequestBody CusMain cusMain) { cusMainService.updateById(cusMain); //时间轴信息 CusTimeAxis cusTimeAxis = new CusTimeAxis(); cusTimeAxis.setBusiMaxCatg("客户"); cusTimeAxis.setBusiCatg("修改"); - cusTimeAxis.setContent(cusMain.getIfStar()?"设为星标":"取消星标"); + cusTimeAxis.setContent(cusMain.getIfStar() ? "设为星标" : "取消星标"); cusTimeAxis.setCusId(cusMain.getId()); cusTimeAxisService.saveNewTimeAxis(cusTimeAxis); return success(); diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusImportService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusImportService.java index 99c1b2d..452765e 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusImportService.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusImportService.java @@ -8,9 +8,21 @@ import java.io.IOException; public interface ICusImportService { /** * 导入客户及联系人信息 + * * @param file 导入文件 * @return 导入结果 */ AjaxResult importCusAndContacts(MultipartFile file) throws IOException; + /** + * 导入公海客户 + * + * @param file TODO + * @return com.ruoyi.common.core.domain.AjaxResult + * @author PQZ + * @date 14:30 2025/11/24 + **/ + AjaxResult importCusSeasAndContacts(MultipartFile file) throws IOException; + + } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusMainSeasService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusMainSeasService.java index 14a13ef..71855a9 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusMainSeasService.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusMainSeasService.java @@ -1,18 +1,30 @@ package com.ruoyi.cus.service; import java.util.List; + import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.cus.domain.CusMain; import com.ruoyi.cus.domain.CusMainSeas; import com.ruoyi.cus.vo.MainVO; /** * 公海客户信息Service接口 - * + * * @author vinjor-m * @date 2025-11-24 */ public interface ICusMainSeasService extends IService { IPage queryListPage(CusMainSeas pageReqVO, Page page); + + /** + * 通过名称保存公海客户信息 + * + * @param cusMainList 客户信息集合 + * @return void + * @author PQZ + * @date 14:44 2025/11/20 + **/ + void saveOrUpdateByCusName(List cusMainList); } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusImportServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusImportServiceImpl.java index 0bddb51..0b342df 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusImportServiceImpl.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusImportServiceImpl.java @@ -36,6 +36,8 @@ public class CusImportServiceImpl implements ICusImportService { private ICusBankService cusBankService; @Autowired private SnowflakeIdGenerator snowflakeIdGenerator; + @Autowired + private ICusMainSeasService cusMainSeasService; /** * 导入客户及联系人信息 @@ -58,13 +60,49 @@ public class CusImportServiceImpl implements ICusImportService { InputStream inputStream = file.getInputStream(); // 读取第二个sheet页数据(索引为1) ExcelUtil cusUtil = new ExcelUtil<>(CusImportDTO.class); - List secondSheetList = cusUtil.importExcel("客户联系人", inputStream, 1); + List cusImportList = cusUtil.importExcel("客户联系人", inputStream, 1); // 重新获取输入流用于读取第三个sheet页数据 InputStream thirdSheetInputStream = file.getInputStream(); // 读取第三个sheet页数据(索引为2) ExcelUtil bankUtil = new ExcelUtil<>(CusBankImportDTO.class); - List thirdSheetList = bankUtil.importExcel("银行资料", thirdSheetInputStream, 0); - saveCusAndBank(secondSheetList, thirdSheetList); + List bankList = bankUtil.importExcel("银行资料", thirdSheetInputStream, 0); + saveCusAndBank(cusImportList, bankList); + return AjaxResult.success("导入成功"); + } catch (Exception e) { + return AjaxResult.error("导入失败:" + e.getMessage()); + } + } + + /** + * 导入公海客户 + * + * @param file 文件 + * @return com.ruoyi.common.core.domain.AjaxResult + * @author PQZ + * @date 14:30 2025/11/24 + **/ + @Override + public AjaxResult importCusSeasAndContacts(MultipartFile file) throws IOException { + try { + // 先打印所有sheet页名称 + Workbook workbook = new XSSFWorkbook(file.getInputStream()); + int numberOfSheets = workbook.getNumberOfSheets(); + for (int i = 0; i < numberOfSheets; i++) { + Sheet sheet = workbook.getSheetAt(i); + } + // 关闭workbook + workbook.close(); + // 重新获取输入流用于数据读取 + InputStream inputStream = file.getInputStream(); + // 读取第二个sheet页数据(索引为1) + ExcelUtil cusUtil = new ExcelUtil<>(CusImportDTO.class); + List cusImportList = cusUtil.importExcel("客户联系人", inputStream, 1); + // 重新获取输入流用于读取第三个sheet页数据 + InputStream thirdSheetInputStream = file.getInputStream(); + // 读取第三个sheet页数据(索引为2) + ExcelUtil bankUtil = new ExcelUtil<>(CusBankImportDTO.class); + List bankList = bankUtil.importExcel("银行资料", thirdSheetInputStream, 0); + saveCusSeasAndBank(cusImportList, bankList); return AjaxResult.success("导入成功"); } catch (Exception e) { return AjaxResult.error("导入失败:" + e.getMessage()); @@ -210,6 +248,145 @@ public class CusImportServiceImpl implements ICusImportService { cusBankService.saveOrUpdateByAccount(cusBankList); } + } + /** + * 数据处理 + * + * @param cusList List + * @param bankList List + * @author PQZ + * @date 15:30 2025/11/19 + **/ + private void saveCusSeasAndBank(List cusList, List bankList) { + if (cusList == null || cusList.isEmpty()) { + return; + } + + // 使用Map按客户代码分组,保留每个客户的所有联系人信息 + Map> customerGroupMap = cusList.stream() + .collect(Collectors.groupingBy(CusImportDTO::getFullName)); + + // 准备批量插入的集合 + List cusMainList = new ArrayList<>(); + List cusCompanyList = new ArrayList<>(); + List cusManagerList = new ArrayList<>(); + List cusContactsList = new ArrayList<>(); + List cusBankList = new ArrayList<>(); + // 遍历每个客户的联系人列表,只保存一次客户信息,但保存所有联系人 + for (Map.Entry> entry : customerGroupMap.entrySet()) { + List customerContacts = entry.getValue(); + if (customerContacts.isEmpty()) { + continue; + } + // 取第一个联系人记录作为客户基本信息(因为同一客户的基本信息是重复的) + CusImportDTO customerInfo = customerContacts.get(0); + // 为客户提供UUID + String customerId = UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32); + // 提取客户主表信息 CusMain + CusMainSeas customer = new CusMainSeas(); + //绑定客户id + customer.setId(customerId); + customer.setCusCode(customerInfo.getCusCode()); + customer.setFullName(customerInfo.getFullName()); + customer.setShortName(customerInfo.getShortName()); + customer.setCusType(customerInfo.getCusType()); + customer.setCountry(customerInfo.getCountry()); + customer.setZoneName(customerInfo.getZoneName()); + customer.setMainProds(customerInfo.getMainProds()); + customer.setSiteUrl(customerInfo.getSiteUrl()); + customer.setCreator(customerInfo.getCreateBy()); + customer.setCreateTime(new Date()); + customer.setUpdateTime(new Date()); + customer.setRemark(customerInfo.getCusRemark()); + cusMainList.add(customer); + + // 提取客户公司信息表 CusCompany + CusCompany companyInfo = new CusCompany(); + //绑定客户id + companyInfo.setCusId(customerId); + companyInfo.setCusName(customerInfo.getFullName()); + companyInfo.setCusFrom(customerInfo.getCusSource()); + companyInfo.setCusLevel(customerInfo.getCusLevel()); + companyInfo.setBusiType(customerInfo.getBusinessType()); + companyInfo.setContactAddress(customerInfo.getContactAddress()); + companyInfo.setCreator(customerInfo.getCreateBy()); + companyInfo.setCreateTime(new Date()); + cusCompanyList.add(companyInfo); + + // 提取客户管理信息表 CusManager + CusManager managementInfo = new CusManager(); + //绑定客户id + managementInfo.setCusId(customerId); + managementInfo.setCusName(customerInfo.getFullName()); + managementInfo.setUserName(customerInfo.getUserName()); + managementInfo.setFollowStep(customerInfo.getFollowStep()); + managementInfo.setSeasReason(customerInfo.getSeasReason()); + managementInfo.setSeasGroup(customerInfo.getSeasGroup()); + managementInfo.setOldDept(customerInfo.getOldDept()); + managementInfo.setCreator(customerInfo.getCreateBy()); + managementInfo.setCreateTime(new Date()); + cusManagerList.add(managementInfo); + + // 提取客户的所有联系人信息 CusContacts + for (CusImportDTO contact : customerContacts) { + CusContacts customerContact = new CusContacts(); + customerContact.setId(snowflakeIdGenerator.generateId()); + //绑定客户id + customerContact.setCusId(customerId); + customerContact.setCusName(contact.getFullName()); + customerContact.setName(contact.getName()); + customerContact.setNickName(contact.getNickName()); + customerContact.setEmail(contact.getEmail()); + customerContact.setTelephone(contact.getTelephone()); + customerContact.setSex(contact.getSex()); + customerContact.setBirthday(new Date()); + customerContact.setWhatsApp(contact.getWhatsApp()); + customerContact.setCreator(contact.getCreateBy()); + customerContact.setCreateTime(new Date()); + cusContactsList.add(customerContact); + } + + //提取银行信息 + for (CusBankImportDTO bank : bankList) { + if (bank.getCusName().equals(customerInfo.getFullName())) { + CusBank bankInfo = new CusBank(); + //绑定客户id + bankInfo.setCusId(customerId); + bankInfo.setCusName(bank.getCusName()); + bankInfo.setBankAccount(bank.getBankAccount()); + bankInfo.setBankName(bank.getBankName()); + bankInfo.setCurrency(bank.getCurrency()); + bankInfo.setBankCode(bank.getBankCode()); + bankInfo.setSwiftCode(bank.getSwiftCode()); + bankInfo.setBankAddress(bank.getBankAddress()); + bankInfo.setBranchCode(bank.getBranchCode()); + bankInfo.setTaxId(bank.getTaxId()); + cusBankList.add(bankInfo); + } + } + + } + + // 批量保存公海客户 + if (!cusMainList.isEmpty()) { + cusMainSeasService.saveOrUpdateByCusName(cusMainList); + } + // 批量保存客户公司信息表 + if (!cusCompanyList.isEmpty()) { + cusCompanyService.saveOrUpdateByCusName(cusCompanyList); + } + // 批量保存客户管理信息表 + if (!cusManagerList.isEmpty()) { + cusManagerService.saveOrUpdateByCusName(cusManagerList); + } + // 批量保存客户联系人信息 + if (!cusContactsList.isEmpty()) { + cusContactsService.saveOrUpdateByCusName(cusContactsList); + } + //批量保存银行账户信息 + if (!cusBankList.isEmpty()) { + cusBankService.saveOrUpdateByAccount(cusBankList); + } } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusMainSeasServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusMainSeasServiceImpl.java index e1a508e..3c2424a 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusMainSeasServiceImpl.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusMainSeasServiceImpl.java @@ -1,12 +1,21 @@ package com.ruoyi.cus.service.impl; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.alibaba.fastjson2.JSON; import com.ruoyi.common.utils.DateUtils; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.cus.domain.CusMain; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.cus.vo.MainVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -37,4 +46,60 @@ public class CusMainSeasServiceImpl extends ServiceImpl cusMainList) { + if (cusMainList == null || cusMainList.isEmpty()) { + return; + } + // 提取所有需要处理的 fullName + List fullNames = cusMainList.stream() + .map(CusMainSeas::getFullName) + .filter(StringUtils::isNotEmpty) + .distinct() + .collect(Collectors.toList()); + // 一次性查询数据库中已存在的客户信息 + Map existingCusMap = new HashMap<>(); + if (!fullNames.isEmpty()) { + List existingCusList = this.list( + new LambdaQueryWrapper() + .in(CusMainSeas::getFullName, fullNames) + ); + existingCusMap = existingCusList.stream() + .collect(Collectors.toMap(CusMainSeas::getFullName, Function.identity())); + } + // 分离需要新增和更新的客户 + List toSaveList = new ArrayList<>(); + List toUpdateList = new ArrayList<>(); + for (CusMainSeas cusMain : cusMainList) { + if (StringUtils.isEmpty(cusMain.getFullName())) { + continue; + } + + CusMainSeas existingCus = existingCusMap.get(cusMain.getFullName()); + if (existingCus != null) { + // 如果存在,设置ID并加入更新列表 + cusMain.setId(existingCus.getId()); + toUpdateList.add(cusMain); + } else { + // 如果不存在,则生成新的ID并加入保存列表 + toSaveList.add(cusMain); + } + } + // 批量保存和更新 + if (!toSaveList.isEmpty()) { + this.saveBatch(toSaveList); + } + if (!toUpdateList.isEmpty()) { + this.updateBatchById(toUpdateList); + } + } } diff --git a/dl_vue/src/views/cus/seas/index.vue b/dl_vue/src/views/cus/seas/index.vue index 693532e..dc26d37 100644 --- a/dl_vue/src/views/cus/seas/index.vue +++ b/dl_vue/src/views/cus/seas/index.vue @@ -114,6 +114,16 @@ v-hasPermi="['cus:seas:export']" >导出 + + 导入 + + @@ -151,7 +161,7 @@ - + 取 消 + + + + + +
将文件拖到此处,或点击上传
+
+ 仅允许导入xls、xlsx格式文件。 + 下载模板 +
+
+ +