Dorado 5 : 11.3.合同管理部分开发步骤 (T22)

添加Dataset

步骤1:添加一Common ViewModel,文件名为ContractMaintain。
为ContractMaintain的<<function>>添加如下代码:

// 计算所有记录金额,毛利以及合计
function calcAll() {
  datasetContractItems.disableControls();
  try {
    var record = datasetContractItems.getFirstRecord();
    while (record) {
      calcItem(record);
      record = record.getNextRecord();
    }
  }
  finally {
    datasetContractItems.enableControls();
  }
}
// 计算单条记录中的金额,毛利..
function calcItem(record) {
  var num = record.getValue("num");
  var sum = record.getValue("price") * num;
  var cost_sum = record.getValue("cost") * num;
  record.setValue("sum", sum);
  record.setValue("cost_sum", cost_sum);
  record.setValue("profit", sum - cost_sum);
  record.post();
}
// 处理产品选择,向datasetContractItems中添加产品
function processSelectedProduct(nodes) {
  for (var i = 0; i < nodes.length; i++) {
    var node = nodes[i];
    datasetContractItems.insertRecord();
    datasetContractItems.copyRecord(node.getRecord());
    datasetContractItems.setValue("item_id", "");
    datasetContractItems.postRecord();
  }
}

为ContractMaintain的onDatasetsPrepared事件添加如下代码:

datasetContractItems.parameters().setValue("contract_no","${Request.contract_no}"); 
datasetContractItems.flushData(); 
calcAll();

步骤2:添加一AutoSqlDataset,选中contract_items表格,选择所有字段,该Dataset属性设置如下:

属性

id

datasetContractItems

keyFields

item_id

originTable

contract_items

retrieveAfterUpdate

true

为datasetContractItems添加一BaseMatchRule,属性设置如下:

属性

datatype

string

escapeEnabled

false

level

1

operator

=

originField

contract_no

originTable

CONTRACT_ITEMS

value

:contract_no

为datasetContractItems添加一Join,属性设置如下:

属性

keyFields

product_id

name

product

originTable

PRODUCT

sourceKeyFields

product_id

sourceTable

CONTRACT_ITEMS

为datasetContractItems添加一DatasetListener,代码如下:

import com.bstek.dorado.data.AbstractDatasetListener;
import com.bstek.dorado.data.Dataset;
import com.bstek.dorado.data.Record;
import com.bstek.dorado.data.db.DBStatement;
/**
 * Contract_datasetContractListener
 */
public class ContractMaintain_datasetContractItemsListener extends
        AbstractDatasetListener {
    public boolean beforeUpdateData(Dataset dataset) throws Exception {
        // 注意: 本例中使用的新建主键值的方法仅用于演示, 在实际应用中并不可取.
        DBStatement stMaxId = new DBStatement();
        stMaxId.setSql("SELECT MAX(item_id) FROM contract_items");
        long maxId = 0L;
        try {
            maxId = stMaxId.query().getLong(0);
        } finally {
            stMaxId.close();
        }
        dataset.moveFirst();
        while (!dataset.isLast()) {
            if (dataset.getRecordState() == Record.STATE_NEW) {
                dataset.setLong("item_id", ++maxId);
            }
            dataset.moveNext();
        }
        return true;
    }
}

为datasetContractItems添加3个Dummy Field,属性设置如下:

dataType

label

name

readOnly

supportsSum

float

毛利

profit

true

true

float

总成本

cost_sum

true

true

float

总金额

sum

true

true


为datasetContractItems的afterScroll事件添加如下代码:

buttonDelete.disabled = (datasetContractItems.getCurrent() == null);

为datasetContractItems的afterChange事件添加如下代码:

switch (field.getName()) { 
	 case "num":; 
	 case "price":; 
	 case "cost": { 
		 calcItem(record); 
	 	break; 
	 } 
}

步骤3:添加一AutoSqlDataset,选择contract表格,选择所有字段,该Dataset属性设置如下:

属性

id

datasetContract

keyFields

contract_no

originTable

contract

retrieveAfterUpdate

true

为其添加一Join条件,属性设置如下:

属性

joinMode

select_expression

keyFields

employee_id

name

employee

originTable

EMPLOYEE

sourceKeyFields

owner

sourceTable

CONTRACT

为其添加5个BaseMatchRule,属性如下:

dataType

escapeEnabled

operator

originField

table

value

string

true

like

contract_no

contract

:contract_no

string

true

=

owner

contract

:owner

string

true

