物料bom后端完善
master
xs 5 days ago
parent 6c78189261
commit bc05582caf

@ -0,0 +1,17 @@
package org.dromara.common.constant;
/**
* MES
*
* @author xins
*/
public interface HwMomMesConstants {
/**
* bom
*/
public static final Long MES_MATERIAL_BOM_TOP_FLAG_YES = 1L;
}

@ -6,6 +6,11 @@ import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.mes.domain.bo.BaseMaterialTypeBo;
import org.dromara.mes.domain.bo.ProdMaterialBomVersionBo;
import org.dromara.mes.domain.vo.BaseMaterialTypeVo;
import org.dromara.mes.domain.vo.ProdMaterialBomVersionVo;
import org.dromara.mes.service.IBaseMaterialTypeService;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
@ -37,6 +42,8 @@ public class BaseMaterialInfoController extends BaseController {
private final IBaseMaterialInfoService baseMaterialInfoService;
private final IBaseMaterialTypeService baseMaterialTypeService;
/**
*
*/
@ -114,4 +121,16 @@ public class BaseMaterialInfoController extends BaseController {
List<BaseMaterialInfoVo> list = baseMaterialInfoService.queryList(bo);
return R.ok(list);
}
/**
* bom
*/
@SaCheckPermission("mes:baseMaterialInfo:list")
@GetMapping("/getMaterialTypeList")
public R<List<BaseMaterialTypeVo>> getMaterialTypeList(BaseMaterialTypeBo bo) {
List<BaseMaterialTypeVo> list = baseMaterialTypeService.queryList(bo);
return R.ok(list);
}
}

@ -6,8 +6,12 @@ import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.mes.domain.bo.BaseStructureBomBo;
import org.dromara.mes.domain.vo.TreeSelect;
import org.dromara.mes.domain.BaseMeasurementUnitInfo;
import org.dromara.mes.domain.ProdMaterialBomVersion;
import org.dromara.mes.domain.bo.*;
import org.dromara.mes.domain.vo.*;
import org.dromara.mes.service.IBaseMeasurementUnitInfoService;
import org.dromara.mes.service.IProdMaterialBomVersionService;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
@ -19,8 +23,6 @@ import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.mes.domain.vo.ProdMaterialBomVo;
import org.dromara.mes.domain.bo.ProdMaterialBomBo;
import org.dromara.mes.service.IProdMaterialBomService;
/**
@ -38,6 +40,10 @@ public class ProdMaterialBomController extends BaseController {
private final IProdMaterialBomService prodMaterialBomService;
private final IBaseMeasurementUnitInfoService baseMeasurementUnitInfoService;
private final IProdMaterialBomVersionService prodMaterialBomVersionService;
/**
* BOM
*/
@ -140,6 +146,18 @@ public class ProdMaterialBomController extends BaseController {
return R.ok(prodMaterialBomService.selectMaterialBomTreeList(prodMaterialBomBo));
}
/**
* BOM
*
* @param prodMaterialBomBo
*/
@SaCheckPermission("mes:materialBom:list")
@GetMapping("/getParentMaterialBom")
public R<ProdMaterialBomVo> getParentMaterialBom(ProdMaterialBomBo prodMaterialBomBo) {
return R.ok(prodMaterialBomService.selectParentMaterialBom(prodMaterialBomBo));
}
/**
* BOM
*/
@ -150,4 +168,25 @@ public class ProdMaterialBomController extends BaseController {
return R.ok(list);
}
/**
*
*/
@SaCheckPermission("mes:materialBom:list")
@GetMapping("/getUnitInfoList")
public R<List<BaseMeasurementUnitInfoVo>> getUnitInfoList(BaseMeasurementUnitInfoBo bo) {
List<BaseMeasurementUnitInfoVo> list = baseMeasurementUnitInfoService.queryList(bo);
return R.ok(list);
}
/**
* bom
*/
@SaCheckPermission("mes:materialBom:list")
@GetMapping("/getMaterialBomVersionList")
public R<List<ProdMaterialBomVersionVo>> getMaterialBomVersionList(ProdMaterialBomVersionBo bo) {
List<ProdMaterialBomVersionVo> list = prodMaterialBomVersionService.queryList(bo);
return R.ok(list);
}
}

