背景目的:
为了配合定价模型的实施,需要建立一套非定价政策的自动核保规则引擎,现有的自动核保规则系统已不能满足新理念的需求,故需重新建造。
<!--EndFragment-->主要功能:
提供天平车险业务在承保系统、电销系统、网销系统关于非定价政策的规则设置和执行功能,包含规则匹配、非定价政策、集合维护、车辆黑名单四个模块。其中规则匹配用于指定各业务类型适用的非定价政策包(作用等同于现在自动核保引擎的口径一);非定价政策包含前置规则、新保规则(禁保、必保、限保)、续保规则、批改规则、资料审验规则、特约管理规则六大部分;集合维护提供非定价政策中决策表字段值的打包功能,包括车型包、分销商包。
一、 业务流程
1、
2、 业务流程说明
机构核保人将所有的非定价政策以决策表的形式整理好后,导入系统,规则引擎经过一系列的定位、解析后将规则结果(保或不保,以什么条件承保)反馈给核心业务系统。
二、 规则流
1)系统在对每单业务进行规则判断时,始终遵循以下规则流顺序,其中某项不通过时后面的规则将不再执行。
项目架构:SpringMVC,ibatis,jboss,oracle10g,poi,jbpm,json-lib,jfreechart,junit
spring相关jar(spring.jar,spring-aop-2.5.6.jar,spring-beans-2.5.6.jar,spring-context-2.5.6.jar,spring-core-2.5.6.jar,spring-jms-2.5.6.jar,spring-mock.jar,spring-modules-jbpm31.jar,spring-oxm-tiger-1.5.8.jar,spring-tx-2.5.6.jar)
项目工具:PowerDesigner,SecureCRT5.0,jboss,PLSQLDeveloper,Oracle10g,eclipse
项目中可以复用的地方:
1.动态导入jsp文件:<%@include file="../common/tag_include.jsp"%>
2.用iframe动态导入页面
<iframe id="tabIframe" name="tabIframe" src="<%=request.getContextPath()%>/decisionRuleUpdateInput2.do?ruleId=<c:out value="${calib0.forbiddenRule.ruleId}" />" space="0" vspace="0" marginheight="0" marginwidth="0" frameborder="0" height="100%" width="100%"></iframe>
3.iframe动态导入的窗口高度随内容相应变化
3.1 calib0_view.jsp
<iframe id="tabIframe" name="tabIframe" src="<%=request.getContextPath()%>/decisionRuleUpdateInput2.do?ruleId=<c:out value="${calib0.forbiddenRule.ruleId}" />" space="0" vspace="0" marginheight="0" marginwidth="0" frameborder="0" height="100%" width="100%"></iframe>
3.2 decisionRuleRelationCode_update2.jsp
<tr>
<td colspan="4" align="left">
选择版本号: <select id="versionNo1" onchange="javascript:changeVersion(this);">
<option value="">请选择</option>
<c:forEach var="tab" items="${decisionRule.tables}" varStatus="status">
<option value="<c:out value="${tab.tableId}"/>" <c:if test="${tab.versionNo==decisionRule.versionNo}">selected="selected"</c:if>><c:out value="${tab.versionNo}"/></option>
</c:forEach>
</select>
<input type="button" class="tpbutton" name="btnEdit" value=" 导入实例数据 " onClick="importObject();" />
</td>
</tr>
#######################################
js代码:
<script languge="javascript">
function init(){
var changeValue = document.getElementById("versionNo1").value;
if(tempVar != ''){
document.getElementById(tempVar).style.display = "none";
}
if(changeValue != ''){
document.getElementById(changeValue).style.display = "block";
}
tempVar = changeValue;
}
#################
changeVersion(form1.versionNo1);
###################
function SetWinHeight(obj){
var win=obj;
if (document.getElementById){
if (win && !window.opera){
if (win.contentDocument && win.contentDocument.body.offsetHeight){
win.height = win.contentDocument.body.offsetHeight;
}else if(win.Document && win.Document.body.scrollHeight){
win.height = win.Document.body.scrollHeight;
}
}
}
}
################
var tempVar = '';
function changeVersion(obj){
var changeValue = obj.value;
//var index = obj.selectedIndex;
//var changeText = obj.options[index].text;
//document.getElementById("versionNo").value = changeText;
if(tempVar != ''){
document.getElementById(tempVar).style.display = "none";
}
if(changeValue != ''){
document.getElementById(changeValue).style.display = "block";
}
tempVar = changeValue;
SetWinHeight(parent);
}
</script>
#############################
项目中模板化的js文件:
###################
/**
* 功能:select对象动态添加Options项
* @param {} objSelectNow select对象
* @param {} txt 显示值text
* @param {} val 值value
*/
function addOption(objSelectNow, txt, val) {
// / 使用W3C标准语法为SELECT添加Option
var objOption = document.createElement("option");
objOption.text = txt;
objOption.value = val;
objSelectNow.options.add(objOption);
}
###################
1)动态添加table-row.
function addTableRow() {
var listTable = document.getElementById('mytable');
var row = listTable.insertRow(listTable.rows.length);
var cells = new Array(1);
for(var i = 0,len =cells.length;i < len;i++){
cells[i] = row.insertCell();
}
infoNum = infoNum + 1;
//动态添加值开始
var objSel = document.getElementById("cfo");
var ops = objSel.options;
//条件列
var limitFlag0 = document.createElement("<select name='conditionInfo'>");
var delBtn = document.createElement("<input id='"+infoNum+"' name='btnSave' value='删除 ' type='button' class='tpbutton' onclick='javasript:delTableRow(this);'>");
addOption(limitFlag0,"请选择","");
limitFlag0.style.width="300";
for(var i=0; i<ops.length; i++){
addOption(limitFlag0,ops[i].text,ops[i].value);
cells[0].appendChild(limitFlag0);
}
cells[0].appendChild(delBtn);
}
2)动态删除table-row.
//删除行
function delTableRow(obj){
var tableObj = document.getElementById("mytable");
tableObj.deleteRow(obj.parentElement.parentElement.rowIndex);
}
3)checkbox全部选中/取消
<TR>
<TD colspan="15">
<input type="checkbox" name="cbSelectAll" id="cbSelectAll" class="checkall" onClick="selectAll_TP(form1,this);">
<label for="cbSelectAll">
全选/取消
</label>
</TD>
</TR>
#######################
function selectAll_TP(formObj,obj){
var inputArray = formObj.elements;
for(var i = 0; i < inputArray.length; i++){
try{
if(inputArray[i].type == "checkbox"){
inputArray[i].checked = obj.checked;
}
}catch(e){
}
}
}
4)批量删除选中的checkbox选项
function deleteObject(){
var raAll = document.getElementsByName('objectId');
if (raAll.length<1){
alert("请先选中!");
return;
}
var objectId = "";
var k=-1;
for (var i=0; i<raAll.length; i++) {
if(raAll[i].checked == true ){
k++;
objectId = raAll[i].value;
}
}
if(k<0){
alert("请先选中!");
return;
}
var gnl=confirm("你真的确定要删除吗?");
if (gnl==true){
form1.target="hiddenFrame";
form1.action="calib0Delete.do";
form1.submit();
form1.btnDelete.disabled=true;
}else{
return false;
}
}
5)其他js方法:
function searchForm(){
form1.target="_self";
form1.action="calib0Search.do";
form1.submit();
}
function viewDetail(objectId){
var url = "calib0View.do?calibId="+objectId;
window.open(url,'viewObject',"scrollbars=yes,resizable=yes,status=no,width=800,height=600");
}
function addObject(){
var url = "calib0AddInput.do";
window.open(url,'createObject',"scrollbars=yes,resizable=yes,status=no,width=800,height=600");
}
function addObject(){
var departmentCode = form1.departmentCode.value;
var channelSourceCode = form1.channelSourceCode.value;
var businessType = form1.businessType.value;
var applyType = form1.applyType.value;
var forbiddenRuleId = form1.forbiddenRuleId.value;
var mustRuleId = form1.mustRuleId.value;
var limitRuleId = form1.limitRuleId.value;
if(departmentCode.trim()==""){
alert("机构不能为空");
form1.departmentCode.focus();
return;
}
if(channelSourceCode.trim()==""){
alert("渠道不能为空");
form1.channelSourceCode.focus();
return;
}
if(businessType.trim()==""){
alert("业务类型不能为空");
form1.businessType.focus();
return;
}
if(applyType.trim()==""){
alert("投保方式不能为空");
form1.applyType.focus();
return;
}
if(forbiddenRuleId.trim()==""){
alert("禁保规则不能为空");
form1.forbiddenRuleId.focus();
return;
}
if(mustRuleId.trim()==""){
alert("必保规则不能为空");
form1.mustRuleId.focus();
return;
}
if(limitRuleId.trim()==""){
alert("限保规则不能为空");
form1.limitRuleId.focus();
return;
}
form1.submit();
form1.btnSave.disabled=true;
}
6)机构二级联动
<script language="javascript" src="<%=request.getContextPath()%>/js/xmlcommon.js"></script>(导入)
function departmentCodeChange(departmentCode){
url = "calib0GetDecisionRule.do?departmentCode="+departmentCode;
handlerRequestURLXML( url, setFields );
}
function setFields(request) {
setElementList(request);
}