=

customer

contract

:customer

string

true

>=

sign_date

contract

:sign_date1

string

true

<=

sign_date

contract

:sign_date2

步骤4:添加一AutoSqlDataset,选择customer表格,选择所有字段,该Dataset的属性设置如下:

属性

id

datasetCustomer

keyFields

custom_id

originTable

customer

 

添加合同信息部分

步骤1:添加一AutoForm,属性设置如下:

属性

dataset

datasetContract

defaultControlWidth

200

id

formContract

步骤2:添加一ListDropDown,属性设置如下:

属性

autoDropdown

true

id

dropdownPalce

为dropdownPalce添加如下图所示的ListItem:

其中"上海"、"北京"等都是设置的ListItem的value,name设置为空即可。
步骤3:添加一CustomDropDown,属性设置如下:

属性

fixed

true

height

250

id

datasetEmployee

path

drop-down-employee-tree.jsp

readFields

employee_id,employee_name

width

200

writeFields

owner,owner_name

步骤4:添加一DatasetDropDown,属性设置如下:

属性

dataset

datasetCustomer

fixed

true

id

dropdownCustomer

labelField

custom_name

mapValue

true

valueField

custom_id

 

添加显示合同产品部分

添加一DataTable,属性设置如下:

属性

dataset

datasetContractItems

fixedColumn

2

height

100%

id

tableContractItems

showFooter

true

width

100%

选中tableContractItems,点击字段生成按钮。
对其中的字段进行设置,最后结果如下图所示:

添加产品操作部分

步骤1:添加一Button,属性设置如下:

属性

id

buttonCopyAdd

value

复制并添加

为buttonCopyAdd的onClick事件添加如下代码:

var recordForCopy = datasetContractItems.getCurrent(); 
datasetContractItems.insertRecord(); 
if (recordForCopy != null) { 
	 datasetContractItems.copyRecord(recordForCopy); 
}

步骤2:添加一DropDown ViewModel,文件名为ProductTreeSelect。
添加一AutoSqlDataSet,选择Category表,选择Category的所有字段。AutoSqlDataSet的属性设置如下:

属性

id

datasetCategory

originTable

CATEGORY

为datasetCategory添加一BaseMatchRule,BaseMatchRule的属性设置如下:

属性

level

1

table

CATEGORY

operator

=

originField

PARENT_ID

value

:PARENT_ID

为datasetCategory添加一Parameter,name设置为PARENT_ID,value设置为$null。
为datasetCategory的beforeDelete事件添加如下代码:

var category_id = parseInt(record.getValue("category_id"));
if (record.getString("parent_id") == "" && 
   (category_id == 1 || category_id == 2 || category_id == 3)) {
  return "处于演示数据的安全考虑,本例不允许您删除顶层的分类!";
}

添加一AutoSqlDataset,选择Product表,选择所有字段,属性设置如下:

属性

id

datasetProduct

originTable

product

keyFields

product_id

为AutoSqlDataset添加三个BaseMatchRule,属性设置分别如下:

属性

level

1

dataType

string

value

:category_id

escapeEnabled

true

table

PRODUCT

originField

category_id

operator

=

属性

level

1

dataType

string

value

:product_id

escapeEnabled

true

table

PRODUCT

originField

product_id

operator

=

属性

level

1

dataType

string

value

:product_name

escapeEnabled

true

table

PRODUCT

originField

product_name

operator

like

添加一DataTree,属性设置如下:

属性

id

treeProduct

height

100%

width

100%

draggable

true

为DataTree添加一Recursive Tree Level,属性设置如下:

属性

name

category

dataset

datasetCategory

recursiveKeyFields

category_id

recursiveKeyParameters

parent_id

labelField

category_name

detailKeyParameters

parent_id

masterKeyFields

category_id

checkable

true

为product添加一Simple Tree Level,属性设置如下:

属性

name

product

dataset

datasetProduct

masterKeyFields

category_id

detailKeyParameters

category_id

labelField

product_name

hasChild

false

添加一Button,属性设置如下:

属性

id

buttonInsert

value

添加

width

80

为buttonInsert的onclick事件添加如下代码:

var nodes = treeProduct.getAllCheckedNodes(); 
treeProduct.clearAllCheckedState(); 
parent.processSelectedProduct(nodes);

添加一Button,属性设置如下:

属性

id

buttonInsertAndClose

value

添加并关闭

为buttonInsertAndClose的onClick事件添加如下代码:

buttonInsert.click(); 
SubWindow.hideParent();