@ -0,0 +1,117 @@
package org.dromara.mes.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.mes.domain.vo.ProdMaterialBomVersionVo;
import org.dromara.mes.domain.bo.ProdMaterialBomVersionBo;
import org.dromara.mes.service.IProdMaterialBomVersionService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* bom
* 访:/mes/materialBomVersion
*
* @author xins
* @date 2025-03-19
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/materialBomVersion")
public class ProdMaterialBomVersionController extends BaseController {
private final IProdMaterialBomVersionService prodMaterialBomVersionService;
/**
* bom
*/
@SaCheckPermission("mes:materialBomVersion:list")
@GetMapping("/list")
public TableDataInfo<ProdMaterialBomVersionVo> list(ProdMaterialBomVersionBo bo, PageQuery pageQuery) {
return prodMaterialBomVersionService.queryPageList(bo, pageQuery);
}
/**
* bom
*/
@SaCheckPermission("mes:materialBomVersion:export")
@Log(title = "物料bom版本", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(ProdMaterialBomVersionBo bo, HttpServletResponse response) {
List<ProdMaterialBomVersionVo> list = prodMaterialBomVersionService.queryList(bo);
ExcelUtil.exportExcel(list, "物料bom版本", ProdMaterialBomVersionVo.class, response);
}
/**
* bom
*
* @param materialBomVersion
*/
@SaCheckPermission("mes:materialBomVersion:query")
@GetMapping("/{materialBomVersion}")
public R<ProdMaterialBomVersionVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable String materialBomVersion) {
return R.ok(prodMaterialBomVersionService.queryById(materialBomVersion));
}
/**
* bom
*/
@SaCheckPermission("mes:materialBomVersion:add")
@Log(title = "物料bom版本", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody ProdMaterialBomVersionBo bo) {
return toAjax(prodMaterialBomVersionService.insertByBo(bo));
}
/**
* bom
*/
@SaCheckPermission("mes:materialBomVersion:edit")
@Log(title = "物料bom版本", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody ProdMaterialBomVersionBo bo) {
return toAjax(prodMaterialBomVersionService.updateByBo(bo));
}
/**
* bom
*
* @param materialBomVersions
*/
@SaCheckPermission("mes:materialBomVersion:remove")
@Log(title = "物料bom版本", businessType = BusinessType.DELETE)
@DeleteMapping("/{materialBomVersions}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable String[] materialBomVersions) {
return toAjax(prodMaterialBomVersionService.deleteWithValidByIds(List.of(materialBomVersions), true));
}
/**
* bom
*/
@GetMapping("/getProdMaterialBomVersionList")
public R<List<ProdMaterialBomVersionVo>> getProdMaterialBomVersionList(ProdMaterialBomVersionBo bo) {
List<ProdMaterialBomVersionVo> list = prodMaterialBomVersionService.queryList(bo);
return R.ok(list);
}
}

