From 0ec904f68d601631fc5a870ea36a6f6f629d86db Mon Sep 17 00:00:00 2001 From: b2894lxlx <517289602@qq.com> Date: Fri, 7 Aug 2026 15:38:39 +0800 Subject: [PATCH] fix bug --- .../ShippingTemplateController.java | 21 +++ .../excel/ShippingTemplateGoodsExcel.java | 29 ++++ .../service/IShippingTemplateService.java | 2 + .../impl/CustomerArchiveServiceImpl.java | 7 + .../impl/ShippingTemplateServiceImpl.java | 126 ++++++++++++++++++ .../impl/TransportPlanServiceImpl.java | 4 +- 6 files changed, 187 insertions(+), 2 deletions(-) create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/excel/ShippingTemplateGoodsExcel.java diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ShippingTemplateController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ShippingTemplateController.java index b8e3444..d5394a6 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ShippingTemplateController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ShippingTemplateController.java @@ -31,6 +31,7 @@ import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.excel.util.ExcelUtil; +import org.springblade.common.excel.ImportFailureExcelUtil; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.secure.annotation.PreAuth; @@ -38,6 +39,7 @@ import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.Func; import org.springblade.transport.excel.ShippingTemplateExcel; +import org.springblade.transport.excel.ShippingTemplateGoodsExcel; import org.springblade.transport.pojo.entity.ShippingTemplate; import org.springblade.transport.pojo.vo.BusinessRemoveResultVO; import org.springblade.transport.pojo.vo.ShippingTemplateVO; @@ -48,6 +50,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; import java.util.ArrayList; import java.util.List; @@ -116,4 +119,22 @@ public class ShippingTemplateController extends BladeController { return R.data(shippingTemplateService.copy(id)); } + @PostMapping("/import-goods") + @Operation(summary = "导入发货模板货物") + public R> importGoods(MultipartFile file, HttpServletResponse response) { + List data = ExcelUtil.read(file, ShippingTemplateGoodsExcel.class); + List failures = shippingTemplateService.importGoods(data); + if (Func.isNotEmpty(failures)) { + ImportFailureExcelUtil.export(response, "发货模板货物导入失败明细" + DateUtil.time(), "导入失败明细", failures, ShippingTemplateGoodsExcel.class); + return null; + } + return R.data(data); + } + + @GetMapping("/export-goods-template") + @Operation(summary = "导出发货模板货物导入模板") + public void exportGoodsTemplate(HttpServletResponse response) { + ExcelUtil.export(response, "发货模板货物导入模板", "货物信息", new ArrayList(), ShippingTemplateGoodsExcel.class); + } + } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/ShippingTemplateGoodsExcel.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/ShippingTemplateGoodsExcel.java new file mode 100644 index 0000000..0be3c5d --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/ShippingTemplateGoodsExcel.java @@ -0,0 +1,29 @@ +package org.springblade.transport.excel; + +import cn.idev.excel.annotation.ExcelIgnore; +import cn.idev.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.write.style.ColumnWidth; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** 发货模板货物导入 Excel。 */ +@Data +@ColumnWidth(20) +public class ShippingTemplateGoodsExcel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @ExcelProperty("*货物名称") private String cargoName; + @ExcelProperty("*货物类型") private String cargoType; + @ExcelProperty("数量") private String quantity; + @ExcelProperty("数量单位") private String quantityUnit; + @ExcelProperty("包装") private String packageType; + @ExcelProperty("品牌") private String brand; + @ExcelProperty("规格") private String specification; + @ExcelProperty("型号") private String model; + @ExcelProperty("物料编码") private String materialCode; + @ExcelProperty("设备编码") private String deviceCode; + @ExcelProperty("备注") private String remark; + @ExcelIgnore private String errorMessage; +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IShippingTemplateService.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IShippingTemplateService.java index 31a7cfd..13aed20 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IShippingTemplateService.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IShippingTemplateService.java @@ -25,6 +25,7 @@ package org.springblade.transport.service; import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.core.mp.base.BaseService; import org.springblade.transport.excel.ShippingTemplateExcel; +import org.springblade.transport.excel.ShippingTemplateGoodsExcel; import org.springblade.transport.pojo.entity.ShippingTemplate; import org.springblade.transport.pojo.vo.BusinessRemoveResultVO; import org.springblade.transport.pojo.vo.ShippingTemplateVO; @@ -45,5 +46,6 @@ public interface IShippingTemplateService extends BaseService BusinessRemoveResultVO removeShippingTemplate(String ids); List exportShippingTemplate(ShippingTemplateVO shippingTemplate, String ids); ShippingTemplateVO copy(Long id); + List importGoods(List data); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CustomerArchiveServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CustomerArchiveServiceImpl.java index 752b4f2..b3c9818 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CustomerArchiveServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CustomerArchiveServiceImpl.java @@ -294,6 +294,13 @@ public class CustomerArchiveServiceImpl extends BaseServiceImpl deptIdList = Func.toLongList(customer.getDeptIds()); + if (Func.isEmpty(deptIdList)) { + throw new ServiceException("所属组织不正确"); + } + customer.setDeptId(deptIdList.get(0)); + } customer.setDeptName(trimToEmpty(customer.getDeptName())); customer.setAccessType(Func.isEmpty(customer.getAccessType()) ? ACCESS_TEMPORARY : customer.getAccessType()); customer.setApprovalStatus(Func.isEmpty(customer.getApprovalStatus()) ? APPROVAL_DRAFT : customer.getApprovalStatus()); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ShippingTemplateServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ShippingTemplateServiceImpl.java index bce8f82..2630a39 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ShippingTemplateServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ShippingTemplateServiceImpl.java @@ -22,6 +22,9 @@ */ package org.springblade.transport.service.impl; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -29,11 +32,14 @@ import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.tool.utils.BeanUtil; import org.springblade.core.tool.utils.Func; +import org.springblade.core.tool.utils.StringUtil; import org.springblade.system.cache.UserCache; import org.springblade.system.pojo.entity.Dept; import org.springblade.transport.excel.ShippingTemplateExcel; +import org.springblade.transport.excel.ShippingTemplateGoodsExcel; import java.time.LocalDate; import java.time.format.DateTimeFormatter; +import java.math.BigDecimal; import org.springblade.transport.mapper.ShippingTemplateMapper; import org.springblade.transport.pojo.entity.ShippingTemplate; import org.springblade.transport.pojo.vo.BusinessRemoveResultVO; @@ -164,6 +170,27 @@ public class ShippingTemplateServiceImpl extends BaseServiceImpl importGoods(List data) { + if (Func.isEmpty(data)) { + throw new ServiceException("导入数据不能为空"); + } + List failures = new ArrayList<>(); + for (int index = 0; index < data.size(); index++) { + ShippingTemplateGoodsExcel item = data.get(index); + try { + if (Func.isEmpty(TransportBusinessSupport.trimToNull(item.getCargoName()))) throw new ServiceException("货物名称不能为空"); + if (Func.isEmpty(TransportBusinessSupport.trimToNull(item.getCargoType()))) throw new ServiceException("货物类型不能为空"); + if (StringUtil.isNotBlank(item.getQuantity()) && !item.getQuantity().trim().matches("^\\d+(\\.\\d{1,3})?$")) throw new ServiceException("数量只能输入非负数字,最多保留3位小数"); + if (StringUtil.isNotBlank(item.getRemark()) && item.getRemark().trim().length() > 200) throw new ServiceException("备注不能超过200个字符"); + } catch (Exception e) { + item.setErrorMessage("第" + (index + 2) + "行:" + e.getMessage()); + failures.add(item); + } + } + return failures; + } + private LambdaQueryWrapper buildQuery(ShippingTemplateVO shippingTemplate) { TransportBusinessSupport.validateAllDept(shippingTemplate.getAllDept(), "发货模板"); LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery().eq(ShippingTemplate::getIsDeleted, 0); @@ -273,11 +300,110 @@ public class ShippingTemplateServiceImpl extends BaseServiceImpl item instanceof JSONObject ? (JSONObject) item : null) + .map(item -> amountValue(item == null ? null : item.get("quantity"), "货物数量")) + .reduce(BigDecimal.ZERO, BigDecimal::add); + freight.put("quantity", decimalText(quantity)); + freight.put("freightAmount", amountText(freight.get("freightAmount"), "运费")); + freight.remove("freightItems"); + freight.remove("totalFreightAmount"); + } + shippingTemplate.setFreightJson(freight.toJSONString()); + } + + private boolean isRoadTransport(String transportType) { + String value = transportType == null ? "" : transportType.toLowerCase(); + return value.contains("公路") || value.contains("道路") || value.contains("road") || "gl".equals(value); + } + + private String amountText(Object value, String fieldName) { + return decimalText(amountValue(value, fieldName)); + } + + private BigDecimal amountValue(Object value, String fieldName) { + if (value == null || StringUtil.isBlank(String.valueOf(value))) { + return BigDecimal.ZERO; + } + try { + BigDecimal amount = new BigDecimal(String.valueOf(value)); + if (amount.compareTo(BigDecimal.ZERO) < 0) { + throw new ServiceException(fieldName + "不能小于0"); + } + return amount; + } catch (NumberFormatException e) { + throw new ServiceException(fieldName + "必须为非负数字"); + } + } + + private String decimalText(BigDecimal value) { + return value.stripTrailingZeros().toPlainString(); + } + private ShippingTemplate loadEditable(Long id, boolean checkDept) { if (Func.isEmpty(id)) { throw new ServiceException("主键不能为空"); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/TransportPlanServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/TransportPlanServiceImpl.java index a6e56db..9eb93d4 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/TransportPlanServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/TransportPlanServiceImpl.java @@ -88,7 +88,7 @@ public class TransportPlanServiceImpl extends BaseServiceImpl latestList = list(Wrappers.lambdaQuery() .select(TransportPlan::getPlanNo) .likeRight(TransportPlan::getPlanNo, prefix)