物料分类

master
17602169347 1 year ago
parent 3654b7034f
commit 6313107275

@ -0,0 +1,54 @@
package cn.iocoder.yudao.module.xxjj.api.materialcategory;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.xxjj.api.materialcategory.dto.MaterialCategoryRespDTO;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* API
*
* @author
*/
public interface MaterialCategoryApi {
/**
*
*
* @param id
* @return
*/
MaterialCategoryRespDTO getMaterialCategory(Long id);
/**
*
*
* @param ids
* @return
*/
List<MaterialCategoryRespDTO> getMaterialCategoryList(Collection<Long> ids);
/**
*
* 1.
* 2.
*
* @param ids
*/
void validateMaterialCategoryList(Collection<Long> ids);
/**
* Map
*
* @param ids
* @return Map
*/
default Map<Long, MaterialCategoryRespDTO> getMaterialCategoryMap(Set<Long> ids) {
List<MaterialCategoryRespDTO> list = getMaterialCategoryList(ids);
return CollectionUtils.convertMap(list, MaterialCategoryRespDTO::getId);
}
}

@ -0,0 +1,30 @@
package cn.iocoder.yudao.module.xxjj.api.materialcategory.dto;
import lombok.Data;
/**
* Response DTO
*
* @author
*/
@Data
public class MaterialCategoryRespDTO {
/**
*
*/
private Long id;
/**
*
*/
private String code;
/**
*
*/
private String name;
/**
*
*/
private Long parentId;
}

@ -0,0 +1,20 @@
package cn.iocoder.yudao.module.xxjj.enums.materialcategory;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
*
*/
@Getter
@AllArgsConstructor
public enum MaterialCategoryIdEnum {
/**
*
*/
ROOT(0L);
private final Long id;
}

@ -0,0 +1,84 @@
package cn.iocoder.yudao.module.xxjj.controller.admin.materialcategory;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.xxjj.controller.admin.materialcategory.vo.*;
import cn.iocoder.yudao.module.xxjj.convert.materialcategory.MaterialCategoryConvert;
import cn.iocoder.yudao.module.xxjj.dal.dataobject.materialcategory.MaterialCategoryDO;
import cn.iocoder.yudao.module.xxjj.service.materialcategory.MaterialCategoryService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.Comparator;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 物料分类")
@RestController
@RequestMapping("/xxjj/materialCategory")
@Validated
public class MaterialCategoryController {
@Resource
private MaterialCategoryService materialCategoryService;
@PostMapping("create")
@Operation(summary = "创建物料分类")
@PreAuthorize("@ss.hasPermission('xxjj:materialCategory:create')")
public CommonResult<Long> createMaterialCategory(@Valid @RequestBody MaterialCategoryCreateReqVO reqVO) {
Long MaterialCategoryId = materialCategoryService.createMaterialCategory(reqVO);
return success(MaterialCategoryId);
}
@PutMapping("update")
@Operation(summary = "更新物料分类")
@PreAuthorize("@ss.hasPermission('xxjj:materialCategory:update')")
public CommonResult<Boolean> updateMaterialCategory(@Valid @RequestBody MaterialCategoryUpdateReqVO reqVO) {
materialCategoryService.updateMaterialCategory(reqVO);
return success(true);
}
@DeleteMapping("delete")
@Operation(summary = "删除物料分类")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('xxjj:materialCategory:delete')")
public CommonResult<Boolean> deleteMaterialCategory(@RequestParam("id") Long id) {
materialCategoryService.deleteMaterialCategory(id);
return success(true);
}
@GetMapping("/list")
@Operation(summary = "获取物料分类列表")
@PreAuthorize("@ss.hasPermission('xxjj:materialCategory:query')")
public CommonResult<List<MaterialCategoryRespVO>> getMaterialCategoryList(MaterialCategoryListReqVO reqVO) {
List<MaterialCategoryDO> list = materialCategoryService.getMaterialCategoryList(reqVO);
list.sort(Comparator.comparing(MaterialCategoryDO::getSort));
return success(MaterialCategoryConvert.INSTANCE.convertList(list));
}
@GetMapping("/list-all-simple")
@Operation(summary = "获取物料分类精简信息列表", description = "只包含被开启的物料分类,主要用于前端的下拉选项")
public CommonResult<List<MaterialCategorySimpleRespVO>> getSimpleMaterialCategoryList() {
// 获得物料分类列表,只要开启状态的
MaterialCategoryListReqVO reqVO = new MaterialCategoryListReqVO();
List<MaterialCategoryDO> list = materialCategoryService.getMaterialCategoryList(reqVO);
// 排序后,返回给前端
list.sort(Comparator.comparing(MaterialCategoryDO::getSort));
return success(MaterialCategoryConvert.INSTANCE.convertList02(list));
}
@GetMapping("/get")
@Operation(summary = "获得物料分类信息")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('xxjj:materialCategory:query')")
public CommonResult<MaterialCategoryRespVO> getMaterialCategory(@RequestParam("id") Long id) {
return success(MaterialCategoryConvert.INSTANCE.convert(materialCategoryService.getMaterialCategory(id)));
}
}

