JAVA Spring MVC 物料清单BOM 展开实例

相关概念:BOM 展开、LIST对象、JSON 字符串、JSON 对象
最近在开发一个管理软件,涉及到物料清单(又称产品结构)BOM管理的相关内容,其中之一就是BOM 的展开。BOM的展开一般有纵向优先展开、层次优先展开和汇总展开等形式,也有很多展开的算法。在开发中使用Spring MVC 框架完成了BOM按层级优先展开的程序,也涉及到了JAVA开发中的相关知识如LIST 对象、LIST 对象转JSON 串,JSON 串返回前端并还原成JSON 对象,在前端通过JSON 对象输出结果内容。

BOM 实体类
public class Bom {
private Integer id; // id 号
private Integer parentid; // 父项 id
private String parentcode; // 父项 代码
private String parentname; // 父项 名称
private Integer subitemid; // 子项 id
private String subitemcode; // 子项代码
private String subitemname; // 子项名称
private String unit; // 计量单位
private Integer qty; // 数量
private Integer level; // 层级号
private Date createDate; // 建立日期
private String username; // 建立用户
private String subitemflag; // 子项标识

get、set 方法略
}

传入到程序的参数 parentcode 待展开BOM的物品代码
程序中使用了3个 LIST 对象数组。
List listBom 存放BOM展开后的最后结果
List listBomt01 BOM 展开中使用的临时LIST 对象数组
List listBomt02 BOM 展开中使用的临时LIST 对象数组

由于BOM是树状结构循环展开,因此至少要使用两个LIST 对象数组,一个存放当前层级节点,一个存放下一层级节点。交替循环展开,每一层级展开的结果都要送到listBom 中。展开完成后需将 listBom 转JSON 串返回给前端数据展现页面。在这里插入图片描述
在这里插入图片描述
JAVA 代码如下

//依据物料号逐层展开 BOM,后端handler 程序
@ResponseBody
@RequestMapping(value="/ajaxbomexplosionlevel", method=RequestMethod.POST,produces = "text/html;charset=UTF-8")
public String ajaxbomexplosionbylevel(@RequestParam(value="parentcode",required=false) String parentcode,Map<String, Object> map) throws         JsonProcessingException {
    	List<Bom> listBom = BomService.BomExplosionbyLevel(parentcode);	             
       
        // LIST 对象转JSON 字符串
        ObjectMapper mapper = new ObjectMapper();
        String jsonlist = mapper.writeValueAsString(listBom);
    	    	    	    
    	return  jsonlist;
      }

//Service中的BOM 展开函数
//依据物料号逐层展开 BOM,Service 业务实现
@Transactional(readOnly=true)
public List<Bom> BomExplosionbyLevel(String parentcode){
	
	//listBom 存放逐层展开 BOM的结果,初始获取第一层		
	List<Bom> listBom =BomRepository.listBomByparentcode(parentcode);	 //利用了Repository 中的查询函数					 				
	
	//第一层级 level 赋值
	Integer level = 1;
	for (int i = 0; i < listBom.size(); i++) {
		Bom bom = listBom.get(i);
		bom.setLevel(level);
	}
	
	//listBomt01 和listBomt02  交替逐层展开 BOM的临时两个 list 对象,并赋予初始值
	List<Bom> listBomt01 =BomRepository.listBomByparentcode(parentcode); //利用了Repository 中的查询函数
	List<Bom> listBomt02 =new ArrayList<Bom>();
	      
//开始逐层交替展开BOM,展开的每层BOM 节点要放入结果listBom 中,同时放入临时对象listBomt01 或 listBomt02中,等待继续循环往下展开,并且在放入之前临时对象要进行初始化
	
	while ( listBomt01.size()>0     ) {
		
	level = level + 1;listBomt02.clear();
	//当前层为listBomt01时结果输出至listBom 和listBomt02
	for (int i = 0; i < listBomt01.size(); i++) {
 	        Bom bom = listBomt01.get(i);
 	        String subcode = bom.getSubitemcode();
 	        Integer itemqty = bom.getQty();
 	        List<Bom> listBomt01sub =BomRepository.listBomByparentcode(subcode);
 	        
      for (int i1 = 0; i1 < listBomt01sub.size(); i1++) {  
 		Bom bom1 =  listBomt01sub.get(i1);
 		bom1.setLevel(level);
 		Integer qty = bom1.getQty();
 		bom1.setQty(qty * itemqty);
 		listBom.add( bom1);
     	listBomt02.add( bom1);
    	 }     	
 	         }		
    	
    	level = level + 1;listBomt01.clear();
   	//当前层为listBomt02时结果输出至listBom 和listBomt01
   	for (int i = 0; i < listBomt02.size(); i++) {
   	Bom bom = listBomt02.get(i);
    	String subcode = bom.getSubitemcode();
    	Integer itemqty = bom.getQty();
        List<Bom> listBomt02sub =BomRepository.listBomByparentcode(subcode);
      	
      for (int i2 = 0; i2 < listBomt02sub.size(); i2++) {  
      	Bom bom2 =  listBomt02sub.get(i2);
      	bom2.setLevel(level);
      	Integer qty = bom2.getQty();
      	bom2.setQty(qty * itemqty);
      	listBom.add( bom2);
        listBomt01.add( bom2);
         }
      	 }	
    	
           }  //while 结束
	//返回展开的结果 listBom
	return listBom;
}

在这里插入图片描述
JSP页面输出结果
在这里插入图片描述

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值