BPP 相关——01

1、InputPageUtil

2、EditPageUtil



----------------------------------------------------------------------------------------------------------

1、InputPageUtil

功能简述:在输入画面中,总是显示最后一页,本页输入满了则自动跳到下一页(如果还有)。

参数:

int  recordsOfPage —— 每页显示的记录条数(不能小于1,默认10)
int  inputtedCount —— 已经输入产品的个数(不能小于 0)
int  totalCount —— 订单关联的产品总个数(不能小于 1)

各方法描述:

a、计算总页数

	int totalPageCount(){
		if( totalCount % recordsOfPage == 0 ){
			return totalCount / recordsOfPage;
		}
		
		return totalCount / recordsOfPage + 1;
	}

b、计算当前页数

注意:如果 inputtedCount 刚好满页。则要继续判断 ---> 

b-1、如果全部输入完了,那么当前页就是本页

b-2、如果没有全部输入完,那么当前页就为 (本页+1)

特殊值,inputtedCount 为 0 。计算结果为1,也正确。

	int currentPageCount(){	
		if( inputtedCount % recordsOfPage == 0 ){
			if( inputtedCount == totalCount ){
				return inputtedCount / recordsOfPage;
			}
			else{
				return inputtedCount / recordsOfPage + 1;
			}
		}
		
		return inputtedCount / recordsOfPage + 1;
	}
c、计算最后页的第一行对应已经输入的 products (List)的索引(用来将最后部分数据 Copy 出来)

显然这个起始索引只能是,0、10、20、30....

	int startIndexForLastPage( int currentPageCount ){
		
		return ( currentPageCount - 1 ) * recordsOfPage;
	}
d、最后页的 Number 数(转换成List,方便strut2 的循环标签使用)

BPP 相关——01_第1张图片

	int lastPageNumberCount( int currentPageCount, int totalPageCount ){
		if( currentPageCount < totalPageCount ){
			return recordsOfPage;
		}
		else if( currentPageCount == totalPageCount ){
			
			if( totalCount % recordsOfPage == 0 ){
				return recordsOfPage;
			}
			return totalCount % recordsOfPage;
		}
		else{
			// this can't happen
			return -1;
		}
	}

d、判断是否已经全部输入

	boolean isAllProductsInputted(){
		return inputtedCount == totalCount;
	}

完整代码:

package jp.co.snjp.kddi.ht.util;

public class InputPageUtil {
	private static final int DEFAULT_RECORDS_OF_PAGE = 10;
	
	private final int recordsOfPage;
	private final int inputtedCount;
	private final int totalCount;
	
	private InputPageUtil( int inputtedCount, int totalCount ){
		this( inputtedCount, totalCount, DEFAULT_RECORDS_OF_PAGE );
	}
	
	private InputPageUtil( int inputtedCount, int totalCount, int recordsOfPage ){
		if( isInvalidParams( inputtedCount, totalCount, recordsOfPage ) ){
			throw new IllegalStateException("Parameters state error.");
		}
		
		this.inputtedCount = inputtedCount;
		this.totalCount = totalCount;
		this.recordsOfPage = recordsOfPage;
	}
	
	private boolean isInvalidParams( int inputtedCount, int totalCount, int recordsOfPage ){
		if( inputtedCount < 0 || totalCount < 1 || recordsOfPage < 1){
			return true;
		}
		if( totalCount < inputtedCount){
			return true;
		}
		
		return false;
	}
	
	
	public int getRecordsOfPage(){
		return recordsOfPage;
	}
	
	public int getInputtedCount() {
		return inputtedCount;
	}

	public int getTotalCount() {
		return totalCount;
	}

	public static InputPageUtil newInstanceDefaultRecordsOfPage( int inputtedCount, int totalCount ){
		return new InputPageUtil( inputtedCount, totalCount );
	}
	
	public static InputPageUtil newInstanceSetRecordsOfPage( int inputtedCount, int totalCount, int recordsOfPage ){
		return new InputPageUtil( inputtedCount, totalCount, recordsOfPage );
	}
	
	boolean isAllProductsInputted(){
		return inputtedCount == totalCount;
	}
	
	int totalPageCount(){
		if( totalCount % recordsOfPage == 0 ){
			return totalCount / recordsOfPage;
		}
		
		return totalCount / recordsOfPage + 1;
	}
	
