|
|
@@ -0,0 +1,154 @@
|
|
|
+package com.cyksj.service.enterprise.impl;
|
|
|
+
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.cyksj.common.exception.BusinessRuntimeException;
|
|
|
+import com.cyksj.mapper.enterprise.EnterprisePurchaseLeadMapper;
|
|
|
+import com.cyksj.model.entity.EnterprisePurchaseLead;
|
|
|
+import com.cyksj.model.request.EnterprisePurchaseLeadRemarkReq;
|
|
|
+import com.cyksj.model.request.EnterprisePurchaseLeadStatusReq;
|
|
|
+import com.cyksj.model.request.EnterprisePurchaseLeadSubmitReq;
|
|
|
+import com.cyksj.model.views.EnterprisePurchaseLeadView;
|
|
|
+import com.cyksj.service.enterprise.EnterprisePurchaseLeadService;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Set;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+@Service
|
|
|
+public class EnterprisePurchaseLeadServiceImpl extends ServiceImpl<EnterprisePurchaseLeadMapper, EnterprisePurchaseLead> implements EnterprisePurchaseLeadService {
|
|
|
+
|
|
|
+ private static final String STATUS_PENDING = "pending";
|
|
|
+ private static final String STATUS_CONTACTED = "contacted";
|
|
|
+ private static final String STATUS_INVALID = "invalid";
|
|
|
+ private static final Set<String> ALLOW_STATUSES = Set.of(STATUS_PENDING, STATUS_CONTACTED, STATUS_INVALID);
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Long submit(EnterprisePurchaseLeadSubmitReq req, String submitIp, String userAgent) {
|
|
|
+ List<String> models = normalizeModels(req.getModels());
|
|
|
+ if (models.isEmpty()) {
|
|
|
+ throw new BusinessRuntimeException("models is required");
|
|
|
+ }
|
|
|
+
|
|
|
+ EnterprisePurchaseLead lead = new EnterprisePurchaseLead()
|
|
|
+ .setContactName(limit(req.getContactName(), 64))
|
|
|
+ .setCompanyName(limit(req.getCompanyName(), 128))
|
|
|
+ .setPhone(limit(req.getPhone(), 32))
|
|
|
+ .setEmail(limit(req.getEmail(), 128))
|
|
|
+ .setModelCodes(String.join(",", models))
|
|
|
+ .setExpectedUsage(limit(req.getExpectedUsage(), 128))
|
|
|
+ .setStatus(STATUS_PENDING)
|
|
|
+ .setSubmitIp(limit(submitIp, 64))
|
|
|
+ .setUserAgent(limit(userAgent, 512))
|
|
|
+ .setRemark("");
|
|
|
+ save(lead);
|
|
|
+ return lead.getId();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Page<EnterprisePurchaseLeadView> page(String status, String keyword, Integer start, Integer limit) {
|
|
|
+ int current = start == null || start < 1 ? 1 : start;
|
|
|
+ int size = limit == null || limit < 1 ? 10 : Math.min(limit, 100);
|
|
|
+
|
|
|
+ LambdaQueryWrapper<EnterprisePurchaseLead> wrapper = new LambdaQueryWrapper<>();
|
|
|
+ if (StrUtil.isNotBlank(status) && !"all".equals(status)) {
|
|
|
+ validateStatus(status);
|
|
|
+ wrapper.eq(EnterprisePurchaseLead::getStatus, status);
|
|
|
+ }
|
|
|
+ if (StrUtil.isNotBlank(keyword)) {
|
|
|
+ String kw = keyword.trim();
|
|
|
+ wrapper.and(w -> w.like(EnterprisePurchaseLead::getCompanyName, kw)
|
|
|
+ .or().like(EnterprisePurchaseLead::getContactName, kw)
|
|
|
+ .or().like(EnterprisePurchaseLead::getPhone, kw)
|
|
|
+ .or().like(EnterprisePurchaseLead::getEmail, kw));
|
|
|
+ }
|
|
|
+ wrapper.orderByDesc(EnterprisePurchaseLead::getCreatedTime);
|
|
|
+
|
|
|
+ Page<EnterprisePurchaseLead> entityPage = page(new Page<>(current, size), wrapper);
|
|
|
+ Page<EnterprisePurchaseLeadView> viewPage = new Page<>(entityPage.getCurrent(), entityPage.getSize());
|
|
|
+ viewPage.setTotal(entityPage.getTotal());
|
|
|
+ viewPage.setRecords(entityPage.getRecords().stream().map(this::toView).collect(Collectors.toList()));
|
|
|
+ return viewPage;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void updateStatus(EnterprisePurchaseLeadStatusReq req) {
|
|
|
+ validateStatus(req.getStatus());
|
|
|
+ EnterprisePurchaseLead lead = new EnterprisePurchaseLead()
|
|
|
+ .setStatus(req.getStatus());
|
|
|
+ lead.setId(req.getId());
|
|
|
+ if (!updateById(lead)) {
|
|
|
+ throw new BusinessRuntimeException("lead not found");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void updateRemark(EnterprisePurchaseLeadRemarkReq req) {
|
|
|
+ EnterprisePurchaseLead lead = new EnterprisePurchaseLead()
|
|
|
+ .setRemark(limit(req.getRemark(), 2000));
|
|
|
+ lead.setId(req.getId());
|
|
|
+ if (!updateById(lead)) {
|
|
|
+ throw new BusinessRuntimeException("lead not found");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private EnterprisePurchaseLeadView toView(EnterprisePurchaseLead lead) {
|
|
|
+ EnterprisePurchaseLeadView view = new EnterprisePurchaseLeadView();
|
|
|
+ view.setId(lead.getId());
|
|
|
+ view.setCreatedTime(lead.getCreatedTime());
|
|
|
+ view.setUpdateTime(lead.getUpdateTime());
|
|
|
+ view.setContactName(lead.getContactName());
|
|
|
+ view.setCompanyName(lead.getCompanyName());
|
|
|
+ view.setPhone(lead.getPhone());
|
|
|
+ view.setEmail(lead.getEmail());
|
|
|
+ view.setModels(splitModels(lead.getModelCodes()));
|
|
|
+ view.setExpectedUsage(lead.getExpectedUsage());
|
|
|
+ view.setStatus(lead.getStatus());
|
|
|
+ view.setRemark(lead.getRemark());
|
|
|
+ return view;
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<String> normalizeModels(List<String> models) {
|
|
|
+ if (models == null) {
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+ return models.stream()
|
|
|
+ .filter(StrUtil::isNotBlank)
|
|
|
+ .map(String::trim)
|
|
|
+ .map(item -> item.replace(",", ""))
|
|
|
+ .map(item -> limit(item, 128))
|
|
|
+ .distinct()
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<String> splitModels(String modelCodes) {
|
|
|
+ if (StrUtil.isBlank(modelCodes)) {
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+ return Arrays.stream(modelCodes.split(","))
|
|
|
+ .filter(StrUtil::isNotBlank)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ private void validateStatus(String status) {
|
|
|
+ if (!ALLOW_STATUSES.contains(status)) {
|
|
|
+ throw new BusinessRuntimeException("status is invalid");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private String limit(String value, int maxLength) {
|
|
|
+ if (value == null) {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ String trim = value.trim();
|
|
|
+ if (trim.length() <= maxLength) {
|
|
|
+ return trim;
|
|
|
+ }
|
|
|
+ return StrUtil.subPre(trim, maxLength);
|
|
|
+ }
|
|
|
+}
|