添加功能

This commit is contained in:
曹鹏飞 2025-07-14 11:00:09 +08:00
parent cf16a46271
commit ea3c00ce24
15 changed files with 165 additions and 60 deletions

View File

@ -87,7 +87,7 @@ public class BinController extends BaseController {
} }
/** /**
* 导出选中的仓库为空时导出模版 * 导出选中的储位为空时导出模版
* @param ids 选中的id集合 * @param ids 选中的id集合
*/ */
@PostMapping("export") @PostMapping("export")

View File

@ -6,6 +6,7 @@ import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.dto.BomMaterialDTO; import com.nflg.wms.common.pojo.dto.BomMaterialDTO;
import com.nflg.wms.common.pojo.qo.BomSearchQO; import com.nflg.wms.common.pojo.qo.BomSearchQO;
import com.nflg.wms.common.pojo.qo.BomUpdateQO; import com.nflg.wms.common.pojo.qo.BomUpdateQO;
import com.nflg.wms.common.pojo.vo.BomMaterialVO;
import com.nflg.wms.starter.BaseController; import com.nflg.wms.starter.BaseController;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
@ -50,7 +51,7 @@ public class BomController extends BaseController {
* @param request 搜索参数 * @param request 搜索参数
*/ */
@PostMapping("search") @PostMapping("search")
public ApiResult<PageData<BomMaterialDTO>> search(@Valid @RequestBody BomSearchQO request){ public ApiResult<PageData<BomMaterialVO>> search(@Valid @RequestBody BomSearchQO request){
return ApiResult.success(bomControllerService.search(request)); return ApiResult.success(bomControllerService.search(request));
} }

View File

@ -8,6 +8,7 @@ import com.google.common.collect.Sets;
import com.nflg.wms.admin.util.DateTimeUtil; import com.nflg.wms.admin.util.DateTimeUtil;
import com.nflg.wms.admin.util.PdfGeneratorUtil; import com.nflg.wms.admin.util.PdfGeneratorUtil;
import com.nflg.wms.admin.util.QRCodeUtil; import com.nflg.wms.admin.util.QRCodeUtil;
import com.nflg.wms.admin.util.ThymeleafUtil;
import com.nflg.wms.common.constant.UserType; import com.nflg.wms.common.constant.UserType;
import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.PageData;
@ -37,10 +38,7 @@ import org.springframework.core.io.ClassPathResource;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.thymeleaf.TemplateEngine; import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import java.math.BigDecimal;
import java.net.URL; import java.net.URL;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
@ -157,18 +155,18 @@ public class DeliverNormalOrderController extends BaseController {
*/ */
@GetMapping("exportPdf") @GetMapping("exportPdf")
public void exportPdf(HttpServletResponse response, @Valid @RequestParam @NotNull Long id) throws Exception { public void exportPdf(HttpServletResponse response, @Valid @RequestParam @NotNull Long id) throws Exception {
// List<WmsDeliverNormalOrderItem> orders = deliverNormalOrderItemService.getByDeliverId(id); List<WmsDeliverNormalOrderItem> orders = deliverNormalOrderItemService.getByDeliverId(id);
// VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(orders)).throwMessage("没有需要导出的数据"); VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(orders)).throwMessage("没有需要导出的数据");
List<WmsDeliverNormalOrderItem> orders=new ArrayList<>(); // List<WmsDeliverNormalOrderItem> orders=new ArrayList<>();
orders.add(new WmsDeliverNormalOrderItem() // orders.add(new WmsDeliverNormalOrderItem()
.setMaterialNo("TEST00001") // .setMaterialNo("TEST00001")
.setMaterialDesc("测试物料") // .setMaterialDesc("测试物料")
.setBatchNum(new BigDecimal("36")) // .setBatchNum(new BigDecimal("36"))
.setLableNum(4) // .setLableNum(4)
.setMinPackageNum(new BigDecimal("10")) // .setMinPackageNum(new BigDecimal("10"))
.setUniqNo(DateTimeUtil.getForDeliverOrderItemNo()) // .setUniqNo(DateTimeUtil.getForDeliverOrderItemNo())
.setBatchNo("TEST00001") // .setBatchNo("TEST00001")
); // );
List<DeliverNormalOrderItemDTO> datas = new ArrayList<>(); List<DeliverNormalOrderItemDTO> datas = new ArrayList<>();
for (WmsDeliverNormalOrderItem order : orders) { for (WmsDeliverNormalOrderItem order : orders) {
for (int i = 0; i < order.getLableNum(); i++) { for (int i = 0; i < order.getLableNum(); i++) {
@ -184,15 +182,9 @@ public class DeliverNormalOrderController extends BaseController {
datas.add(dto); datas.add(dto);
} }
} }
ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
resolver.setPrefix("/template/qrcode/");
resolver.setSuffix(".html");
templateEngine.setTemplateResolver(resolver);
Map<String, Object> variables = new HashMap<>(); Map<String, Object> variables = new HashMap<>();
variables.put("list", datas); variables.put("list", datas);
Context context = new Context(); String html = ThymeleafUtil.generator("/template/qrcode/", "dp", ".html", variables);
context.setVariables(variables);
String html = templateEngine.process("dp", context);
URL baseUrl = new ClassPathResource("template/qrcode/").getURL(); URL baseUrl = new ClassPathResource("template/qrcode/").getURL();
PdfGeneratorUtil.generatePdf("普通物料条码", html,baseUrl.toString(), response); PdfGeneratorUtil.generatePdf("普通物料条码", html,baseUrl.toString(), response);
} }

View File

@ -123,10 +123,10 @@ public class StructuralPackageController extends BaseController {
} }
/** /**
* 导出钢构包 * 导出钢构包id为空时导出模板
*/ */
@GetMapping("exportKit") @GetMapping("exportKit")
public void exportKit(HttpServletResponse response,@Valid @RequestParam @NotNull Long id) throws Exception { public void exportKit(HttpServletResponse response,@RequestParam(required = false) Long id) throws Exception {
packageControllerService.exportKit(response,id); packageControllerService.exportKit(response,id);
} }

View File

@ -12,6 +12,7 @@ import com.nflg.wms.common.pojo.dto.BomImportExcelDTO;
import com.nflg.wms.common.pojo.dto.BomMaterialDTO; import com.nflg.wms.common.pojo.dto.BomMaterialDTO;
import com.nflg.wms.common.pojo.qo.BomSearchQO; import com.nflg.wms.common.pojo.qo.BomSearchQO;
import com.nflg.wms.common.pojo.qo.BomUpdateQO; import com.nflg.wms.common.pojo.qo.BomUpdateQO;
import com.nflg.wms.common.pojo.vo.BomMaterialVO;
import com.nflg.wms.common.util.DateTimeUtil; import com.nflg.wms.common.util.DateTimeUtil;
import com.nflg.wms.common.util.EecExcelUtil; import com.nflg.wms.common.util.EecExcelUtil;
import com.nflg.wms.common.util.UserUtil; import com.nflg.wms.common.util.UserUtil;
@ -81,7 +82,7 @@ public class BomControllerService {
}).toList()); }).toList());
} }
public PageData<BomMaterialDTO> search(@Valid BomSearchQO request) { public PageData<BomMaterialVO> search(@Valid BomSearchQO request) {
return bomService.search(request); return bomService.search(request);
} }