	int currentPageCount(){	
		if( inputtedCount % recordsOfPage == 0 ){
			if( inputtedCount == totalCount ){
				return inputtedCount / recordsOfPage;
			}
			else{
				return inputtedCount / recordsOfPage + 1;
			}
		}
		
		return inputtedCount / recordsOfPage + 1;
	}
	
	int startIndexForLastPage( int currentPageCount ){
		
		return ( currentPageCount - 1 ) * recordsOfPage;
	}
	
	int lastPageNumberCount( int currentPageCount, int totalPageCount ){
		if( currentPageCount < totalPageCount ){
			return recordsOfPage;
		}
		else if( currentPageCount == totalPageCount ){
			
			if( totalCount % recordsOfPage == 0 ){
				return recordsOfPage;
			}
			return totalCount % recordsOfPage;
		}
		else{
			// this can't happen
			return -1;
		}
	}
	
	public Status computeAllStatus(){
		int totalPageCount = totalPageCount();
		int currentPageCount = currentPageCount();
		int startIndexForLastPage = startIndexForLastPage( currentPageCount );
		int lastPageNumberCount = lastPageNumberCount( currentPageCount, totalPageCount );
		boolean allProductsInputted = isAllProductsInputted();
		
		return new Status( currentPageCount, totalPageCount, 
						   startIndexForLastPage, lastPageNumberCount, allProductsInputted );
	}
	
	public static class Status{
		private final int totalPageCount;
		private final int currentPageCount;
		private final int startIndexForLastPage;
		private final int lastPageNumberCount;
		private final boolean allProductsInputted;
		
		private Status( int currentPageCount, int totalPageCount, 
						int startIndexForLastPage, int lastPageNumberCount, boolean allProductsInputted ){
			this.currentPageCount = currentPageCount;
			this.totalPageCount = totalPageCount;
			this.startIndexForLastPage =startIndexForLastPage;
			this.lastPageNumberCount = lastPageNumberCount;
			this.allProductsInputted = allProductsInputted;
		}

		public int getCurrentPageCount() {
			return currentPageCount;
		}

		public int getLastPageNumberCount() {
			return lastPageNumberCount;
		}

		public int getStartIndexForLastPage() {
			return startIndexForLastPage;
		}

		public int getTotalPageCount() {
			return totalPageCount;
		}

		public boolean isAllProductsInputted() {
			return allProductsInputted;
		}
		
	}
	
} 

使用示例:

	void initContinueManualInputParam(  T03SlipWk orderForm, List<T04CaseDtlWk> products ){
		assert orderForm != null;
		assert products != null;
		assert products.size() != 0;
		
		productName = orderForm.getProdNm1();
		productCount = orderForm.getShpVol1().intValue();
		
		InputPageUtil.Status inputPageStatus = 
			InputPageUtil.newInstanceDefaultRecordsOfPage( products.size(), productCount ).computeAllStatus();
		allProductsInput = inputPageStatus.isAllProductsInputted();
		totalPageCount = inputPageStatus.getTotalPageCount();
		currentPageCount = inputPageStatus.getCurrentPageCount();
		
		int startIndexForLastPage = inputPageStatus.getStartIndexForLastPage();
		int lastPageNumberCount = inputPageStatus.getLastPageNumberCount();
		lastPageProducts = lastPageProducts( startIndexForLastPage, products );
		lastPageRecords = lastPageRecords( lastPageNumberCount );
	}
	
	// 相关的两个方法
	List<String> lastPageProducts( int startIndexForLastPage, List<T04CaseDtlWk> products ){
		
		List<String> result = new ArrayList<String>();
		while( startIndexForLastPage < products.size() ){
			T04CaseDtlWk product = (T04CaseDtlWk)products.get( startIndexForLastPage );
			result.add( formatNumber( product.getShpWt2() ) );
			
			startIndexForLastPage++;
		}
		
		return result;
	}
	
	List<Integer> lastPageRecords( int lastPageNumberCount ){
		List<Integer> result = new ArrayList<Integer>();
		
		for( int i = 0 ; i < lastPageNumberCount ; i++ ){
			result.add( i );
		}
		
		return result;
	}

2、EditPageUtil

功能简述:

进入编辑页面,根据 page_line 参数来确定显示的“当前页”和 选中状态的“当前行”,如果 page_line 为 null (从输入页面进入编辑页面),则默认显示第一页,选中第一行。

