diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/ModelController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/ModelController.java new file mode 100644 index 00000000..ce74d118 --- /dev/null +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/ModelController.java @@ -0,0 +1,88 @@ +package com.nflg.wms.admin.controller; + +import com.nflg.wms.admin.service.ModelControllerService; +import com.nflg.wms.common.pojo.ApiResult; +import com.nflg.wms.common.pojo.PageData; +import com.nflg.wms.common.pojo.qo.EnableQO; +import com.nflg.wms.common.pojo.qo.ModelAddQO; +import com.nflg.wms.common.pojo.qo.ModelSearchQO; +import com.nflg.wms.common.pojo.qo.ModelUpdateQO; +import com.nflg.wms.repository.entity.Model; +import com.nflg.wms.starter.BaseController; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +/** + * 机型管理 + */ +@RestController +@RequestMapping("/model") +public class ModelController extends BaseController { + + @Resource + private ModelControllerService modelControllerService; + + /** + * 新增机型 + */ + @PostMapping("add") + public ApiResult add(@Valid @RequestBody ModelAddQO request){ + modelControllerService.add(request); + return ApiResult.success(); + } + + /** + * 更新机型 + */ + @PostMapping("update") + public ApiResult update(@Valid @RequestBody ModelUpdateQO request){ + modelControllerService.update(request); + return ApiResult.success(); + } + + /** + * 删除机型 + */ + @PostMapping("delete") + public ApiResult delete(@Valid @NotNull Long id){ + modelControllerService.delete(id); + return ApiResult.success(); + } + + /** + * 启用/禁用机型 + * @param request 请求参数 + */ + @PostMapping("/enable") + public ApiResult enable(@Valid @RequestBody EnableQO request){ + modelControllerService.enable(request); + return ApiResult.success(); + } + + /** + * 搜索机型 + * @param request 搜索参数 + */ + @PostMapping("search") + public ApiResult> search(@Valid @RequestBody ModelSearchQO request){ + return ApiResult.success(modelControllerService.search(request)); + } + + /** + * 导入机型 + * @param file 文件 + */ + @Transactional + @PostMapping("import") + public ApiResult importFromExcel(HttpServletResponse response, @RequestParam(value = "file") MultipartFile file) throws IOException { + return modelControllerService.importFromExcel(response,file); + } + +} \ No newline at end of file diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/ModelControllerService.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/ModelControllerService.java new file mode 100644 index 00000000..40e502bd --- /dev/null +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/ModelControllerService.java @@ -0,0 +1,131 @@ +package com.nflg.wms.admin.service; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.nflg.wms.common.constant.STATE; +import com.nflg.wms.common.pojo.ApiResult; +import com.nflg.wms.common.pojo.dto.ModelExcelImportDTO; +import com.nflg.wms.common.pojo.qo.EnableQO; +import com.nflg.wms.common.pojo.qo.ModelAddQO; +import com.nflg.wms.common.pojo.qo.ModelSearchQO; +import com.nflg.wms.common.pojo.qo.ModelUpdateQO; +import com.nflg.wms.common.util.DateTimeUtil; +import com.nflg.wms.common.util.EecExcelUtil; +import com.nflg.wms.common.util.UserUtil; +import com.nflg.wms.common.util.VUtil; +import com.nflg.wms.repository.entity.Model; +import com.nflg.wms.repository.service.IModelService; +import com.nflg.wms.starter.service.FileUploadService; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import org.ttzero.excel.entity.ListSheet; +import org.ttzero.excel.entity.Workbook; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@Component +public class ModelControllerService { + + @Resource + private IModelService modelService; + + @Resource + private FileUploadService fileUploadService; + + public void add(@Valid ModelAddQO request) { + Model model= Convert.convert(Model.class, request); + model.setCreateBy(UserUtil.getUserName()); + model.setCreateTime(LocalDateTime.now()); + modelService.add(model); + } + + public void update(@Valid ModelUpdateQO request) { + Model model= Convert.convert(Model.class, request); + model.setUpdateBy(UserUtil.getUserName()); + model.setUpdateTime(LocalDateTime.now()); + modelService.update(model); + } + + public void delete(@Valid @NotNull Long id) { + modelService.delete(id); + } + + public void enable(@Valid EnableQO request) { + modelService.enable(request); + } + + public IPage search(@Valid ModelSearchQO request) { + return modelService.search(request); + } + + public ApiResult importFromExcel(HttpServletResponse response, MultipartFile file) throws IOException { + List data = EecExcelUtil.getExcelContext(file.getInputStream(), ModelExcelImportDTO.class); + VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(data)).throwMessage("导入文件内容为空"); + if (updateCheckAndImport(data)) { + return ApiResult.success(); + } else { + 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 ListSheet<>(data)) + .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)); + } + }catch (Exception e){ + return ApiResult.error(STATE.BusinessError, "保存文件出错"); + } + } + } + + private String getResultName(String name){ + int index=name.lastIndexOf("."); + return name.substring(0,index)+"_结果"+"."+name.substring(index+1); + } + + @Transactional + public boolean updateCheckAndImport(List data) { + List models = new ArrayList<>(); + for (ModelExcelImportDTO dto : data) { + Model model = new Model(); + StringBuilder sb = new StringBuilder(); + if (Objects.isNull(dto.getNo())) { + sb.append("机型编号不能为空;"); + } else { + model = modelService.lambdaQuery().eq(Model::getNo, dto.getNo()).one(); + if (Objects.isNull( model)){ + model = new Model() + .setNo(dto.getNo()); + } + } + model.setRemark(dto.getRemark()); + dto.setError(sb.toString()); + models.add(model); + } + if (data.stream().noneMatch(it -> StrUtil.isNotBlank(it.getError()))) { + modelService.saveOrUpdateBatch(models); + return true; + } + return false; + } +} diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/ModelExcelImportDTO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/ModelExcelImportDTO.java new file mode 100644 index 00000000..a213f7bd --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/ModelExcelImportDTO.java @@ -0,0 +1,28 @@ +package com.nflg.wms.common.pojo.dto; + +import lombok.Data; +import lombok.experimental.Accessors; +import org.ttzero.excel.annotation.ExcelColumn; + +@Data +@Accessors(chain = true) +public class ModelExcelImportDTO { + + /** + * 机型编号 + */ + @ExcelColumn("*机型编号") + private String no; + + /** + * 备注 + */ + @ExcelColumn("备注") + private String remark; + + /** + * 错误信息 + */ + @ExcelColumn("错误信息") + private String error; +} diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ModelAddQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ModelAddQO.java new file mode 100644 index 00000000..959bc9af --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ModelAddQO.java @@ -0,0 +1,26 @@ +package com.nflg.wms.common.pojo.qo; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class ModelAddQO { + + /** + * 机型编号 + */ + @NotBlank + private String no; + + /** + * 是否启用 + */ + @NotNull + private Boolean enable; + + /** + * 备注 + */ + private String remark; +} \ No newline at end of file diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ModelSearchQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ModelSearchQO.java new file mode 100644 index 00000000..aba592b6 --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ModelSearchQO.java @@ -0,0 +1,12 @@ +package com.nflg.wms.common.pojo.qo; + +import lombok.Data; + +@Data +public class ModelSearchQO extends PageQO{ + + /** + * 机型编号 + */ + private String no; +} diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ModelUpdateQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ModelUpdateQO.java new file mode 100644 index 00000000..f3b74a07 --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ModelUpdateQO.java @@ -0,0 +1,11 @@ +package com.nflg.wms.common.pojo.qo; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class ModelUpdateQO extends ModelAddQO{ + + @NotNull + private Long id; +} diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/Model.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/Model.java new file mode 100644 index 00000000..b208d86e --- /dev/null +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/Model.java @@ -0,0 +1,66 @@ +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.time.LocalDateTime; + +/** + *

+ * + *

+ * + * @author 代码生成器生成 + * @since 2025 + */ +@Getter +@Setter +@ToString +@Accessors(chain = true) +public class Model implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 机型编号 + */ + private String no; + + /** + * 是否启用 + */ + private Boolean enable; + + /** + * 备注 + */ + private String remark; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + /** + * 最后更新人 + */ + private String updateBy; + + /** + * 最后更新时间 + */ + private LocalDateTime updateTime; +} diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/ModelMapper.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/ModelMapper.java new file mode 100644 index 00000000..2156d46e --- /dev/null +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/ModelMapper.java @@ -0,0 +1,16 @@ +package com.nflg.wms.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.nflg.wms.repository.entity.Model; + +/** + *

+ * Mapper 接口 + *

+ * + * @author 代码生成器生成 + * @since 2025 + */ +public interface ModelMapper extends BaseMapper { + +} diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IModelService.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IModelService.java new file mode 100644 index 00000000..3280cc83 --- /dev/null +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IModelService.java @@ -0,0 +1,30 @@ +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.EnableQO; +import com.nflg.wms.common.pojo.qo.ModelSearchQO; +import com.nflg.wms.repository.entity.Model; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; + +/** + *

+ * 服务类 + *

+ * + * @author 代码生成器生成 + * @since 2025 + */ +public interface IModelService extends IService { + + void add(Model model); + + void update(Model model); + + void delete(@Valid @NotNull Long id); + + void enable(@Valid EnableQO request); + + IPage search(@Valid ModelSearchQO request); +} diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/ModelServiceImpl.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/ModelServiceImpl.java new file mode 100644 index 00000000..b41306e9 --- /dev/null +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/ModelServiceImpl.java @@ -0,0 +1,82 @@ +package com.nflg.wms.repository.service.impl; + +import cn.hutool.core.util.StrUtil; +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.EnableQO; +import com.nflg.wms.common.pojo.qo.ModelSearchQO; +import com.nflg.wms.common.util.UserUtil; +import com.nflg.wms.common.util.VUtil; +import com.nflg.wms.repository.entity.Model; +import com.nflg.wms.repository.mapper.ModelMapper; +import com.nflg.wms.repository.service.IAuditLogService; +import com.nflg.wms.repository.service.IModelService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; + +/** + *

+ * 服务实现类 + *

+ * + * @author 代码生成器生成 + * @since 2025 + */ +@Service +public class ModelServiceImpl extends ServiceImpl implements IModelService { + + @Resource + private IAuditLogService auditLogService; + + @Transactional + @Override + public void add(Model model) { + VUtil.trueThrowBusinessError(lambdaQuery().eq(Model::getNo, model.getNo()).exists()).throwMessage("机型已存在"); + save(model); + auditLogService.addInsert(Model.class,model,model.getCreateBy()); + } + + @Transactional + @Override + public void update(Model model) { + VUtil.trueThrowBusinessError(lambdaQuery().eq(Model::getNo, model.getNo()).ne(Model::getId, model.getId()).exists()) + .throwMessage("机型已存在"); + Model old = getById(model.getId()); + updateById(model); + Model newModel = getById(model.getId()); + auditLogService.addUpdate(Model.class, old, newModel, model.getUpdateBy()); + } + + @Transactional + @Override + public void delete(Long id) { + Model old = getById(id); + removeById(id); + auditLogService.addDelete(Model.class, old, UserUtil.getUserName()); + } + + @Override + public void enable(EnableQO request) { + Model old = getById(request.getId()); + lambdaUpdate() + .set(Model::getEnable, request.getEnable()) + .set(Model::getUpdateBy, UserUtil.getUserName()) + .set(Model::getUpdateTime, LocalDateTime.now()) + .eq(Model::getId, request.getId()) + .update(); + Model newModel = getById(request.getId()); + auditLogService.addUpdate(Model.class, old, newModel, UserUtil.getUserName()); + } + + @Override + public IPage search(ModelSearchQO request) { + return lambdaQuery() + .like(StrUtil.isNotBlank(request.getNo()),Model::getNo, request.getNo()) + .orderByDesc(Model::getId) + .page(new Page<>(request.getPage(), request.getPageSize())); + } +} diff --git a/nflg-wms-repository/src/main/resources/mapper/ModelMapper.xml b/nflg-wms-repository/src/main/resources/mapper/ModelMapper.xml new file mode 100644 index 00000000..3c4bd9ea --- /dev/null +++ b/nflg-wms-repository/src/main/resources/mapper/ModelMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/nflg-wms-repository/src/test/java/com/nflg/wms/repository/CodeGeneratorTest.java b/nflg-wms-repository/src/test/java/com/nflg/wms/repository/CodeGeneratorTest.java index 970849e6..e2cb8a1f 100644 --- a/nflg-wms-repository/src/test/java/com/nflg/wms/repository/CodeGeneratorTest.java +++ b/nflg-wms-repository/src/test/java/com/nflg/wms/repository/CodeGeneratorTest.java @@ -33,7 +33,7 @@ public class CodeGeneratorTest { ) .strategyConfig(builder -> { builder - .addInclude("v_user_supplier") //只生成指定表 + .addInclude("model") //只生成指定表 .entityBuilder().idType(IdType.ASSIGN_ID) .enableLombok() .enableChainModel()