BPP 相关——01

来源:互联网 发布:水印制作软件下载 编辑:程序博客网 时间:2024/04/29 12:37

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 的循环标签使用)


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 happenreturn -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 happenreturn -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(){// 1if( page_line == null ){return 1;}// 2int page = parsePage();if( page < 1){return 1;}else if( maxEditablePageCount() < page ){return maxEditablePageCount();}else{return page;}}
c、计算当前行

int currentLine( int currentPageCount ){// 1if( page_line == null ){return 1;}// 2int 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(){// 1if( page_line == null ){return 1;}// 2int page = parsePage();if( page < 1){return 1;}else if( maxEditablePageCount() < page ){return maxEditablePageCount();}else{return page;}}int currentLine( int currentPageCount ){// 1if( page_line == null ){return 1;}// 2int 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 找不到这个BlankProductproduct.setCaseId( -1 );product.setShpWt2( null );return product;}










































原创粉丝点击