参数:

int recordsOfPage —— 页面记录条数(不能小于1,默认为10)
int inputtedCount —— 已经输入产品个数(不能小于1,这里如果一个都没有输入会构造一个 BlankProduct,这样进入编辑页就可以直接输入)
int totalCount —— 订单关联的产品总个数(不能小于 1)
String page_line —— JSP 页面传递的参数,用来确定页和行

各方法描述:

a、计算总页数

	int totalPageCount(){
		if( totalCount % recordsOfPage == 0 ){
			return totalCount / recordsOfPage;
		}
		
		return totalCount / recordsOfPage + 1;
	}
b、计算当前页

	// 1. 第一次从输入页面->编辑页面 ( page_line为null, 默认第一页面)
	// 2. 编辑修改保存后->再次进入 (根据 page_line 参数解析)
	int currentPageCount(){
		
		// 1
		if( page_line == null ){
			return 1;
		}
		
		// 2
		int page = parsePage();
		if( page < 1){
			return 1;
		}
		else if( maxEditablePageCount() < page ){
			return maxEditablePageCount();
		}
		else{
			return page;
		}
	}
c、计算当前行

	int currentLine( int currentPageCount ){
		
		// 1
		if( page_line == null ){
			return 1;
		}
		
		// 2
		int line = parseLine();
		if( line < 1 ){
			return 1;
		}
		else if( maxEditableLine( currentPageCount ) < line ){
			return maxEditableLine( currentPageCount );
		}
		else{
			return line;
		}
	}
d、计算当前页的记录条数(也就是 JSP 页面,HT 的 Select控件 option 的个数)
	// select 控件要用
	int productRecordCountOfCurrentPage( int currentPageCount ){
		
		if( inputtedCount < ( currentPageCount * recordsOfPage ) ){
			return inputtedCount - ( currentPageCount - 1 ) * recordsOfPage;
		}
		
		return recordsOfPage;
	}
e、计算当前页的第一行对应已经输入的 products (List)的索引(用来将最后部分数据 Copy 出来)

显然这个起始索引只能是,0、10、20、30....

	int startIndexForCopy( int currentPageCount ){
		
		return ( currentPageCount - 1 ) * recordsOfPage;
	}
f、判断是否有上一页 和是否有下一页

	boolean hasPrePage( int currentPageCount ){
		return 1 < currentPageCount ? true : false;
	}
	
	boolean hasNextPage( int currentPageCount ){
		return currentPageCount < maxEditablePageCount() ? true : false;
	}
g、构造 page_line 参数

	String pageLine( int currentPageCount, int currentLine ){
		return currentPageCount + "_" + currentLine;
	}


完整代码:

package jp.co.snjp.kddi.ht.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class EditPageUtil {
	private static final int DEFAULT_RECORDS_OF_PAGE = 10;
	
	private final int recordsOfPage;
	private final int inputtedCount;
	private final int totalCount;
	private final String page_line;
	
	public int getInputtedCount() {
		return inputtedCount;
	}

	public int getRecordsOfPage() {
		return recordsOfPage;
	}

	public int getTotalCount() {
		return totalCount;
	}

	private EditPageUtil( int inputtedCount, int totalCount, String page_line ){
		this( inputtedCount, totalCount, page_line, DEFAULT_RECORDS_OF_PAGE );
	}
	
	private EditPageUtil( int inputtedCount, int totalCount, String page_line, int recordsOfPage ){
		if( isInvalidParams( inputtedCount, totalCount, page_line, recordsOfPage ) ){
			throw new IllegalStateException("Parameters state error.");
		}
		
		this.inputtedCount = inputtedCount;
		this.totalCount = totalCount;
		this.page_line = page_line;
		this.recordsOfPage = recordsOfPage;
	}
	
	private boolean isInvalidParams( int inputtedCount, int totalCount, String page_line, int recordsOfPage ){
		
		// 这里 inputtedCount 至少会有一个 BlankProduct, 用于在编辑模式下输入
		if( inputtedCount < 1 || totalCount < 1 || recordsOfPage < 1){
			return true;
		}
		if( totalCount < inputtedCount){
			return true;
		}
		if( page_line != null && !page_line.trim().equals("") ){
			return notMatcher( page_line, "\\d+_\\d+" );
		}
		
		return false;
	}
	
	private boolean notMatcher( String sequence, String regex ){
		Pattern p = Pattern.compile(regex);
		Matcher m = p.matcher( sequence.trim() );
		return !m.matches();
	}
	
	
	public static EditPageUtil newInstanceDefaultRecordsOfPage( int inputtedCount, int totalCount, String page_line ){
		return new EditPageUtil( inputtedCount, totalCount, page_line );
	}
	
	public static EditPageUtil newInstanceSetRecordsOfPage( int inputtedCount, int totalCount, String page_line, int recordsOfPage ){
		return new EditPageUtil( inputtedCount, totalCount,page_line, recordsOfPage );
	}
	
	int totalPageCount(){
		if( totalCount % recordsOfPage == 0 ){
			return totalCount / recordsOfPage;
		}
		
		return totalCount / recordsOfPage + 1;
	}
	
	// 1. 第一次从输入页面->编辑页面 ( page_line为null, 默认第一页面)
	// 2. 编辑修改保存后->再次进入 (根据 page_line 参数解析)
	int currentPageCount(){
		
		// 1
		if( page_line == null ){
			return 1;
		}
		
		// 2
		int page = parsePage();
		if( page < 1){
			return 1;
		}
		else if( maxEditablePageCount() < page ){
			return maxEditablePageCount();
		}
		else{
			return page;
		}
	}
	
	int currentLine( int currentPageCount ){
		
		// 1
		if( page_line == null ){
			return 1;
		}
		
		// 2
		int line = parseLine();
		if( line < 1 ){
			return 1;
		}
		else if( maxEditableLine( currentPageCount ) < line ){
			return maxEditableLine( currentPageCount );
		}
		else{
			return line;
		}
	}
	
	private int maxEditableLine( int currentPageCount ){
		
		return productRecordCountOfCurrentPage( currentPageCount );
	}
	
	// select 控件要用
	int productRecordCountOfCurrentPage( int currentPageCount ){
		
		if( inputtedCount < ( currentPageCount * recordsOfPage ) ){
			return inputtedCount - ( currentPageCount - 1 ) * recordsOfPage;
		}
		
		return recordsOfPage;
	}
	
	int startIndexForCopy( int currentPageCount ){
		
		return ( currentPageCount - 1 ) * recordsOfPage;
	}
	
	boolean hasPrePage( int currentPageCount ){
		return 1 < currentPageCount ? true : false;
	}
	
	boolean hasNextPage( int currentPageCount ){
		return currentPageCount < maxEditablePageCount() ? true : false;
	}
	
	String pageLine( int currentPageCount, int currentLine ){
		return currentPageCount + "_" + currentLine;
	}
	
	// 可以"翻页"的最大页数
	private int maxEditablePageCount(){
		
		if( inputtedCount % recordsOfPage == 0 ){
			return inputtedCount / recordsOfPage;
		}
		return inputtedCount / recordsOfPage + 1;
		
	}
	
	private int parsePage(){
		String[] params = page_line.split( "_" );
		String page = params[0].trim();
		
		return Integer.valueOf( page ).intValue();
	}
	
	private int parseLine(){
		String[] params = page_line.split( "_" );
		String line = params[1].trim();
		
		return Integer.valueOf( line ).intValue();
	}
	
	public Status computeAllStatus(){
		
		int totalPageCount = totalPageCount();
		int currentPageCount = currentPageCount();
		int currentLine = currentLine( currentPageCount );
		int productRecordCountOfCurrentPage = productRecordCountOfCurrentPage( currentPageCount );
		int startIndexForCopy = startIndexForCopy( currentPageCount );
		String pageLine = pageLine( currentPageCount, currentLine );
		boolean hasPrePage = hasPrePage( currentPageCount );
		boolean hasNextPage = hasNextPage( currentPageCount );
		
		return new Status( totalPageCount, currentPageCount, currentLine,
						   productRecordCountOfCurrentPage, startIndexForCopy,
						   pageLine, hasPrePage, hasNextPage);
	}
	
	public static class Status{
		private final int totalPageCount;
		private final int currentPageCount;
		private final int currentLine;
		private final int productRecordCountOfCurrentPage;
		private final int startIndexForCopy;
		private final String pageLine;
		private final boolean hasPrePage;
		private final boolean hasNextPage;
		
		private Status( int totalPageCount, int currentPageCount, int currentLine, 
						int productRecordCountOfCurrentPage, int startIndexForCopy, 
						String pageLine, boolean hasPrePage, boolean hasNextPage) {
			this.totalPageCount = totalPageCount;
			this.currentPageCount = currentPageCount;
			this.currentLine = currentLine;
			this.productRecordCountOfCurrentPage = productRecordCountOfCurrentPage;
			this.startIndexForCopy = startIndexForCopy;
			this.pageLine = pageLine;
			this.hasPrePage = hasPrePage;
			this.hasNextPage = hasNextPage;
		}

		public int getCurrentLine() {
			return currentLine;
		}

		public int getCurrentPageCount() {
			return currentPageCount;
		}

		public boolean getHasNextPage() {
			return hasNextPage;
		}

		public boolean getHasPrePage() {
			return hasPrePage;
		}

		public String getPageLine() {
			return pageLine;
		}

		public int getProductRecordCountOfCurrentPage() {
			return productRecordCountOfCurrentPage;
		}

		public int getStartIndexForCopy() {
			return startIndexForCopy;
		}

		public int getTotalPageCount() {
			return totalPageCount;
		}
	}
}

