|
@@ -5,25 +5,28 @@ import cn.hutool.core.collection.ListUtil;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
|
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
|
|
|
+import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
|
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
|
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessPageReqVO;
|
|
|
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessSaveReqVO;
|
|
|
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessTransferReqVO;
|
|
|
-import cn.iocoder.yudao.module.crm.controller.admin.business.vo.product.CrmBusinessProductSaveReqVO;
|
|
|
import cn.iocoder.yudao.module.crm.convert.business.CrmBusinessConvert;
|
|
|
-import cn.iocoder.yudao.module.crm.convert.businessproduct.CrmBusinessProductConvert;
|
|
|
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
|
|
|
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessProductDO;
|
|
|
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactBusinessDO;
|
|
|
+import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductDO;
|
|
|
import cn.iocoder.yudao.module.crm.dal.mysql.business.CrmBusinessMapper;
|
|
|
+import cn.iocoder.yudao.module.crm.dal.mysql.business.CrmBusinessProductMapper;
|
|
|
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
|
|
|
import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
|
|
|
import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission;
|
|
|
+import cn.iocoder.yudao.module.crm.service.business.bo.CrmBusinessUpdateProductReqBO;
|
|
|
import cn.iocoder.yudao.module.crm.service.contact.CrmContactBusinessService;
|
|
|
import cn.iocoder.yudao.module.crm.service.contract.CrmContractService;
|
|
|
import cn.iocoder.yudao.module.crm.service.followup.bo.CrmUpdateFollowUpReqBO;
|
|
|
import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
|
|
|
import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
|
|
|
+import cn.iocoder.yudao.module.crm.service.product.CrmProductService;
|
|
|
import com.mzt.logapi.context.LogRecordContext;
|
|
|
import com.mzt.logapi.service.impl.DiffParseFunction;
|
|
|
import com.mzt.logapi.starter.annotation.LogRecord;
|
|
@@ -35,11 +38,12 @@ import org.springframework.validation.annotation.Validated;
|
|
|
|
|
|
import java.util.Collection;
|
|
|
import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Set;
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
-import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
|
|
-import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.BUSINESS_CONTRACT_EXISTS;
|
|
|
-import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.BUSINESS_NOT_EXISTS;
|
|
|
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
|
|
|
+import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
|
|
|
import static cn.iocoder.yudao.module.crm.enums.LogRecordConstants.*;
|
|
|
|
|
|
/**
|
|
@@ -53,9 +57,9 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
|
|
|
|
|
|
@Resource
|
|
|
private CrmBusinessMapper businessMapper;
|
|
|
-
|
|
|
@Resource
|
|
|
- private CrmBusinessProductService businessProductService;
|
|
|
+ private CrmBusinessProductMapper businessProductMapper;
|
|
|
+
|
|
|
@Resource
|
|
|
@Lazy // 延迟加载,避免循环依赖
|
|
|
private CrmContractService contractService;
|
|
@@ -63,6 +67,8 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
|
|
|
private CrmPermissionService permissionService;
|
|
|
@Resource
|
|
|
private CrmContactBusinessService contactBusinessService;
|
|
|
+ @Resource
|
|
|
+ private CrmProductService productService;
|
|
|
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@@ -71,12 +77,15 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
|
|
|
public Long createBusiness(CrmBusinessSaveReqVO createReqVO, Long userId) {
|
|
|
createReqVO.setId(null);
|
|
|
// 1. 插入商机
|
|
|
- CrmBusinessDO business = BeanUtils.toBean(createReqVO, CrmBusinessDO.class)
|
|
|
- .setOwnerUserId(userId);
|
|
|
+ CrmBusinessDO business = BeanUtils.toBean(createReqVO, CrmBusinessDO.class).setOwnerUserId(userId);
|
|
|
businessMapper.insert(business);
|
|
|
- // TODO 商机待定:插入商机与产品的关联表;校验商品存在
|
|
|
- if (CollUtil.isNotEmpty(createReqVO.getProducts())) {
|
|
|
- createBusinessProducts(createReqVO.getProducts(), business.getId(), false);
|
|
|
+ // 1.2 插入商机关联商品
|
|
|
+ if (CollUtil.isNotEmpty(createReqVO.getProductItems())) { // 如果有的话
|
|
|
+ List<CrmBusinessProductDO> productList = convertBusinessProductList(createReqVO.getProductItems(), business.getId());
|
|
|
+ businessProductMapper.insertBatch(productList);
|
|
|
+ // 更新合同商品总金额
|
|
|
+ businessMapper.updateById(new CrmBusinessDO().setId(business.getId()).setProductPrice(
|
|
|
+ getSumValue(productList, CrmBusinessProductDO::getTotalPrice, Integer::sum)));
|
|
|
}
|
|
|
// TODO 商机待定:在联系人的详情页,如果直接【新建商机】,则需要关联下。这里要搞个 CrmContactBusinessDO 表
|
|
|
createContactBusiness(business.getId(), createReqVO.getContactId());
|
|
@@ -92,13 +101,6 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
|
|
|
}
|
|
|
|
|
|
// TODO @lzxhqs:CrmContactBusinessService 调用这个;这样逻辑才能收敛哈;
|
|
|
- /**
|
|
|
- * @param businessId 商机id
|
|
|
- * @param contactId 联系人id
|
|
|
- * @throws
|
|
|
- * @description 联系人与商机的关联
|
|
|
- * @author lzxhqs
|
|
|
- */
|
|
|
private void createContactBusiness(Long businessId, Long contactId) {
|
|
|
CrmContactBusinessDO contactBusiness = new CrmContactBusinessDO();
|
|
|
contactBusiness.setBusinessId(businessId);
|
|
@@ -106,37 +108,6 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
|
|
|
contactBusinessService.insert(contactBusiness);
|
|
|
}
|
|
|
|
|
|
- // TODO @lzxhqs:这个方法注释格式不对;删除@description,然后把 插入商机产品关联表 作为方法注释;
|
|
|
- /**
|
|
|
- * 插入商机产品关联表
|
|
|
- *
|
|
|
- * @param products 产品集合
|
|
|
- * @param businessId 商机id
|
|
|
- * @param updateFlag 更新标识 true 代表更新
|
|
|
- * @author lzxhqs
|
|
|
- */
|
|
|
- private void createBusinessProducts(List<CrmBusinessProductSaveReqVO> products, Long businessId, Boolean updateFlag) {
|
|
|
- List<CrmBusinessProductDO> list = CollectionUtils.convertList(products, product ->
|
|
|
- CrmBusinessProductConvert.INSTANCE.convert(product).setBusinessId(businessId));
|
|
|
- if (Boolean.TRUE.equals(updateFlag)) {
|
|
|
-// 根据商机 id从商机产品关联表中获取已存在的数据集合
|
|
|
- List<CrmBusinessProductDO> oldProducts = businessProductService.getBusinessProductListByBusinessId(businessId);
|
|
|
- List<List<CrmBusinessProductDO>> diffList = CollectionUtils.diffList(oldProducts, list, (oldValue, newValue) ->
|
|
|
- ObjectUtil.equal(oldValue.getProductId(), newValue.getProductId()));
|
|
|
- if (CollUtil.isNotEmpty(diffList.getFirst())) {
|
|
|
- businessProductService.createBusinessProductBatch(diffList.getFirst());
|
|
|
- }
|
|
|
- if (CollUtil.isNotEmpty(diffList.get(1))) {
|
|
|
- businessProductService.updateBusinessProductBatch(diffList.get(1));
|
|
|
- }
|
|
|
- if (CollUtil.isNotEmpty(diffList.get(2))) {
|
|
|
- businessProductService.deleteBusinessProductBatch(diffList.get(2));
|
|
|
- }
|
|
|
- } else {
|
|
|
- businessProductService.createBusinessProductBatch(list);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
@LogRecord(type = CRM_BUSINESS_TYPE, subType = CRM_BUSINESS_UPDATE_SUB_TYPE, bizNo = "{{#updateReqVO.id}}",
|
|
@@ -146,16 +117,12 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
|
|
|
// 1. 校验存在
|
|
|
CrmBusinessDO oldBusiness = validateBusinessExists(updateReqVO.getId());
|
|
|
|
|
|
- // 2. 更新商机
|
|
|
+ // 2.1 更新商机
|
|
|
CrmBusinessDO updateObj = BeanUtils.toBean(updateReqVO, CrmBusinessDO.class);
|
|
|
businessMapper.updateById(updateObj);
|
|
|
- // TODO 商机待定:插入商机与产品的关联表;校验商品存在
|
|
|
- // TODO @lzxhqs:createBusinessProducts 可以抽成两个方法,一个新增;一个修改,修改需要把 businessProductService.deleteByBusinessId(updateReqVO.getId()); 一起处理进去;
|
|
|
- if (CollUtil.isNotEmpty(updateReqVO.getProducts())) {
|
|
|
- createBusinessProducts(updateReqVO.getProducts(), updateReqVO.getId(), true);
|
|
|
- } else {
|
|
|
- businessProductService.deleteBusinessProductByBusinessId(updateReqVO.getId());
|
|
|
- }
|
|
|
+ // 2.2 更新商机关联商品
|
|
|
+ List<CrmBusinessProductDO> productList = convertBusinessProductList(updateReqVO.getProductItems(), updateObj.getId());
|
|
|
+ updateBusinessProduct(productList, updateObj.getId());
|
|
|
|
|
|
// TODO @商机待定:如果状态发生变化,插入商机状态变更记录表
|
|
|
// 3. 记录操作日志上下文
|
|
@@ -188,6 +155,43 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
|
|
|
LogRecordContext.putVariable("businessName", business.getName());
|
|
|
}
|
|
|
|
|
|
+ private void updateBusinessProduct(List<CrmBusinessProductDO> newProductList, Long businessId) {
|
|
|
+ List<CrmBusinessProductDO> oldProducts = businessProductMapper.selectListByBusinessId(businessId);
|
|
|
+ List<List<CrmBusinessProductDO>> diffList = CollectionUtils.diffList(oldProducts, newProductList, (oldValue, newValue) -> {
|
|
|
+ boolean condition = ObjectUtil.equal(oldValue.getProductId(), newValue.getProductId());
|
|
|
+ if (condition) {
|
|
|
+ newValue.setId(oldValue.getId()); // 更新需要原始编号
|
|
|
+ }
|
|
|
+ return condition;
|
|
|
+ });
|
|
|
+ if (CollUtil.isNotEmpty(diffList.get(0))) {
|
|
|
+ businessProductMapper.insertBatch(diffList.get(0));
|
|
|
+ }
|
|
|
+ if (CollUtil.isNotEmpty(diffList.get(1))) {
|
|
|
+ businessProductMapper.updateBatch(diffList.get(1));
|
|
|
+ }
|
|
|
+ if (CollUtil.isNotEmpty(diffList.get(2))) {
|
|
|
+ businessProductMapper.deleteBatchIds(convertSet(diffList.get(2), CrmBusinessProductDO::getId));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<CrmBusinessProductDO> convertBusinessProductList(List<CrmBusinessSaveReqVO.CrmBusinessProductItem> productItems, Long businessId) {
|
|
|
+ // 校验商品存在
|
|
|
+ Set<Long> productIds = convertSet(productItems, CrmBusinessSaveReqVO.CrmBusinessProductItem::getId);
|
|
|
+ List<CrmProductDO> productList = productService.getProductList(productIds);
|
|
|
+ if (CollUtil.isEmpty(productIds) || productList.size() != productIds.size()) {
|
|
|
+ throw exception(PRODUCT_NOT_EXISTS);
|
|
|
+ }
|
|
|
+ Map<Long, CrmProductDO> productMap = convertMap(productList, CrmProductDO::getId);
|
|
|
+ return convertList(productItems, productItem -> {
|
|
|
+ CrmProductDO product = productMap.get(productItem.getId());
|
|
|
+ return BeanUtils.toBean(product, CrmBusinessProductDO.class)
|
|
|
+ .setId(null).setProductId(productItem.getId()).setBusinessId(businessId)
|
|
|
+ .setCount(productItem.getCount()).setDiscountPercent(productItem.getDiscountPercent())
|
|
|
+ .setTotalPrice(MoneyUtils.calculator(product.getPrice(), productItem.getCount(), productItem.getDiscountPercent()));
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 删除校验合同是关联合同
|
|
|
*
|
|
@@ -228,6 +232,14 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
|
|
|
LogRecordContext.putVariable("business", business);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void updateBusinessProduct(CrmBusinessUpdateProductReqBO updateProductReqBO) {
|
|
|
+ // 更新商机关联商品
|
|
|
+ List<CrmBusinessProductDO> productList = convertBusinessProductList(
|
|
|
+ BeanUtils.toBean(updateProductReqBO.getProductItems(), CrmBusinessSaveReqVO.CrmBusinessProductItem.class), updateProductReqBO.getId());
|
|
|
+ updateBusinessProduct(productList, updateProductReqBO.getId());
|
|
|
+ }
|
|
|
+
|
|
|
//======================= 查询相关 =======================
|
|
|
|
|
|
@Override
|