@ -38,6 +38,21 @@ public class ProdMaterialBom extends TenantEntity {
*/
private Long materialId;
/**
* ID
*/
private Long unitId;
/**
* ID
*/
private Long parentUnitId;
/**
*
*/
private BigDecimal parentStandardAmount;
/**
*
*/
@ -48,6 +63,11 @@ public class ProdMaterialBom extends TenantEntity {
*/
private Long materialTypeId;
/**
* ID
*/
private Long parentMaterialTypeId;
/**
* bom
*/
@ -58,10 +78,6 @@ public class ProdMaterialBom extends TenantEntity {
*/
private String materialBomVersion;
/**
*
*/
private String ancestors;
/**
*

@ -0,0 +1,35 @@
package org.dromara.mes.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* bom prod_material_bom_version
*
* @author xins
* @date 2025-03-19
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("prod_material_bom_version")
public class ProdMaterialBomVersion extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* ,BOM
*/
private String materialBomVersion;
/**
* 1 0
*/
private String activeFlag;
}

@ -38,6 +38,21 @@ public class ProdMaterialBomBo extends BaseEntity {
@NotNull(message = "物料ID不能为空", groups = {AddGroup.class, EditGroup.class})
private Long materialId;
/**
* ID
*/
private Long unitId;
/**
* ID
*/
private Long parentUnitId;
/**
*
*/
private BigDecimal parentStandardAmount;
/**
*
*/
@ -48,6 +63,11 @@ public class ProdMaterialBomBo extends BaseEntity {
*/
private Long materialTypeId;
/**
* ID
*/
private Long parentMaterialTypeId;
/**
* bom
*/
@ -58,10 +78,6 @@ public class ProdMaterialBomBo extends BaseEntity {
*/
private String materialBomVersion;
/**
*
*/
private String ancestors;
/**
*
@ -112,5 +128,4 @@ public class ProdMaterialBomBo extends BaseEntity {
private String materialTypeName;//join查询字段
private Long bomStructureParentId;//结构树的parentId
}

@ -0,0 +1,36 @@
package org.dromara.mes.domain.bo;
import org.dromara.mes.domain.ProdMaterialBomVersion;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
* bom prod_material_bom_version
*
* @author xins
* @date 2025-03-19
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = ProdMaterialBomVersion.class, reverseConvertGenerate = false)
public class ProdMaterialBomVersionBo extends BaseEntity {
/**
* ,BOM
*/
@NotBlank(message = "主键标识,BOM版本手动输入不能为空", groups = { AddGroup.class, EditGroup.class })
private String materialBomVersion;
/**
* 1 0
*/
@NotBlank(message = "激活标识1是 0否不能为空", groups = { AddGroup.class, EditGroup.class })
private String activeFlag;
}

@ -0,0 +1,45 @@
package org.dromara.mes.domain.vo;
import org.dromara.mes.domain.ProdMaterialBomVersion;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* bom prod_material_bom_version
*
* @author xins
* @date 2025-03-19
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = ProdMaterialBomVersion.class)
public class ProdMaterialBomVersionVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* ,BOM
*/
@ExcelProperty(value = "主键标识,BOM版本手动输入")
private String materialBomVersion;
/**
* 1 0
*/
@ExcelProperty(value = "激活标识", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "1=是,0=否")
private String activeFlag;
}

@ -47,6 +47,21 @@ public class ProdMaterialBomVo implements Serializable {
@ExcelProperty(value = "物料ID")
private Long materialId;
/**
* ID
*/
private Long unitId;
/**
* ID
*/
private Long parentUnitId;
/**
*
*/
private BigDecimal parentStandardAmount;
/**
*
*/
@ -58,6 +73,11 @@ public class ProdMaterialBomVo implements Serializable {
*/
private Long materialTypeId;
/**
* ID
*/
private Long parentMaterialTypeId;
/**
* bom
*/
@ -68,10 +88,6 @@ public class ProdMaterialBomVo implements Serializable {
*/
private String materialBomVersion;
/**
*
*/
private String ancestors;
/**
*
@ -169,6 +185,10 @@ public class ProdMaterialBomVo implements Serializable {
private String materialTypeName;//join字段
private String parentMaterialName; //join字段
private String parentMaterialTypeName;//join字段
private String unitName;//子物料单位
}

@ -4,6 +4,7 @@ import com.alibaba.excel.util.StringUtils;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
import java.util.stream.Collectors;
@ -37,6 +38,8 @@ public class TreeSelect implements Serializable {
private List<TreeSelect> children;
private Long materialId;
private String materialName;
/**
* ID
@ -47,6 +50,7 @@ public class TreeSelect implements Serializable {
private String materialBomVersion;
private String treeKey;//作为树的唯一键使用
public TreeSelect() {
@ -60,7 +64,8 @@ public class TreeSelect implements Serializable {
}
public TreeSelect(ProdMaterialBomVo prodMaterialBomVo) {
this.id = prodMaterialBomVo.getMaterialBomId();
this.id = prodMaterialBomVo.getMaterialBomId();//树的唯一键,有可能为空所以不能作为树的ID
this.treeKey = prodMaterialBomVo.getMaterialId() + "-" + prodMaterialBomVo.getMaterialBomVersion();
if (prodMaterialBomVo.getParentId() == null) {
this.label = prodMaterialBomVo.getMaterialName();
} else {
@ -68,6 +73,7 @@ public class TreeSelect implements Serializable {
prodMaterialBomVo.getMaterialName();
}
this.parentId = prodMaterialBomVo.getParentId();
this.materialId = prodMaterialBomVo.getMaterialId();
this.children = prodMaterialBomVo.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
this.materialName = prodMaterialBomVo.getMaterialName();
this.materialTypeId = prodMaterialBomVo.getMaterialTypeId();
@ -138,4 +144,20 @@ public class TreeSelect implements Serializable {
public void setMaterialBomVersion(String materialBomVersion) {
this.materialBomVersion = materialBomVersion;
}
public Long getMaterialId() {
return materialId;
}
public void setMaterialId(Long materialId) {
this.materialId = materialId;
}
public String getTreeKey() {
return treeKey;
}
public void setTreeKey(String treeKey) {
this.treeKey = treeKey;
}
}

@ -1,10 +1,13 @@
package org.dromara.mes.mapper;
import org.dromara.mes.domain.BaseMaterialInfo;
import org.dromara.mes.domain.bo.BaseMaterialInfoBo;
import org.dromara.mes.domain.vo.BaseMaterialInfoVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.pda.api.model.BaseMaterial;
import java.util.List;
/**
* Mapper
*
@ -14,4 +17,11 @@ import org.dromara.pda.api.model.BaseMaterial;
public interface BaseMaterialInfoMapper extends BaseMapperPlus<BaseMaterialInfo, BaseMaterialInfoVo> {
BaseMaterial queryByMaterialCode(String materialCode);
/**
* join material_type
* @param baseMaterialInfoBo
* @return
*/
List<BaseMaterialInfoVo> selectMaterialJoinList(BaseMaterialInfoBo baseMaterialInfoBo);
}

@ -26,6 +26,17 @@ public interface ProdMaterialBomMapper extends BaseMapperPlus<ProdMaterialBom, P
// })
List<ProdMaterialBomVo> selectMaterialBomJoinList(ProdMaterialBomBo podMaterialBomBo);
/**
* parentbom,join materialmaterialtype
*
* @param podMaterialBomBo
* @return bom
*/
// @DataPermission({
// @DataColumn(key = "deptName", value = "dept_id")
// })
List<ProdMaterialBomVo> selectParentMaterialBomJoinList(ProdMaterialBomBo podMaterialBomBo);
/**
* bom,join materialmaterialtypebomstructure
@ -38,4 +49,12 @@ public interface ProdMaterialBomMapper extends BaseMapperPlus<ProdMaterialBom, P
// })
List<ProdMaterialBomVo> selectMaterialBomJoinStructureList(ProdMaterialBomBo podMaterialBomBo);
/**
* bom,join materialmaterialtype,bom
*
* @param podMaterialBomBo
* @return bom
*/
ProdMaterialBomVo selectParentMaterialBomJoin(ProdMaterialBomBo podMaterialBomBo);
}

@ -0,0 +1,15 @@
package org.dromara.mes.mapper;
import org.dromara.mes.domain.ProdMaterialBomVersion;
import org.dromara.mes.domain.vo.ProdMaterialBomVersionVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* bomMapper
*
* @author xins
* @date 2025-03-19
*/
public interface ProdMaterialBomVersionMapper extends BaseMapperPlus<ProdMaterialBomVersion, ProdMaterialBomVersionVo> {
}

@ -73,6 +73,14 @@ public interface IProdMaterialBomService {
*/
public List<ProdMaterialBomVo> queryJoinStructureList(ProdMaterialBomBo bo);
/**
* bom
*
* @param bo bom
* @return bom
*/
public ProdMaterialBomVo selectParentMaterialBom(ProdMaterialBomBo bo);
/**
* bom
*

@ -0,0 +1,69 @@
package org.dromara.mes.service;
import org.dromara.mes.domain.ProdMaterialBomVersion;
import org.dromara.mes.domain.vo.ProdMaterialBomVersionVo;
import org.dromara.mes.domain.bo.ProdMaterialBomVersionBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* bomService
*
* @author xins
* @date 2025-03-19
*/
public interface IProdMaterialBomVersionService {
/**
* bom
*
* @param materialBomVersion
* @return bom
*/
ProdMaterialBomVersionVo queryById(String materialBomVersion);
/**
* bom
*
* @param bo
* @param pageQuery
* @return bom
*/
TableDataInfo<ProdMaterialBomVersionVo> queryPageList(ProdMaterialBomVersionBo bo, PageQuery pageQuery);
/**
* bom
*
* @param bo
* @return bom
*/
List<ProdMaterialBomVersionVo> queryList(ProdMaterialBomVersionBo bo);
/**
* bom
*
* @param bo bom
* @return
*/
Boolean insertByBo(ProdMaterialBomVersionBo bo);
/**
* bom
*
* @param bo bom
* @return
*/
Boolean updateByBo(ProdMaterialBomVersionBo bo);
/**
* bom
*
* @param ids
* @param isValid
* @return
*/
Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid);
}

@ -98,7 +98,7 @@ public class BaseMaterialInfoServiceImpl implements IBaseMaterialInfoService {
.eq(bo.getMaterialId() != null, BaseMaterialInfo::getMaterialId, bo.getMaterialId())
.eq(StringUtils.isNotBlank(bo.getErpId()), BaseMaterialInfo::getErpId, bo.getErpId())
.eq(StringUtils.isNotBlank(bo.getMaterialCode()), BaseMaterialInfo::getMaterialCode, bo.getMaterialCode())
.like(StringUtils.isNotBlank(bo.getMaterialCode()), BaseMaterialInfo::getMaterialCode, bo.getMaterialCode())
.eq(StringUtils.isNotBlank(bo.getOldMaterialCode()), BaseMaterialInfo::getOldMaterialCode, bo.getOldMaterialCode())
.like(StringUtils.isNotBlank(bo.getMaterialName()), BaseMaterialInfo::getMaterialName, bo.getMaterialName())
.eq(bo.getMaterialTypeId() != null, BaseMaterialInfo::getMaterialTypeId, bo.getMaterialTypeId())

@ -175,6 +175,7 @@ public class BaseStructureBomServiceImpl implements IBaseStructureBomService {
throw new ServiceException("此物料类型下已经有此子级物料类型");
}
//TODO:需要找整棵树,不能无限循环
BaseStructureBom reverseQuery = new BaseStructureBom();//同一个物料类型同一个父级,反过来父级物料类型是物料类型的子级
reverseQuery.setParentId(entity.getMaterialTypeId());
reverseQuery.setMaterialTypeId(entity.getParentId());
@ -217,9 +218,9 @@ public class BaseStructureBomServiceImpl implements IBaseStructureBomService {
//监测删除的节点是否有子节点
BaseStructureBom query = new BaseStructureBom();
query.setParentId(id);
if (baseMapper.selectCount(Wrappers.lambdaQuery(query)) > 0) {
throw new ServiceException("BOM结构编号["+id+"]存在子节点,不允许删除");
}
// if (baseMapper.selectCount(Wrappers.lambdaQuery(query)) > 0) {
// throw new ServiceException("BOM结构编号["+id+"]存在子节点,不允许删除");
// }
BaseStructureBomVo dbStructureBomVo = baseMapper.selectVoById(id);
if (materialBomUsed(dbStructureBomVo)) {
throw new ServiceException("BOM结构编号["+id+"]的物料类型和子级物料类型都已经在生产BOM中配置不允许删除");
@ -256,9 +257,9 @@ public class BaseStructureBomServiceImpl implements IBaseStructureBomService {
List<BaseStructureBomVo> returnList = new ArrayList<BaseStructureBomVo>();
List<Long> tempList = structureBomVos.stream().map(BaseStructureBomVo::getMaterialTypeId).collect(Collectors.toList());
for (BaseStructureBomVo structureBomVo : structureBomVos) {
if (structureBomVo.getMaterialTypeId().equals(-1L) && StringUtil.isBlank(structureBomVo.getMaterialTypeName())) {
structureBomVo.setMaterialTypeName("BOM结构");
}
// if (structureBomVo.getMaterialTypeId().equals(-1L) && StringUtil.isBlank(structureBomVo.getMaterialTypeName())) {
// structureBomVo.setMaterialTypeName("BOM结构");
// }
// 如果是顶级节点, 遍历该父节点的所有子节点
if (!tempList.contains(structureBomVo.getParentId())) {
recursionFn(structureBomVos, structureBomVo);

@ -1,14 +1,12 @@
package org.dromara.mes.service.impl;
import com.alibaba.csp.sentinel.util.StringUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.dromara.common.constant.HwMomMesConstants;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.RequiredArgsConstructor;
import org.dromara.mes.domain.BaseStructureBom;
import org.dromara.mes.domain.vo.BaseStructureBomVo;
import org.dromara.mes.domain.vo.TreeSelect;
import org.springframework.stereotype.Service;
import org.dromara.mes.domain.bo.ProdMaterialBomBo;
@ -19,6 +17,7 @@ import org.dromara.mes.service.IProdMaterialBomService;
import java.util.*;
import java.util.stream.Collectors;
import java.util.function.Function;
import org.springframework.transaction.annotation.Transactional;
import cn.hutool.core.collection.CollUtil;
@ -71,7 +70,6 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
.like(StringUtils.isNotBlank(bo.getMaterialName()), ProdMaterialBom::getMaterialName, bo.getMaterialName())
.like(StringUtils.isNotBlank(bo.getMaterialBomDesc()), ProdMaterialBom::getMaterialBomDesc, bo.getMaterialBomDesc())
.like(StringUtils.isNotBlank(bo.getMaterialBomVersion()), ProdMaterialBom::getMaterialBomVersion, bo.getMaterialBomVersion())
.like(StringUtils.isNotBlank(bo.getAncestors()), ProdMaterialBom::getAncestors, bo.getAncestors())
.eq(bo.getStandardAmount() != null, ProdMaterialBom::getStandardAmount, bo.getStandardAmount())
.eq(bo.getTopFlag() != null, ProdMaterialBom::getTopFlag, bo.getTopFlag())
.eq(StringUtils.isNotBlank(bo.getCheckType()), ProdMaterialBom::getCheckType, bo.getCheckType())
@ -94,11 +92,6 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
public Boolean insertByBo(ProdMaterialBomBo bo) {
isTopFlag(bo);
ProdMaterialBomVo info = baseMapper.selectVoById(bo.getParentId());
if (StringUtils.isNull(info)) {
bo.setAncestors(bo.getParentId().toString());
} else {
bo.setAncestors(info.getAncestors() + "," + bo.getParentId());
}
ProdMaterialBom add = MapstructUtils.convert(bo, ProdMaterialBom.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
@ -178,6 +171,8 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
if (CollUtil.isEmpty(boList)) {
return false;
}
//todo:在pojo中增加equals方法来判断有没有修改如果有修改则判断计划中是否有引用根据物料id和bom版本找
//TODO:判断在新建子级时是否存在在此颗树的父级节点存在此子级节点根据bom版本找
//获取materialbomid不为空的更新获取materialbomid为空materialid不为空的保存
for (ProdMaterialBomBo prodMaterialBomBo : boList) {
if (prodMaterialBomBo.getMaterialBomId() == null) {
@ -210,6 +205,17 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
return baseMapper.selectMaterialBomJoinStructureList(bo);
}
/**
* bom
*
* @param bo bom
* @return bom
*/
@Override
public ProdMaterialBomVo selectParentMaterialBom(ProdMaterialBomBo bo) {
return baseMapper.selectParentMaterialBomJoin(bo);
}
/**
* bom
@ -232,26 +238,75 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
*/
private List<ProdMaterialBomVo> buildMaterialBomTree(List<ProdMaterialBomVo> prodMaterialBomVos) {
List<ProdMaterialBomVo> returnList = new ArrayList<ProdMaterialBomVo>();
// ProdMaterialBomVo topProdMaterialBomVo = new ProdMaterialBomVo();
// topProdMaterialBomVo.setMaterialId(0L);
// topProdMaterialBomVo.setMaterialName("生产BOM");
// topProdMaterialBomVo.setMaterialTypeId(1L);
// prodMaterialBomVos.add(topProdMaterialBomVo);
// List<Long> tempList = prodMaterialBomVos.stream().map(ProdMaterialBomVo::getMaterialId).toList();
/**
* parent
* v1AbcAparentId1materialIdA
*/
//1、先过滤出顶级
List<ProdMaterialBomVo> topMaterialBomVos = prodMaterialBomVos.stream()
.filter(obj -> prodMaterialBomVos.stream()
.noneMatch(other -> other.getMaterialId().longValue() == obj.getParentId().longValue()))
.toList();
//2、过滤出parentId相同的
List<ProdMaterialBomVo> distinctParentIdVoList = topMaterialBomVos.stream()
.collect(Collectors.toMap(
ProdMaterialBomVo::getParentId, // 以parentId作为key
Function.identity(), // 以对象本身作为value
(existing, replacement) -> existing // 如果遇到重复的key保留已有的对象
))
.values()
.stream()
.toList();
//3、基于过滤出顶级的增加虚拟top节点进行递归
for (ProdMaterialBomVo prodMaterialBomVo : distinctParentIdVoList) {
ProdMaterialBomVo topProdMaterialBomVo = new ProdMaterialBomVo();
topProdMaterialBomVo.setMaterialBomId(0L);
topProdMaterialBomVo.setMaterialName("生产BOM");
topProdMaterialBomVo.setMaterialTypeId(1L);
topProdMaterialBomVo.setParentId(0L);
topProdMaterialBomVo.setMaterialId(prodMaterialBomVo.getParentId());
topProdMaterialBomVo.setMaterialTypeId(prodMaterialBomVo.getParentMaterialTypeId());
topProdMaterialBomVo.setMaterialTypeName(prodMaterialBomVo.getParentMaterialTypeName());//设置parent的物料类型名称
topProdMaterialBomVo.setMaterialName(prodMaterialBomVo.getParentMaterialName());//设置parent的物料名称
topProdMaterialBomVo.setMaterialBomVersion(prodMaterialBomVo.getMaterialBomVersion());
prodMaterialBomVos.add(topProdMaterialBomVo);
List<Long> tempList = prodMaterialBomVos.stream().map(ProdMaterialBomVo::getMaterialBomId).toList();
for (ProdMaterialBomVo prodMaterialBomVo : prodMaterialBomVos) {
// 如果是顶级节点, 遍历该父节点的所有子节点
if (!tempList.contains(prodMaterialBomVo.getParentId())) {
recursionFn(prodMaterialBomVos, prodMaterialBomVo);
returnList.add(prodMaterialBomVo);
}
recursionFn(prodMaterialBomVos, topProdMaterialBomVo);
returnList.add(topProdMaterialBomVo);
// // 如果是顶级节点, 遍历该父节点的所有子节点
// if (!tempList.contains(prodMaterialBomVo.getParentId())) {
// recursionFn(prodMaterialBomVos, prodMaterialBomVo);
// returnList.add(prodMaterialBomVo);
// }
}
// for (ProdMaterialBomVo prodMaterialBomVo : prodMaterialBomVos) {
// // 如果是顶级节点, 遍历该父节点的所有子节点
// if (!tempList.contains(prodMaterialBomVo.getParentId())) {
// recursionFn(prodMaterialBomVos, prodMaterialBomVo);
// returnList.add(prodMaterialBomVo);
// }
// }
if (returnList.isEmpty()) {
returnList = prodMaterialBomVos;
}
return returnList;
}
/**
*
*
@ -259,8 +314,18 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
* @return
*/
private List<TreeSelect> buildMaterialBomTreeSelect(List<ProdMaterialBomVo> prodMaterialBomVos) {
List<ProdMaterialBomVo> materialBomTrees = buildMaterialBomTree(prodMaterialBomVos);
return materialBomTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
// 根据物料bom版本号group不能的版本是不同的树。使用 groupingBy 将 List 转换为 Map<String, List<ProdMaterialBomVo>>
Map<String, List<ProdMaterialBomVo>> prodMaterialBomVoMap = prodMaterialBomVos.stream()
.collect(Collectors.groupingBy(ProdMaterialBomVo::getMaterialBomVersion));
List<ProdMaterialBomVo> allMaterialBomTrees = new ArrayList<>();
// 根据物料版本号build树
prodMaterialBomVoMap.forEach((materialBomVersion, vos) -> {
List<ProdMaterialBomVo> materialBomTrees = buildMaterialBomTree(vos);
allMaterialBomTrees.addAll(materialBomTrees);
});
return allMaterialBomTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
}
@ -285,11 +350,12 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
/**
*
*/
private List<ProdMaterialBomVo> getChildList(List<ProdMaterialBomVo> list, ProdMaterialBomVo parent) {
private List<ProdMaterialBomVo> getChildList(List<ProdMaterialBomVo> list, ProdMaterialBomVo t) {
return list.stream()
.filter(n -> StringUtils.isNotNull(n.getParentId()) &&
n.getParentId().equals(parent.getMaterialBomId()))
n.getParentId().equals(t.getMaterialId()))
.collect(Collectors.toList());
}
/**

@ -0,0 +1,133 @@
package org.dromara.mes.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.dromara.mes.domain.bo.ProdMaterialBomVersionBo;
import org.dromara.mes.domain.vo.ProdMaterialBomVersionVo;
import org.dromara.mes.domain.ProdMaterialBomVersion;
import org.dromara.mes.mapper.ProdMaterialBomVersionMapper;
import org.dromara.mes.service.IProdMaterialBomVersionService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* bomService
*
* @author xins
* @date 2025-03-19
*/
@RequiredArgsConstructor
@Service
public class ProdMaterialBomVersionServiceImpl implements IProdMaterialBomVersionService {
private final ProdMaterialBomVersionMapper baseMapper;
/**
* bom
*
* @param materialBomVersion
* @return bom
*/
@Override
public ProdMaterialBomVersionVo queryById(String materialBomVersion){
return baseMapper.selectVoById(materialBomVersion);
}
/**
* bom
*
* @param bo
* @param pageQuery
* @return bom
*/
@Override
public TableDataInfo<ProdMaterialBomVersionVo> queryPageList(ProdMaterialBomVersionBo bo, PageQuery pageQuery) {
MPJLambdaWrapper<ProdMaterialBomVersion> lqw = buildQueryWrapper(bo);
Page<ProdMaterialBomVersionVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* bom
*
* @param bo
* @return bom
*/
@Override
public List<ProdMaterialBomVersionVo> queryList(ProdMaterialBomVersionBo bo) {
MPJLambdaWrapper<ProdMaterialBomVersion> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private MPJLambdaWrapper<ProdMaterialBomVersion> buildQueryWrapper(ProdMaterialBomVersionBo bo) {
Map<String, Object> params = bo.getParams();
MPJLambdaWrapper<ProdMaterialBomVersion> lqw = JoinWrappers.lambda(ProdMaterialBomVersion.class)
.selectAll(ProdMaterialBomVersion.class)
.eq(StringUtils.isNotBlank(bo.getMaterialBomVersion()), ProdMaterialBomVersion::getMaterialBomVersion, bo.getMaterialBomVersion())
.eq(StringUtils.isNotBlank(bo.getActiveFlag()), ProdMaterialBomVersion::getActiveFlag, bo.getActiveFlag())
.orderByDesc(ProdMaterialBomVersion::getCreateTime).orderByDesc(ProdMaterialBomVersion::getActiveFlag);
return lqw;
}
/**
* bom
*
* @param bo bom
* @return
*/
@Override
public Boolean insertByBo(ProdMaterialBomVersionBo bo) {
ProdMaterialBomVersion add = MapstructUtils.convert(bo, ProdMaterialBomVersion.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setMaterialBomVersion(add.getMaterialBomVersion());
}
return flag;
}
/**
* bom
*
* @param bo bom
* @return
*/
@Override
public Boolean updateByBo(ProdMaterialBomVersionBo bo) {
ProdMaterialBomVersion update = MapstructUtils.convert(bo, ProdMaterialBomVersion.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
*
*/
private void validEntityBeforeSave(ProdMaterialBomVersion entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* bom
*
* @param ids
* @param isValid
* @return
*/
@Override
public Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

@ -7,4 +7,33 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="queryByMaterialCode" resultType="org.dromara.pda.api.model.BaseMaterial">
select material_code,material_name from base_material_info where material_code = #{materialCode}
</select>
<select id="selectMaterialJoinList" parameterType="BaseMaterialInfoBo" resultType="BaseMaterialInfoVo">
select
bmi.material_id,
bmi.material_code,
bmi.material_name,
bmi.material_category_id,
bmi.material_type_id,
bmi.material_spec,
bmi.material_unit_id,
bmi.material_unit,
bmt.matrial_type_code as material_type_code,
bmt.matrial_type_name as material_type_name
from base_material_info bmi
left join base_material_type bmt on bmi.material_type_id = bmt.matrial_type_id
<where>
<if test="materialCode != null and materialCode != ''">and bmi.material_code like concat('%', #{materialCode},
'%')
</if>
<if test="materialName != null and materialName != ''">and bmi.material_name like concat('%', #{materialName},
'%')
</if>
<if test="materialTypeId != null ">and bmi.material_type_id = #{materialTypeId}</if>
</where>
order by bmi.material_id desc
</select>
</mapper>

@ -12,11 +12,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
pmb.parent_id,
pmb.material_type_id,
pmb.material_bom_version,
pmb.parent_material_type_id,
pmb.parent_standard_amount,
pmb.parent_unit_id,
pmb.top_flag,
bmi.material_name,
bmt.matrial_type_name as material_type_name
bmt.matrial_type_name as material_type_name,
bmip.material_name as parent_material_name,
bmtp.matrial_type_name as parent_material_type_name
from prod_material_bom pmb
left join base_material_info bmi on pmb.material_id=bmi.material_id
left join base_material_type bmt on bmi.material_type_id = bmt.matrial_type_id
left join base_material_type bmt on pmb.material_type_id = bmt.matrial_type_id
left join base_material_info bmip on pmb.parent_id=bmip.material_id
left join base_material_type bmtp on pmb.parent_material_type_id = bmtp.matrial_type_id
<where>
<if test="materialTypeCode != null and materialTypeCode != ''">and bmt.matrial_type_code like concat('%', #{materialTypeCode},
'%')
@ -24,12 +32,56 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="materialTypeName != null and materialTypeName != ''">and bmt.matrial_type_name like concat('%', #{materialTypeName},
'%')
</if>
<if test="materialBomVersion != null and materialBomVersion != ''">and pmb.material_bom_version = #{materialBomVersion}
</if>
<if test="parentId != null ">and pmb.parent_id = #{parentId}</if>
</where>
order by pmb.material_bom_id, pmb.material_bom_version desc
</select>
<select id="selectParentMaterialBomJoin" parameterType="ProdMaterialBomBo" resultType="ProdMaterialBomVo">
select
top 1
bmi.material_id as parent_id,
bmi.material_name as parent_material_name,
bmi.material_type_id as parent_material_type_id,
pmb.material_bom_version,
pmb.parent_material_type_id,
pmb.parent_standard_amount,
pmb.parent_unit_id,
bmt.matrial_type_name as parent_material_type_name
from base_material_info bmi
left join prod_material_bom pmb on pmb.parent_id=bmi.material_id and pmb.material_bom_version = #{materialBomVersion}
left join base_material_type bmt on bmi.material_type_id = bmt.matrial_type_id
<where>
<if test="parentId != null ">and bmi.material_id = #{parentId}</if>
</where>
order by bmi.material_id desc
</select>
<select id="selectParentMaterialBomJoinList" parameterType="ProdMaterialBomBo" resultType="ProdMaterialBomVo">
select
pmb.material_bom_id,
pmb.material_id,
pmb.parent_id,
pmb.material_type_id,
pmb.material_bom_version,
pmb.top_flag,
bmi.material_name,
bmt.matrial_type_name as material_type_name
from prod_material_bom pmb
left join base_material_info bmi on pmb.parent_id=bmi.material_id
left join base_material_type bmt on bmi.parent_material_type_id = bmt.matrial_type_id
<where>
<if test="topFlag != null ">and pmb.top_flag = #{topFlag}</if>
</where>
order by pmb.material_bom_id, pmb.material_bom_version desc
</select>
<select id="selectMaterialBomJoinStructureList" parameterType="ProdMaterialBomBo" resultType="ProdMaterialBomVo">
@ -41,14 +93,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
pmb.standard_amount,
bmi.material_name,
bsb.material_type_id,
bmui.unit_name,
pmb.unit_id,
bmt.matrial_type_code as material_type_code,
bmt.matrial_type_name as material_type_name
from base_structure_bom bsb
left join prod_material_bom pmb on pmb.material_type_id = bsb.material_type_id and pmb.parent_id = #{parentId}
left join prod_material_bom pmb on pmb.material_type_id = bsb.material_type_id and pmb.parent_id = #{parentId} and pmb.material_bom_version=#{materialBomVersion}
left join base_material_info bmi on pmb.material_id=bmi.material_id
left join base_material_type bmt on bsb.material_type_id = bmt.matrial_type_id
LEFT JOIN base_measurement_unit_info bmui ON bmui.unit_id = bmi.material_unit_id
<where>
<if test="materialTypeCode != null and materialTypeCode != ''">and bmt.matrial_type_code like concat('%', #{materialTypeCode},
'%')
@ -59,7 +110,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="materialName != null and materialName != ''">and bmi.material_name like concat('%', #{materialName},
'%')
</if>
<if test="bomStructureParentId != null ">and bsb.parent_id = #{bomStructureParentId}</if>
<if test="parentId != null ">and bsb.parent_id = #{parentMaterialTypeId}</if>
</where>
order by bsb.structure_bom_id desc
</select>

@ -0,0 +1,7 @@
<?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="org.dromara.mes.mapper.ProdMaterialBomVersionMapper">
</mapper>
Loading…
Cancel
Save