View File

@ -103,7 +103,13 @@ public class StorageControllerService {
} }
public IPage<StorageVO> search(@Valid StorageSearchQO request) { public IPage<StorageVO> search(@Valid StorageSearchQO request) {
return storageService.search(request); IPage<StorageVO> page = storageService.search(request);
page.getRecords().forEach(storageVO ->
{
List<String> binNos = StrUtil.split(storageVO.getBinNos(), ",");
storageVO.setBinIds(binService.lambdaQuery().select(WmsBin::getId).in(WmsBin::getNo,binNos).list().stream().map(WmsBin::getId).toList());
});
return page;
} }
@Transactional @Transactional

View File

@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.nflg.wms.admin.util.PdfGeneratorUtil; import com.nflg.wms.admin.util.PdfGeneratorUtil;
import com.nflg.wms.admin.util.ThymeleafUtil;
import com.nflg.wms.common.constant.STATE; import com.nflg.wms.common.constant.STATE;
import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.PageData;
@ -40,8 +41,6 @@ import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import org.thymeleaf.TemplateEngine; import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import org.ttzero.excel.entity.ListSheet; import org.ttzero.excel.entity.ListSheet;
import org.ttzero.excel.entity.TemplateSheet; import org.ttzero.excel.entity.TemplateSheet;
import org.ttzero.excel.entity.Workbook; import org.ttzero.excel.entity.Workbook;
@ -325,32 +324,34 @@ public class StructuralPackageControllerService {
return ApiResult.success(); return ApiResult.success();
} }
public void exportKit(HttpServletResponse response, @Valid @NotNull Long id) throws IOException { public void exportKit(HttpServletResponse response, Long id) throws IOException {
if (Objects.isNull(id)) {
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode("钢构包导入模板.xlsx", StandardCharsets.UTF_8));
new Workbook()
.addSheet(new TemplateSheet(new ClassPathResource("template/钢构包导出.xlsx").getInputStream()))
.writeTo(response.getOutputStream());
} else {
PackageVO packageInfo = packageService.getInfo(id); PackageVO packageInfo = packageService.getInfo(id);
VUtil.trueThrowBusinessError(Objects.isNull(packageInfo)).throwMessage("数据不存在"); VUtil.trueThrowBusinessError(Objects.isNull(packageInfo)).throwMessage("数据不存在");
List<PackageMaterialDTO> list = JSONUtil.toList(packageInfo.getMaterials(), PackageMaterialDTO.class); List<PackageMaterialDTO> list = JSONUtil.toList(packageInfo.getMaterials(), PackageMaterialDTO.class);
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode(packageInfo.getNo()+"钢构包.xlsx", StandardCharsets.UTF_8)); response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode(packageInfo.getNo() + "钢构包.xlsx", StandardCharsets.UTF_8));
new Workbook() new Workbook()
.addSheet(new TemplateSheet(new ClassPathResource("template/钢构包导出.xlsx").getInputStream()) .addSheet(new TemplateSheet(new ClassPathResource("template/钢构包导出.xlsx").getInputStream())
.setData(packageInfo) .setData(packageInfo)
.setData("list", list) .setData("list", list)
).writeTo(response.getOutputStream()); ).writeTo(response.getOutputStream());
} }
}
public void exportPdf(HttpServletResponse response, @Valid @NotNull Long id) throws Exception { public void exportPdf(HttpServletResponse response, @Valid @NotNull Long id) throws Exception {
PackageVO vo = packageService.getInfo(id); PackageVO vo = packageService.getInfo(id);
VUtil.trueThrowBusinessError(Objects.isNull(vo)).throwMessage("数据不存在"); VUtil.trueThrowBusinessError(Objects.isNull(vo)).throwMessage("数据不存在");
ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
resolver.setPrefix("/template/");
resolver.setSuffix(".html");
templateEngine.setTemplateResolver(resolver);
Map<String, Object> variables = new HashMap<>(); Map<String, Object> variables = new HashMap<>();
variables.put("info", vo); variables.put("info", vo);
variables.put("list", vo.getMaterialList()); variables.put("list", vo.getMaterialList());
Context context = new Context(); String html = ThymeleafUtil.generator("/template/", "StructuralPackage", ".html", variables);
context.setVariables(variables);
String html = templateEngine.process("StructuralPackage", context);
PdfGeneratorUtil.generatePdf(vo.getNo() + "老鼠图", html, response); PdfGeneratorUtil.generatePdf(vo.getNo() + "老鼠图", html, response);
} }
} }