@ -0,0 +1,34 @@
package cn.iocoder.yudao.module.xxjj.controller.admin.materialcategory.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
/**
* Base VO VO 使
* VO Swagger
*/
@Data
public class MaterialCategoryBaseVO {
@Schema(description = "菜单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "20230802AAA1")
@Size(max = 30, message = "物料分类名称长度不能超过30个字符")
private String code;
@Schema(description = "菜单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
@NotBlank(message = "物料分类名称不能为空")
@Size(max = 30, message = "物料分类名称长度不能超过30个字符")
private String name;
@Schema(description = "父菜单 ID", example = "1024")
private Long parentId;
@Schema(description = "显示顺序不能为空", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@NotNull(message = "显示顺序不能为空")
private Integer sort;
}

@ -0,0 +1,12 @@
package cn.iocoder.yudao.module.xxjj.controller.admin.materialcategory.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Schema(description = "管理后台 - 物料分类创建 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MaterialCategoryCreateReqVO extends MaterialCategoryBaseVO {
}

@ -0,0 +1,13 @@
package cn.iocoder.yudao.module.xxjj.controller.admin.materialcategory.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - 物料分类列表 Request VO")
@Data
public class MaterialCategoryListReqVO {
@Schema(description = "物料分类名称,模糊匹配", example = "芋道")
private String name;
}

@ -0,0 +1,20 @@
package cn.iocoder.yudao.module.xxjj.controller.admin.materialcategory.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 物料分类信息 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
public class MaterialCategoryRespVO extends MaterialCategoryBaseVO {
@Schema(description = "物料分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式")
private LocalDateTime createTime;
}

@ -0,0 +1,26 @@
package cn.iocoder.yudao.module.xxjj.controller.admin.materialcategory.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Schema(description = "管理后台 - 物料分类精简信息 Response VO")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MaterialCategorySimpleRespVO {
@Schema(description = "物料分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "物料分类编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
private String code;
@Schema(description = "物料分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
private String name;
@Schema(description = "父物料分类 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long parentId;
}

@ -0,0 +1,18 @@
package cn.iocoder.yudao.module.xxjj.controller.admin.materialcategory.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotNull;
@Schema(description = "管理后台 - 物料分类更新 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
public class MaterialCategoryUpdateReqVO extends MaterialCategoryBaseVO {
@Schema(description = "物料分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@NotNull(message = "物料分类编号不能为空")
private Long id;
}

@ -22,8 +22,4 @@ public class MaterialIndustryBaseVO {
@NotNull(message = "行业名称不能为空")
private String industryName;
@Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "状态不能为空")
private Byte status;
}

@ -28,10 +28,6 @@ public class MaterialIndustryExcelVO {
@ExcelProperty("行业名称")
private String industryName;
@ExcelProperty(value = "状态", converter = DictConvert.class)
@DictFormat("common_status") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
private Byte status;
@ExcelProperty("创建时间")
private LocalDateTime createTime;

@ -19,9 +19,6 @@ public class MaterialIndustryExportReqVO {
@Schema(description = "行业名称", example = "李四")
private String industryName;
@Schema(description = "状态", example = "1")
private Byte status;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;

@ -21,9 +21,6 @@ public class MaterialIndustryPageReqVO extends PageParam {
@Schema(description = "行业名称", example = "李四")
private String industryName;
@Schema(description = "状态", example = "1")
private Byte status;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;

@ -0,0 +1,33 @@
package cn.iocoder.yudao.module.xxjj.convert.materialcategory;
import cn.iocoder.yudao.module.xxjj.api.materialcategory.dto.MaterialCategoryRespDTO;
import cn.iocoder.yudao.module.xxjj.controller.admin.materialcategory.vo.MaterialCategoryCreateReqVO;
import cn.iocoder.yudao.module.xxjj.controller.admin.materialcategory.vo.MaterialCategoryRespVO;
import cn.iocoder.yudao.module.xxjj.controller.admin.materialcategory.vo.MaterialCategorySimpleRespVO;
import cn.iocoder.yudao.module.xxjj.controller.admin.materialcategory.vo.MaterialCategoryUpdateReqVO;
import cn.iocoder.yudao.module.xxjj.dal.dataobject.materialcategory.MaterialCategoryDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface MaterialCategoryConvert {
MaterialCategoryConvert INSTANCE = Mappers.getMapper(MaterialCategoryConvert.class);
List<MaterialCategoryRespVO> convertList(List<MaterialCategoryDO> list);
List<MaterialCategorySimpleRespVO> convertList02(List<MaterialCategoryDO> list);
MaterialCategoryRespVO convert(MaterialCategoryDO bean);
MaterialCategoryDO convert(MaterialCategoryCreateReqVO bean);
MaterialCategoryDO convert(MaterialCategoryUpdateReqVO bean);
List<MaterialCategoryRespDTO> convertList03(List<MaterialCategoryDO> list);
MaterialCategoryRespDTO convert03(MaterialCategoryDO bean);
}

@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.xxjj.dal.dataobject.materialcategory;
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.Data;
import lombok.EqualsAndHashCode;
/**
*
*
* @author ruoyi
* @author
*/
@TableName("xxjj_material_category")
@KeySequence("xxjj_material_category_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
public class MaterialCategoryDO extends BaseDO {
/**
* ID
*/
@TableId
private Long id;
/**
*
*/
private String code;
/**
*
*/
private String name;
/**
* ID
*
* {@link #id}
*/
private Long parentId;
/**
*
*/
private Integer sort;
}

@ -35,11 +35,5 @@ public class MaterialIndustryDO extends BaseDO {
*
*/
private String industryName;
/**
*
*
* {@link TODO common_status }
*/
private Byte status;
}

@ -0,0 +1,27 @@
package cn.iocoder.yudao.module.xxjj.dal.mysql.materialcategory;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.xxjj.controller.admin.materialcategory.vo.MaterialCategoryListReqVO;
import cn.iocoder.yudao.module.xxjj.dal.dataobject.materialcategory.MaterialCategoryDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface MaterialCategoryMapper extends BaseMapperX<MaterialCategoryDO> {
default List<MaterialCategoryDO> selectList(MaterialCategoryListReqVO reqVO) {
return selectList(new LambdaQueryWrapperX<MaterialCategoryDO>()
.likeIfPresent(MaterialCategoryDO::getName, reqVO.getName()));
}
default MaterialCategoryDO selectByParentIdAndName(Long parentId, String name) {
return selectOne(MaterialCategoryDO::getParentId, parentId, MaterialCategoryDO::getName, name);
}
default Long selectCountByParentId(Long parentId) {
return selectCount(MaterialCategoryDO::getParentId, parentId);
}
}

@ -21,7 +21,6 @@ public interface MaterialIndustryMapper extends BaseMapperX<MaterialIndustryDO>
return selectPage(reqVO, new LambdaQueryWrapperX<MaterialIndustryDO>()
.eqIfPresent(MaterialIndustryDO::getIndustryCode, reqVO.getIndustryCode())
.likeIfPresent(MaterialIndustryDO::getIndustryName, reqVO.getIndustryName())
.eqIfPresent(MaterialIndustryDO::getStatus, reqVO.getStatus())
.betweenIfPresent(MaterialIndustryDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(MaterialIndustryDO::getId));
}
@ -30,7 +29,6 @@ public interface MaterialIndustryMapper extends BaseMapperX<MaterialIndustryDO>
return selectList(new LambdaQueryWrapperX<MaterialIndustryDO>()
.eqIfPresent(MaterialIndustryDO::getIndustryCode, reqVO.getIndustryCode())
.likeIfPresent(MaterialIndustryDO::getIndustryName, reqVO.getIndustryName())
.eqIfPresent(MaterialIndustryDO::getStatus, reqVO.getStatus())
.betweenIfPresent(MaterialIndustryDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(MaterialIndustryDO::getId));
}

@ -9,4 +9,14 @@ public interface ErrorCodeConstants {
ErrorCode MATERIAL_TYPE_NOT_EXISTS = new ErrorCode(1002025003, "物料类型不存在");
// ========== 物料 TODO 补充编号 ==========
ErrorCode MATERIAL_NOT_EXISTS = new ErrorCode(1002025004, "物料不存在");
// ========== 部门模块 1002004000 ==========
ErrorCode MaterialCategory_NAME_DUPLICATE = new ErrorCode(1002004000, "已经存在该名字的部门");
ErrorCode MaterialCategory_PARENT_NOT_EXITS = new ErrorCode(1002004001,"父级部门不存在");
ErrorCode MaterialCategory_NOT_FOUND = new ErrorCode(1002004002, "当前部门不存在");
ErrorCode MaterialCategory_EXITS_CHILDREN = new ErrorCode(1002004003, "存在子部门,无法删除");
ErrorCode MaterialCategory_PARENT_ERROR = new ErrorCode(1002004004, "不能设置自己为父部门");
ErrorCode MaterialCategory_EXISTS_USER = new ErrorCode(1002004005, "部门中存在员工,无法删除");
ErrorCode MaterialCategory_NOT_ENABLE = new ErrorCode(1002004006, "部门({})不处于开启状态,不允许选择");
ErrorCode MaterialCategory_PARENT_IS_CHILD = new ErrorCode(1002004007, "不能设置自己的子部门为父部门");
}

@ -0,0 +1,105 @@
package cn.iocoder.yudao.module.xxjj.service.materialcategory;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.xxjj.controller.admin.materialcategory.vo.MaterialCategoryCreateReqVO;
import cn.iocoder.yudao.module.xxjj.controller.admin.materialcategory.vo.MaterialCategoryListReqVO;
import cn.iocoder.yudao.module.xxjj.controller.admin.materialcategory.vo.MaterialCategoryUpdateReqVO;
import cn.iocoder.yudao.module.xxjj.dal.dataobject.materialcategory.MaterialCategoryDO;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/**
* Service
*
* @author
*/
public interface MaterialCategoryService {
/**
*
*/
//void initLocalCache();
/**
*
*
* @param reqVO
* @return
*/
Long createMaterialCategory(MaterialCategoryCreateReqVO reqVO);
/**
*
*
* @param reqVO
*/
void updateMaterialCategory(MaterialCategoryUpdateReqVO reqVO);
/**
*
*
* @param id
*/
void deleteMaterialCategory(Long id);
/**
*
*
* @param reqVO VO
* @return
*/
List<MaterialCategoryDO> getMaterialCategoryList(MaterialCategoryListReqVO reqVO);
/**
*
*
* @param parentId
* @param recursive
* @return
*/
//List<MaterialCategoryDO> getMaterialCategoryListByParentIdFromCache(Long parentId, boolean recursive);
/**
*
*
* @param ids
* @return
*/
List<MaterialCategoryDO> getMaterialCategoryList(Collection<Long> ids);
/**
* Map
*
* @param ids
* @return Map
*/
default Map<Long, MaterialCategoryDO> getMaterialCategoryMap(Collection<Long> ids) {
if (CollUtil.isEmpty(ids)) {
return Collections.emptyMap();
}
List<MaterialCategoryDO> list = getMaterialCategoryList(ids);
return CollectionUtils.convertMap(list, MaterialCategoryDO::getId);
}
/**
*
*
* @param id
* @return
*/
MaterialCategoryDO getMaterialCategory(Long id);
/**
*
* 1.
* 2.
*
* @param ids
*/
//void validateMaterialCategoryList(Collection<Long> ids);
}

@ -0,0 +1,179 @@
package cn.iocoder.yudao.module.xxjj.service.materialcategory;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.module.xxjj.controller.admin.materialcategory.vo.MaterialCategoryCreateReqVO;
import cn.iocoder.yudao.module.xxjj.controller.admin.materialcategory.vo.MaterialCategoryListReqVO;
import cn.iocoder.yudao.module.xxjj.controller.admin.materialcategory.vo.MaterialCategoryUpdateReqVO;
import cn.iocoder.yudao.module.xxjj.convert.materialcategory.MaterialCategoryConvert;
import cn.iocoder.yudao.module.xxjj.dal.dataobject.materialcategory.MaterialCategoryDO;
import cn.iocoder.yudao.module.xxjj.dal.mysql.materialcategory.MaterialCategoryMapper;
import cn.iocoder.yudao.module.xxjj.enums.materialcategory.MaterialCategoryIdEnum;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.Multimap;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.*;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.xxjj.enums.ErrorCodeConstants.*;
/**
* Service
*
* @author
*/
@Service
@Validated
@Slf4j
public class MaterialCategoryServiceImpl implements MaterialCategoryService {
/**
*
* key {@link MaterialCategoryDO#getId()}
*
* volatile
*/
@Getter
private volatile Map<Long, MaterialCategoryDO> materialCategoryCache;
/**
*
* key {@link MaterialCategoryDO#getParentId()}
* value:
*
* volatile
*/
@Getter
private volatile Multimap<Long, MaterialCategoryDO> parentMaterialCategoryCache;
@Resource
private MaterialCategoryMapper materialCategoryMapper;
@Override
public Long createMaterialCategory(MaterialCategoryCreateReqVO reqVO) {
// 校验正确性
if (reqVO.getParentId() == null) {
reqVO.setParentId(MaterialCategoryIdEnum.ROOT.getId());
}
//validateForCreateOrUpdate(null, reqVO.getParentId(), reqVO.getName());
// 插入部门
MaterialCategoryDO materialCategory = MaterialCategoryConvert.INSTANCE.convert(reqVO);
materialCategoryMapper.insert(materialCategory);
return materialCategory.getId();
}
@Override
public void updateMaterialCategory(MaterialCategoryUpdateReqVO reqVO) {
// 校验正确性
if (reqVO.getParentId() == null) {
reqVO.setParentId(MaterialCategoryIdEnum.ROOT.getId());
}
//validateForCreateOrUpdate(reqVO.getId(), reqVO.getParentId(), reqVO.getName());
// 更新部门
MaterialCategoryDO updateObj = MaterialCategoryConvert.INSTANCE.convert(reqVO);
materialCategoryMapper.updateById(updateObj);
}
@Override
public void deleteMaterialCategory(Long id) {
// 校验是否存在
validateMaterialCategoryExists(id);
// 校验是否有子部门
if (materialCategoryMapper.selectCountByParentId(id) > 0) {
throw exception(MaterialCategory_EXITS_CHILDREN);
}
// 删除部门
materialCategoryMapper.deleteById(id);
}
@Override
public List<MaterialCategoryDO> getMaterialCategoryList(MaterialCategoryListReqVO reqVO) {
return materialCategoryMapper.selectList(reqVO);
}
/*private void validateForCreateOrUpdate(Long id, Long parentId, String name) {
// 校验自己存在
validateMaterialCategoryExists(id);
// 校验父部门的有效性
validateParentMaterialCategoryEnable(id, parentId);
// 校验部门名的唯一性
validateMaterialCategoryNameUnique(id, parentId, name);
}*/
/*private void validateParentMaterialCategoryEnable(Long id, Long parentId) {
if (parentId == null || MaterialCategoryIdEnum.ROOT.getId().equals(parentId)) {
return;
}
// 不能设置自己为父部门
if (parentId.equals(id)) {
throw exception(MaterialCategory_PARENT_ERROR);
}
// 父岗位不存在
MaterialCategoryDO materialCategory = materialCategoryMapper.selectById(parentId);
if (materialCategory == null) {
throw exception(MaterialCategory_PARENT_NOT_EXITS);
}
// 父部门不能是原来的子部门
List<MaterialCategoryDO> children = getMaterialCategoryListByParentIdFromCache(id, true);
if (children.stream().anyMatch(materialCategory1 -> materialCategory1.getId().equals(parentId))) {
throw exception(MaterialCategory_PARENT_IS_CHILD);
}
}*/
private void validateMaterialCategoryExists(Long id) {
if (id == null) {
return;
}
MaterialCategoryDO materialCategory = materialCategoryMapper.selectById(id);
if (materialCategory == null) {
throw exception(MaterialCategory_NOT_FOUND);
}
}
private void validateMaterialCategoryNameUnique(Long id, Long parentId, String name) {
MaterialCategoryDO menu = materialCategoryMapper.selectByParentIdAndName(parentId, name);
if (menu == null) {
return;
}
// 如果 id 为空,说明不用比较是否为相同 id 的岗位
if (id == null) {
throw exception(MaterialCategory_NAME_DUPLICATE);
}
if (!menu.getId().equals(id)) {
throw exception(MaterialCategory_NAME_DUPLICATE);
}
}
@Override
public List<MaterialCategoryDO> getMaterialCategoryList(Collection<Long> ids) {
return materialCategoryMapper.selectBatchIds(ids);
}
@Override
public MaterialCategoryDO getMaterialCategory(Long id) {
return materialCategoryMapper.selectById(id);
}
/*@Override
public void validateMaterialCategoryList(Collection<Long> ids) {
if (CollUtil.isEmpty(ids)) {
return;
}
// 获得科室信息
Map<Long, MaterialCategoryDO> materialCategoryMap = getMaterialCategoryMap(ids);
// 校验
ids.forEach(id -> {
MaterialCategoryDO materialCategory = materialCategoryMap.get(id);
if (materialCategory == null) {
throw exception(MaterialCategory_NOT_FOUND);
}
});
}*/
}

@ -112,7 +112,6 @@ public class MaterialIndustryServiceImplTest extends BaseDbUnitTest {
MaterialIndustryDO dbMaterialIndustry = randomPojo(MaterialIndustryDO.class, o -> { // 等会查询到
o.setIndustryCode(null);
o.setIndustryName(null);
o.setStatus(null);
o.setCreateTime(null);
});
materialIndustryMapper.insert(dbMaterialIndustry);
@ -120,15 +119,12 @@ public class MaterialIndustryServiceImplTest extends BaseDbUnitTest {
materialIndustryMapper.insert(cloneIgnoreId(dbMaterialIndustry, o -> o.setIndustryCode(null)));
// 测试 industryName 不匹配
materialIndustryMapper.insert(cloneIgnoreId(dbMaterialIndustry, o -> o.setIndustryName(null)));
// 测试 status 不匹配
materialIndustryMapper.insert(cloneIgnoreId(dbMaterialIndustry, o -> o.setStatus(null)));
// 测试 createTime 不匹配
materialIndustryMapper.insert(cloneIgnoreId(dbMaterialIndustry, o -> o.setCreateTime(null)));
// 准备参数
MaterialIndustryPageReqVO reqVO = new MaterialIndustryPageReqVO();
reqVO.setIndustryCode(null);
reqVO.setIndustryName(null);
reqVO.setStatus(null);
reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
// 调用
@ -146,7 +142,6 @@ public class MaterialIndustryServiceImplTest extends BaseDbUnitTest {
MaterialIndustryDO dbMaterialIndustry = randomPojo(MaterialIndustryDO.class, o -> { // 等会查询到
o.setIndustryCode(null);
o.setIndustryName(null);
o.setStatus(null);
o.setCreateTime(null);
});
materialIndustryMapper.insert(dbMaterialIndustry);
@ -154,15 +149,12 @@ public class MaterialIndustryServiceImplTest extends BaseDbUnitTest {
materialIndustryMapper.insert(cloneIgnoreId(dbMaterialIndustry, o -> o.setIndustryCode(null)));
// 测试 industryName 不匹配
materialIndustryMapper.insert(cloneIgnoreId(dbMaterialIndustry, o -> o.setIndustryName(null)));
// 测试 status 不匹配
materialIndustryMapper.insert(cloneIgnoreId(dbMaterialIndustry, o -> o.setStatus(null)));
// 测试 createTime 不匹配
materialIndustryMapper.insert(cloneIgnoreId(dbMaterialIndustry, o -> o.setCreateTime(null)));
// 准备参数
MaterialIndustryExportReqVO reqVO = new MaterialIndustryExportReqVO();
reqVO.setIndustryCode(null);
reqVO.setIndustryName(null);
reqVO.setStatus(null);
reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
// 调用

@ -1,54 +0,0 @@
import request from '@/utils/request'
// 创建物料行业
export function createMaterialIndustry(data) {
return request({
url: '/demo/material-industry/create',
method: 'post',
data: data
})
}
// 更新物料行业
export function updateMaterialIndustry(data) {
return request({
url: '/demo/material-industry/update',
method: 'put',
data: data
})
}
// 删除物料行业
export function deleteMaterialIndustry(id) {
return request({
url: '/demo/material-industry/delete?id=' + id,
method: 'delete'
})
}
// 获得物料行业
export function getMaterialIndustry(id) {
return request({
url: '/demo/material-industry/get?id=' + id,
method: 'get'
})
}
// 获得物料行业分页
export function getMaterialIndustryPage(query) {
return request({
url: '/demo/material-industry/page',
method: 'get',
params: query
})
}
// 导出物料行业 Excel
export function exportMaterialIndustryExcel(query) {
return request({
url: '/demo/material-industry/export-excel',
method: 'get',
params: query,
responseType: 'blob'
})
}

@ -0,0 +1,60 @@
import request from '@/utils/request'
// 查询物料分类列表
export function listMaterialCategory(query) {
return request({
url: '/xxjj/materialCategory/list',
method: 'get',
params: query
})
}
// 查询物料分类列表(排除节点)
export function listMaterialCategoryExcludeChild(materialCategoryId) {
return request({
url: '/xxjj/materialCategory/list/exclude/' + materialCategoryId,
method: 'get'
})
}
// 查询物料分类详细
export function getMaterialCategory(materialCategoryId) {
return request({
url: '/xxjj/materialCategory/get?id=' + materialCategoryId,
method: 'get'
})
}
// 获取物料分类精简信息列表
export function listSimpleMaterialCategorys() {
return request({
url: '/xxjj/materialCategory/list-all-simple',
method: 'get'
})
}
// 新增物料分类
export function addMaterialCategory(data) {
return request({
url: '/xxjj/materialCategory/create',
method: 'post',
data: data
})
}
// 修改物料分类
export function updateMaterialCategory(data) {
return request({
url: '/xxjj/materialCategory/update',
method: 'put',
data: data
})
}
// 删除物料分类
export function delMaterialCategory(id) {
return request({
url: '/xxjj/materialCategory/delete?id=' + id,
method: 'delete'
})
}

@ -0,0 +1,265 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
<el-form-item label="分类名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入分类名称" clearable @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
v-hasPermi="['xxjj:materialCategory:create']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="info" plain icon="el-icon-sort" size="mini" @click="toggleExpandAll">/</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-if="refreshTable" v-loading="loading" :data="materialCategoryList" row-key="id" :default-expand-all="isExpandAll"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}">
<el-table-column prop="name" label="分类名称" width="260"></el-table-column>
<el-table-column prop="sort" label="排序" width="200"></el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="200">
<template v-slot="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template v-slot="scope">
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
v-hasPermi="['xxjj:materialCategory:update']">修改</el-button>
<el-button size="mini" type="text" icon="el-icon-plus" @click="handleAdd(scope.row)"
v-hasPermi="['xxjj:materialCategory:create']">新增</el-button>
<el-button v-if="scope.row.parentId !== 0" size="mini" type="text" icon="el-icon-delete"
@click="handleDelete(scope.row)" v-hasPermi="['xxjj:materialCategory:delete']">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 添加或修改分类对话框 -->
<el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-row>
<el-col :span="24">
<el-form-item label="上级分类" prop="parentId">
<treeselect v-model="form.parentId" :options="materialCategoryOptions" :normalizer="normalizer" placeholder="选择上级分类" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="分类名称" prop="name">
<el-input v-model="form.name" placeholder="请输入分类名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="显示排序" prop="sort">
<el-input-number v-model="form.sort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listMaterialCategory, getMaterialCategory, delMaterialCategory, addMaterialCategory, updateMaterialCategory } from "@/api/xxjj/materialCategory";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import {CommonStatusEnum} from '@/utils/constants'
import { getDictDatas, DICT_TYPE } from '@/utils/dict'
import {listSimpleUsers} from "@/api/system/user";
export default {
name: "MaterialCategory",
components: { Treeselect },
data() {
return {
//
loading: true,
//
showSearch: true,
//
materialCategoryList: [],
//
materialCategoryOptions: [],
//
users: [],
//
title: "",
//
open: false,
//
isExpandAll: true,
//
refreshTable: true,
//
expand: false,
//
queryParams: {
name: undefined,
status: undefined
},
//
form: {},
//
rules: {
name: [
{ required: true, message: "部门名称不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "显示排序不能为空", trigger: "blur" }
],
email: [
{
type: "email",
message: "'请输入正确的邮箱地址",
trigger: ["blur", "change"]
}
],
phone: [
{
pattern: /^(?:(?:\+|00)86)?1(?:3[\d]|4[5-79]|5[0-35-9]|6[5-7]|7[0-8]|8[\d]|9[189])\d{8}$/,
message: "请输入正确的手机号码",
trigger: "blur"
}
],
status: [
{ required: true, message: "状态不能为空", trigger: "blur" }
]
},
//
CommonStatusEnum: CommonStatusEnum,
//
statusDictDatas: getDictDatas(DICT_TYPE.COMMON_STATUS)
};
},
created() {
this.getList();
//
listSimpleUsers().then(response => {
this.users = response.data;
});
},
methods: {
/** 查询部门列表 */
getList() {
this.loading = true;
listMaterialCategory(this.queryParams).then(response => {
this.materialCategoryList = this.handleTree(response.data, "id");
this.loading = false;
});
},
/** 转换部门数据结构 */
normalizer(node) {
if (node.children && !node.children.length) {
delete node.children;
}
return {
id: node.id,
label: node.name,
children: node.children
};
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: undefined,
parentId: undefined,
name: undefined,
sort: undefined,
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
/** 新增按钮操作 */
handleAdd(row) {
this.reset();
if (row !== undefined) {
this.form.parentId = row.id;
}
this.open = true;
this.title = "添加分类";
listMaterialCategory().then(response => {
this.materialCategoryOptions = this.handleTree(response.data, "id");
});
},
/** 展开/折叠操作 */
toggleExpandAll() {
this.refreshTable = false;
this.isExpandAll = !this.isExpandAll;
this.$nextTick(() => {
this.refreshTable = true;
});
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
getMaterialCategory(row.id).then(response => {
this.form = response.data;
if (this.form.parentId === 0) { // undefined Unknown
this.form.parentId = undefined;
}
this.open = true;
this.title = "修改分类";
});
listMaterialCategory(row.id).then(response => {
this.materialCategoryOptions = this.handleTree(response.data, "id");
});
},
/** 提交按钮 */
submitForm: function() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id !== undefined) {
updateMaterialCategory(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addMaterialCategory(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
this.$modal.confirm('是否确认删除名称为"' + row.name + '"的数据项?').then(function() {
return delMaterialCategory(row.id);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
}
}
};
</script>

@ -9,12 +9,6 @@
<el-form-item label="行业名称" prop="industryName">
<el-input v-model="queryParams.industryName" placeholder="请输入行业名称" clearable @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
<el-option v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)"
:key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker v-model="queryParams.createTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss" type="daterange"
range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']" />
@ -43,11 +37,6 @@
<el-table-column label="编号" align="center" prop="id" />
<el-table-column label="行业编码" align="center" prop="industryCode" />
<el-table-column label="行业名称" align="center" prop="industryName" />
<el-table-column label="状态" align="center" prop="status">
<template v-slot="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template v-slot="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
@ -75,12 +64,6 @@
<el-form-item label="行业名称" prop="industryName">
<el-input v-model="form.industryName" placeholder="请输入行业名称" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="form.status" placeholder="请选择状态">
<el-option v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)"
:key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
@ -119,7 +102,6 @@ export default {
pageSize: 10,
industryCode: null,
industryName: null,
status: null,
createTime: [],
},
//
@ -128,7 +110,6 @@ export default {
rules: {
industryCode: [{ required: true, message: "行业编码不能为空", trigger: "blur" }],
industryName: [{ required: true, message: "行业名称不能为空", trigger: "blur" }],
status: [{ required: true, message: "状态不能为空", trigger: "change" }],
}
};
},
@ -157,7 +138,6 @@ export default {
id: undefined,
industryCode: undefined,
industryName: undefined,
status: undefined,
};
this.resetForm("form");
},

@ -3,13 +3,13 @@
<!-- 搜索工作栏 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="物料类型编码" prop="materialTypeCode">
<el-form-item label="类型编码" prop="materialTypeCode">
<el-input v-model="queryParams.materialTypeCode" placeholder="请输入物料类型编码" clearable @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="物料类型名称" prop="materialTypeName">
<el-form-item label="类型名称" prop="materialTypeName">
<el-input v-model="queryParams.materialTypeName" placeholder="请输入物料类型名称" clearable @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="行业id" prop="materialIndustryId">
<el-form-item label="行业" prop="materialIndustryId">
<el-input v-model="queryParams.materialIndustryId" placeholder="请输入行业id" clearable @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
@ -40,7 +40,7 @@
<el-table-column label="编号" align="center" prop="id" />
<el-table-column label="物料类型编码" align="center" prop="materialTypeCode" />
<el-table-column label="物料类型名称" align="center" prop="materialTypeName" />
<el-table-column label="行业id" align="center" prop="materialIndustryId" />
<el-table-column label="行业" align="center" prop="materialIndustryId" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template v-slot="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
@ -62,10 +62,10 @@
<!-- 对话框(添加 / 修改) -->
<el-dialog :title="title" :visible.sync="open" width="500px" v-dialogDrag append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="物料类型编码" prop="materialTypeCode">
<el-form-item label="类型编码" prop="materialTypeCode">
<el-input v-model="form.materialTypeCode" placeholder="请输入物料类型编码" />
</el-form-item>
<el-form-item label="物料类型名称" prop="materialTypeName">
<el-form-item label="类型名称" prop="materialTypeName">
<el-input v-model="form.materialTypeName" placeholder="请输入物料类型名称" />
</el-form-item>
<el-form-item label="行业id" prop="materialIndustryId">

Loading…
Cancel
Save