diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseCountryService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseCountryService.java index 21f78e6..ad2e0f8 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseCountryService.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseCountryService.java @@ -25,4 +25,12 @@ public interface IBaseCountryService extends IService { * @date 15:47 2025/11/17 **/ IPage queryListPage(BaseCountry pageReqVO, Page page); + /** + * 通过名称查询 + * @author PQZ + * @date 11:32 2025/11/22 + * @param nameCn 中文名称 + * @return com.ruoyi.base.domain.BaseCountry + **/ + BaseCountry queryByName(String nameCn); } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseCountryServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseCountryServiceImpl.java index 652e3e2..e637e5f 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseCountryServiceImpl.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseCountryServiceImpl.java @@ -2,6 +2,7 @@ package com.ruoyi.base.service.impl; import java.util.List; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.base.vo.BaseCountryVO; @@ -36,4 +37,19 @@ public class BaseCountryServiceImpl extends ServiceImpl queryListPage(BaseCountry pageReqVO, Page page) { return baseCountryMapper.queryListPage(pageReqVO, page); } + + /** + * 通过名称查询 + * + * @param nameCn 中文名称 + * @return com.ruoyi.base.domain.BaseCountry + * @author PQZ + * @date 11:32 2025/11/22 + **/ + @Override + public BaseCountry queryByName(String nameCn) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(BaseCountry::getNameCn,nameCn); + return this.getOne(lambdaQueryWrapper); + } } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/controller/CusFollowController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/controller/CusFollowController.java index 5f71320..0ba09cc 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/controller/CusFollowController.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/controller/CusFollowController.java @@ -4,8 +4,12 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.servlet.http.HttpServletResponse; + +import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.cus.domain.CusTimeAxis; +import com.ruoyi.cus.service.ICusTimeAxisService; import com.ruoyi.cus.vo.CusFollowVO; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; @@ -39,6 +43,8 @@ public class CusFollowController extends BaseController { @Autowired private ICusFollowService cusFollowService; + @Autowired + private ICusTimeAxisService cusTimeAxisService; /** * 查询客户跟进记录列表 @@ -83,8 +89,15 @@ public class CusFollowController extends BaseController @PreAuthorize("@ss.hasPermi('cus:follow:add')") @Log(title = "客户跟进记录", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody CusFollow cusFollow) - { + public AjaxResult add(@RequestBody CusFollow cusFollow) { + //时间轴信息 + CusTimeAxis cusTimeAxis = new CusTimeAxis(); + cusTimeAxis.setBusiMaxCatg("跟进"); + cusTimeAxis.setBusiCatg("新增"); + cusTimeAxis.setContent("新增客户跟进:"+cusFollow.getFollowContent()+";跟进方式:"+ + cusFollow.getFollowWay()+";跟进阶段:"+cusFollow.getFollowStep()+";跟进时间:"+ DateUtil.formatDateTime(cusFollow.getFollowTime())); + cusTimeAxis.setCusId(cusFollow.getCusId()); + cusTimeAxisService.saveNewTimeAxis(cusTimeAxis); return toAjax(cusFollowService.save(cusFollow)); } @@ -94,8 +107,18 @@ public class CusFollowController extends BaseController @PreAuthorize("@ss.hasPermi('cus:follow:edit')") @Log(title = "客户跟进记录", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@RequestBody CusFollow cusFollow) - { + public AjaxResult edit(@RequestBody CusFollow cusFollow) { + CusFollow old = cusFollowService.getById(cusFollow.getId()); + //时间轴信息 + CusTimeAxis cusTimeAxis = new CusTimeAxis(); + cusTimeAxis.setBusiMaxCatg("跟进"); + cusTimeAxis.setBusiCatg("修改"); + String oldContent = "原客户跟进:"+old.getFollowContent()+";跟进方式:"+ + old.getFollowWay()+";跟进阶段:"+old.getFollowStep()+";跟进时间:"+ DateUtil.formatDateTime(old.getFollowTime()); + cusTimeAxis.setContent(oldContent+";修改后客户跟进:"+cusFollow.getFollowContent()+";跟进方式:"+ + cusFollow.getFollowWay()+";跟进阶段:"+cusFollow.getFollowStep()+";跟进时间:"+ DateUtil.formatDateTime(cusFollow.getFollowTime())); + cusTimeAxis.setCusId(cusFollow.getCusId()); + cusTimeAxisService.saveNewTimeAxis(cusTimeAxis); return toAjax(cusFollowService.updateById(cusFollow)); } @@ -105,9 +128,17 @@ public class CusFollowController extends BaseController @PreAuthorize("@ss.hasPermi('cus:follow:remove')") @Log(title = "客户跟进记录", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") - public AjaxResult remove(@PathVariable String[] ids) - { + public AjaxResult remove(@PathVariable String[] ids) { List list = new ArrayList<>(Arrays.asList(ids)); + CusFollow old = cusFollowService.getById(ids[0]); + //时间轴信息 + CusTimeAxis cusTimeAxis = new CusTimeAxis(); + cusTimeAxis.setBusiMaxCatg("跟进"); + cusTimeAxis.setBusiCatg("删除"); + cusTimeAxis.setContent("删除客户跟进:"+old.getFollowContent()+";跟进方式:"+ + old.getFollowWay()+";跟进阶段:"+old.getFollowStep()+";跟进时间:"+ DateUtil.formatDateTime(old.getFollowTime())); + cusTimeAxis.setCusId(old.getCusId()); + cusTimeAxisService.saveNewTimeAxis(cusTimeAxis); return toAjax(cusFollowService.removeByIds(list)); } } 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 a46caca..f661e73 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 @@ -1,5 +1,6 @@ package com.ruoyi.cus.controller; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; @@ -7,11 +8,16 @@ import java.util.List; import javax.servlet.http.HttpServletResponse; import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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.CusTimeAxis; +import com.ruoyi.cus.service.ICusImportService; +import com.ruoyi.cus.service.ICusTimeAxisService; import com.ruoyi.cus.vo.CusMainVO; import com.ruoyi.cus.vo.MainVO; import com.ruoyi.utils.CodeGenerator; @@ -34,21 +40,26 @@ import com.ruoyi.cus.domain.CusMain; import com.ruoyi.cus.service.ICusMainService; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; /** * 客户信息Controller - * + * * @author vinjor-m * @date 2025-11-03 */ @RestController @RequestMapping("/cus/main") -public class CusMainController extends BaseController -{ +public class CusMainController extends BaseController { @Autowired private ICusMainService cusMainService; @Autowired private CodeGenerator codeGenerator; + @Autowired + private ICusImportService cusImportService; + @Autowired + private ICusTimeAxisService cusTimeAxisService; + /** * 生成客户编码 */ @@ -77,6 +88,7 @@ public class CusMainController extends BaseController return AjaxResult.error(e.getMessage()); } } + /** * 查询客户信息列表 */ @@ -84,10 +96,9 @@ public class CusMainController extends BaseController @GetMapping("/list") public AjaxResult list(MainVO cusMain, @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, - @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) - { + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { Page page = new Page<>(pageNum, pageSize); - IPage list = cusMainService.queryListPage(cusMain,page); + IPage list = cusMainService.queryListPage(cusMain, page); return success(list); } @@ -97,19 +108,35 @@ public class CusMainController extends BaseController @PreAuthorize("@ss.hasPermi('cus:main:export')") @Log(title = "客户信息", businessType = BusinessType.EXPORT) @PostMapping("/export") - public void export(HttpServletResponse response, CusMain cusMain) - { + public void export(HttpServletResponse response, CusMain cusMain) { List list = cusMainService.list(); ExcelUtil util = new ExcelUtil(CusMain.class); util.exportExcel(response, list, "客户信息数据"); } + /** + * 客户信息导入 + * + * @param file TODO + * @return com.ruoyi.common.core.domain.AjaxResult + * @author PQZ + * @date 14:29 2025/11/19 + **/ + @Log(title = "客户信息导入", businessType = BusinessType.IMPORT) + @PostMapping("/importCus") + public AjaxResult importCusAndContacts(@RequestParam("file") MultipartFile file) throws IOException { + if (file.isEmpty()) { + return AjaxResult.error("上传文件不能为空"); + } + return cusImportService.importCusAndContacts(file); + } + /** * 获取客户信息详细信息--编辑 */ @PreAuthorize("@ss.hasPermi('cus:main:query')") @GetMapping(value = "/{id}") - public AjaxResult getInfo(@PathVariable("id") String id){ + public AjaxResult getInfo(@PathVariable("id") String id) { return success(cusMainService.getDataById(id)); } @@ -118,7 +145,7 @@ public class CusMainController extends BaseController */ @PreAuthorize("@ss.hasPermi('cus:main:query')") @GetMapping(value = "/viewData") - public AjaxResult viewData(String id){ + public AjaxResult viewData(String id) { return success(cusMainService.viewData(id)); } @@ -128,8 +155,8 @@ public class CusMainController extends BaseController @PreAuthorize("@ss.hasPermi('cus:main:add')") @Log(title = "客户信息", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody CusMainVO cusMainVO){ - if(StringUtils.isEmpty(cusMainVO.getMainInfo().getId())){ + public AjaxResult add(@RequestBody CusMainVO cusMainVO) { + if (StringUtils.isEmpty(cusMainVO.getMainInfo().getId())) { cusMainVO.getMainInfo().setCusCode(codeGenerator.generate()); } cusMainService.saveNewCus(cusMainVO); @@ -145,6 +172,37 @@ public class CusMainController extends BaseController cusMain.setId(cusMainVO.getId()); cusMain.setCusLabels(JSON.toJSONString(cusMainVO.getCusLabelList())); cusMainService.updateById(cusMain); + + //时间轴信息 + CusTimeAxis cusTimeAxis = new CusTimeAxis(); + cusTimeAxis.setBusiMaxCatg("客户"); + cusTimeAxis.setBusiCatg("修改"); + + List cusLabelList = new ArrayList<>(); + JSONArray cusLabelArray = JSON.parseArray(cusMain.getCusLabels()); + for(int i = 0; i < cusLabelArray.size(); i++){ + JSONObject jsonObj = cusLabelArray.getJSONObject(i); + cusLabelList.add(jsonObj.getString("name")); + } + cusTimeAxis.setContent("更新客户标签:" + String.join(",", cusLabelList)); + cusTimeAxis.setCusId(cusMain.getId()); + cusTimeAxisService.saveNewTimeAxis(cusTimeAxis); + return success(); + } + + /** + * 更新是否星标客户 + */ + @PostMapping("/setIfStar") + public AjaxResult setIfStar(@RequestBody CusMain cusMain){ + cusMainService.updateById(cusMain); + //时间轴信息 + CusTimeAxis cusTimeAxis = new CusTimeAxis(); + cusTimeAxis.setBusiMaxCatg("客户"); + cusTimeAxis.setBusiCatg("修改"); + cusTimeAxis.setContent(cusMain.getIfStar()?"设为星标":"取消星标"); + cusTimeAxis.setCusId(cusMain.getId()); + cusTimeAxisService.saveNewTimeAxis(cusTimeAxis); return success(); } @@ -154,10 +212,16 @@ public class CusMainController extends BaseController */ @PreAuthorize("@ss.hasPermi('cus:main:remove')") @Log(title = "客户信息", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public AjaxResult remove(@PathVariable String[] ids) - { + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable String[] ids) { List list = new ArrayList<>(Arrays.asList(ids)); + //时间轴信息 + CusTimeAxis cusTimeAxis = new CusTimeAxis(); + cusTimeAxis.setBusiMaxCatg("客户"); + cusTimeAxis.setBusiCatg("修改"); + cusTimeAxis.setContent("删除客户信息"); + cusTimeAxis.setCusId(list.get(0)); + cusTimeAxisService.saveNewTimeAxis(cusTimeAxis); return toAjax(cusMainService.removeByIds(list)); } @@ -165,7 +229,7 @@ public class CusMainController extends BaseController * 获取客户资料信息--公司信息、管理信息 */ @GetMapping(value = "/getOtherInfo") - public AjaxResult getOtherInfo(String cusId){ + public AjaxResult getOtherInfo(String cusId) { return success(cusMainService.getOtherInfo(cusId)); } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusBank.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusBank.java index f78788e..ebb6f2c 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusBank.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusBank.java @@ -34,6 +34,10 @@ public class CusBank extends DlBaseEntity @Excel(name = "客户ID") private String cusId; + /** 客户名称 */ + @Excel(name = "客户名称") + private String cusName; + /** 银行账号 */ @Excel(name = "银行账号") private String bankAccount; diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusCompany.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusCompany.java index 09d24ca..1d39fa5 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusCompany.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusCompany.java @@ -30,6 +30,10 @@ public class CusCompany extends DlBaseEntity @TableId(type = IdType.ASSIGN_UUID) private String id; + /** 客户名称 */ + @Excel(name = "客户名称") + private String cusName; + /** 客户ID */ @Excel(name = "客户ID") private String cusId; diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusContacts.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusContacts.java index d99d06c..b412daf 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusContacts.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusContacts.java @@ -36,6 +36,10 @@ public class CusContacts extends DlBaseEntity @Excel(name = "客户ID") private String cusId; + /** 客户名称 */ + @Excel(name = "客户名称") + private String cusName; + /** 姓名 */ @Excel(name = "姓名") private String name; diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusManager.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusManager.java index 0bb4aa1..a90ee5d 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusManager.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/domain/CusManager.java @@ -34,6 +34,10 @@ public class CusManager extends DlBaseEntity @Excel(name = "客户ID") private String cusId; + /** 客户名称 */ + @Excel(name = "客户名称") + private String cusName; + /** 业务员ID */ @Excel(name = "业务员ID") private Long userId; diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/dto/CusBankImportDTO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/dto/CusBankImportDTO.java new file mode 100644 index 0000000..cc973b6 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/dto/CusBankImportDTO.java @@ -0,0 +1,37 @@ +package com.ruoyi.cus.dto; + +import com.ruoyi.common.annotation.Excel; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class CusBankImportDTO { + @Excel(name = "客户名称") + private String cusName; + @Excel(name = "税号") + private String taxId; + @Excel(name = "银行名称") + private String bankName; + @Excel(name = "银行账号") + private String bankAccount; + @Excel(name = "分支机构代码") + private String branchCode; + @Excel(name = "银行代码") + private String bankCode; + @Excel(name = "币种") + private String currency; + @Excel(name = "银行swift代码") + private String swiftCode; + @Excel(name = "银行地址") + private String bankAddress; + + + + + + + + + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/dto/CusImportDTO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/dto/CusImportDTO.java new file mode 100644 index 0000000..451830a --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/dto/CusImportDTO.java @@ -0,0 +1,77 @@ +package com.ruoyi.cus.dto; + +import com.ruoyi.common.annotation.Excel; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class CusImportDTO { + // 客户主表字段 + @Excel(name = "客户代码") + private String cusCode; + @Excel(name = "客户名称") + private String fullName; + @Excel(name = "客户简称") + private String shortName; + @Excel(name = "客户类型") + private String cusType; + @Excel(name = "国家/地区") + private String country; + @Excel(name = "时区") + private String zoneName; + @Excel(name = "主营产品") + private String mainProds; + @Excel(name = "企业网站") + private String siteUrl; + @Excel(name = "创建人") + private String createBy; + @Excel(name = "创建日期") + private String createTime; + @Excel(name = "修改日期") + private String updateTime; + @Excel(name = "客户备注") + private String cusRemark; + + // 客户公司信息表字段 + @Excel(name = "客户来源") + private String cusSource; + @Excel(name = "客户等级") + private String cusLevel; + @Excel(name = "业务类型") + private String businessType; + @Excel(name = "联系地址") + private String contactAddress; + + // 客户管理信息表字段 + @Excel(name = "部门") + private String dept; + @Excel(name = "业务员") + private String userName; + @Excel(name = "跟进阶段") + private String followStep; + @Excel(name = "预计转入公海原因") + private String seasReason; + @Excel(name = "公海组") + private String seasGroup; + @Excel(name = "原部门") + private String oldDept; + + // 客户联系人表字段 + @Excel(name = "姓名") + private String name; + @Excel(name = "昵称") + private String nickName; + @Excel(name = "邮箱") + private String email; + @Excel(name = "手机") + private String telephone; + @Excel(name = "性别") + private String sex; + @Excel(name = "生日") + private String birthday; + @Excel(name = "whatsApp") + private String whatsApp; + @Excel(name = "联系人备注") + private String contactRemark; +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusBankService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusBankService.java index c53ba90..be7239b 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusBankService.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusBankService.java @@ -1,6 +1,7 @@ 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; @@ -8,11 +9,20 @@ import com.ruoyi.cus.domain.CusBank; /** * 客户银行资料Service接口 - * + * * @author vinjor-m * @date 2025-11-03 */ -public interface ICusBankService extends IService -{ +public interface ICusBankService extends IService { IPage queryListPage(CusBank pageReqVO, Page page); + + /** + * 批量保存银行卡信息 + * + * @param cusBankList 银行集合 + * @return void + * @author PQZ + * @date 15:58 2025/11/20 + **/ + void saveOrUpdateByAccount(List cusBankList); } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusCompanyService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusCompanyService.java index 0350655..459f298 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusCompanyService.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusCompanyService.java @@ -1,6 +1,7 @@ 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; @@ -8,11 +9,20 @@ import com.ruoyi.cus.domain.CusCompany; /** * 客户公司信息Service接口 - * + * * @author vinjor-m * @date 2025-11-03 */ -public interface ICusCompanyService extends IService -{ +public interface ICusCompanyService extends IService { IPage queryListPage(CusCompany pageReqVO, Page page); + + /** + * 批量保存客户公司信息 + * + * @param cusCompanyList 客户公司信息集合 + * @return void + * @author PQZ + * @date 15:15 2025/11/20 + **/ + void saveOrUpdateByCusName(List cusCompanyList); } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusContactsService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusContactsService.java index b1eb02a..dc62f1a 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusContactsService.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusContactsService.java @@ -1,6 +1,7 @@ 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; @@ -8,19 +9,27 @@ import com.ruoyi.cus.domain.CusContacts; /** * 客户联系人Service接口 - * + * * @author vinjor-m * @date 2025-11-03 */ -public interface ICusContactsService extends IService -{ +public interface ICusContactsService extends IService { IPage queryListPage(CusContacts pageReqVO, Page page); + /** + * 批量保存客户联系人信息 + * + * @param cusContactsList List + * @author PQZ + * @date 9:32 2025/11/21 + **/ + void saveOrUpdateByCusName(List cusContactsList); + /** * 查客户所有联系人列表 - * @author vinjor-M + * @author vinjor-M * @date 17:58 2025/11/21 - * @param cusContacts TODO + * @param cusContacts TODO * @return java.util.List **/ List selectAllList(CusContacts cusContacts); 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 new file mode 100644 index 0000000..99c1b2d --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusImportService.java @@ -0,0 +1,16 @@ +package com.ruoyi.cus.service; + +import com.ruoyi.common.core.domain.AjaxResult; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +public interface ICusImportService { + /** + * 导入客户及联系人信息 + * @param file 导入文件 + * @return 导入结果 + */ + AjaxResult importCusAndContacts(MultipartFile file) throws IOException; + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusMainService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusMainService.java index 9061d19..2c0ae86 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusMainService.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusMainService.java @@ -2,6 +2,7 @@ package com.ruoyi.cus.service; import java.util.Date; 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; @@ -14,48 +15,62 @@ import com.ruoyi.cus.vo.ViewTimeVO; /** * 客户信息Service接口 - * + * * @author vinjor-m * @date 2025-11-03 */ -public interface ICusMainService extends IService -{ +public interface ICusMainService extends IService { IPage queryListPage(MainVO pageReqVO, Page page); /** * 新增客户信息 + * + * @param cusMainVO TODO * @author vinjor-M * @date 15:56 2025/11/6 - * @param cusMainVO TODO - **/ + **/ void saveNewCus(CusMainVO cusMainVO); /** * 根据id查询客户信息 - * @author vinjor-M - * @date 15:41 2025/11/12 + * * @param id 客户id * @return com.ruoyi.cus.vo.CusMainVO - **/ + * @author vinjor-M + * @date 15:41 2025/11/12 + **/ CusMainVO getDataById(String id); /** * 查看客户信息面板数据对象 - * @author vinjor-M - * @date 10:34 2025/11/18 + * * @param id 数据id * @return com.ruoyi.cus.vo.CusViewVO - **/ + * @author vinjor-M + * @date 10:34 2025/11/18 + **/ CusViewVO viewData(String id); /** * 获取客户其他信息 + * + * @param cusId 客户id + * @return com.ruoyi.cus.vo.CusViewVO * @author vinjor-M * @date 13:14 2025/11/18 - * @param id 客户id - * @return com.ruoyi.cus.vo.CusViewVO - **/ + **/ CusViewVO getOtherInfo(String cusId); + /** + * 通过名称保存客户主表信息 + * + * @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/ICusManagerService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusManagerService.java index 6662dd0..d76ed90 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusManagerService.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/ICusManagerService.java @@ -1,6 +1,7 @@ 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; @@ -8,11 +9,20 @@ import com.ruoyi.cus.domain.CusManager; /** * 客户管理信息Service接口 - * + * * @author vinjor-m * @date 2025-11-03 */ -public interface ICusManagerService extends IService -{ +public interface ICusManagerService extends IService { IPage queryListPage(CusManager pageReqVO, Page page); + + /** + * 批量保存客户管理信息 + * + * @param cusManagerList 客户管理信息集合 + * @return void + * @author PQZ + * @date 15:15 2025/11/20 + **/ + void saveOrUpdateByCusName(List cusManagerList); } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusBankServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusBankServiceImpl.java index ccd6fc1..4e837d4 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusBankServiceImpl.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusBankServiceImpl.java @@ -1,27 +1,33 @@ 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.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.DlBaseEntity; +import com.ruoyi.common.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.cus.mapper.CusBankMapper; import com.ruoyi.cus.domain.CusBank; import com.ruoyi.cus.service.ICusBankService; +import org.springframework.transaction.annotation.Transactional; /** * 客户银行资料Service业务层处理 - * + * * @author vinjor-m * @date 2025-11-03 */ @Service -public class CusBankServiceImpl extends ServiceImpl implements ICusBankService -{ +public class CusBankServiceImpl extends ServiceImpl implements ICusBankService { @Autowired private CusBankMapper cusBankMapper; @@ -29,4 +35,67 @@ public class CusBankServiceImpl extends ServiceImpl impl public IPage queryListPage(CusBank pageReqVO, Page page) { return cusBankMapper.queryListPage(pageReqVO, page); } + + + /** + * 根据银行账号保存或更新客户银行信息 + * + * @param cusBankList 客户银行信息列表 + * @author lingma + * @date 2025/11/20 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void saveOrUpdateByAccount(List cusBankList) { + if (cusBankList == null || cusBankList.isEmpty()) { + return; + } + + // 1. 提取所有有效的 bankAccount 并去重 + List bankAccounts = cusBankList.stream() + .map(CusBank::getBankAccount) + .filter(StringUtils::isNotEmpty) + .distinct() + .collect(Collectors.toList()); + + // 2. 查询数据库中已有的银行信息 + Map existingBankMap = new HashMap<>(); + if (!bankAccounts.isEmpty()) { + List existingBanks = this.list(new LambdaQueryWrapper() + .in(CusBank::getBankAccount, bankAccounts)); + existingBankMap = existingBanks.stream() + .collect(Collectors.toMap(CusBank::getBankAccount, Function.identity())); + } + + // 3. 分离需要新增和更新的数据 + List toSaveList = new ArrayList<>(); + List toUpdateList = new ArrayList<>(); + + for (CusBank bank : cusBankList) { + if (StringUtils.isEmpty(bank.getBankAccount())) { + continue; // 忽略没有 bankAccount 的数据 + } + + CusBank existing = existingBankMap.get(bank.getBankAccount()); + if (existing != null) { + // 存在就更新 + bank.setId(existing.getId()); + //保留原来的客户id + bank.setCusId(existing.getCusId()); + toUpdateList.add(bank); + } else { + // 不存在就新增 + toSaveList.add(bank); + } + } + + // 4. 批量保存与更新 + if (!toSaveList.isEmpty()) { + this.saveBatch(toSaveList); + } + if (!toUpdateList.isEmpty()) { + this.updateBatchById(toUpdateList); + } + } + } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusCompanyServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusCompanyServiceImpl.java index 5184a56..2ffa60b 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusCompanyServiceImpl.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusCompanyServiceImpl.java @@ -1,24 +1,32 @@ 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.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.cus.mapper.CusCompanyMapper; import com.ruoyi.cus.domain.CusCompany; import com.ruoyi.cus.service.ICusCompanyService; +import org.springframework.transaction.annotation.Transactional; /** * 客户公司信息Service业务层处理 - * + * * @author vinjor-m * @date 2025-11-03 */ @Service -public class CusCompanyServiceImpl extends ServiceImpl implements ICusCompanyService -{ +public class CusCompanyServiceImpl extends ServiceImpl implements ICusCompanyService { @Autowired private CusCompanyMapper cusCompanyMapper; @@ -26,4 +34,67 @@ public class CusCompanyServiceImpl extends ServiceImpl queryListPage(CusCompany pageReqVO, Page page) { return cusCompanyMapper.queryListPage(pageReqVO, page); } + + /** + * 批量保存客户公司信息 + * + * @param cusCompanyList 客户公司信息集合 + * @return void + * @author PQZ + * @date 15:15 2025/11/20 + **/ + @Override + @Transactional(rollbackFor = Exception.class) + public void saveOrUpdateByCusName(List cusCompanyList) { + if (cusCompanyList == null || cusCompanyList.isEmpty()) { + return; + } + + // 1. 提取所有有效的 cusName 并去重 + List cusNames = cusCompanyList.stream() + .map(CusCompany::getCusName) + .filter(StringUtils::isNotEmpty) + .distinct() + .collect(Collectors.toList()); + + // 2. 查询数据库中已有的公司信息 + Map existingCompanyMap = new HashMap<>(); + if (!cusNames.isEmpty()) { + List existingCompanies = this.list(new LambdaQueryWrapper() + .in(CusCompany::getCusName, cusNames)); + existingCompanyMap = existingCompanies.stream() + .collect(Collectors.toMap(CusCompany::getCusName, Function.identity())); + } + + // 3. 分离需要新增和更新的数据 + List toSaveList = new ArrayList<>(); + List toUpdateList = new ArrayList<>(); + + for (CusCompany company : cusCompanyList) { + if (StringUtils.isEmpty(company.getCusName())) { + continue; // 忽略没有 cusName 的数据 + } + + CusCompany existing = existingCompanyMap.get(company.getCusName()); + if (existing != null) { + // 存在就更新 + company.setId(existing.getId()); + //保留原来的客户id + company.setCusId(existing.getCusId()); + toUpdateList.add(company); + } else { + // 不存在就新增 + toSaveList.add(company); + } + } + + // 4. 批量保存与更新 + if (!toSaveList.isEmpty()) { + this.saveBatch(toSaveList); + } + if (!toUpdateList.isEmpty()) { + this.updateBatchById(toUpdateList); + } + } + } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusContactsServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusContactsServiceImpl.java index 6913e0e..d8da0f4 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusContactsServiceImpl.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusContactsServiceImpl.java @@ -1,11 +1,18 @@ 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.stream.Collectors; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.DlBaseEntity; +import com.ruoyi.common.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -57,4 +64,60 @@ public class CusContactsServiceImpl extends ServiceImpl + * @author PQZ + * @date 9:32 2025/11/21 + **/ + @Override + public void saveOrUpdateByCusName(List cusContactsList) { + if(cusContactsList == null || cusContactsList.isEmpty()) { + return; + } + // 1. 提取有效的客户名称并去重 + List cusNames = cusContactsList.stream() + .map(CusContacts::getCusName) + .filter(StringUtils::isNotEmpty) + .distinct() + .collect(Collectors.toList()); + + //2. 查询数据库中已有的客户联系人信息,并按照客户名称+姓名分组 + Map existingCusContactMap = new HashMap<>(); + List existingContactsList = this.list(new LambdaQueryWrapper() + .in(CusContacts::getCusName, cusNames)); + existingCusContactMap = existingContactsList.stream() + .collect(Collectors.toMap( + contact -> contact.getCusName() + "_" + contact.getName(), + contact -> contact, + // 保留第一个,忽略后续重复项 + (existing, replacement) -> existing + )); + + // 3. 分离需要新增和更新的数据 + List toSaveList = new ArrayList<>(); + List toUpdateList = new ArrayList<>(); + for(CusContacts cusContacts : cusContactsList) { + String key = cusContacts.getCusName() + "_" + cusContacts.getName(); + CusContacts existing = existingCusContactMap.get(key); + if(existing != null) { + // 存在就更新 + cusContacts.setId(existing.getId()); + //保留原来的客户id + cusContacts.setCusId(existing.getCusId()); + toUpdateList.add(cusContacts); + } else { + // 不存在就新增 + toSaveList.add(cusContacts); + } + } + // 4. 批量保存与更新 + if(!toSaveList.isEmpty()) { + this.saveBatch(toSaveList); + } + if(!toUpdateList.isEmpty()) { + this.updateBatchById(toUpdateList); + } + } } 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 new file mode 100644 index 0000000..0bddb51 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusImportServiceImpl.java @@ -0,0 +1,217 @@ +package com.ruoyi.cus.service.impl; + +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.cus.domain.*; +import com.ruoyi.cus.dto.CusBankImportDTO; +import com.ruoyi.cus.dto.CusImportDTO; +import com.ruoyi.cus.service.*; +import com.ruoyi.utils.SnowflakeIdGenerator; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.io.InputStream; +import java.util.*; +import java.util.stream.Collectors; + +@Service +@Transactional(rollbackFor = Exception.class) +public class CusImportServiceImpl implements ICusImportService { + + @Autowired + private ICusMainService cusMainService; + @Autowired + private ICusCompanyService cusCompanyService; + @Autowired + private ICusManagerService cusManagerService; + @Autowired + private ICusContactsService cusContactsService; + @Autowired + private ICusBankService cusBankService; + @Autowired + private SnowflakeIdGenerator snowflakeIdGenerator; + + /** + * 导入客户及联系人信息 + * + * @param file 导入文件 + * @return 导入结果 + */ + @Override + public AjaxResult importCusAndContacts(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 secondSheetList = 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); + return AjaxResult.success("导入成功"); + } catch (Exception e) { + return AjaxResult.error("导入失败:" + e.getMessage()); + } + } + + /** + * 数据处理 + * + * @param cusList List + * @param bankList List + * @author PQZ + * @date 15:30 2025/11/19 + **/ + private void saveCusAndBank(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 + CusMain customer = new CusMain(); + //绑定客户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()) { + cusMainService.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/CusMainServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusMainServiceImpl.java index 0051a8d..7d1f794 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusMainServiceImpl.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusMainServiceImpl.java @@ -1,12 +1,15 @@ package com.ruoyi.cus.service.impl; import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.base.service.IBaseCountryService; import com.ruoyi.common.core.domain.DlBaseEntity; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.utils.SecurityUtils; @@ -49,6 +52,8 @@ public class CusMainServiceImpl extends ServiceImpl impl private ICusMarkService cusMarkService; @Autowired private ICusTimeAxisService cusTimeAxisService; + @Autowired + private IBaseCountryService baseCountryService; @Override public IPage queryListPage(MainVO pageReqVO, Page page) { @@ -244,6 +249,10 @@ public class CusMainServiceImpl extends ServiceImpl impl CusContacts contacts = new CusContacts(); contacts.setCusId(id); cusViewVO.setContacts(cusContactsService.selectAllList(contacts)); + //3.国旗信息 + if (StringUtils.isNotEmpty(cusMain.getCountry())){ + cusViewVO.setCountryImg(baseCountryService.queryByName(cusMain.getCountry()).getImg()); + } return cusViewVO; } @@ -268,4 +277,60 @@ public class CusMainServiceImpl extends ServiceImpl impl return cusViewVO; } + /** + * 通过名称保存客户主表信息 + * + * @param cusMainList List + * @return void + * @author PQZ + * @date 14:44 2025/11/20 + **/ + @Override + public void saveOrUpdateByCusName(List cusMainList) { + if (cusMainList == null || cusMainList.isEmpty()) { + return; + } + // 提取所有需要处理的 fullName + List fullNames = cusMainList.stream() + .map(CusMain::getFullName) + .filter(StringUtils::isNotEmpty) + .distinct() + .collect(Collectors.toList()); + // 一次性查询数据库中已存在的客户信息 + Map existingCusMap = new HashMap<>(); + if (!fullNames.isEmpty()) { + List existingCusList = this.list( + new LambdaQueryWrapper() + .in(CusMain::getFullName, fullNames) + ); + existingCusMap = existingCusList.stream() + .collect(Collectors.toMap(CusMain::getFullName, Function.identity())); + } + // 分离需要新增和更新的客户 + List toSaveList = new ArrayList<>(); + List toUpdateList = new ArrayList<>(); + for (CusMain cusMain : cusMainList) { + if (StringUtils.isEmpty(cusMain.getFullName())) { + continue; + } + + CusMain 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_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusManagerServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusManagerServiceImpl.java index 28bd32a..b2b36c5 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusManagerServiceImpl.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusManagerServiceImpl.java @@ -1,24 +1,32 @@ 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.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.cus.mapper.CusManagerMapper; import com.ruoyi.cus.domain.CusManager; import com.ruoyi.cus.service.ICusManagerService; +import org.springframework.transaction.annotation.Transactional; /** * 客户管理信息Service业务层处理 - * + * * @author vinjor-m * @date 2025-11-03 */ @Service -public class CusManagerServiceImpl extends ServiceImpl implements ICusManagerService -{ +public class CusManagerServiceImpl extends ServiceImpl implements ICusManagerService { @Autowired private CusManagerMapper cusManagerMapper; @@ -26,4 +34,68 @@ public class CusManagerServiceImpl extends ServiceImpl queryListPage(CusManager pageReqVO, Page page) { return cusManagerMapper.queryListPage(pageReqVO, page); } + + /** + * 批量保存客户管理信息 + * + * @param cusManagerList 客户管理信息集合 + * @return void + * @author PQZ + * @date 15:15 2025/11/20 + **/ + @Override + @Transactional(rollbackFor = Exception.class) + public void saveOrUpdateByCusName(List cusManagerList) { + if (cusManagerList == null || cusManagerList.isEmpty()) { + return; + } + // 1. 提取所有有效的 cusName 并去重 + List cusNames = cusManagerList.stream() + .map(CusManager::getCusName) + .filter(StringUtils::isNotEmpty) + .distinct() + .collect(Collectors.toList()); + + // 2. 查询数据库中已有的管理信息 + Map existingManagerMap = new HashMap<>(); + if (!cusNames.isEmpty()) { + List existingManagers = this.list(new LambdaQueryWrapper() + .in(CusManager::getCusName, cusNames)); + existingManagerMap = existingManagers.stream() + .collect(Collectors.toMap(CusManager::getCusName, Function.identity())); + } + + // 3. 分离需要新增和更新的数据 + List toSaveList = new ArrayList<>(); + List toUpdateList = new ArrayList<>(); + + for (CusManager manager : cusManagerList) { + if (StringUtils.isEmpty(manager.getCusName())) { + continue; // 忽略没有 cusName 的数据 + } + + CusManager existing = existingManagerMap.get(manager.getCusName()); + if (existing != null) { + // 存在就更新 + manager.setId(existing.getId()); + //保留原来的客户id + manager.setCusId(existing.getCusId()); + toUpdateList.add(manager); + } else { + // 不存在就新增 + toSaveList.add(manager); + } + } + + // 4. 批量保存与更新 + if (!toSaveList.isEmpty()) { + this.saveBatch(toSaveList); + } + if (!toUpdateList.isEmpty()) { + this.updateBatchById(toUpdateList); + } + } + + + } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/vo/CusViewVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/vo/CusViewVO.java index a8bfc51..650d898 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/vo/CusViewVO.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/vo/CusViewVO.java @@ -20,6 +20,8 @@ public class CusViewVO { private CusCompany company; /** 管理信息 */ private CusManager manager; + /** 国旗信息*/ + private String countryImg; /** 银行信息 */ private List bankList; } diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseCountryMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseCountryMapper.xml index 9ade594..6cb3e44 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseCountryMapper.xml +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseCountryMapper.xml @@ -13,7 +13,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" LEFT JOIN base_time_zone btz ON main.zone_id = btz.id and name_en = #{entity.nameEn} - and name_cn = #{entity.nameCn} + and name_cn like concat('%', #{entity.nameCn}, '%') \ No newline at end of file diff --git a/dl_vue/src/api/cus/main.js b/dl_vue/src/api/cus/main.js index 2804658..6bcdde9 100644 --- a/dl_vue/src/api/cus/main.js +++ b/dl_vue/src/api/cus/main.js @@ -50,7 +50,7 @@ export function updateMain(data) { data: data }) } -// 修改客户信息 +// 设置客户标签 export function setLabels(data) { return request({ url: '/cus/main/setLabels', @@ -58,6 +58,14 @@ export function setLabels(data) { data: data }) } +// 设置是否星标客户 +export function setIfStar(data) { + return request({ + url: '/cus/main/setIfStar', + method: 'post', + data: data + }) +} // 删除客户信息 export function delMain(id) { diff --git a/dl_vue/src/views/cus/main/drawForm.vue b/dl_vue/src/views/cus/main/drawForm.vue index 2f44e6e..b651190 100644 --- a/dl_vue/src/views/cus/main/drawForm.vue +++ b/dl_vue/src/views/cus/main/drawForm.vue @@ -57,12 +57,20 @@ - + @@ -71,10 +79,10 @@ @@ -255,6 +263,9 @@