View File

@ -0,0 +1,22 @@
package com.nflg.wms.admin.util;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring6.SpringTemplateEngine;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import java.util.Map;
public class ThymeleafUtil {
public static String generator(String prefix,String template,String suffix, Map<String, Object> variables){
ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
resolver.setPrefix(prefix);
resolver.setSuffix(".html");
SpringTemplateEngine engine = new SpringTemplateEngine();
engine.setTemplateResolver(resolver);
engine.setEnableSpringELCompiler(true);
Context context = new Context();
context.setVariables(variables);
return engine.process("StructuralPackage", context);
}
}

View File

@ -12,7 +12,7 @@ public class BinExcelExportDTO {
* 仓库编码 * 仓库编码
*/ */
@ExcelColumn("*仓库编码") @ExcelColumn("*仓库编码")
private String warehouseCode; private String warehouseNo;
/** /**
* 储位编码 * 储位编码

View File

@ -15,5 +15,5 @@ public class PackageSearchQO extends PageQO {
/** /**
* 机型id * 机型id
*/ */
private Long modelId; private String modelId;
} }

View File

@ -0,0 +1,70 @@
package com.nflg.wms.common.pojo.vo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Data
@Accessors(chain = true)
public class BomMaterialVO {
private Long id;
/**
* 上级id
*/
private Long parentId;
/**
* SAP料号
*/
private String materialNo;
/**
* 物料描述
*/
private String materialDesc;
/**
* 图号
*/
private String drawingNo;
/**
* 数量
*/
private BigDecimal num;
/**
* 重量
*/
private BigDecimal materialWeight;
/**
* 创建人
*/
private String createBy;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 最后更新人
*/
private String updateBy;
/**
* 最后更新时间
*/
private LocalDateTime updateTime;
/**
* 子节点
*/
private List<BomMaterialVO> children;
}

