问题现象: 在报价单新增/编辑界面中,当用户输入小数数量(如1.2、2.5)时,后端抛出以下错误:
JSON parse error: Cannot deserialize value of type `java.lang.Integer` from String "1.2":
not a valid `java.lang.Integer` value
根本原因:
报价单、合同、商机的产品数量字段在后端定义为 Integer 类型,无法接受小数值。
业务需求: 化工行业的产品(如硫酸、液碱等)以吨为单位,经常需要填写小数数量(如1.2吨、2.5吨)。
将所有产品数量相关字段从 Integer 类型改为 BigDecimal 类型,支持4位小数精度。
CrmQuoteProductBo.java - quantity字段改为BigDecimalCrmQuoteProduct.java - quantity字段改为BigDecimalCrmQuoteProductVo.java - quantity字段改为BigDecimalCrmContractProductBo.java - quantity字段改为BigDecimalCrmContractProduct.java - quantity和deliveredQuantity字段改为BigDecimalCrmContractProductVo.java - quantity和deliveredQuantity字段改为BigDecimalCrmOpportunityProductBo.java - quantity字段改为BigDecimalCrmOpportunityProduct.java - quantity字段改为BigDecimalCrmOpportunityProductVo.java - quantity字段改为BigDecimal创建了SQL脚本:backend/script/sql/fix_product_quantity_to_decimal.sql
修改内容:
crm_quote_product.quantity: INT → DECIMAL(20, 4)crm_contract_product.quantity: INT → DECIMAL(20, 4)crm_contract_product.delivered_quantity: INT → DECIMAL(20, 4)crm_opportunity_product.quantity: INT → DECIMAL(20, 4)✅ 无需修改 - TypeScript的number类型和el-input组件已支持小数输入
# 登录数据库
mysql -u username -p database_name
# 执行脚本
source backend/script/sql/fix_product_quantity_to_decimal.sql;
cd backend
mvn clean package -DskipTests
# 重启服务
./restart.sh
backend/script/sql/fix_product_quantity_to_decimal.sql - 数据库修改脚本backend/script/sql/fix_product_quantity_to_decimal_README.md - 详细修复说明docs/fix_product_quantity_decimal_summary.md - 本总结文档| 字段 | 修改前 | 修改后 |
|---|---|---|
| quantity | Integer | BigDecimal |
| deliveredQuantity | Integer | BigDecimal |
| 注解 | 修改前 | 修改后 |
|---|---|---|
| 数量验证 | @Min(value = 1) | @DecimalMin(value = "0.01") |
| 字段类型 | 修改前 | 修改后 |
|---|---|---|
| 数据类型 | INT | DECIMAL(20, 4) |
| 示例值 | 1 | 1.0000 |
| 小数支持 | ❌ | ✅ |