您的位置:首页 > 其它

如何在OA系统上搭建一个报价系统

2015-08-02 08:10 543 查看
最后在做一个五金厂的报价系统,开始准备自已做,做着做着发现真的不是那么简单,报价界面有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系统这个平台,不然真自已做起来不简单,开发周期太长,用这个平台,只要把时间用在业务逻辑的处理上,同时也给了我一个新的想法,以后开发的项目若是要走审批流程的,都可以利用这个平台来做!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: