package cn.iocoder.yudao.module.crm.service.quotation; import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractSaveReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO; import cn.iocoder.yudao.module.crm.dal.dataobject.quotation.CrmSaleQuotationDO; import cn.iocoder.yudao.module.crm.dal.dataobject.quotation.CrmSaleQuotationProductDO; 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.service.contract.CrmContractService; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.springframework.test.util.ReflectionTestUtils; import java.math.BigDecimal; import java.lang.reflect.Proxy; import java.util.List; import java.util.concurrent.atomic.AtomicReference; import static org.junit.jupiter.api.Assertions.assertEquals; class CrmSaleQuotationQuantityTest { @Test void contractRequestAcceptsFractionalQuantity() throws Exception { var product = new ObjectMapper().readValue("{\"itemId\":1103,\"count\":22304.8}", CrmContractSaveReqVO.Product.class); assertEquals(new BigDecimal("22304.8"), product.getCount()); } @Test void conversionKeepsFractionalQuantity() { var service = new CrmSaleQuotationServiceImpl(); var request = new AtomicReference(); var quote = new CrmSaleQuotationDO().setId(1L).setNo("BJ-1").setName("台账报价").setStatus(0); var quotes = stub(CrmSaleQuotationMapper.class, (proxy, method, args) -> switch (method.getName()) { case "selectById" -> quote; case "updateById" -> 1; default -> throw new AssertionError(method.getName()); }); var products = stub(CrmSaleQuotationProductMapper.class, (proxy, method, args) -> { assertEquals("selectListByQuotationId", method.getName()); return List.of(new CrmSaleQuotationProductDO().setItemId(1103L).setCount(new BigDecimal("22304.8"))); }); var contracts = stub(CrmContractService.class, (proxy, method, args) -> switch (method.getName()) { case "createContract" -> { assertEquals(291L, args[1]); request.set((CrmContractSaveReqVO) args[0]); yield 2L; } case "getContract" -> new CrmContractDO().setNo("HT-2"); default -> throw new AssertionError(method.getName()); }); ReflectionTestUtils.setField(service, "saleQuotationMapper", quotes); ReflectionTestUtils.setField(service, "saleQuotationProductMapper", products); ReflectionTestUtils.setField(service, "contractService", contracts); assertEquals(2L, service.convertToContract(1L, 291L)); assertEquals(new BigDecimal("22304.8"), request.get().getProducts().getFirst().getCount()); } private static T stub(Class type, java.lang.reflect.InvocationHandler handler) { return type.cast(Proxy.newProxyInstance(type.getClassLoader(), new Class[]{type}, handler)); } }