feat: 添加图纸功能

This commit is contained in:
曹鹏飞 2025-07-01 16:42:36 +08:00
parent 1c2867b0ef
commit 829d750000
13 changed files with 658 additions and 1 deletions

View File

@ -0,0 +1,73 @@
package com.nflg.wms.admin.controller;
import com.nflg.wms.admin.service.MaterialControllerService;
import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.qo.MaterialAddQO;
import com.nflg.wms.common.pojo.qo.MaterialSearchQO;
import com.nflg.wms.common.pojo.qo.MaterialUpdateQO;
import com.nflg.wms.common.pojo.vo.MaterialVO;
import com.nflg.wms.starter.BaseController;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 图纸管理
*/
@RestController
@RequestMapping("/material")
public class MaterialController extends BaseController {
@Resource
private MaterialControllerService materialControllerService;
/**
* 新增图纸
*/
@PostMapping("add")
public ApiResult<Void> add(@Valid @RequestBody MaterialAddQO request){
materialControllerService.add(request);
return ApiResult.success();
}
/**
* 更新图纸
*/
@PostMapping("update")
public ApiResult<Void> update(@Valid @RequestBody MaterialUpdateQO request){
materialControllerService.update(request);
return ApiResult.success();
}
/**
* 搜索图纸
* @param request 搜索参数
*/
@PostMapping("search")
public ApiResult<PageData<MaterialVO>> search(@Valid @RequestBody MaterialSearchQO request){
return ApiResult.success(materialControllerService.search(request));
}
/**
* 获取图纸历史记录
* @param no SAP料号
*/
@GetMapping("/getHistory")
public ApiResult<List<MaterialVO>> getHistory(@Valid @RequestParam @NotBlank String no){
return ApiResult.success(materialControllerService.getHistory(no));
}
/**
* 导出未设置物料清单
*/
@PostMapping("export")
public void exportNotSet(HttpServletResponse response) throws Exception {
materialControllerService.exportNotSet(response);
}
}

View File

@ -0,0 +1,80 @@
package com.nflg.wms.admin.service;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.nflg.wms.common.pojo.dto.MaterialExcelExportDTO;
import com.nflg.wms.common.pojo.qo.MaterialAddQO;
import com.nflg.wms.common.pojo.qo.MaterialSearchQO;
import com.nflg.wms.common.pojo.qo.MaterialUpdateQO;
import com.nflg.wms.common.pojo.vo.MaterialVO;
import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.Material;
import com.nflg.wms.repository.service.IMaterialService;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.ttzero.excel.entity.ListSheet;
import org.ttzero.excel.entity.Workbook;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Component
public class MaterialControllerService {
@Resource
private IMaterialService materialService;
public void add(@Valid MaterialAddQO request) {
Material material = Convert.convert(Material.class, request);
material.setCreateBy(UserUtil.getUserName());
material.setCreateTime(LocalDateTime.now());
materialService.add(material);
}
public void update(@Valid MaterialUpdateQO request) {
Material old = materialService.getById(request.getId());
VUtil.trueThrowBusinessError(Objects.isNull(old)).throwMessage("数据不存在!");
Material material = Convert.convert(Material.class, request);
if (StrUtil.isNotBlank(old.getImage()) && Objects.nonNull(old.getWeight())) {
material.setVersion(old.getVersion() + 1);
material.setCreateBy(UserUtil.getUserName());
material.setCreateTime(LocalDateTime.now());
material.setId(null);
materialService.add(material);
}else {
material.setUpdateBy(UserUtil.getUserName());
material.setUpdateTime(LocalDateTime.now());
materialService.update(material);
}
}
public IPage<MaterialVO> search(@Valid MaterialSearchQO request) {
return materialService.search(request);
}
public List<MaterialVO> getHistory(@Valid @NotBlank String no) {
return materialService.getHistory(no);
}
public void exportNotSet(HttpServletResponse response) throws IOException {
List<Material> materials = materialService.getNotSet();
List<MaterialExcelExportDTO> datas = materials.stream().map(model -> Convert.convert(MaterialExcelExportDTO.class, model)).collect(Collectors.toList());
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode("未设置物料清单.xlsx", StandardCharsets.UTF_8));
new Workbook()
.addSheet(new ListSheet<>(datas).setRowHeight(100))
.writeTo(response.getOutputStream());
}
}