View File

@ -3,6 +3,7 @@ package com.nflg.wms.common.pojo.vo;
import lombok.Data; import lombok.Data;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
@Data @Data
public class StorageVO { public class StorageVO {
@ -19,11 +20,21 @@ public class StorageVO {
*/ */
private String materialDescribe; private String materialDescribe;
/**
* 仓库id
*/
private String warehouseId;
/** /**
* 仓库编码 * 仓库编码
*/ */
private String warehouseNo; private String warehouseNo;
/**
* 储位id列表
*/
private List<Long> binIds;
/** /**
* 储位编码 * 储位编码
*/ */

View File

@ -2,8 +2,8 @@ package com.nflg.wms.repository.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.dto.BomMaterialDTO;
import com.nflg.wms.common.pojo.qo.BomSearchQO; import com.nflg.wms.common.pojo.qo.BomSearchQO;
import com.nflg.wms.common.pojo.vo.BomMaterialVO;
import com.nflg.wms.repository.entity.WmsBom; import com.nflg.wms.repository.entity.WmsBom;
import jakarta.validation.Valid; import jakarta.validation.Valid;
@ -23,5 +23,5 @@ public interface IWmsBomService extends IService<WmsBom> {
void update(Long parentId, List<WmsBom> list); void update(Long parentId, List<WmsBom> list);
PageData<BomMaterialDTO> search(@Valid BomSearchQO request); PageData<BomMaterialVO> search(@Valid BomSearchQO request);
} }

View File

@ -4,8 +4,8 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.dto.BomMaterialDTO;
import com.nflg.wms.common.pojo.qo.BomSearchQO; import com.nflg.wms.common.pojo.qo.BomSearchQO;
import com.nflg.wms.common.pojo.vo.BomMaterialVO;
import com.nflg.wms.common.util.UserUtil; import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.common.util.VUtil; import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.WmsBom; import com.nflg.wms.repository.entity.WmsBom;
@ -55,7 +55,7 @@ public class WmsBomServiceImpl extends ServiceImpl<WmsBomMapper, WmsBom> impleme
} }
@Override @Override
public PageData<BomMaterialDTO> search(BomSearchQO request) { public PageData<BomMaterialVO> search(BomSearchQO request) {
List<WmsBom> boms = lambdaQuery() List<WmsBom> boms = lambdaQuery()
.like(StrUtil.isNotBlank(request.getNo()), WmsBom::getNo, request.getNo()) .like(StrUtil.isNotBlank(request.getNo()), WmsBom::getNo, request.getNo())
.like(StrUtil.isNotBlank(request.getDescribe()), WmsBom::getDescribe, request.getDescribe()) .like(StrUtil.isNotBlank(request.getDescribe()), WmsBom::getDescribe, request.getDescribe())
@ -64,34 +64,34 @@ public class WmsBomServiceImpl extends ServiceImpl<WmsBomMapper, WmsBom> impleme
if (CollectionUtil.isNotEmpty(parentIds)) { if (CollectionUtil.isNotEmpty(parentIds)) {
boms.addAll(listByIds(parentIds)); boms.addAll(listByIds(parentIds));
} }
List<BomMaterialDTO> datas = boms.stream() List<BomMaterialVO> datas = boms.stream()
.filter(it -> it.getParentId() == 0L) .filter(it -> it.getParentId() == 0L)
.sorted(Comparator.comparing(WmsBom::getId)) .sorted(Comparator.comparing(WmsBom::getId))
.skip((long) (request.getPage() - 1) * request.getPageSize()) .skip((long) (request.getPage() - 1) * request.getPageSize())
.limit(request.getPageSize()) .limit(request.getPageSize())
.map(it -> new BomMaterialDTO() .map(it -> new BomMaterialVO()
.setId(it.getId()) .setId(it.getId())
.setParentId(it.getParentId()) .setParentId(it.getParentId())
.setMaterialNo(it.getNo()) .setMaterialNo(it.getNo())
.setMaterialDesc(it.getDescribe()) .setMaterialDesc(it.getDescribe())
.setDrawingNo(it.getDrawingNo()) .setDrawingNo(it.getDrawingNo())
.setNum(it.getNum()) .setNum(it.getNum())
.setMaterialWeight(String.valueOf(it.getWeight())) .setMaterialWeight(it.getWeight())
.setChildren(boms.stream() .setChildren(boms.stream()
.filter(child -> child.getParentId().equals(it.getId())) .filter(child -> child.getParentId().equals(it.getId()))
.map(child -> { .map(child -> {
return new BomMaterialDTO() return new BomMaterialVO()
.setId(child.getId()) .setId(child.getId())
.setParentId(child.getParentId()) .setParentId(child.getParentId())
.setMaterialNo(child.getNo()) .setMaterialNo(child.getNo())
.setMaterialDesc(child.getDescribe()) .setMaterialDesc(child.getDescribe())
.setDrawingNo(child.getDrawingNo()) .setDrawingNo(child.getDrawingNo())
.setNum(child.getNum()) .setNum(child.getNum())
.setMaterialWeight(String.valueOf(child.getWeight())); .setMaterialWeight(child.getWeight());
}) })
.toList() .toList()
)).toList(); )).toList();
return new PageData<BomMaterialDTO>() return new PageData<BomMaterialVO>()
.setPage(request.getPage()) .setPage(request.getPage())
.setPageSize(request.getPageSize()) .setPageSize(request.getPageSize())
.setTotal(datas.size()) .setTotal(datas.size())

View File

@ -7,6 +7,7 @@
FROM ( FROM (
SELECT SELECT
s.*, s.*,
wh.id AS "warehouseId",
wh.no AS "warehouseNo", wh.no AS "warehouseNo",
m.no AS "materialNo", m.no AS "materialNo",
m.describe AS "materialDescribe", m.describe AS "materialDescribe",