为该CustomDropDown ViewModel生成Jsp页面并进行编辑,代码如下:

<%@ page contentType="text/html; charset=UTF-8" %> 
<%@ taglib uri="http://www.bstek.com/dorado" prefix="d" %> 
 <html> 
 <head> 
 <title>选择产品</title> 
 </head> 
 <body> 
 <d:View config="ProductTreeSelect"> 
 <d:Layout type="border"> 
 <d:Pane position="center"> 
 <d:DataTree id="treeProduct" /> 
 </d:Pane> 
 <d:Pane position="bottom" align="right"> 
 <d:Layout type="Hflow"> 
 <d:Pane> 
 <d:Button id="buttonInsert" /> 
 </d:Pane> 
 <d:Pane> 
 <d:Button id="buttonInsertAndClose" /> 
 </d:Pane> 
 </d:Layout> 
 </d:Pane> 
 </d:Layout> 
 </d:View> 
 </body> 
 </html>

步骤3:回到ContractMaintain中来,添加一RequestCommand,属性设置如下:

属性

id

commandShowProductDialog

path

product-tree-select.jsp

为commandShowProductDialog的Frame的节点设置属性如下:

属性

center

true

target

_subwindow

步骤4:添加一Button,属性设置如下:

属性

command

commandShowProductDialog

id

buttonBatchAdd

value

批量添加产品

步骤5:添加一Button,属性设置如下:

属性

disabled

true

id

buttonDelete

value

删除产品

为buttonDelete的onclick事件添加如下代码:

datasetContractItems.deleteRecord();

添加保存返回部分

步骤1:添加一UpdateCommand,id设置为commandSave。在commandSave的DatasetInfos节点下面添加两个DatasetInfo,分别为datasetContract和datasetContractItems。
步骤2:添加一Button,属性设置如下:

属性

command

commandSave

id

buttonSave

value

保存

width

80

步骤3:添加一Button,属性设置如下:

属性

id

buttonSaveAndBack

value

保存并返回

width

120

为buttonSaveAndBack的onclick事件添加如下代码:

if (commandSave.execute()) { 
	open("contract-query.jsp", "_self"); 
}

步骤4:添加一Button,属性设置如下:

属性

id

buttonBack

value

返回

width

80

为buttonBack的onclick事件添加如下代码:

open("contract-query.jsp", "_self");

创建Jsp页面

对ContractMaintain生成Jsp页面并进行编辑,最后结果如下:

<%@ page contentType="text/html; charset=UTF-8" %> 
<%@ taglib uri="http://www.bstek.com/dorado" prefix="d" %> 
 <html> 
 <head> 
 <title> 
 <% 
 out.print(("add".equals(request.getParameter("op")))?"新增合同":"查看/修改合同"); 
 %> 
 </title> 
 </head> 
 <body> 
 <d:View config="ContractMaintain"> 
 <d:Layout type="vflow" height="100%"> 
 <d:Pane> 
 <d:AutoForm id="formContract" /> 
 </d:Pane> 
 <d:Pane align="right"> 
 <d:Layout type="Hflow"> 
 <d:Pane> 
 <d:Button id="buttonCopyAdd" /> 
 </d:Pane> 
 <d:Pane> 
 <d:Button id="buttonBatchAdd" /> 
 </d:Pane> 
 <d:Pane> 
 <d:Button id="buttonDelete" /> 
 </d:Pane> 
 </d:Layout> 
 </d:Pane> 
 <d:Pane height="100%"> 
 <d:DataTable id="tableContractItems" /> 
 </d:Pane> 
 <d:Pane align="right"> 
 <d:Layout type="Hflow"> 
 <d:Pane> 
 <d:Button id="buttonSave" /> 
 </d:Pane> 
 <d:Pane> 
 <d:Button id="buttonSaveAndBack" /> 
 </d:Pane> 
 <d:Pane> 
 <d:Button id="buttonBack" /> 
 </d:Pane> 
 </d:Layout> 
 </d:Pane> 
 </d:Layout> 
 </d:View> 
 </body> 
 </html>

浏览运行效果

启动服务器后,浏览contract-query.jsp页面,效果如下图所示:

在上方的AutoForm中输入查询条件后,点击查询,可以在下面看到结果。当点击下面表格中的合同号的链接,或者双击那条记录的话,可以跳转到如下页面:

在该页面可以进行合同中产品的维护以及进行保存。

知识点

该示例为dorado的综合应用,无新知识点。