View File

@ -0,0 +1,73 @@
package com.nflg.wms.common.pojo.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import org.ttzero.excel.annotation.ExcelColumn;
import org.ttzero.excel.annotation.MediaColumn;
import java.math.BigDecimal;
@Data
@Accessors(chain = true)
public class MaterialExcelExportDTO {
/**
* SAP料号
*/
@ExcelColumn("*SAP料号")
private String no;
/**
* 物料描述
*/
@ExcelColumn("*物料描述")
private String describe;
/**
* 图片
*/
@MediaColumn
private String image;
/**
* 当前版本号
*/
@ExcelColumn("当前版本号")
private Integer version;
/**
* 重量
*/
@ExcelColumn("重量")
private BigDecimal weight;
/**
* 长度
*/
@ExcelColumn("长度")
private BigDecimal length;
/**
* 宽度
*/
@ExcelColumn("宽度")
private BigDecimal width;
/**
* 高度
*/
@ExcelColumn("高度")
private BigDecimal height;
/**
* 打包要求
*/
@ExcelColumn("打包要求")
private String requirement;
/**
* 备注
*/
@ExcelColumn("备注")
private String remark;
}

View File

@ -0,0 +1,62 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class MaterialAddQO {
/**
* SAP料号
*/
@NotBlank
private String no;
/**
* 物料描述
*/
@NotBlank
private String describe;
/**
* 图片
*/
@NotBlank
private String image;
/**
* 重量
*/
@NotBlank
private BigDecimal weight;
/**
* 长度
*/
@NotBlank
private BigDecimal length;
/**
* 宽度
*/
@NotBlank
private BigDecimal width;
/**
* 高度
*/
@NotBlank
private BigDecimal height;
/**
* 备注
*/
private String remark;
/**
* 打包要求
*/
private String requirement;
}

View File

@ -0,0 +1,17 @@
package com.nflg.wms.common.pojo.qo;
import lombok.Data;
@Data
public class MaterialSearchQO extends PageQO{
/**
* SAP料号
*/
private String no;
/**
* 物料描述
*/
private String describe;
}

View File

@ -0,0 +1,11 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@Data
public class MaterialUpdateQO extends MaterialAddQO{
@NotNull
private Long id;
}

View File

@ -0,0 +1,84 @@
package com.nflg.wms.common.pojo.vo;
import cn.hutool.core.util.StrUtil;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
public class MaterialVO {
private Long id;
/**
* SAP料号
*/
private String no;
/**
* 物料描述
*/
private String describe;
/**
* 图片
*/
private String image;
/**
* 图片类型
*/
private String imageType;
/**
* 当前版本号
*/
private Integer version;
/**
* 重量
*/
private BigDecimal weight;
/**
* 长度
*/
private BigDecimal length;
/**
* 宽度
*/
private BigDecimal width;
/**
* 高度
*/
private BigDecimal height;
/**
* 备注
*/
private String remark;
/**
* 创建人
*/
private String createBy;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 最后更新人
*/
private String updateBy;
/**
* 最后更新时间
*/
private LocalDateTime updateTime;
/**
* 打包要求
*/
private String requirement;
public String getImageType(){
if (StrUtil.isBlank(image)){
return "";
}
return image.substring(image.lastIndexOf("."));
}
}

View File

@ -0,0 +1,102 @@
package com.nflg.wms.repository.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* <p>
*
* </p>
*
* @author 代码生成器生成
* @since 2025
*/
@Getter
@Setter
@ToString
@Accessors(chain = true)
public class Material implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.ASSIGN_ID)
private Long id;
/**
* SAP料号
*/
private String no;
/**
* 物料描述
*/
private String describe;
/**
* 图片
*/
private String image;
/**
* 当前版本号
*/
private Integer version;
/**
* 重量
*/
private BigDecimal weight;
/**
* 长度
*/
private BigDecimal length;
/**
* 宽度
*/
private BigDecimal width;
/**
* 高度
*/
private BigDecimal height;
/**
* 备注
*/
private String remark;
/**
* 创建人
*/
private String createBy;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 最后更新人
*/
private String updateBy;
/**
* 最后更新时间
*/
private LocalDateTime updateTime;
/**
* 打包要求
*/
private String requirement;
}