使用示例:

	void initEditJspParam( ){
		T03SlipWk orderForm = (T03SlipWk) session.get( "SLIP_WK" );
		List<T04CaseDtlWk> products = getEditableProducts( orderForm );
		LOG.info( "products.size()=" + products.size() );
		
		productName = orderForm.getProdNm1();
		productCount = orderForm.getShpVol1().intValue();
		
		String page_line = request.getParameter( "page_line" );
		EditPageUtil.Status editPageStatus = 
			EditPageUtil.newInstanceDefaultRecordsOfPage( products.size(), productCount, page_line).computeAllStatus();
		totalPageCount = editPageStatus.getTotalPageCount();
		currentPageCount = editPageStatus.getCurrentPageCount();
		currentLine = editPageStatus.getCurrentLine();
		currentPageProductRecords = editPageStatus.getProductRecordCountOfCurrentPage();
		currentPageProducts = currentPageProducts( products, editPageStatus );
		hasPrePage = editPageStatus.getHasPrePage();
		hasNextPage = editPageStatus.getHasNextPage();
		pageLine = editPageStatus.getPageLine();
		
		LOG.info( "currentPageCount=" + currentPageCount );
		LOG.info( "currentLine=" + currentLine );
		LOG.info( "currentPageProductRecords=" + currentPageProductRecords );
		LOG.info( "hasPrePage=" + hasPrePage );
		LOG.info( "hasNextPage=" + hasNextPage );
	}
	
	//  计算显示在当前页面的商品
	List<String> currentPageProducts( List<T04CaseDtlWk> products, EditPageUtil.Status status ){
		
		List<String> results = new ArrayList<String>();
		int currentPageProductRecords = status.getProductRecordCountOfCurrentPage();
		int startIndexForCopy = status.getStartIndexForCopy();
		int copyedCount = 0;
		
		final String BLANK = "    ";
		while( copyedCount < currentPageProductRecords ){
			
			T04CaseDtlWk product = products.get( startIndexForCopy );
			BigDecimal wt2 = product.getShpWt2();
			if( wt2 == null ){
				results.add( BLANK );
			}
			else{
				results.add( manualInputAction.formatNumber( wt2 ) );
			}
			
			startIndexForCopy++;
			copyedCount++;
		}
		
		return results;
	}	
	
	// 获取可编辑 的商品************************************ 注意这个方法对BlankProduct 的操作
	List<T04CaseDtlWk> getEditableProducts( T03SlipWk orderForm ){
		List<T04CaseDtlWk> products = manualInputAction.getProductsFromDB( orderForm );
		
		// 商品没有完全输入, 在最后加入一个 BlankProduct, 用于输入
		if( products.size() < orderForm.getShpVol1().intValue() ){
			String slipId = orderForm.getSlipId();
			products.add( constructBlankProduct( slipId ) );
		}
		
		return products;
	}
	
	T04CaseDtlWk constructBlankProduct( String slipId ){
		T04CaseDtlWk product = new T04CaseDtlWk();
		product.setSlipId( slipId );
		
		// 要保证通过 page_line 计算出来的 caseId 找不到这个BlankProduct
		product.setCaseId( -1 );
		product.setShpWt2( null );
		
		return product;
	}










































你可能感兴趣的:(BPP 相关——01)