| | |
| | | } |
| | | int successCount = 0; |
| | | int updateCount = 0; |
| | | int skipCount = 0; |
| | | for (Map<String, Object> data : dataList) { |
| | | try { |
| | | // 检查是否已存在(根据订单号和物料编码) |
| | |
| | | |
| | | SaleOrder saleOrder; |
| | | boolean isUpdate = false; |
| | | boolean hasQtyChange = false; |
| | | |
| | | if (existOrder != null) { |
| | | // 已存在,更新数据 |
| | | saleOrder = existOrder; |
| | | isUpdate = true; |
| | | updateCount++; |
| | | // 已存在,检查数量字段是否有变化 |
| | | Double newOrderQty = parseDoubleSafely(data.get("orderQty")); |
| | | Double newProductQty = parseDoubleSafely(data.get("productQty")); |
| | | Double newInQty = parseDoubleSafely(data.get("inQty")); |
| | | Double newOutQty = parseDoubleSafely(data.get("outQty")); |
| | | Double newOutAmount = parseDoubleSafely(data.get("outAmount")); |
| | | Double newOutPrice = parseDoubleSafely(data.get("outPrice")); |
| | | Double newIcsbeqty = parseDoubleSafely(data.get("icsbeqty")); |
| | | Double newSeoseqty = parseDoubleSafely(data.get("seoseqty")); |
| | | |
| | | // 比较数量字段是否有变化 |
| | | hasQtyChange = !isDoubleEqual(existOrder.getOrderQty(), newOrderQty) |
| | | || !isDoubleEqual(existOrder.getProductQty(), newProductQty) |
| | | || !isDoubleEqual(existOrder.getInQty(), newInQty) |
| | | || !isDoubleEqual(existOrder.getOutQty(), newOutQty) |
| | | || !isDoubleEqual(existOrder.getOutAmount(), newOutAmount) |
| | | || !isDoubleEqual(existOrder.getOutPrice(), newOutPrice) |
| | | || !isDoubleEqual(existOrder.getIcsbeqty(), newIcsbeqty) |
| | | || !isDoubleEqual(existOrder.getSeoseqty(), newSeoseqty); |
| | | |
| | | // 只有当数量有变化时才更新 |
| | | if (hasQtyChange) { |
| | | saleOrder = existOrder; |
| | | isUpdate = true; |
| | | updateCount++; |
| | | } else { |
| | | // 数量没有变化,跳过更新 |
| | | skipCount++; |
| | | continue; |
| | | } |
| | | } else { |
| | | // 不存在,创建新记录 |
| | | saleOrder = new SaleOrder(); |
| | |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | return R.ok("成功保存 " + successCount + " 条新数据,更新 " + updateCount + " 条已存在数据"); |
| | | String message = "成功保存 " + successCount + " 条新数据,更新 " + updateCount + " 条已存在数据"; |
| | | if (skipCount > 0) { |
| | | message += ",跳过 " + skipCount + " 条数量未变化的数据"; |
| | | } |
| | | return R.ok(message); |
| | | } |
| | | |
| | | /** |
| | | * 比较两个Double值是否相等(处理null值和0值) |
| | | * 重要:null和0被认为是不同的值,需要更新 |
| | | * @param d1 第一个Double值 |
| | | * @param d2 第二个Double值 |
| | | * @return true-相等,false-不相等 |
| | | */ |
| | | private boolean isDoubleEqual(Double d1, Double d2) { |
| | | // 两个都是null,认为相等 |
| | | if (d1 == null && d2 == null) { |
| | | return true; |
| | | } |
| | | // 一个为null,另一个不为null,认为不相等(需要更新) |
| | | // 注意:null和0是不同的,null和0.0会返回false,触发更新 |
| | | if (d1 == null || d2 == null) { |
| | | return false; |
| | | } |
| | | // 两个都不为null,使用误差范围比较,避免浮点数精度问题 |
| | | // 注意:0值会被正确比较,例如:0.0和0.0会返回true,100.0和0.0会返回false |
| | | return Math.abs(d1 - d2) < 0.0001; |
| | | } |
| | | |
| | | @RequestMapping(value = "/saleOrder/update/auth") |
| | |
| | | |
| | | // 表头 |
| | | String[] headers = { "生产单号", "业务员", "图号", "物料名称", "规格", "订单数量", "交货日期", |
| | | "任务单数量", "成品数量", "出货通知数", "实出数量", "对账数量", "对账单价", "对账金额", |
| | | "任务单数量", "成品数量", "出货通知数", /* "实出数量", */ "对账数量", "对账单价", "对账金额", |
| | | "包材版费", "退税资料", "开票", "内陆费", "收款", "应收款余额", |
| | | "对账数量残余", "对账金额残余", "任务单残余", "实出数量残余", "收款残余" }; |
| | | // 实出数量字段已隐藏,isCalc数组需要相应调整(移除一个false) |
| | | boolean[] isCalc = { false, false, false, false, false, false, false, |
| | | false, false, false, false, false, false, false, |
| | | false, false, false, /* false, */ false, false, false, |
| | | false, false, false, false, false, false, |
| | | true, true, true, true, true }; |
| | | |
| | |
| | | createNumCell(row, col++, order.getProductQty(), dataStyle); |
| | | createNumCell(row, col++, order.getInQty(), dataStyle); |
| | | createNumCell(row, col++, order.getIcsbeqty(), dataStyle); |
| | | createNumCell(row, col++, order.getSeoseqty(), dataStyle); |
| | | // createNumCell(row, col++, order.getSeoseqty(), dataStyle); |
| | | createNumCell(row, col++, order.getOutQty(), dataStyle); |
| | | createNumCell(row, col++, order.getOutPrice(), dataStyle); |
| | | createNumCell(row, col++, order.getOutAmount(), dataStyle); |