|
|
@@ -0,0 +1,191 @@
|
|
|
+package org.dromara.customer.service.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import org.dromara.common.core.utils.MapstructUtils;
|
|
|
+import org.dromara.common.core.utils.ObjectUtils;
|
|
|
+import org.dromara.common.mybatis.core.page.PageQuery;
|
|
|
+import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
|
+import org.dromara.common.redis.utils.SequenceUtils;
|
|
|
+
|
|
|
+import org.dromara.customer.controller.constant.CustomerConstants;
|
|
|
+import org.dromara.customer.domain.Salesleads;
|
|
|
+import org.dromara.customer.domain.bo.SalesleadsBo;
|
|
|
+import org.dromara.customer.domain.bo.TeamMemberBo;
|
|
|
+import org.dromara.customer.domain.vo.SalesleadsVo;
|
|
|
+import org.dromara.customer.mapper.SalesleadsMapper;
|
|
|
+import org.dromara.customer.service.IOperationLogService;
|
|
|
+import org.dromara.customer.service.ISalesleadsService;
|
|
|
+import org.dromara.customer.service.ITeamMemberService;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.time.Duration;
|
|
|
+import java.util.Collection;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 销售线索/项目商机 Service 业务层处理
|
|
|
+ *
|
|
|
+ * @author tys
|
|
|
+ * @date 2026-04-16
|
|
|
+ */
|
|
|
+@RequiredArgsConstructor
|
|
|
+@Service
|
|
|
+public class SalesleadsServiceImpl implements ISalesleadsService {
|
|
|
+
|
|
|
+ private static final String PROJECT_NO_KEY = "salesleads:project_no";
|
|
|
+
|
|
|
+ private final SalesleadsMapper baseMapper;
|
|
|
+ private final ITeamMemberService teamMemberService;
|
|
|
+ private final IOperationLogService operationLogService;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public SalesleadsVo queryById(Long id) {
|
|
|
+ return baseMapper.selectVoById(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分页查询
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<SalesleadsVo> queryPageList(SalesleadsBo bo, PageQuery pageQuery) {
|
|
|
+ IPage<SalesleadsVo> result = baseMapper.selectSalesleadsList(pageQuery.build(), bo);
|
|
|
+ return TableDataInfo.build(result);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 列表查询
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<SalesleadsVo> queryList(SalesleadsBo bo) {
|
|
|
+ return baseMapper.selectSalesleadsList(bo);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 新增
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public Boolean insertLeads(SalesleadsBo bo) {
|
|
|
+ Salesleads add = MapstructUtils.convert(bo, Salesleads.class);
|
|
|
+ if (add.getProjectNo() == null || add.getProjectNo().isEmpty()) {
|
|
|
+ add.setProjectNo(SequenceUtils.nextPaddedIdStr(PROJECT_NO_KEY, Duration.ofDays(3650), 6));
|
|
|
+ }
|
|
|
+ if (add.getPlatformCode() == null || add.getPlatformCode().isEmpty()) {
|
|
|
+ add.setPlatformCode(CustomerConstants.DEFAULT_PLATFORM);
|
|
|
+ }
|
|
|
+ if (add.getProjectType() == null || add.getProjectType().isEmpty()) {
|
|
|
+ add.setProjectType(CustomerConstants.PROJECT_TYPE_LEADS);
|
|
|
+ }
|
|
|
+ boolean success = baseMapper.insert(add) > 0;
|
|
|
+ if (success && add.getLeader() != null) {
|
|
|
+ // 新增成功后,将负责人同步到团队成员表
|
|
|
+ syncLeaderToTeamMember(add.getId(), add.getLeader(), add.getLeaderName());
|
|
|
+ }
|
|
|
+ return success;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 修改
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public Boolean updateLeads(SalesleadsBo bo) {
|
|
|
+ Salesleads oldData = baseMapper.selectById(bo.getId());
|
|
|
+ Salesleads update = MapstructUtils.convert(bo, Salesleads.class);
|
|
|
+ boolean success = baseMapper.updateById(update) > 0;
|
|
|
+ if (success && oldData != null) {
|
|
|
+ if (!ObjectUtils.equals(oldData.getProjectSchedule(), bo.getProjectSchedule())) {
|
|
|
+ operationLogService.recordLog(CustomerConstants.DATA_TYPE_LEADS, String.valueOf(bo.getId()), CustomerConstants.ACTION_TYPE_UPDATE, null, CustomerConstants.MODULE_PROJECT_PROGRESS, bo.getProjectSchedule());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (success && bo.getLeader() != null) {
|
|
|
+ // 负责人变更时,同步更新团队成员
|
|
|
+ if (oldData == null || !ObjectUtils.equals(oldData.getLeader(), bo.getLeader())) {
|
|
|
+ syncLeaderToTeamMember(bo.getId(), bo.getLeader(), bo.getLeaderName());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return success;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量删除
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
|
|
+ return baseMapper.deleteByIds(ids) > 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 认领销售线索 - 设置项目负责人(支持批量)
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public Boolean claimLeads(SalesleadsBo bo) {
|
|
|
+ List<Long> ids = bo.getIds();
|
|
|
+ if (ids == null || ids.isEmpty()) {
|
|
|
+ if (bo.getId() == null) return false;
|
|
|
+ ids = List.of(bo.getId());
|
|
|
+ }
|
|
|
+ // 逐条更新(批量认领场景通常数据量不大)
|
|
|
+ boolean result = true;
|
|
|
+ for (Long id : ids) {
|
|
|
+ Salesleads update = new Salesleads();
|
|
|
+ update.setId(id);
|
|
|
+ update.setLeader(bo.getLeader());
|
|
|
+ update.setLeaderName(bo.getLeaderName());
|
|
|
+ result = result && baseMapper.updateById(update) > 0;
|
|
|
+ if (result) {
|
|
|
+ syncLeaderToTeamMember(id, bo.getLeader(), bo.getLeaderName());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转移销售线索 - 更换负责人(支持批量)
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public Boolean transferLeads(SalesleadsBo bo) {
|
|
|
+ List<Long> ids = bo.getIds();
|
|
|
+ if (ids == null || ids.isEmpty()) {
|
|
|
+ if (bo.getId() == null) return false;
|
|
|
+ ids = List.of(bo.getId());
|
|
|
+ }
|
|
|
+ boolean result = true;
|
|
|
+ for (Long id : ids) {
|
|
|
+ Salesleads update = new Salesleads();
|
|
|
+ update.setId(id);
|
|
|
+ update.setLeader(bo.getLeader());
|
|
|
+ update.setLeaderName(bo.getLeaderName());
|
|
|
+ result = result && baseMapper.updateById(update) > 0;
|
|
|
+ if (result) {
|
|
|
+ syncLeaderToTeamMember(id, bo.getLeader(), bo.getLeaderName());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步负责人到团队成员表
|
|
|
+ * 如果该用户已存在则更新为负责人,否则新增
|
|
|
+ */
|
|
|
+ private void syncLeaderToTeamMember(Long objectNo, Long leaderId, String leaderName) {
|
|
|
+ if (leaderId == null) return;
|
|
|
+ TeamMemberBo memberBo = new TeamMemberBo();
|
|
|
+ memberBo.setDataType(CustomerConstants.DATA_TYPE_LEADS);
|
|
|
+ memberBo.setObjectNo(String.valueOf(objectNo));
|
|
|
+ memberBo.setUserNo(leaderId);
|
|
|
+ memberBo.setRealName(leaderName);
|
|
|
+ memberBo.setRoleCode(CustomerConstants.TEAM_ROLE_LEADER); // 业务负责人的字典值
|
|
|
+ memberBo.setIzManager(1);
|
|
|
+ memberBo.setUpdateAccredit(1);
|
|
|
+ teamMemberService.insertOrUpdateMember(memberBo);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|