diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/MesMdVendorController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/MesMdVendorController.java new file mode 100644 index 0000000..4199e6f --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/MesMdVendorController.java @@ -0,0 +1,134 @@ +package cn.iocoder.yudao.module.mes.controller.admin.md; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.module.mes.controller.admin.md.vo.vendor.MesMdVendorImportExcelVO; +import cn.iocoder.yudao.module.mes.controller.admin.md.vo.vendor.MesMdVendorImportRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.md.vo.vendor.MesMdVendorPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.md.vo.vendor.MesMdVendorRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.md.vo.vendor.MesMdVendorSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.MesMdVendorDO; +import cn.iocoder.yudao.module.mes.service.md.MesMdVendorService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; + +@Tag(name = "管理后台 - MES 供应商") +@RestController +@RequestMapping("/mes/md-vendor") +@Validated +public class MesMdVendorController { + + @Resource + private MesMdVendorService vendorService; + + @PostMapping("/create") + @Operation(summary = "创建供应商") + @PreAuthorize("@ss.hasPermission('mes:md-vendor:create')") + public CommonResult createVendor(@Valid @RequestBody MesMdVendorSaveReqVO createReqVO) { + return success(vendorService.createVendor(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新供应商") + @PreAuthorize("@ss.hasPermission('mes:md-vendor:update')") + public CommonResult updateVendor(@Valid @RequestBody MesMdVendorSaveReqVO updateReqVO) { + vendorService.updateVendor(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除供应商") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:md-vendor:delete')") + public CommonResult deleteVendor(@RequestParam("id") Long id) { + vendorService.deleteVendor(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得供应商") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:md-vendor:query')") + public CommonResult getVendor(@RequestParam("id") Long id) { + MesMdVendorDO vendor = vendorService.getVendor(id); + return success(BeanUtils.toBean(vendor, MesMdVendorRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得供应商分页") + @PreAuthorize("@ss.hasPermission('mes:md-vendor:query')") + public CommonResult> getVendorPage(@Valid MesMdVendorPageReqVO pageReqVO) { + PageResult pageResult = vendorService.getVendorPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, MesMdVendorRespVO.class)); + } + + @GetMapping("/simple-list") + @Operation(summary = "获得供应商精简列表", description = "只包含被开启的供应商,主要用于前端的下拉选项") + public CommonResult> getVendorSimpleList() { + List list = vendorService.getVendorListByStatus(CommonStatusEnum.ENABLE.getStatus()); + return success(convertList(list, vendor -> new MesMdVendorRespVO() + .setId(vendor.getId()).setName(vendor.getName()).setCode(vendor.getCode()))); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出供应商 Excel") + @PreAuthorize("@ss.hasPermission('mes:md-vendor:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportVendorExcel(@Valid MesMdVendorPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = vendorService.getVendorPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "供应商.xls", "数据", MesMdVendorRespVO.class, + BeanUtils.toBean(list, MesMdVendorRespVO.class)); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得供应商导入模板") + public void importTemplate(HttpServletResponse response) throws IOException { + // 手动创建导出 demo + List list = Collections.singletonList( + MesMdVendorImportExcelVO.builder().code("V001").name("示例供应商").nickname("示例") + .level("A").telephone("13800138000").status(0).build() + ); + // 输出 + ExcelUtils.write(response, "供应商导入模板.xls", "供应商列表", MesMdVendorImportExcelVO.class, list); + } + + @PostMapping("/import") + @Operation(summary = "导入供应商") + @Parameters({ + @Parameter(name = "file", description = "Excel 文件", required = true), + @Parameter(name = "updateSupport", description = "是否支持更新,默认为 false", example = "true") + }) + @PreAuthorize("@ss.hasPermission('mes:md-vendor:import')") + public CommonResult importExcel(@RequestParam("file") MultipartFile file, + @RequestParam(value = "updateSupport", required = false, + defaultValue = "false") Boolean updateSupport) throws Exception { + List list = ExcelUtils.read(file, MesMdVendorImportExcelVO.class); + return success(vendorService.importVendorList(list, updateSupport)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/vo/vendor/MesMdVendorImportExcelVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/vo/vendor/MesMdVendorImportExcelVO.java new file mode 100644 index 0000000..906ca48 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/vo/vendor/MesMdVendorImportExcelVO.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.module.mes.controller.admin.md.vo.vendor; + +import cn.idev.excel.annotation.ExcelProperty; +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 供应商 Excel 导入 VO + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class MesMdVendorImportExcelVO { + + @ExcelProperty("供应商编码") + private String code; + + @ExcelProperty("供应商名称") + private String name; + + @ExcelProperty("供应商简称") + private String nickname; + + @ExcelProperty(value = "供应商等级", converter = DictConvert.class) + @DictFormat(DictTypeConstants.MES_VENDOR_LEVEL) + private String level; + + @ExcelProperty("供应商电话") + private String telephone; + + @ExcelProperty("供应商邮箱地址") + private String email; + + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(cn.iocoder.yudao.module.system.enums.DictTypeConstants.COMMON_STATUS) + private Integer status; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/vo/vendor/MesMdVendorImportRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/vo/vendor/MesMdVendorImportRespVO.java new file mode 100644 index 0000000..ca75a96 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/vo/vendor/MesMdVendorImportRespVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.mes.controller.admin.md.vo.vendor; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Schema(description = "管理后台 - MES 供应商导入 Response VO") +@Data +@Builder +public class MesMdVendorImportRespVO { + + @Schema(description = "创建成功的供应商编码数组", requiredMode = Schema.RequiredMode.REQUIRED) + private List createCodes; + + @Schema(description = "更新成功的供应商编码数组", requiredMode = Schema.RequiredMode.REQUIRED) + private List updateCodes; + + @Schema(description = "导入失败的供应商集合,key 为供应商编码,value 为失败原因", requiredMode = Schema.RequiredMode.REQUIRED) + private Map failureCodes; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/vo/vendor/MesMdVendorPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/vo/vendor/MesMdVendorPageReqVO.java new file mode 100644 index 0000000..98c48ce --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/vo/vendor/MesMdVendorPageReqVO.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.mes.controller.admin.md.vo.vendor; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - MES 供应商分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MesMdVendorPageReqVO extends PageParam { + + @Schema(description = "供应商编码", example = "V00101") + private String code; + + @Schema(description = "供应商名称", example = "海力德") + private String name; + + @Schema(description = "供应商简称", example = "海力德") + private String nickname; + + @Schema(description = "供应商等级", example = "A") + private String level; + + @Schema(description = "状态", example = "0") + private Integer status; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/vo/vendor/MesMdVendorRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/vo/vendor/MesMdVendorRespVO.java new file mode 100644 index 0000000..481a3e9 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/vo/vendor/MesMdVendorRespVO.java @@ -0,0 +1,123 @@ +package cn.iocoder.yudao.module.mes.controller.admin.md.vo.vendor; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 供应商 Response VO") +@Data +@ExcelIgnoreUnannotated +public class MesMdVendorRespVO { + + @Schema(description = "供应商编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("供应商编号") + private Long id; + + @Schema(description = "供应商编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "V00101") + @ExcelProperty("供应商编码") + private String code; + + @Schema(description = "供应商名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "海力德电子") + @ExcelProperty("供应商名称") + private String name; + + @Schema(description = "供应商简称", example = "海力德") + @ExcelProperty("供应商简称") + private String nickname; + + @Schema(description = "供应商英文名称", example = "HLD Electronics") + @ExcelProperty("供应商英文名称") + private String englishName; + + @Schema(description = "供应商简介", example = "专业从事电子元器件生产与销售") + @ExcelProperty("供应商简介") + private String description; + + @Schema(description = "供应商LOGO地址", example = "https://xxx.com/logo.png") + private String logo; + + @Schema(description = "供应商等级", example = "A") + @ExcelProperty(value = "供应商等级", converter = DictConvert.class) + @DictFormat(DictTypeConstants.MES_VENDOR_LEVEL) + private String level; + + @Schema(description = "供应商评分", example = "95") + @ExcelProperty("供应商评分") + private Integer score; + + @Schema(description = "供应商地址", example = "深圳市宝安区") + @ExcelProperty("供应商地址") + private String address; + + @Schema(description = "供应商官网地址", example = "https://www.hld-elec.com") + @ExcelProperty("供应商官网地址") + private String website; + + @Schema(description = "供应商邮箱地址", example = "info@hld-elec.com") + @ExcelProperty("供应商邮箱地址") + private String email; + + @Schema(description = "供应商电话", example = "0755-12345678") + @ExcelProperty("供应商电话") + private String telephone; + + @Schema(description = "联系人1", example = "王经理") + @ExcelProperty("联系人1") + private String contact1Name; + + @Schema(description = "联系人1-电话", example = "13800138001") + @ExcelProperty("联系人1-电话") + private String contact1Telephone; + + @Schema(description = "联系人1-邮箱", example = "wang@hld-elec.com") + @ExcelProperty("联系人1-邮箱") + private String contact1Email; + + @Schema(description = "联系人2", example = "赵助理") + @ExcelProperty("联系人2") + private String contact2Name; + + @Schema(description = "联系人2-电话", example = "13800138002") + @ExcelProperty("联系人2-电话") + private String contact2Telephone; + + @Schema(description = "联系人2-邮箱", example = "zhao@hld-elec.com") + @ExcelProperty("联系人2-邮箱") + private String contact2Email; + + @Schema(description = "统一社会信用代码", example = "91440300MA5EXAMPLE") + @ExcelProperty("统一社会信用代码") + private String creditCode; + + @Schema(description = "预留字段1") + private String attribute1; + + @Schema(description = "预留字段2") + private String attribute2; + + @Schema(description = "预留字段3") + private Integer attribute3; + + @Schema(description = "预留字段4") + private Integer attribute4; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(cn.iocoder.yudao.module.system.enums.DictTypeConstants.COMMON_STATUS) + private Integer status; + + @Schema(description = "备注", example = "备注") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/vo/vendor/MesMdVendorSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/vo/vendor/MesMdVendorSaveReqVO.java new file mode 100644 index 0000000..1044528 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/vo/vendor/MesMdVendorSaveReqVO.java @@ -0,0 +1,93 @@ +package cn.iocoder.yudao.module.mes.controller.admin.md.vo.vendor; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Schema(description = "管理后台 - MES 供应商新增/修改 Request VO") +@Data +public class MesMdVendorSaveReqVO { + + @Schema(description = "供应商编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "供应商编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "V00101") + @NotEmpty(message = "供应商编码不能为空") + private String code; + + @Schema(description = "供应商名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "海力德电子") + @NotEmpty(message = "供应商名称不能为空") + private String name; + + @Schema(description = "供应商简称", example = "海力德") + private String nickname; + + @Schema(description = "供应商英文名称", example = "HLD Electronics") + private String englishName; + + @Schema(description = "供应商简介", example = "专业从事电子元器件生产与销售") + private String description; + + @Schema(description = "供应商LOGO地址", example = "https://xxx.com/logo.png") + private String logo; + + @Schema(description = "供应商等级", example = "A") + private String level; + + @Schema(description = "供应商评分", example = "95") + private Integer score; + + @Schema(description = "供应商地址", example = "深圳市宝安区") + private String address; + + @Schema(description = "供应商官网地址", example = "https://www.hld-elec.com") + private String website; + + @Schema(description = "供应商邮箱地址", example = "info@hld-elec.com") + private String email; + + @Schema(description = "供应商电话", example = "0755-12345678") + private String telephone; + + @Schema(description = "联系人1", example = "王经理") + private String contact1Name; + + @Schema(description = "联系人1-电话", example = "13800138001") + private String contact1Telephone; + + @Schema(description = "联系人1-邮箱", example = "wang@hld-elec.com") + private String contact1Email; + + @Schema(description = "联系人2", example = "赵助理") + private String contact2Name; + + @Schema(description = "联系人2-电话", example = "13800138002") + private String contact2Telephone; + + @Schema(description = "联系人2-邮箱", example = "zhao@hld-elec.com") + private String contact2Email; + + @Schema(description = "统一社会信用代码", example = "91440300MA5EXAMPLE") + private String creditCode; + + @Schema(description = "预留字段1") + private String attribute1; + + @Schema(description = "预留字段2") + private String attribute2; + + @Schema(description = "预留字段3") + private Integer attribute3; + + @Schema(description = "预留字段4") + private Integer attribute4; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @NotNull(message = "状态不能为空") + private Integer status; + + @Schema(description = "备注", example = "备注") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/MesMdVendorDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/MesMdVendorDO.java new file mode 100644 index 0000000..1dffbbf --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/MesMdVendorDO.java @@ -0,0 +1,134 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.md; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * MES 供应商 DO + * + * @author 芋道源码 + */ +@TableName("mes_md_vendor") +@KeySequence("mes_md_vendor_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesMdVendorDO extends BaseDO { + + /** + * 供应商编号 + */ + @TableId + private Long id; + /** + * 供应商编码 + */ + private String code; + /** + * 供应商名称 + */ + private String name; + /** + * 供应商简称 + */ + private String nickname; + /** + * 供应商英文名称 + */ + private String englishName; + /** + * 供应商简介 + */ + private String description; + /** + * 供应商LOGO地址 + */ + private String logo; + /** + * 供应商等级 + * + * 字典 {@link cn.iocoder.yudao.module.mes.enums.DictTypeConstants#MES_VENDOR_LEVEL} + */ + private String level; + /** + * 供应商评分 + */ + private Integer score; + /** + * 供应商地址 + */ + private String address; + /** + * 供应商官网地址 + */ + private String website; + /** + * 供应商邮箱地址 + */ + private String email; + /** + * 供应商电话 + */ + private String telephone; + /** + * 联系人1 + */ + private String contact1Name; + /** + * 联系人1-电话 + */ + private String contact1Telephone; + /** + * 联系人1-邮箱 + */ + private String contact1Email; + /** + * 联系人2 + */ + private String contact2Name; + /** + * 联系人2-电话 + */ + private String contact2Telephone; + /** + * 联系人2-邮箱 + */ + private String contact2Email; + /** + * 统一社会信用代码 + */ + private String creditCode; + /** + * 预留字段1 + */ + private String attribute1; + /** + * 预留字段2 + */ + private String attribute2; + /** + * 预留字段3 + */ + private Integer attribute3; + /** + * 预留字段4 + */ + private Integer attribute4; + /** + * 状态 + * + * 枚举 {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/MesMdVendorMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/MesMdVendorMapper.java new file mode 100644 index 0000000..d54d6fc --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/MesMdVendorMapper.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.md; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.controller.admin.md.vo.vendor.MesMdVendorPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.MesMdVendorDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * MES 供应商 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface MesMdVendorMapper extends BaseMapperX { + + default PageResult selectPage(MesMdVendorPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MesMdVendorDO::getCode, reqVO.getCode()) + .likeIfPresent(MesMdVendorDO::getName, reqVO.getName()) + .likeIfPresent(MesMdVendorDO::getNickname, reqVO.getNickname()) + .eqIfPresent(MesMdVendorDO::getLevel, reqVO.getLevel()) + .eqIfPresent(MesMdVendorDO::getStatus, reqVO.getStatus()) + .orderByDesc(MesMdVendorDO::getId)); + } + + default MesMdVendorDO selectByCode(String code) { + return selectOne(MesMdVendorDO::getCode, code); + } + + default MesMdVendorDO selectByName(String name) { + return selectOne(MesMdVendorDO::getName, name); + } + + default MesMdVendorDO selectByNickname(String nickname) { + return selectOne(MesMdVendorDO::getNickname, nickname); + } + + default List selectListByStatus(Integer status) { + return selectList(MesMdVendorDO::getStatus, status); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index 213dfc9..4a9fa60 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -42,6 +42,7 @@ public interface ErrorCodeConstants { ErrorCode MD_VENDOR_CODE_DUPLICATE = new ErrorCode(1_040_104_001, "供应商编码已存在"); ErrorCode MD_VENDOR_NAME_DUPLICATE = new ErrorCode(1_040_104_002, "供应商名称已存在"); ErrorCode MD_VENDOR_NICKNAME_DUPLICATE = new ErrorCode(1_040_104_003, "供应商简称已存在"); + ErrorCode MD_VENDOR_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_040_104_004, "导入供应商数据不能为空"); // ========== MES 基础数据-车间(1-040-105-000) ========== ErrorCode MD_WORKSHOP_NOT_EXISTS = new ErrorCode(1_040_105_000, "车间不存在"); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/MesMdVendorService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/MesMdVendorService.java new file mode 100644 index 0000000..f650cc4 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/MesMdVendorService.java @@ -0,0 +1,97 @@ +package cn.iocoder.yudao.module.mes.service.md; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.md.vo.vendor.MesMdVendorImportExcelVO; +import cn.iocoder.yudao.module.mes.controller.admin.md.vo.vendor.MesMdVendorImportRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.md.vo.vendor.MesMdVendorPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.md.vo.vendor.MesMdVendorSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.MesMdVendorDO; +import jakarta.validation.Valid; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; + +/** + * MES 供应商 Service 接口 + * + * @author 芋道源码 + */ +public interface MesMdVendorService { + + /** + * 创建供应商 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createVendor(@Valid MesMdVendorSaveReqVO createReqVO); + + /** + * 更新供应商 + * + * @param updateReqVO 更新信息 + */ + void updateVendor(@Valid MesMdVendorSaveReqVO updateReqVO); + + /** + * 删除供应商 + * + * @param id 编号 + */ + void deleteVendor(Long id); + + /** + * 获得供应商 + * + * @param id 编号 + * @return 供应商 + */ + MesMdVendorDO getVendor(Long id); + + /** + * 获得供应商分页 + * + * @param pageReqVO 分页查询 + * @return 供应商分页 + */ + PageResult getVendorPage(MesMdVendorPageReqVO pageReqVO); + + /** + * 获得指定状态的供应商列表 + * + * @param status 状态 + * @return 供应商列表 + */ + List getVendorListByStatus(Integer status); + + /** + * 获得供应商列表 + * + * @param ids 编号列表 + * @return 供应商列表 + */ + List getVendorList(Collection ids); + + /** + * 获得供应商 Map + * + * @param ids 编号列表 + * @return 供应商 Map + */ + default Map getVendorMap(Collection ids) { + return convertMap(getVendorList(ids), MesMdVendorDO::getId); + } + + /** + * 批量导入供应商 + * + * @param importVendors 导入供应商列表 + * @param updateSupport 是否支持更新 + * @return 导入结果 + */ + MesMdVendorImportRespVO importVendorList(List importVendors, boolean updateSupport); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/MesMdVendorServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/MesMdVendorServiceImpl.java new file mode 100644 index 0000000..01d860c --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/MesMdVendorServiceImpl.java @@ -0,0 +1,200 @@ +package cn.iocoder.yudao.module.mes.service.md; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjUtil; +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.exception.ServiceException; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.md.vo.vendor.MesMdVendorImportExcelVO; +import cn.iocoder.yudao.module.mes.controller.admin.md.vo.vendor.MesMdVendorImportRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.md.vo.vendor.MesMdVendorPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.md.vo.vendor.MesMdVendorSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.MesMdVendorDO; +import cn.iocoder.yudao.module.mes.dal.mysql.md.MesMdVendorMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +/** + * MES 供应商 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class MesMdVendorServiceImpl implements MesMdVendorService { + + @Resource + private MesMdVendorMapper vendorMapper; + + @Override + public Long createVendor(MesMdVendorSaveReqVO createReqVO) { + // 校验编码唯一 + validateVendorCodeUnique(null, createReqVO.getCode()); + // 校验名称唯一 + validateVendorNameUnique(null, createReqVO.getName()); + // 校验简称唯一 + validateVendorNicknameUnique(null, createReqVO.getNickname()); + + // 插入 + MesMdVendorDO vendor = BeanUtils.toBean(createReqVO, MesMdVendorDO.class); + vendorMapper.insert(vendor); + return vendor.getId(); + } + + @Override + public void updateVendor(MesMdVendorSaveReqVO updateReqVO) { + // 校验存在 + validateVendorExists(updateReqVO.getId()); + // 校验编码唯一 + validateVendorCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); + // 校验名称唯一 + validateVendorNameUnique(updateReqVO.getId(), updateReqVO.getName()); + // 校验简称唯一 + validateVendorNicknameUnique(updateReqVO.getId(), updateReqVO.getNickname()); + + // 更新 + MesMdVendorDO updateObj = BeanUtils.toBean(updateReqVO, MesMdVendorDO.class); + vendorMapper.updateById(updateObj); + } + + @Override + public void deleteVendor(Long id) { + // 校验存在 + validateVendorExists(id); + // 删除 + vendorMapper.deleteById(id); + } + + private void validateVendorExists(Long id) { + if (vendorMapper.selectById(id) == null) { + throw exception(MD_VENDOR_NOT_EXISTS); + } + } + + private void validateVendorCodeUnique(Long id, String code) { + MesMdVendorDO vendor = vendorMapper.selectByCode(code); + if (vendor == null) { + return; + } + if (ObjUtil.notEqual(vendor.getId(), id)) { + throw exception(MD_VENDOR_CODE_DUPLICATE); + } + } + + private void validateVendorNameUnique(Long id, String name) { + MesMdVendorDO vendor = vendorMapper.selectByName(name); + if (vendor == null) { + return; + } + if (ObjUtil.notEqual(vendor.getId(), id)) { + throw exception(MD_VENDOR_NAME_DUPLICATE); + } + } + + private void validateVendorNicknameUnique(Long id, String nickname) { + if (StrUtil.isEmpty(nickname)) { + return; + } + MesMdVendorDO vendor = vendorMapper.selectByNickname(nickname); + if (vendor == null) { + return; + } + if (ObjUtil.notEqual(vendor.getId(), id)) { + throw exception(MD_VENDOR_NICKNAME_DUPLICATE); + } + } + + @Override + public MesMdVendorDO getVendor(Long id) { + return vendorMapper.selectById(id); + } + + @Override + public PageResult getVendorPage(MesMdVendorPageReqVO pageReqVO) { + return vendorMapper.selectPage(pageReqVO); + } + + @Override + public List getVendorListByStatus(Integer status) { + return vendorMapper.selectListByStatus(status); + } + + @Override + public List getVendorList(Collection ids) { + return vendorMapper.selectByIds(ids); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public MesMdVendorImportRespVO importVendorList(List importVendors, boolean updateSupport) { + // 1. 参数校验 + if (CollUtil.isEmpty(importVendors)) { + throw exception(MD_VENDOR_IMPORT_LIST_IS_EMPTY); + } + + // 2. 遍历,逐个创建 or 更新 + MesMdVendorImportRespVO respVO = MesMdVendorImportRespVO.builder() + .createCodes(new ArrayList<>()).updateCodes(new ArrayList<>()) + .failureCodes(new LinkedHashMap<>()).build(); + AtomicInteger index = new AtomicInteger(1); + importVendors.forEach(importVendor -> { + int currentIndex = index.getAndIncrement(); + // 2.1 校验字段 + String key = StrUtil.blankToDefault(importVendor.getCode(), "第 " + currentIndex + " 行"); + if (StrUtil.isBlank(importVendor.getCode())) { + respVO.getFailureCodes().put(key, "供应商编码不能为空"); + return; + } + if (StrUtil.isBlank(importVendor.getName())) { + respVO.getFailureCodes().put(key, "供应商名称不能为空"); + return; + } + + // 2.2 判断:创建 or 更新 + MesMdVendorDO existVendor = vendorMapper.selectByCode(importVendor.getCode()); + if (existVendor == null) { + // 2.2.1 创建 + try { + validateVendorNameUnique(null, importVendor.getName()); + validateVendorNicknameUnique(null, importVendor.getNickname()); + } catch (ServiceException ex) { + respVO.getFailureCodes().put(key, ex.getMessage()); + return; + } + MesMdVendorDO vendor = BeanUtils.toBean(importVendor, MesMdVendorDO.class); + vendorMapper.insert(vendor); + respVO.getCreateCodes().add(importVendor.getCode()); + } else if (updateSupport) { + // 2.2.2 更新 + try { + validateVendorNameUnique(existVendor.getId(), importVendor.getName()); + validateVendorNicknameUnique(existVendor.getId(), importVendor.getNickname()); + } catch (ServiceException ex) { + respVO.getFailureCodes().put(key, ex.getMessage()); + return; + } + MesMdVendorDO updateObj = BeanUtils.toBean(importVendor, MesMdVendorDO.class); + updateObj.setId(existVendor.getId()); + vendorMapper.updateById(updateObj); + respVO.getUpdateCodes().add(importVendor.getCode()); + } else { + // 不支持更新 + respVO.getFailureCodes().put(key, "供应商编码已存在"); + } + }); + return respVO; + } + +}