feat: bug-762 钢构件订单创建部分字段信息自动带出上一次的值

This commit is contained in:
曹鹏飞 2025-11-10 10:23:36 +08:00
parent f796618f14
commit 6785e797a5
5 changed files with 276 additions and 4 deletions

View File

@ -0,0 +1 @@
method.return[#response]=groovy: "com.nflg.wms.common.pojo.ApiResult<" + helper.resolveLink(it.doc("response")) +">"

View File

@ -2,6 +2,7 @@ package com.nflg.wms.admin.controller;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.RandomUtil;
@ -18,6 +19,7 @@ import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.nflg.wms.admin.pojo.document.PackageMaterialScanRecord;
import com.nflg.wms.admin.pojo.dto.PdfPageDTO;
import com.nflg.wms.admin.pojo.dto.SAPMaterialInfoInOrderDTO;
import com.nflg.wms.admin.pojo.dto.StructuralPackageOrderImportDTO;
import com.nflg.wms.admin.repository.PackageMaterialScanRecordRepository;
import com.nflg.wms.admin.service.BasdeSerialNumberControllerService;
import com.nflg.wms.admin.service.BinService;
@ -28,6 +30,8 @@ import com.nflg.wms.admin.util.PdfGeneratorUtil;
import com.nflg.wms.admin.util.QRCodeUtil;
import com.nflg.wms.admin.util.ThymeleafUtil;
import com.nflg.wms.common.constant.OrderState;
import com.nflg.wms.common.constant.STATE;
import com.nflg.wms.common.exception.NflgException;
import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.dto.PackageMaterialDTO;
@ -48,11 +52,15 @@ import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.core.io.ClassPathResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.ttzero.excel.entity.ListMapSheet;
import org.ttzero.excel.entity.Workbook;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
@ -65,6 +73,8 @@ import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.*;
import java.util.stream.Collectors;
@ -124,6 +134,185 @@ public class StructuralPackageOrderController extends BaseController {
@Resource
private BasdeSerialNumberControllerService serialNumberControllerService;
@Resource
private IWmsModelService modelService;
@Resource
private IWmsWorkbenchService workbenchService;
/**
* 导出订单创建模板
*/
@GetMapping("exportOrderTemplate")
public void exportOrderTemplate(HttpServletResponse response) throws IOException {
List<Map<String, Object>> datas = new LinkedList<>();
Map<String, Object> map = new LinkedHashMap<>();
map.put("*钢构包料号", "必填");
map.put("*供应商编号", "必填");
map.put("*机型", "必填");
map.put("*机台序号", "必填");
map.put("*期望交期", "必填,格式2025-10-01");
map.put("采购单号", "");
map.put("采购单行号", "");
map.put("数量", "");
datas.add(map);
EecExcelUtil.eecExcel("钢构件订单创建模板", new ListMapSheet<>(datas), response);
}
/**
* 导入订单创建数据
* @param file excel文件
* @response {@link List<StructuralPackageOrderImportDTO>}
*/
@PostMapping(value = "importForOrder")
public ApiResult importForOrder(HttpServletResponse response, @RequestParam(name = "file") MultipartFile file) throws IOException {
List<StructuralPackageOrderImportDTO> datas = new ArrayList<>();
List<Map<String, Object>> maps = EecExcelUtil.handlerExcel(file.getInputStream());
maps.forEach(map -> {
StructuralPackageOrderImportDTO dto = new StructuralPackageOrderImportDTO();
StringBuilder sb = new StringBuilder();
String data = StrUtil.trim(map.get("*钢构包料号").toString());
if (StrUtil.isBlank(data)) {
sb.append("钢构包料号不能为空;");
} else {
PackageVO packageVO = structuralPackageService.getCurrent(data);
if (Objects.isNull(packageVO)) {
sb.append("钢构包不存在;");
} else {
dto.setMaterialNo(data);
dto.setPackageId(packageVO.getId());
}
}
data = StrUtil.trim(map.get("*供应商编号").toString());
if (StrUtil.isBlank(data)) {
sb.append("供应商编号不能为空;");
} else {
UserSupplier supplier = userSupplierService.getByCode(data);
if (Objects.isNull(supplier)) {
sb.append("供应商不存在;");
} else {
dto.setSupplierId(supplier.getId());
dto.setSupplierCode(supplier.getSupplierCode());
dto.setSupplierName(supplier.getSupplierName());
}
}
data = StrUtil.trim(map.get("*机型").toString());
if (StrUtil.isBlank(data)) {
sb.append("机型不能为空;");
} else {
WmsModel model = modelService.lambdaQuery().eq(WmsModel::getNo, data).eq(WmsModel::getEnable, true).one();
if (Objects.isNull(model)) {
sb.append("机型不存在;");
} else {
dto.setModelId(model.getId());
dto.setModelNo(model.getNo());
}
}
data = StrUtil.trim(map.get("*机台序号").toString());
if (StrUtil.isBlank(data)) {
sb.append("机台序号不能为空;");
} else {
WmsWorkbench workbench = workbenchService.lambdaQuery().eq(WmsWorkbench::getNo, data).eq(WmsWorkbench::getEnable, true).one();
if (Objects.isNull(workbench)) {
sb.append("机台不存在;");
} else {
dto.setWorkbenchId(workbench.getId());
dto.setWorkbenchNo(workbench.getNo());
}
}
data = StrUtil.trim(map.get("*期望交期").toString());
if (StrUtil.isBlank(data)) {
sb.append("期望交期不能为空;");
} else {
try {
if (data.contains(" ")) {
data = data.split(" ")[0];
}
LocalDate date = LocalDate.parse(data, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
dto.setDeliveryDate(LocalDateTimeUtil.formatNormal(date));
} catch (DateTimeParseException e) {
log.error("期望交期格式错误", e);
map.put("*期望交期", data);
sb.append("期望交期格式错误;");
}
}
if (StrUtil.isBlank(sb.toString())) {
data = StrUtil.trim(map.get("采购单号").toString());
if (StrUtil.isNotBlank(data)) {
try {
List<SAPMaterialInfoInOrderDTO> orders = sapService.zim004(data, dto.getSupplierCode(), dto.getMaterialNo());
if (CollectionUtil.isEmpty(orders)) {
sb.append("采购单号无效;");
} else {
dto.setExternalOrderNo(data);
data = getData(map, "采购单行号");
if (StrUtil.isNotBlank(data)) {
String finalData = data;
SAPMaterialInfoInOrderDTO order = orders.stream()
.filter(it -> StrUtil.equals(it.getEbelp(), finalData))
.findFirst()
.orElse(null);
if (Objects.isNull(order)) {
sb.append("采购单行号无效;");
} else {
dto.setRowNo(data);
data = getData(map, "数量");
if (StrUtil.isNotBlank(data)) {
if (!NumberUtils.isCreatable(data)) {
sb.append("数量无效;");
} else {
BigDecimal num = new BigDecimal(data);
if (order.getTransportNum().compareTo(num) < 0) {
sb.append("数量不能大于未收货数量(").append(order.getTransportNum()).append(");");
} else {
dto.setNum(num);
}
}
}
}
}
}
} catch (NflgException e) {
sb.append(e.getMsg()).append(";");
}
}
}
if (StrUtil.isBlank(sb.toString())) {
datas.add(dto);
} else {
map.put("错误信息", sb.toString());
}
});
if (datas.size() != maps.size()) {
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode(getResultName(file.getOriginalFilename()), StandardCharsets.UTF_8));
try (ByteArrayOutputStream osOut = new ByteArrayOutputStream()) {
new Workbook()
.addSheet(new ListMapSheet<>(maps))
.writeTo(osOut);
try (ByteArrayInputStream isIn = new ByteArrayInputStream(osOut.toByteArray())) {
return ApiResult.error(STATE.DataNoCheckPass, "导入文件失败"
, fileUploadService.upload("temp/" + DateTimeUtil.format(LocalDate.now(), "yyyyMMdd") + "/" + IdUtil.fastUUID() + ".xlsx"
, isIn
, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"));
}
} catch (Exception e) {
return ApiResult.error(STATE.BusinessError, "保存文件出错");
}
} else {
return ApiResult.success(datas);
}
}
private String getData(Map<String, Object> map, String key) {
return StrUtil.trim(Optional.ofNullable(map.get(key)).orElse("").toString());
}
private String getResultName(String name) {
int index = name.lastIndexOf(".");
return name.substring(0, index) + "_结果" + "." + name.substring(index + 1);
}
/**
* 搜索SAP订单
* @param request 请求参数

View File

@ -0,0 +1,74 @@
package com.nflg.wms.admin.pojo.dto;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class StructuralPackageOrderImportDTO {
/**
* 钢构包料号
*/
private String materialNo;
/**
* 钢构包id
*/
private Long packageId;
/**
* 供应商id
*/
private Long supplierId;
/**
* 供应商编号
*/
private String supplierCode;
/**
* 供应商名称
*/
private String supplierName;
/**
* 机型id
*/
private Long modelId;
/**
* 机型编号
*/
private String modelNo;
/**
* 机台id
*/
private Long workbenchId;
/**
* 机台编号
*/
private String workbenchNo;
/**
* 期望交期
*/
private String deliveryDate;
/**
* 采购单订单号
*/
private String externalOrderNo;
/**
* 采购单订单行号
*/
private String rowNo;
/**
* 数量
*/
private BigDecimal num;
}

View File

@ -10,6 +10,7 @@ import com.nflg.wms.admin.pojo.dto.SAPMaterialInfoInOrderDTO;
import com.nflg.wms.admin.pojo.dto.ZWM3A17DTO;
import com.nflg.wms.admin.pojo.dto.ZWM3A18DTO;
import com.nflg.wms.admin.util.JCoUtil;
import com.nflg.wms.common.constant.STATE;
import com.nflg.wms.common.exception.SAPException;
import com.nflg.wms.common.pojo.dto.*;
import com.nflg.wms.common.pojo.qo.*;
@ -332,8 +333,8 @@ public class SapService {
JCoFunction function = exec("ZIM_004", parameters);
JCoStructure structure = function.getExportParameterList().getStructure("E_RETURN");
VUtil.trueThrowBusinessError(!StrUtil.equals(structure.getString("TYPE"), "S"))
.throwMessage("SAP错误" + structure.getString("MSG"));
VUtil.trueThrow(!StrUtil.equals(structure.getString("TYPE"), "S"))
.throwMessage(STATE.SAPErr, "SAP错误" + structure.getString("MSG"));
JCoTable table = function.getTableParameterList().getTable("T_OUT");
log.info("SAP返回: {}", table);

View File

@ -26,7 +26,6 @@ import java.util.stream.Collectors;
/**
* eecExcel
*
* @Author 大米
*/
public class EecExcelUtil {
@ -102,7 +101,6 @@ public class EecExcelUtil {
/**
* 行读取excel sheet 0
*
* @param hanlder
* @param inputStream
*/
@ -169,4 +167,13 @@ public class EecExcelUtil {
return result;
}
public static List<Map<String, Object>> handlerExcel(InputStream inputStream) throws IOException {
try (ExcelReader reader = ExcelReader.read(inputStream)) {
return reader.sheet(0)
.dataRows()
.map(Row::toMap)
.toList();
}
}
}