最后在做一个五金厂的报价系统,开始准备自已做,做着做着发现真的不是那么简单,报价界面有100多个栏位,有N多个公式,12个工序动态指定,然后带出对应的设备,表单还要经过五个部门协同操作,每一步骤操作的栏位不同,如果自已开发,得要有一个完整的权限控制、工作流表单设计、工作流程设计,而且还要很灵活,用户在系统使用初期可能会有很多调整,想想都头大了,于是想到了OA2015,说干就干,搭建环境后,开工。
一、设计表单
用了整整一天的时间,那栏位多得你都想吐血,你看图就知道了!
二、开始一个一个公式设置
比如MAX,MIN,+-*/这些都可以直接用表单设计器的控件来实现了,但不支持IF呀,但自已用JS的三元表达式实现,不过要注意>符右边必须有一个空格,不然字符会被截断;
JS中用到了大量的jQuery的事件绑定,还好有这个东东,不然JS代码都会写死人的,以下是一段选择工序后,自动加载工序设备的代码:
//计算工艺 自动加载设备
jQuery("input[id^='mgxcb_']").attr('readonly',true);
jQuery("input[id^='mgxshcb_']").attr('readonly',true);
jQuery("input[id^='gycbother_']").attr('readonly',true);
jQuery("select[id^='gygx_']").bind('change propertychange',function(){
var gygx=jQuery(this).children('option:selected').val();
var idx=(jQuery(this).attr('id')).substr(-2);
jQuery('#gygxsb_'+idx+' option').remove();
var sid = document.getElementById('gygxsb_'+idx);
var DATA_41=YJB_Str2Num(jQuery("input[name='DATA_41']:eq(0)").val());
var shebeitype='';
switch (gygx){
case '卷制':
shebeitype='juanzhishebei';
jQuery("#gxsudu_"+idx).attr('readonly',false);
break;
case '热处理':
shebeitype='rechulishebei';
jQuery("#gxsudu_"+idx).attr('readonly',true);
speedfromweight(DATA_41,'0',"gxsudu_"+idx);
break;
case '喷丸':
shebeitype='penwanshebei';
jQuery("#gxsudu_"+idx).attr('readonly',true);
speedfromweight(DATA_41,'0',"gxsudu_"+idx);
break;
case '磨端面':
jQuery("#gxsudu_"+idx).attr('readonly',false);
jQuery("#gxsudu_"+idx).val(0);
shebeitype='moduanmianshebei';
break;
case '倒角':
jQuery("#gxsudu_"+idx).attr('readonly',false);
jQuery("#gxsudu_"+idx).val(0);
shebeitype='daojiaoshebei';
break;
case '立定':
jQuery("#gxsudu_"+idx).attr('readonly',false);
jQuery("#gxsudu_"+idx).val(0);
shebeitype='lidingshebei';
break;
case '清洗':
jQuery("#gxsudu_"+idx).attr('readonly',true);
speedfromweight(DATA_41,'qx',"gxsudu_"+idx);
shebeitype='qingxishebei';
break;
case '手工':
jQuery("#gxsudu_"+idx).attr('readonly',false);
jQuery("#gxsudu_"+idx).val(0);
shebeitype='shougongshebei';
break;
default:
jQuery("#gxsudu_"+idx).attr('readonly',false);
jQuery("#gxsudu_"+idx).val(0);
break;
}
jQuery.post('/userext/index.php?c=workflow&m=getgxsb',
{tbname:shebeitype},
function(res){
jQuery.each(res.resmsg,function(idx,val){
sid.options[sid.options.length]=new Option(val,val);
});
},'json'
);
});
//工序设备变化更新速度、工序成本、工序损耗成本,折旧成本
jQuery("input[name='DATA_41']").bind('input change',function(){
var gygxlist=jQuery("select[id^='gygx_']");
var DATA_41=YJB_Str2Num(jQuery("input[name='DATA_41']:eq(0)").val());
jQuery.each(gygxlist,function(idx,obj){
gygx=jQuery(obj).children('option:selected').val();
id=(jQuery(obj).attr('id')).substr(-2);
switch (gygx){
case '热处理':
case '喷丸':
speedfromweight(DATA_41,'0',"gxsudu_"+id);
break;
case '清洗':
speedfromweight(DATA_41,'qx',"gxsudu_"+id);
break;
default :
jQuery("#gxsudu_"+id).val(0);
break;
}
});
});
以上代码调用到了一个函数,函数的是用来从后台取要加载的数据:
/*
通过重量获取速度
*/
function speedfromweight(weight,gxtype,id){
jQuery.ajax({type:'POST',
url:'/userext/index.php?c=workflow&m=speedfromweight',
data:{weight:weight,gxtype:gxtype},
success:function(res){
if (res.rescode!=0){
alert(res.resmsg);
return false;
}
jQuery("#"+id).val(res.resmsg);
},
dataType:'json',
async:false,cache:false}
);
}
加载数据后台代码是php实现的,写了一个最简易的MVC模式的入口文件,所有的方法都从这个文件入口调用:
include_once('inc/auth.inc.php');
$ControllerPath='Controller/'.$_GET['c'].'Controller.php';
$ControllerName=$_GET['c'].'Controller';
$method=$_GET['m'];
if (!file_exists($ControllerPath)){
echo json_encode(array('rescode'=>1,'resmsg'=>'Controller '.$_GET['c'].' is not exists!'));
exit(0);
}
require($ControllerPath);
$ctl=new $ControllerName;
$ctl->$method();
入口文件负责控制器和方法的解析,控制器才是方法实现的主体:
/*
功能:工作流控制器
*/
class workflowController{
//获取工序设备列表
public function getgxsb(){
$tbname='data_'.$_POST["tbname"];
$this->returnajax(0,$this->getparalist($tbname));
}
//获取参数列表数组
public function getparalist($table){
$query = "select cName from ".$table." order by ds_key_id";
$cursor=exequery(TD::conn(),$query);
$list=array();
while($ROW=MySQL_fetch_array($cursor)){
array_push($list,iconv("GBK", "UTF-8", $ROW["cName"]));
}
return $list;
}
//通过重量取速度
public function speedfromweight(){
$weight=$_POST["weight"];
$type=$_POST["gxtype"];
$query="select max(speed) speed from (
select cast(weight as DECIMAL(18,1)) weight,cast(speed as DECIMAL(18,1)) as speed
from data_".($type=='qx'?'qx':'')."weightspeedcompare
) as bb where ".$weight."<".($type=='qx'?'':'=')."weight";
$cursor=exequery(TD::conn(),$query);
while($ROW=MySQL_fetch_array($cursor)){
$speed=$ROW["speed"];
}
mysql_free_result($cursor);
$this->returnajax(0,$speed);
}
//返回JSON字符串
private function returnajax($code,$str){
echo json_encode(array('rescode'=>$code,'resmsg'=>$str));
}
}
这个项目还好有OA系统这个平台,不然真自已做起来不简单,开发周期太长,用这个平台,只要把时间用在业务逻辑的处理上,同时也给了我一个新的想法,以后开发的项目若是要走审批流程的,都可以利用这个平台来做!