View File

@ -0,0 +1,27 @@
package com.nflg.wms.repository.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nflg.wms.common.pojo.qo.MaterialSearchQO;
import com.nflg.wms.common.pojo.vo.MaterialVO;
import com.nflg.wms.repository.entity.Material;
import java.util.List;
/**
* <p>
* Mapper 接口
* </p>
*
* @author 代码生成器生成
* @since 2025
*/
public interface MaterialMapper extends BaseMapper<Material> {
IPage<MaterialVO> search(MaterialSearchQO request, Page<?> objectPage);
List<MaterialVO> getHistory(String no);
List<Material> getNotSet();
}

View File

@ -0,0 +1,32 @@
package com.nflg.wms.repository.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.wms.common.pojo.qo.MaterialSearchQO;
import com.nflg.wms.common.pojo.vo.MaterialVO;
import com.nflg.wms.repository.entity.Material;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import java.util.List;
/**
* <p>
* 服务类
* </p>
*
* @author 代码生成器生成
* @since 2025
*/
public interface IMaterialService extends IService<Material> {
void add(Material material);
void update(Material material);
IPage<MaterialVO> search(@Valid MaterialSearchQO request);
List<MaterialVO> getHistory(@Valid @NotBlank String no);
List<Material> getNotSet();
}

View File

@ -0,0 +1,63 @@
package com.nflg.wms.repository.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.wms.common.pojo.qo.MaterialSearchQO;
import com.nflg.wms.common.pojo.vo.MaterialVO;
import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.Material;
import com.nflg.wms.repository.mapper.MaterialMapper;
import com.nflg.wms.repository.service.IAuditLogService;
import com.nflg.wms.repository.service.IMaterialService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 服务实现类
* </p>
*
* @author 代码生成器生成
* @since 2025
*/
@Service
public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> implements IMaterialService {
@Resource
private IAuditLogService auditLogService;
@Override
public void add(Material material) {
VUtil.trueThrowBusinessError(lambdaQuery().eq(Material::getNo, material.getNo()).exists())
.throwMessage("SAP料号已存在");
save(material);
auditLogService.addInsert(Material.class,material,material.getCreateBy());
}
@Override
public void update(Material material) {
Material old = getById(material.getId());
material.setNo(null);
updateById(material);
Material newMaterial = getById(material.getId());
auditLogService.addUpdate(Material.class, old, newMaterial, material.getUpdateBy());
}
@Override
public IPage<MaterialVO> search(MaterialSearchQO request) {
return baseMapper.search(request,new Page<>(request.getPage(),request.getPageSize()));
}
@Override
public List<MaterialVO> getHistory(String no) {
return baseMapper.getHistory(no);
}
@Override
public List<Material> getNotSet() {
return baseMapper.getNotSet();
}
}

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nflg.wms.repository.mapper.MaterialMapper">
<select id="search" resultType="com.nflg.wms.common.pojo.vo.MaterialVO">
SELECT DISTINCT ON ("no") *
FROM material
<where>
<if test="request.no!=null and request.no!=''">
and "no" like concat('%', #{request.no}, '%')
</if>
</where>
ORDER BY "no",id DESC;
</select>
<select id="getHistory" resultType="com.nflg.wms.common.pojo.vo.MaterialVO">
select *
from material
where no=#{no}
order by id desc
</select>
<select id="getNotSet" resultType="com.nflg.wms.repository.entity.Material">
SELECT *
FROM (
SELECT DISTINCT ON ("no") *
FROM material
ORDER BY "no", id DESC
) t
where image is null or weight is null
ORDER BY id
</select>
</mapper>

View File

@ -33,7 +33,7 @@ public class CodeGeneratorTest {
)
.strategyConfig(builder -> {
builder
.addInclude("v_user_supplier") //只生成指定表
.addInclude("material") //只生成指定表
.entityBuilder().idType(IdType.ASSIGN_ID)
.enableLombok()
.enableChainModel()