| | |
| | | import cn.iocoder.yudao.module.crm.dal.mysql.quotation.CrmSaleQuotationMapper; |
| | | import cn.iocoder.yudao.module.crm.dal.mysql.quotation.CrmSaleQuotationProductMapper; |
| | | import cn.iocoder.yudao.module.crm.dal.redis.no.CrmNoRedisDAO; |
| | | import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; |
| | | import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; |
| | | import cn.iocoder.yudao.module.crm.enums.quotation.CrmSaleQuotationStatusEnum; |
| | | import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService; |
| | | import cn.iocoder.yudao.module.crm.service.contact.CrmContactService; |
| | | import cn.iocoder.yudao.module.crm.service.contract.CrmContractService; |
| | | import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; |
| | | import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; |
| | | import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; |
| | | import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO; |
| | | import jakarta.annotation.Resource; |
| | |
| | | quotationProducts.forEach(p -> p.setQuotationId(saleQuotation.getId())); |
| | | saleQuotationProductMapper.insertBatch(quotationProducts); |
| | | // 2.3 创建数据权限 |
| | | permissionService.createPermission(saleQuotation.getId(), userId); |
| | | permissionService.createPermission(new CrmPermissionCreateReqBO() |
| | | .setUserId(userId) |
| | | .setBizType(CrmBizTypeEnum.CRM_SALE_QUOTATION.getType()) |
| | | .setBizId(saleQuotation.getId()) |
| | | .setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); |
| | | return saleQuotation.getId(); |
| | | } |
| | | |
| | |
| | | // 2.2 删除报价明细 |
| | | saleQuotationProductMapper.deleteByQuotationId(saleQuotation.getId()); |
| | | // 2.3 删除数据权限 |
| | | permissionService.deletePermission(saleQuotation.getId()); |
| | | permissionService.deletePermission(CrmBizTypeEnum.CRM_SALE_QUOTATION.getType(), saleQuotation.getId()); |
| | | }); |
| | | } |
| | | |
| | |
| | | |
| | | private List<CrmSaleQuotationProductDO> validateQuotationItems(List<CrmSaleQuotationSaveReqVO.Item> list) { |
| | | // 1. 校验物料存在且启用 |
| | | List<Long> itemIds = convertSet(list, CrmSaleQuotationSaveReqVO.Item::getItemId); |
| | | Set<Long> itemIds = convertSet(list, CrmSaleQuotationSaveReqVO.Item::getItemId); |
| | | Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(itemIds); |
| | | // 2. 转换为 CrmSaleQuotationProductDO 列表 |
| | | return convertList(list, o -> BeanUtils.toBean(o, CrmSaleQuotationProductDO.class, item -> { |
| | |
| | | |
| | | private void calculateTotalPrice(CrmSaleQuotationDO saleQuotation, List<CrmSaleQuotationProductDO> items) { |
| | | saleQuotation.setTotalProductPrice(getSumValue(items, CrmSaleQuotationProductDO::getTotalPrice, BigDecimal::add, BigDecimal.ZERO)); |
| | | saleQuotation.setTotalTaxPrice(getSumValue(items, CrmSaleQuotationProductDO::getTaxPrice, BigDecimal::add, BigDecimal.ZERO)); |
| | | BigDecimal totalTaxPrice = getSumValue(items, CrmSaleQuotationProductDO::getTaxPrice, BigDecimal::add, BigDecimal.ZERO); |
| | | saleQuotation.setTaxPrice(totalTaxPrice); |
| | | // 计算优惠价格 |
| | | if (saleQuotation.getDiscountPercent() == null) { |
| | | saleQuotation.setDiscountPercent(BigDecimal.ZERO); |
| | | } |
| | | BigDecimal basePrice = saleQuotation.getTotalProductPrice().add(saleQuotation.getTotalTaxPrice()); |
| | | BigDecimal basePrice = saleQuotation.getTotalProductPrice().add(totalTaxPrice); |
| | | saleQuotation.setDiscountPrice(MoneyUtils.priceMultiplyPercent(basePrice, saleQuotation.getDiscountPercent())); |
| | | saleQuotation.setTotalPrice(basePrice.subtract(saleQuotation.getDiscountPrice())); |
| | | } |